elanous 0.2.41 → 0.2.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{2fe2c302.41b517f88d6fe502.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{385e4574.e9886ab32759eda3.js → 0ad6802e.ae7afb63fdcb4491.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1200.6a37c202f9f17e9a.js +226 -0
- package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1313-19f737e0222c4444.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6874.d5cf7eb8edb2cabe.js → 1406.a1dc2ab6f8449374.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5744.b9415e18ad623100.js → 1961.a81b12872c3e93a9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1970cf59.2d4d8ce5d6c81853.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2073-ba274e00e4f9efb4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.js → 2144.25b292396712196d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{3230-49298c3b73ef2268.js → 2268-53861f339e0b65a2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9834.63ab2bbc3153172e.js → 2312.0c8b61e22d3136d7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1800.f7ff51dc4978a958.js → 2573.387a707f6f9d720c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9048.212083de42d25be3.js → 3072.01338851ca21a6f7.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +90 -0
- package/apps/pwa/out/_next/static/chunks/3095.dc44586a5f83b86d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.js → 3113.d7472bbc27d580c7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3402.44b565b314f2263c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{addc2b32.8c4ff8f0aefe987d.js → 3557ac4a.c8931684475018ad.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/360.ae9f9f4c33c395e8.js +79 -0
- package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
- package/apps/pwa/out/_next/static/chunks/{a0a01613.6d1cca322238d7fe.js → 363bfab3.9623b9f89363541f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3694.e0099884345f0198.js +64 -0
- package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3903.3ef4656c67572764.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3935.16701e33f8982dc9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3955.6922286237f2ac2b.js +24 -0
- package/apps/pwa/out/_next/static/chunks/3969.272ee7f9fd6c62e5.js +34 -0
- package/apps/pwa/out/_next/static/chunks/4199.ce86b281fd0a60b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{530.d26346e18089640a.js → 4445.7990c76b3751a918.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4894.fec2ca9e99caefa2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +94 -0
- package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +36 -0
- package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1219.7e17964e0e7cd8e5.js → 5564.9e72532188f57586.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5628.6ddb2d5ffba4ff4c.js +309 -0
- package/apps/pwa/out/_next/static/chunks/5730.43d7ccc09988e646.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.js → 5789.2da35c258292e1e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4133.2056bb4d78f621af.js → 5824.da9527b15a3221e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.js → 5930.8b4df3b46c32b05a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +27 -0
- package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +104 -0
- package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +287 -0
- package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9507.7026657a2f47eb64.js → 6540.c7bef57ad8f90a87.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5574.f35accf4f132b29d.js → 6944.309f4e3ea54d1537.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7483.427a2fe2049e388d.js +148 -0
- package/apps/pwa/out/_next/static/chunks/7502-be74718178e13e56.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7900.096f455c7c1efc53.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7910-6f139bcafd238b9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5947-135e26537d80a6b9.js → 8062-7cd0bcc7f01455ba.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +74 -0
- package/apps/pwa/out/_next/static/chunks/8205.282ca4bb62d54a0a.js +62 -0
- package/apps/pwa/out/_next/static/chunks/8313-dfa1021bb58a46d6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/837-81336ebaca8198a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8588.d1c6a2903727ce87.js +149 -0
- package/apps/pwa/out/_next/static/chunks/8637.90f92d5c8db4732c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2743.5d3f76948be32b34.js → 868.6e953be05bcf6dca.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5964-7e21164a8f2cf0ce.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8967-7dfebf710c9dec9d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5159.115f1c2ca471386c.js → 8986.8e2e4efbfa655c59.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +1 -0
- package/apps/pwa/out/_next/static/chunks/923.2034d10ae91e9c20.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
- package/apps/pwa/out/_next/static/chunks/943.39ae5e82f4f1893f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +32 -0
- package/apps/pwa/out/_next/static/chunks/9770.5f75bc6088b16109.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +8 -0
- package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b2271e54.c1de3347976e90b0.js → aa57532f.510551854ff239b1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-9ee28f7df07428ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-40f9e19149024298.js → page-79a8b5fee4c20871.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-a142dfb0331a05f5.js → page-ca2d09128c585ca4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-0a815f34367b6db6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{53aeb4ee-51c92f8d683f5220.js → c7945435-b44d4dbe90ba0dcb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2fdf2931.b431eee4fb468bc3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.js → d96660fb.cbc21a2a88539dbb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/ea514caa.05a24f78d9dffe5f.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{83184dcd-0ee6247ff41eb3f2.js → fb7d20d5-6892502b6ee39ca6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +1 -0
- package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
- package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +24 -25
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +23 -23
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +24 -25
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +24 -25
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/catalog/external-commands.yaml +5 -3
- package/catalog/meta/catalogVersion.yaml +2 -1
- package/catalog/signing/catalog-signing-public.pem +3 -0
- package/docs/goal-context/04-mock-scenarios.md +13 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/heal/heal-loop.yaml +1 -0
- package/graphs/intake/intake-daily.yaml +16 -0
- package/graphs/intake/news-sources.yaml +1 -0
- package/graphs/intake/recipes.yaml +7 -0
- package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
- package/graphs/overlays/stop-heal-ladder.yaml +113 -0
- package/graphs/profiles/local.yaml +5 -0
- package/graphs/profiles/pod.yaml +4 -0
- package/graphs/units/verbs/recipes.yaml +11 -11
- package/graphs/work/research-report.yaml +10 -2
- package/package.json +6 -2
- package/plugins/demo-absorption-briefing/plugin.json +18 -0
- package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
- package/plugins/demo-browser-hand/plugin.json +13 -0
- package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
- package/plugins/demo-linear-secretary/plugin.json +15 -0
- package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
- package/plugins/demo-plugin-wizard/plugin.json +11 -0
- package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
- package/plugins/demo-research/plugin.json +16 -0
- package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
- package/plugins/demo-video-briefing/plugin.json +15 -0
- package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
- package/scripts/build-signed-catalog.ts +48 -0
- package/scripts/ci-typecheck-main-delta.sh +88 -0
- package/scripts/codex-fallback-live-probe.ts +1 -1
- package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
- package/scripts/demo/demo1104-stage.config.ts +21 -0
- package/scripts/demo/demo1104-stage.ts +316 -0
- package/scripts/goal-method-audit.ts +17 -1
- package/scripts/graph-units/land-enqueue.ts +90 -0
- package/scripts/heal/run-role.ts +99 -5
- package/scripts/hooks/codex-notify.sh +32 -0
- package/scripts/install.sh +10 -38
- package/scripts/land-global-checks.ts +6 -1
- package/scripts/landing-heal/land-plan.ts +57 -0
- package/scripts/lib/decompose-ab.ts +1 -0
- package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
- package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
- package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
- package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
- package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
- package/scripts/lib/tui-regress-checks.ts +33 -13
- package/scripts/release-loop/auto-approve-node.ts +1 -1
- package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
- package/scripts/release-loop/gate-baseline-receipt.ts +47 -9
- package/scripts/release-loop/gate-image-pin.ts +81 -0
- package/scripts/release-loop/gate-method.ts +139 -0
- package/scripts/release-loop/gate-node-sim.ts +207 -0
- package/scripts/release-loop/gate-node.ts +463 -64
- package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
- package/scripts/release-loop/gate-radius-live.ts +97 -13
- package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
- package/scripts/release-loop/gate-traffic-mode.ts +151 -3
- package/scripts/release-loop/gate-train-receipts.ts +122 -0
- package/scripts/release-loop/node-verdict.ts +38 -25
- package/scripts/release-loop/preflight.ts +362 -8
- package/scripts/release-loop/resume-release.ts +83 -8
- package/scripts/release-loop/unattended-release.ts +20 -9
- package/scripts/rhythm/daily.ts +36 -4
- package/scripts/rhythm/linear-progress-sync.ts +298 -0
- package/scripts/ux-sim.ts +18 -1
- package/scripts/video-pipeline.ts +9 -1
- package/scripts/warm-pool-provider-config.ts +286 -0
- package/skills/omni-crawl/SKILL.md +5 -2
- package/skills/omni-crawl/scripts/main.ts +84 -23
- package/src/acp/agent-manager.ts +1 -0
- package/src/acp/codex-app-server-agent.ts +33 -0
- package/src/acp/codex-app-server-client.ts +153 -16
- package/src/acp/core-turn-bridge.ts +27 -9
- package/src/acp/event-router.ts +20 -1
- package/src/acp/server.ts +6 -0
- package/src/agent/registry.ts +2 -0
- package/src/agent/task-notification.ts +25 -5
- package/src/agent/types.ts +6 -0
- package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
- package/src/agent-mission/claude-headless.ts +4 -1
- package/src/agent-mission/codex-exec.ts +105 -0
- package/src/agent-mission/driver.ts +192 -11
- package/src/agent-mission/grok-auth-status.ts +47 -0
- package/src/agent-mission/hand-hooks.ts +101 -0
- package/src/agent-mission/mission-cli.ts +63 -4
- package/src/agent-mission/mission-hand-reply.ts +118 -0
- package/src/agent-mission/mission-line.ts +180 -0
- package/src/agent-mission/mission-out.ts +833 -0
- package/src/agent-mission/tool-install.ts +200 -3
- package/src/agent-substrate/context-strategy.ts +4 -4
- package/src/agent-substrate/self-review-cli.ts +178 -13
- package/src/agents/general-purpose.md +1 -1
- package/src/auto-research/research-turn.ts +211 -53
- package/src/autopilot/pr-manager.ts +69 -10
- package/src/autopilot/pty-control-loop.ts +2 -0
- package/src/boot/daemon-tools/self-implement.ts +3 -1
- package/src/boot/daemon-tools/web-search.ts +1 -2
- package/src/briefing/brief-items.ts +55 -11
- package/src/capture/tui-self-report.ts +22 -6
- package/src/chat/index.ts +1 -1
- package/src/cli/agent-cli.ts +2 -1
- package/src/cli/catalog-cli.ts +31 -0
- package/src/cli/connector-cli.ts +16 -0
- package/src/cli/doctor-fix.ts +2 -2
- package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
- package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
- package/src/cli/intake-source-cli.ts +44 -8
- package/src/cli/msg-cli.ts +32 -3
- package/src/cli/pr-cli.ts +21 -1
- package/src/cli/pr-land-heavy-remote.ts +75 -5
- package/src/cli/pr-land-overlap-evidence.ts +113 -2
- package/src/cli/pr-land-pod-shadow-job.ts +202 -4
- package/src/cli/pr-land-pod-shadow.ts +9 -2
- package/src/cli/release-checklist-read-cli.ts +57 -19
- package/src/cli/release-cli.ts +23 -3
- package/src/cli/research-cli.ts +13 -5
- package/src/cli/setup-cli.ts +166 -6
- package/src/cli/setup-keys.ts +187 -0
- package/src/cli/task-plugin-wizard-host.ts +114 -0
- package/src/cli/tasks-cli.ts +61 -9
- package/src/cli/tui-test-cli.ts +186 -0
- package/src/compact/auto.ts +8 -1
- package/src/config.ts +4 -2
- package/src/connectors/linear-daily-progress.ts +228 -0
- package/src/connectors/linear-projector.ts +34 -12
- package/src/connectors/linear.ts +151 -7
- package/src/control-plane/ledger.ts +52 -2
- package/src/control-plane/server.ts +16 -2
- package/src/core-turn/deep-turn-bloom.ts +67 -0
- package/src/core-turn/research-policy.ts +37 -0
- package/src/core-turn/run-core-turn.ts +606 -95
- package/src/core-turn/run-goal-loop.ts +18 -0
- package/src/core-turn/types.ts +4 -0
- package/src/dashboard/chat/acp-chat.ts +10 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +161 -0
- package/src/dashboard/classic-sidetab-mission-pair.ts +81 -0
- package/src/dashboard/classic-sidetab-mission-trio.ts +219 -0
- package/src/dashboard/classic-sidetab-mission.ts +347 -0
- package/src/dashboard/index.ts +517 -18
- package/src/dashboard/input/agent-wake.ts +23 -1
- package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +17 -0
- package/src/dashboard/mission-cli-consumer.ts +165 -0
- package/src/dashboard/plugin-wizard-runtime.ts +50 -0
- package/src/dashboard/plugin-wizard-tool.ts +55 -0
- package/src/dashboard/seat-boot-preamble.ts +171 -1
- package/src/dashboard/side-basic-runtime.ts +54 -1
- package/src/dashboard/sidetab-runtime.ts +90 -1
- package/src/dashboard/skill-catalog-preamble.ts +101 -0
- package/src/dashboard/skill-detection-runtime.ts +55 -15
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
- package/src/dashboard/terminal-popup-runtime.ts +6 -3
- package/src/dashboard/turn-preamble.ts +53 -15
- package/src/dashboard/turn-prompt-runtime.ts +4 -2
- package/src/decisions/linear-progress-summary.ts +78 -0
- package/src/decisions/linear-progress-sync.ts +152 -0
- package/src/domains/outbound-alert.ts +49 -11
- package/src/domains/telegram-kind-route.ts +16 -9
- package/src/graph-runner/arg-allowance.ts +13 -0
- package/src/graph-runner/graph-cli.ts +23 -7
- package/src/graph-runner/graph-run-api.ts +3 -1
- package/src/graph-runner/graph-tick.ts +10 -2
- package/src/graph-runner/runner.ts +86 -18
- package/src/graph-wizard/mission-compose.ts +407 -12
- package/src/grok/agent-search.ts +14 -4
- package/src/grok/credential.ts +28 -11
- package/src/harness/dispatch-backpressure.ts +54 -1
- package/src/harness/dispatch-shadow-compare.ts +74 -0
- package/src/harness/harness-cli-command.ts +11 -1
- package/src/harness/harness-pod-dispatch.ts +81 -15
- package/src/harness/harness-stop.ts +155 -11
- package/src/harness/skill-exec.ts +21 -9
- package/src/harness/skill-select.ts +1 -1
- package/src/hooks/error-report-cloud.ts +101 -0
- package/src/hooks/receiver.ts +29 -2
- package/src/index.ts +159 -13
- package/src/instance/spawn-elanous.ts +6 -4
- package/src/intake-plane/actions.ts +354 -0
- package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
- package/src/intake-plane/intake-sources.ts +78 -8
- package/src/intake-plane/items.ts +14 -4
- package/src/intake-plane/linear-mission-sync.ts +80 -0
- package/src/intake-plane/linear-secretary-runtime.ts +178 -0
- package/src/intake-plane/linear-wish.ts +227 -1
- package/src/life/life-cli.ts +168 -0
- package/src/life/life-kinds.ts +160 -0
- package/src/live-supply/budget-consumer.ts +78 -0
- package/src/live-supply/read.ts +3 -0
- package/src/live-supply/snapshot.ts +45 -0
- package/src/llm/provider-credentials.ts +8 -2
- package/src/llm.ts +168 -9
- package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
- package/src/loops/orchestrator/tick.ts +13 -0
- package/src/maturity/feature-maturity.ts +4 -4
- package/src/msg/msg-sse-server.ts +3 -3
- package/src/msg/msg-store.ts +177 -19
- package/src/native-tool-catalog.ts +38 -4
- package/src/nexus/api/harness-traversal.ts +11 -0
- package/src/nexus/api/http-server.ts +37 -1
- package/src/nexus/api/mcp-public-allowlist.ts +2 -0
- package/src/nexus/index.ts +7 -2
- package/src/nexus/outbound/format.ts +9 -0
- package/src/nexus/outbound/router.ts +98 -13
- package/src/nexus/setup-status.ts +9 -0
- package/src/nexus/state/state.ts +3 -0
- package/src/oauth/codex-account-store.ts +20 -7
- package/src/oauth/codex-owner-mirror.ts +44 -0
- package/src/oauth/codex.ts +17 -2
- package/src/oauth/fallback-chain.ts +47 -17
- package/src/onboarding/first-run-doctor.ts +8 -1
- package/src/onboarding/first-run.ts +85 -26
- package/src/onboarding/key-setup.ts +103 -0
- package/src/onboarding/menu-answer.ts +13 -0
- package/src/onboarding/secret-prompt.ts +37 -0
- package/src/plugins/install/plugin-install.ts +59 -0
- package/src/pr-tool/census.ts +133 -2
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/tui-run-state.ts +188 -2
- package/src/registry/catalog-server.ts +232 -0
- package/src/registry/loader.ts +45 -1
- package/src/registry/types.ts +1 -2
- package/src/release-loop/checklist-target-path-hint.ts +13 -0
- package/src/release-loop/checklist.ts +9 -1
- package/src/repl/index.ts +43 -2
- package/src/research/axis-fanout.ts +136 -16
- package/src/research/bloom-exemplars.ts +3 -1
- package/src/research/gap-followup.ts +13 -1
- package/src/research/plugin-discovery.ts +36 -14
- package/src/research-bridge/invoke.ts +22 -5
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +72 -1
- package/src/self-dev/decompose.ts +119 -5
- package/src/self-dev/dev-cli.ts +4 -1
- package/src/self-dev/dev-pipeline.ts +5 -0
- package/src/self-dev/draft-residue.ts +64 -5
- package/src/self-dev/graph-front-nodes.ts +2 -1
- package/src/self-dev/graph-journey-route.ts +76 -21
- package/src/self-dev/launch-preflight-text.ts +5 -6
- package/src/self-dev/launch-preflight.ts +58 -0
- package/src/self-dev/orchestrate.ts +13 -3
- package/src/self-dev/review-provider-fallback.ts +9 -2
- package/src/self-dev/run-supervisor.ts +42 -4
- package/src/self-dev/run-types.ts +4 -0
- package/src/self-dev/shard-aggregate.ts +4 -0
- package/src/self-dev/shard-run.ts +36 -15
- package/src/self-implement/abandoned-classification.ts +12 -3
- package/src/self-implement/budget-gate.ts +7 -0
- package/src/self-implement/child-llm-preference.ts +10 -1
- package/src/self-implement/doctor-visit.ts +118 -8
- package/src/self-implement/elanous-tui-spawn.ts +3 -0
- package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
- package/src/self-implement/gate-artifacts.ts +2 -1
- package/src/self-implement/goal-author-cli.ts +4 -2
- package/src/self-implement/goal-author.ts +684 -7
- package/src/self-implement/graph-overlay-yaml.ts +37 -4
- package/src/self-implement/graph-overlay.ts +3 -1
- package/src/self-implement/graph-profile-yaml.ts +107 -0
- package/src/self-implement/graph-yaml.ts +26 -3
- package/src/self-implement/headless-elanous-driver.ts +31 -2
- package/src/self-implement/heal-intake.ts +112 -4
- package/src/self-implement/heal-triage.ts +20 -0
- package/src/self-implement/host-regate.ts +27 -4
- package/src/self-implement/merge-train.ts +5 -0
- package/src/self-implement/off-diff-evidence.ts +249 -5
- package/src/self-implement/orchestrator.ts +365 -25
- package/src/self-implement/regate-detail.ts +38 -1
- package/src/self-implement/rework-child-provider.ts +25 -0
- package/src/self-implement/run-chart.ts +122 -0
- package/src/self-implement/run-ledger.ts +162 -11
- package/src/self-implement/run-stop.ts +188 -4
- package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
- package/src/self-implement/stop-autoheal.ts +13 -0
- package/src/self-implement/tdd-evidence-tags.ts +9 -0
- package/src/self-implement/train-gate-receipt.ts +166 -0
- package/src/self-implement/train-gate-remote.ts +62 -18
- package/src/session/chat.ts +40 -4
- package/src/session/session-fanout.ts +2 -0
- package/src/session/streaming/acp-stream-sink.ts +2 -1
- package/src/session/streaming/chunk-producer.ts +6 -0
- package/src/session/streaming/stream-compositor.ts +3 -2
- package/src/session-runtime/index.ts +135 -5
- package/src/session-runtime/retry-policy.ts +1 -1
- package/src/session-runtime/tier-flip.ts +3 -3
- package/src/setup/llm-env-detect.ts +3 -0
- package/src/setup/service-key-catalog.ts +46 -0
- package/src/setup/service-keys.ts +241 -0
- package/src/sidetab-core/model.ts +19 -5
- package/src/sidetab-core/visible-agent-mission.ts +262 -0
- package/src/skills/name-match.ts +20 -0
- package/src/skills/tools/agent.ts +53 -6
- package/src/skills/tools/omni-search.ts +173 -13
- package/src/task-agent/parent-host.ts +10 -0
- package/src/task-agent/pod-distributor-entry.ts +3 -0
- package/src/task-agent/repair-outcomes.ts +65 -0
- package/src/task-agent/task-hand.ts +47 -7
- package/src/task-orchestrator/dispatcher.ts +14 -1
- package/src/task-orchestrator/linear-capture-events.ts +55 -0
- package/src/task-orchestrator/store.ts +16 -5
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +4 -0
- package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
- package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
- package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +178 -16
- package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +237 -41
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +337 -51
- package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
- package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
- package/src/task-orchestrator/types.ts +14 -0
- package/src/telegram.ts +14 -16
- package/src/terminal/coding-agent.ts +14 -5
- package/src/terminal/session-registry.ts +1 -1
- package/src/tokens.ts +35 -2
- package/src/tool-hints/gate.ts +1 -0
- package/src/tool-runtime/agent-runtime.ts +2 -0
- package/src/tool-runtime/browser-hand-runtime.ts +381 -0
- package/src/tool-runtime/browser-runtime.ts +2 -1
- package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
- package/src/tool-runtime/elanous-linear-secretary-runtime.ts +57 -0
- package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
- package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
- package/src/tool-runtime/index.ts +6 -0
- package/src/tool-runtime/skill-exec-runtime.ts +33 -13
- package/src/tool-runtime/types.ts +4 -0
- package/src/tui/entry.ts +38 -5
- package/src/tui/sidetab/attach.ts +177 -1
- package/src/tui/sidetab/herdr-portal.ts +225 -0
- package/src/tui-client/local-chat-turn.ts +26 -13
- package/src/tui.ts +22 -0
- package/src/user-config.ts +34 -9
- package/src/user-intent/types.ts +4 -3
- package/src/ux-sim/browser-hand.ts +165 -0
- package/src/ux-sim/draft-inventory-builder.ts +198 -0
- package/src/ux-sim/fake-browser-page.ts +81 -0
- package/src/ux-sim/fake-kubectl.ts +37 -3
- package/src/ux-sim/fake-linear-device.ts +31 -0
- package/src/ux-sim/fault-pool-cap.ts +11 -6
- package/src/ux-sim/graph-engine-sim.ts +47 -0
- package/src/ux-sim/linear-secretary.ts +216 -0
- package/src/ux-sim/mock-scenario-catalog.json +93 -0
- package/src/ux-sim/mock-scenario-catalog.ts +274 -0
- package/src/ux-sim/onboarding-first-run-device.ts +31 -21
- package/src/ux-sim/scenario.ts +185 -48
- package/src/ux-sim/service-key-setup.ts +50 -0
- package/src/ux-sim/term-slash-device.ts +74 -0
- package/src/ux-sim/turn-throw-sim.ts +31 -0
- package/src/version/packed-revision.json +1 -1
- package/src/voice/voice-tts-singleton.ts +18 -3
- package/src/web-search/exa.ts +77 -0
- package/src/web-search/grok.ts +5 -9
- package/src/web-search/index.ts +30 -9
- package/src/web-search/provider.ts +4 -1
- package/src/web-search/x-intent.ts +5 -0
- package/apps/pwa/out/_next/static/chunks/1115.434ae2ecb0ad986d.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +0 -287
- package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1661.0dd330f3d89f73f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +0 -90
- package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +0 -77
- package/apps/pwa/out/_next/static/chunks/1971-7efb628c471dc5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2073.689dcb2680113d76.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +0 -1
- package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2527-5c636a43c7cc5dde.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +0 -32
- package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +0 -79
- package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +0 -148
- package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +0 -226
- package/apps/pwa/out/_next/static/chunks/4667.97e31aa38c95c475.js +0 -309
- package/apps/pwa/out/_next/static/chunks/4702.4a4adc1f16d7c93b.js +0 -64
- package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +0 -94
- package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +0 -24
- package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5937.c2df9e3447e1f667.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +0 -286
- package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +0 -27
- package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6552.a3840aa7da35ad68.js +0 -62
- package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +0 -122
- package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7191.fdc955f7d96064a4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8050-9b364bdef8f71927.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +0 -104
- package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9541.eb8e2f8480c7feca.js +0 -93
- package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +0 -34
- package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-14949db884bfa672.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +0 -1
- package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
- /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
package/src/llm.ts
CHANGED
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
DEFAULT_PROVIDER,
|
|
28
28
|
} from './config.js';
|
|
29
29
|
import { debug, redactSecrets, redactSecretText } from './debug/log.js';
|
|
30
|
+
import { estimateMessagesTokens } from './tokens.js';
|
|
30
31
|
import { isVerifiedOpenGatewayModel } from './llm/opengateway-models.js';
|
|
31
32
|
import { llmUsageCostFields } from './budget/llm-cost.js';
|
|
32
33
|
import { accumulateByokUsage } from './llm/openrouter-byok-cost.js';
|
|
@@ -274,6 +275,13 @@ export interface LLMMessage {
|
|
|
274
275
|
phase?: 'commentary' | 'partial_answer' | 'final_answer';
|
|
275
276
|
/** Opaque Codex stateless reasoning items, before this assistant message. */
|
|
276
277
|
codexReasoningItems?: Array<{ type: 'reasoning'; encrypted_content: string; summary: unknown[]; id?: string }>;
|
|
278
|
+
/** TUI-PROMPT-CACHE-PREFIX — a `system` message whose text changes between
|
|
279
|
+
* requests of one session (seat boot card · git snapshot · memory · self
|
|
280
|
+
* health · per-turn guidance). The Codex Responses serializer keeps these
|
|
281
|
+
* OUT of `instructions` (which must stay byte-stable for prompt-cache
|
|
282
|
+
* prefix reuse) and sends them as a `developer` item placed just before
|
|
283
|
+
* the latest user message. Other providers ignore the flag. */
|
|
284
|
+
cacheVolatile?: boolean;
|
|
277
285
|
}
|
|
278
286
|
|
|
279
287
|
/** JSONSchema-shaped tool definition sent to the provider (no handler). */
|
|
@@ -1707,6 +1715,15 @@ export interface MessagesToResponsesInputOpts {
|
|
|
1707
1715
|
replayCodexReasoning?: boolean;
|
|
1708
1716
|
acceptUserMessageImages?: boolean;
|
|
1709
1717
|
onOrphanToolResult?: (callId: string) => void;
|
|
1718
|
+
/** TUI-PROMPT-CACHE-PREFIX — keep `instructions` stable for the prompt
|
|
1719
|
+
* cache prefix. When true: (a) leading `system` messages flagged
|
|
1720
|
+
* `cacheVolatile` are merged into ONE `developer` item inserted right
|
|
1721
|
+
* before the latest user text message (after the cached history), and
|
|
1722
|
+
* (b) `system` messages that appear after the conversation started
|
|
1723
|
+
* (loop self-notes, mid-turn hints) are emitted IN PLACE as `developer`
|
|
1724
|
+
* items instead of being folded into `instructions`. Default false keeps
|
|
1725
|
+
* the legacy "every system → instructions" fold. */
|
|
1726
|
+
stablePrefix?: boolean;
|
|
1710
1727
|
}
|
|
1711
1728
|
|
|
1712
1729
|
/** Exported for tests. Converts the unified LLMMessage shape into the
|
|
@@ -1747,6 +1764,11 @@ export function messagesToResponsesInput(
|
|
|
1747
1764
|
|
|
1748
1765
|
const sys: string[] = [];
|
|
1749
1766
|
const input: ResponsesInputItem[] = [];
|
|
1767
|
+
const stablePrefix = opts.stablePrefix === true;
|
|
1768
|
+
// Leading volatile system text (stablePrefix only) — spliced in before the
|
|
1769
|
+
// latest user text message once the whole input is assembled.
|
|
1770
|
+
const volatileSys: string[] = [];
|
|
1771
|
+
let conversationStarted = false;
|
|
1750
1772
|
for (const m of messages) {
|
|
1751
1773
|
// Build typed content blocks: text accumulated into one block,
|
|
1752
1774
|
// images appended as separate input_image entries. The old
|
|
@@ -1873,9 +1895,20 @@ export function messagesToResponsesInput(
|
|
|
1873
1895
|
}
|
|
1874
1896
|
|
|
1875
1897
|
if (m.role === 'system') {
|
|
1898
|
+
if (stablePrefix && conversationStarted) {
|
|
1899
|
+
// Mid-conversation system note → in-place developer item. Folding it
|
|
1900
|
+
// into `instructions` would rewrite the cache prefix every round.
|
|
1901
|
+
if (textBuf) input.push({ role: 'developer', content: [{ type: 'input_text', text: textBuf }] });
|
|
1902
|
+
continue;
|
|
1903
|
+
}
|
|
1904
|
+
if (stablePrefix && m.cacheVolatile) {
|
|
1905
|
+
if (textBuf) volatileSys.push(textBuf);
|
|
1906
|
+
continue;
|
|
1907
|
+
}
|
|
1876
1908
|
sys.push(textBuf);
|
|
1877
1909
|
continue;
|
|
1878
1910
|
}
|
|
1911
|
+
conversationStarted = true;
|
|
1879
1912
|
|
|
1880
1913
|
// Stateless Codex requires the opaque reasoning item in its original
|
|
1881
1914
|
// position before the corresponding assistant message/tool calls.
|
|
@@ -1901,6 +1934,13 @@ export function messagesToResponsesInput(
|
|
|
1901
1934
|
}
|
|
1902
1935
|
input.push(...trailingItems);
|
|
1903
1936
|
}
|
|
1937
|
+
if (volatileSys.length > 0) {
|
|
1938
|
+
const developerItem: ResponsesInputItem = {
|
|
1939
|
+
role: 'developer',
|
|
1940
|
+
content: [{ type: 'input_text', text: volatileSys.join('\n\n') }],
|
|
1941
|
+
};
|
|
1942
|
+
input.splice(latestUserTextIndex(input), 0, developerItem);
|
|
1943
|
+
}
|
|
1904
1944
|
if (input.length === 0) input.push({ role: 'user', content: [{ type: 'input_text', text: '' }] });
|
|
1905
1945
|
return {
|
|
1906
1946
|
instructions: sys.length ? sys.join('\n\n') : 'You are a helpful assistant.',
|
|
@@ -1908,6 +1948,17 @@ export function messagesToResponsesInput(
|
|
|
1908
1948
|
};
|
|
1909
1949
|
}
|
|
1910
1950
|
|
|
1951
|
+
/** Index of the latest user message carrying text/image content (not a bare
|
|
1952
|
+
* tool output). Volatile per-turn context goes right before it, so the
|
|
1953
|
+
* history before it stays a stable cached prefix. No such message → end. */
|
|
1954
|
+
function latestUserTextIndex(input: readonly ResponsesInputItem[]): number {
|
|
1955
|
+
for (let i = input.length - 1; i >= 0; i--) {
|
|
1956
|
+
const item = input[i]!;
|
|
1957
|
+
if ('role' in item && item.role === 'user') return i;
|
|
1958
|
+
}
|
|
1959
|
+
return input.length;
|
|
1960
|
+
}
|
|
1961
|
+
|
|
1911
1962
|
/** store=true wave: compute the incremental tail when `current` is a
|
|
1912
1963
|
* strict extension of `prev`. Returns null when the previous input
|
|
1913
1964
|
* isn't usable as a baseline — caller falls back to full input + no
|
|
@@ -1960,6 +2011,35 @@ export function computePromptCacheKey(model: string, instructions: string): stri
|
|
|
1960
2011
|
return createHash('sha256').update(`${model}::${prefix}`).digest('hex').slice(0, 32);
|
|
1961
2012
|
}
|
|
1962
2013
|
|
|
2014
|
+
/** TUI-PROMPT-CACHE-PREFIX — per-conversation cache affinity for the Codex
|
|
2015
|
+
* Responses backend. Mirrors ref/codex `core/src/client.rs`
|
|
2016
|
+
* (`PromptCacheKey::SessionDerived` → the session id itself is the
|
|
2017
|
+
* `prompt_cache_key`, and the same id rides the `session-id` header —
|
|
2018
|
+
* `codex-api/src/requests/headers.rs`; the underscored `session_id` alias
|
|
2019
|
+
* was dropped upstream in #22193 because proxies reject `_` headers).
|
|
2020
|
+
*
|
|
2021
|
+
* Precedence: chat `sessionId` → harness run `ELANOUS_RUN_ID`. Neither →
|
|
2022
|
+
* null and the caller falls back to the legacy instructions-prefix key.
|
|
2023
|
+
* Ids that are long (> 64 chars — the prompt_cache_key limit) or carry
|
|
2024
|
+
* characters outside `[A-Za-z0-9._:-]` fold to `elanous-<sha256/32>`. */
|
|
2025
|
+
export function codexSessionCacheKey(
|
|
2026
|
+
sessionId: string | undefined,
|
|
2027
|
+
runId: string | undefined,
|
|
2028
|
+
): { key: string; source: 'session' | 'run'; hashed: boolean } | null {
|
|
2029
|
+
const s = sessionId && sessionId.trim() ? sessionId : undefined;
|
|
2030
|
+
const r = runId && runId.trim() ? runId : undefined;
|
|
2031
|
+
const raw = s ?? r;
|
|
2032
|
+
if (!raw) return null;
|
|
2033
|
+
const source = s ? 'session' : 'run';
|
|
2034
|
+
if (raw.length <= 64 && /^[A-Za-z0-9._:-]+$/.test(raw)) return { key: raw, source, hashed: false };
|
|
2035
|
+
return { key: `elanous-${createHash('sha256').update(raw).digest('hex').slice(0, 32)}`, source, hashed: true };
|
|
2036
|
+
}
|
|
2037
|
+
|
|
2038
|
+
/** Short content hash for request-stability observation (logs only). */
|
|
2039
|
+
function stabilityHash(value: string): string {
|
|
2040
|
+
return createHash('sha256').update(value).digest('hex').slice(0, 16);
|
|
2041
|
+
}
|
|
2042
|
+
|
|
1963
2043
|
/** Cycle order for the HUD pill click + `/reasoning` no-arg form. */
|
|
1964
2044
|
export const REASONING_CYCLE: readonly import('./user-config.js').ReasoningLevel[] =
|
|
1965
2045
|
['off', 'low', 'medium', 'high', 'xhigh'] as const;
|
|
@@ -2240,8 +2320,12 @@ function buildCodexResponsesWireBody(
|
|
|
2240
2320
|
previousResponseId?: string;
|
|
2241
2321
|
},
|
|
2242
2322
|
promptCache: boolean,
|
|
2323
|
+
/** Session-derived key (codexSessionCacheKey). Absent → legacy key. */
|
|
2324
|
+
sessionCacheKey?: string,
|
|
2243
2325
|
): Record<string, unknown> {
|
|
2244
|
-
const cacheKey = promptCache
|
|
2326
|
+
const cacheKey = promptCache
|
|
2327
|
+
? (sessionCacheKey ?? computePromptCacheKey(body.model, body.instructions))
|
|
2328
|
+
: undefined;
|
|
2245
2329
|
return {
|
|
2246
2330
|
...body,
|
|
2247
2331
|
stream: true,
|
|
@@ -2259,8 +2343,9 @@ function buildCodexResponsesWireBody(
|
|
|
2259
2343
|
function serializeCodexResponsesWireBody(
|
|
2260
2344
|
body: Parameters<typeof buildCodexResponsesWireBody>[0],
|
|
2261
2345
|
promptCache: boolean,
|
|
2346
|
+
sessionCacheKey?: string,
|
|
2262
2347
|
): string {
|
|
2263
|
-
return JSON.stringify(buildCodexResponsesWireBody(body, promptCache));
|
|
2348
|
+
return JSON.stringify(buildCodexResponsesWireBody(body, promptCache, sessionCacheKey));
|
|
2264
2349
|
}
|
|
2265
2350
|
|
|
2266
2351
|
export async function* streamCodexResponsesEvents(
|
|
@@ -2320,9 +2405,14 @@ export async function* streamCodexResponsesEvents(
|
|
|
2320
2405
|
onResponseCreated?: (id: string) => void;
|
|
2321
2406
|
/** Unused configured fallbacks. Overload k times switches before retries. */
|
|
2322
2407
|
remainingFallbacks?: number;
|
|
2408
|
+
/** TUI-PROMPT-CACHE-PREFIX — conversation id for cache affinity. When
|
|
2409
|
+
* set (or `ELANOUS_RUN_ID` is), `prompt_cache_key` is session-derived
|
|
2410
|
+
* and the `session-id` header is sent (ref/codex parity). */
|
|
2411
|
+
sessionId?: string;
|
|
2323
2412
|
} = {},
|
|
2324
2413
|
): AsyncGenerator<LLMStreamEvent, void, unknown> {
|
|
2325
2414
|
const startedAt = Date.now();
|
|
2415
|
+
const sessionAffinity = codexSessionCacheKey(extra.sessionId, process.env.ELANOUS_RUN_ID);
|
|
2326
2416
|
// See comment in streamOpenAIEvents — we drop the raw body by
|
|
2327
2417
|
// default. `/debug verbose on` restores the full body for deep
|
|
2328
2418
|
// reproduction.
|
|
@@ -2340,6 +2430,16 @@ export async function* streamCodexResponsesEvents(
|
|
|
2340
2430
|
inputChars: (() => { try { return JSON.stringify(body.input).length; } catch { return -1; } })(),
|
|
2341
2431
|
toolChars: (() => { try { return JSON.stringify(body.tools ?? []).length; } catch { return -1; } })(),
|
|
2342
2432
|
instructionChars: body.instructions.length,
|
|
2433
|
+
// TUI-PROMPT-CACHE-PREFIX — prefix stability: two requests of one
|
|
2434
|
+
// session must log the same instructionsHash ⊕ toolsHash ⊕ cacheKey.
|
|
2435
|
+
instructionsHash: stabilityHash(body.instructions),
|
|
2436
|
+
toolsHash: (() => { try { return stabilityHash(JSON.stringify(body.tools ?? [])); } catch { return 'unhashable'; } })(),
|
|
2437
|
+
toolChoice: body.tool_choice ?? null,
|
|
2438
|
+
promptCacheKey: extra.promptCache === false
|
|
2439
|
+
? null
|
|
2440
|
+
: (sessionAffinity?.key ?? computePromptCacheKey(body.model, body.instructions)).slice(0, 24),
|
|
2441
|
+
cacheKeySource: extra.promptCache === false ? 'off' : (sessionAffinity?.source ?? 'instructions-prefix'),
|
|
2442
|
+
sessionHeader: sessionAffinity !== null,
|
|
2343
2443
|
tools: observeRequestTools(body.tools),
|
|
2344
2444
|
instructions: body.instructions.slice(0, 200),
|
|
2345
2445
|
accountId: extra.accountId ? `${extra.accountId.slice(0, 8)}…` : '(none)',
|
|
@@ -2367,7 +2467,7 @@ export async function* streamCodexResponsesEvents(
|
|
|
2367
2467
|
const promptCache = extra.promptCache !== false;
|
|
2368
2468
|
// TUI-REQUEST-SIZE-COMPACT — the exact serializer is shared with the
|
|
2369
2469
|
// preflight guard, so the size decision and fetch body cannot drift.
|
|
2370
|
-
const wireBody = buildCodexResponsesWireBody(body, promptCache);
|
|
2470
|
+
const wireBody = buildCodexResponsesWireBody(body, promptCache, sessionAffinity?.key);
|
|
2371
2471
|
const wireJson = extra.serializedWireBody ?? JSON.stringify(wireBody);
|
|
2372
2472
|
debug.log('llm.request', 'request-size', {
|
|
2373
2473
|
provider: 'openai-codex',
|
|
@@ -2391,6 +2491,9 @@ export async function* streamCodexResponsesEvents(
|
|
|
2391
2491
|
// is treated as an old client → 400 "requires a newer version of
|
|
2392
2492
|
// Codex". See getCodexUserAgent (oauth/codex.ts).
|
|
2393
2493
|
'User-Agent': getCodexUserAgent(),
|
|
2494
|
+
// ChatGPT derives cache affinity from this header (ref/codex
|
|
2495
|
+
// client.rs `responses_session_id` → `build_session_headers`).
|
|
2496
|
+
...(sessionAffinity ? { 'session-id': sessionAffinity.key } : {}),
|
|
2394
2497
|
},
|
|
2395
2498
|
body: wireJson,
|
|
2396
2499
|
signal,
|
|
@@ -4474,7 +4577,8 @@ function configuredFallbackChainSteps(): readonly string[] {
|
|
|
4474
4577
|
try {
|
|
4475
4578
|
const { getUserConfig } = require('./user-config.js') as typeof import('./user-config.js');
|
|
4476
4579
|
const { normalizeFallbackChain } = require('./oauth/fallback-chain.js') as typeof import('./oauth/fallback-chain.js');
|
|
4477
|
-
|
|
4580
|
+
const llm = getUserConfig().llm;
|
|
4581
|
+
return normalizeFallbackChain(llm.fallbackChain, llm.provider).chain;
|
|
4478
4582
|
} catch (err) {
|
|
4479
4583
|
// ⛔ 조용히 삼키면 「설정을 못 읽었다」가 「폴백 후보가 없다」로 «둔갑»한다 —
|
|
4480
4584
|
// 호출자는 그것을 `fallback candidates exhausted` 로 보고 사람에게 그렇게 말한다.
|
|
@@ -5828,8 +5932,19 @@ async function tryForceSynthesisPass(args: {
|
|
|
5828
5932
|
* / error), this function emits a clear signal to wipe any
|
|
5829
5933
|
* partial text it streamed. */
|
|
5830
5934
|
streamingHandlers?: { onText: (delta: string, accumulated: string) => void };
|
|
5935
|
+
/** TUI-PROMPT-CACHE-PREFIX — the turn's session + tools. On Codex the pass
|
|
5936
|
+
* keeps the same tools array (tool_choice:'none') and session cache key so
|
|
5937
|
+
* it reuses the cached prefix instead of rewriting it with tools dropped. */
|
|
5938
|
+
sessionId?: string;
|
|
5939
|
+
tools?: LLMToolSpec[];
|
|
5831
5940
|
}): Promise<string | null> {
|
|
5832
5941
|
const { provider, model, history, turn, modelFamily, streamingHandlers } = args;
|
|
5942
|
+
const keepToolsNoCall = provider.name === 'openai-codex' && (args.tools?.length ?? 0) > 0;
|
|
5943
|
+
const synthesisOpts: LLMOpts = {
|
|
5944
|
+
model,
|
|
5945
|
+
...(args.sessionId ? { sessionId: args.sessionId } : {}),
|
|
5946
|
+
...(keepToolsNoCall ? { tools: args.tools, toolChoice: 'none' as const } : {}),
|
|
5947
|
+
};
|
|
5833
5948
|
const synthesisPromptMsg: LLMMessage = {
|
|
5834
5949
|
role: 'user',
|
|
5835
5950
|
content:
|
|
@@ -5862,7 +5977,7 @@ async function tryForceSynthesisPass(args: {
|
|
|
5862
5977
|
try {
|
|
5863
5978
|
let collected = '';
|
|
5864
5979
|
const MAX_OUTPUT_CHARS = 8000;
|
|
5865
|
-
for await (const delta of provider.chat(synthesisHistory, {
|
|
5980
|
+
for await (const delta of provider.chat(synthesisHistory, { ...synthesisOpts, signal: f2Controller.signal })) {
|
|
5866
5981
|
collected += delta;
|
|
5867
5982
|
// Live progressive emit — TUI shows synthesis text as it
|
|
5868
5983
|
// generates instead of all-at-once at the end (user-reported
|
|
@@ -8889,6 +9004,10 @@ export async function streamLLMWithTools(
|
|
|
8889
9004
|
// read-time projection 등 교체. 문맥관리를 substrate 프리미티브로 통일(streamLLMWithTools 인라인 산재 해소).
|
|
8890
9005
|
const { createDefaultContextStrategy: _makeContextStrategy } = require('./agent-substrate/context-strategy.js') as typeof import('./agent-substrate/context-strategy.js');
|
|
8891
9006
|
const _contextStrategy = opts.contextStrategy ?? _makeContextStrategy();
|
|
9007
|
+
// Latest provider prompt usage is the trigger baseline. Add estimated growth
|
|
9008
|
+
// appended to history after that request (usually tool output) at the next loop.
|
|
9009
|
+
let previousInputTokens: number | undefined;
|
|
9010
|
+
let previousRequestEstimatedTokens: number | undefined;
|
|
8892
9011
|
let loopTermination: 'budget-exhausted' | 'aborted' = 'budget-exhausted';
|
|
8893
9012
|
let terminalTurn = maxTurns;
|
|
8894
9013
|
|
|
@@ -8976,7 +9095,21 @@ export async function streamLLMWithTools(
|
|
|
8976
9095
|
// ★ 조각2 — pluggable context 전략(기본=2-tier compaction·무회귀 이관). 판정+압축을 substrate 프리미티브가
|
|
8977
9096
|
// 수행 → caller 는 splice/관측/breaker 만. 주입(opts.contextStrategy)으로 read-time projection 등 교체 가능.
|
|
8978
9097
|
const beforeLen = history.length;
|
|
8979
|
-
const outcome = await _contextStrategy.compact(history, {
|
|
9098
|
+
const outcome = await _contextStrategy.compact(history, {
|
|
9099
|
+
model: effectiveModel,
|
|
9100
|
+
...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
|
|
9101
|
+
config: acCfg,
|
|
9102
|
+
...(previousInputTokens !== undefined ? {
|
|
9103
|
+
observedInputTokens: previousInputTokens + Math.max(
|
|
9104
|
+
0,
|
|
9105
|
+
estimateMessagesTokens(history) - (previousRequestEstimatedTokens ?? estimateMessagesTokens(history)),
|
|
9106
|
+
),
|
|
9107
|
+
} : {}),
|
|
9108
|
+
});
|
|
9109
|
+
// This usage event belongs to the request before this compaction
|
|
9110
|
+
// decision; do not carry it into another loop iteration.
|
|
9111
|
+
previousInputTokens = undefined;
|
|
9112
|
+
previousRequestEstimatedTokens = undefined;
|
|
8980
9113
|
if (outcome.fired && outcome.reduced) {
|
|
8981
9114
|
history.splice(0, history.length, ...outcome.messages);
|
|
8982
9115
|
// ★ 관측(2026-07-21) — beforeTokens/afterTokens 포함(reduced 는 개수 아닌 **토큰** 감소로 판정).
|
|
@@ -9029,7 +9162,19 @@ export async function streamLLMWithTools(
|
|
|
9029
9162
|
// revert to auto (see above).
|
|
9030
9163
|
const buildTurnOpts = () => {
|
|
9031
9164
|
const remainingFallbacks = opts.provider ? 0 : remainingFallbackProviderNames(attemptedProviders, opts).length;
|
|
9032
|
-
|
|
9165
|
+
// TUI-PROMPT-CACHE-PREFIX — on Codex the final-answer turn shares the
|
|
9166
|
+
// session cache key, so dropping tools would rewrite the cached prefix
|
|
9167
|
+
// (measured toolChars 67k → 2). Keep the same tools and forbid calls
|
|
9168
|
+
// with tool_choice:'none' instead. Other providers keep the legacy
|
|
9169
|
+
// empty tools (some ignore toolChoice).
|
|
9170
|
+
const keepToolsNoCall = completionNeedsFinalTurn && activeProvider.name === 'openai-codex';
|
|
9171
|
+
const base = {
|
|
9172
|
+
...opts,
|
|
9173
|
+
model: activeModel,
|
|
9174
|
+
tools: completionNeedsFinalTurn && !keepToolsNoCall ? [] : activeTools,
|
|
9175
|
+
remainingFallbacks,
|
|
9176
|
+
};
|
|
9177
|
+
if (keepToolsNoCall) return { ...base, toolChoice: 'none' as const };
|
|
9033
9178
|
return turn === 0 ? base : { ...base, toolChoice: undefined };
|
|
9034
9179
|
};
|
|
9035
9180
|
let turnOpts = buildTurnOpts();
|
|
@@ -9148,6 +9293,7 @@ export async function streamLLMWithTools(
|
|
|
9148
9293
|
: turnOpts.toolChoice,
|
|
9149
9294
|
};
|
|
9150
9295
|
const providerMessages = mapProviderToolNamesInMessages(history, nameMap.toProviderName);
|
|
9296
|
+
previousRequestEstimatedTokens = estimateMessagesTokens(providerMessages);
|
|
9151
9297
|
streamIter = restoreProviderToolCallNames(
|
|
9152
9298
|
activeProvider.streamChat!(providerMessages, providerOpts),
|
|
9153
9299
|
nameMap.toOriginalName,
|
|
@@ -9397,6 +9543,10 @@ export async function streamLLMWithTools(
|
|
|
9397
9543
|
} else if (ev.type === 'usage') {
|
|
9398
9544
|
// Provider parsers normalize inputTokens to uncached input; cache
|
|
9399
9545
|
// reads/writes are separate fields (prompt-cache/types.ts contract).
|
|
9546
|
+
const observedPromptTokens = (ev.usage.inputTokens ?? 0)
|
|
9547
|
+
+ (ev.usage.cacheReadInputTokens ?? 0)
|
|
9548
|
+
+ (ev.usage.cacheCreationInputTokens ?? 0);
|
|
9549
|
+
if (observedPromptTokens > 0) previousInputTokens = observedPromptTokens;
|
|
9400
9550
|
// ⭐ 주 에이전트 턴의 토큰·비용을 «게이트 없이» 남긴다(2026-09-24 실측: 이 줄이 없어 3시간 `llm.usage`
|
|
9401
9551
|
// 18행이 전부 곁가지 두 자리였고, 하니스 런 비용의 거의 전부가 관측 밖이었다). 곁가지와 같은 모양 ·
|
|
9402
9552
|
// 모르는 모델은 금액 대신 `cost.kind='unknown'`. runId 는 debug.log 가 붙인다. 실패해도 턴은 계속.
|
|
@@ -11552,6 +11702,8 @@ export async function streamLLMWithTools(
|
|
|
11552
11702
|
history,
|
|
11553
11703
|
turn,
|
|
11554
11704
|
modelFamily,
|
|
11705
|
+
...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
|
|
11706
|
+
tools: activeTools,
|
|
11555
11707
|
// Live progressive streaming — deltas emit through handlers
|
|
11556
11708
|
// during collection so TUI shows synthesis text as it
|
|
11557
11709
|
// generates instead of one big chunk at the end.
|
|
@@ -12198,6 +12350,7 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
|
|
|
12198
12350
|
acceptToolImages: codexAcceptToolImages,
|
|
12199
12351
|
acceptUserMessageImages: codexAcceptUserImages,
|
|
12200
12352
|
replayCodexReasoning: !useStore,
|
|
12353
|
+
stablePrefix: true,
|
|
12201
12354
|
onOrphanToolResult: (callId) => {
|
|
12202
12355
|
try { debug.log('llm.codex', 'orphan-tool-output-dropped', { callId }); }
|
|
12203
12356
|
catch { /* observation must not block the request */ }
|
|
@@ -12254,6 +12407,7 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
|
|
|
12254
12407
|
? messagesToResponsesInput(messages, {
|
|
12255
12408
|
acceptToolImages: codexAcceptToolImages,
|
|
12256
12409
|
acceptUserMessageImages: codexAcceptUserImages,
|
|
12410
|
+
stablePrefix: true,
|
|
12257
12411
|
}).input
|
|
12258
12412
|
: input);
|
|
12259
12413
|
const wirePrevId = (delta && lastResponseId) ? lastResponseId : undefined;
|
|
@@ -12274,9 +12428,12 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
|
|
|
12274
12428
|
};
|
|
12275
12429
|
const requestGuard = opts.requestSizeGuard;
|
|
12276
12430
|
const promptCache = opts.promptCache !== false;
|
|
12431
|
+
// TUI-PROMPT-CACHE-PREFIX — the preflight must measure the same body
|
|
12432
|
+
// streamCodexResponsesEvents would build (session-derived key).
|
|
12433
|
+
const sessionCacheKey = codexSessionCacheKey(opts.sessionId, process.env.ELANOUS_RUN_ID)?.key;
|
|
12277
12434
|
let serializedWireBody: string | undefined;
|
|
12278
12435
|
if (requestGuard) {
|
|
12279
|
-
serializedWireBody = serializeCodexResponsesWireBody(requestBody, promptCache);
|
|
12436
|
+
serializedWireBody = serializeCodexResponsesWireBody(requestBody, promptCache, sessionCacheKey);
|
|
12280
12437
|
let requestChars = serializedWireBody.length;
|
|
12281
12438
|
const initialRequestChars = requestChars;
|
|
12282
12439
|
let requestCompacted = false;
|
|
@@ -12295,9 +12452,10 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
|
|
|
12295
12452
|
// Compaction runs only when store threading is off, matching
|
|
12296
12453
|
// the original non-threaded wire input policy.
|
|
12297
12454
|
replayCodexReasoning: !useStore,
|
|
12455
|
+
stablePrefix: true,
|
|
12298
12456
|
});
|
|
12299
12457
|
const compactBody = { ...requestBody, instructions: compactInput.instructions, input: compactInput.input };
|
|
12300
|
-
const compactWireBody = serializeCodexResponsesWireBody(compactBody, promptCache);
|
|
12458
|
+
const compactWireBody = serializeCodexResponsesWireBody(compactBody, promptCache, sessionCacheKey);
|
|
12301
12459
|
const compactChars = compactWireBody.length;
|
|
12302
12460
|
if (compactChars < requestChars) {
|
|
12303
12461
|
messages.splice(0, messages.length, ...compacted.messages);
|
|
@@ -12341,6 +12499,7 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
|
|
|
12341
12499
|
yield* streamCodexResponsesEvents(responsesUrl, tokens.accessToken, requestBody, opts.signal, {
|
|
12342
12500
|
accountId,
|
|
12343
12501
|
promptCache,
|
|
12502
|
+
...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
|
|
12344
12503
|
...(serializedWireBody ? { serializedWireBody } : {}),
|
|
12345
12504
|
// Capture the new response id from the SSE stream so the
|
|
12346
12505
|
// next call can thread it. If the backend skips the event
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* COORD-ENTRANCE-FOLD · 0.2.42 칸 · TASK-AGENT(OP 디스패처) — 셸 디스패처 은퇴 결정 카드.
|
|
3
|
+
*
|
|
4
|
+
* 배경: 대표 10-19 «중간층(런 닥터 r3·rework · 입구 디스패처)이 0.2.35 최우선 병목» ·
|
|
5
|
+
* seat-state/OP/PLAN-mid-tier-loops-2026-10-19.md §5.
|
|
6
|
+
*
|
|
7
|
+
* 판정 신호: 조율자 그림자가 ④ 빌더로 같은 칸·같은 지시서를 달력 기준 3일 연속
|
|
8
|
+
* 디스패치하면 «셸 디스패처 은퇴» 결정 카드를 기존 결정 원장(src/decisions/decision-ledger.ts,
|
|
9
|
+
* `decisions/decisions.jsonl`) 부가 형식 그대로 정확히 1장 올린다.
|
|
10
|
+
*
|
|
11
|
+
* 그림자 디스패치 원장(<root>/seat-state/OP/coordinator-shadow-dispatch.jsonl)은
|
|
12
|
+
* 조율자 그림자 디스패처가 한 줄씩 적는 JSONL 이다:
|
|
13
|
+
* {"date":"2026-03-02","agent":"builder-4","cell":"src/x/y.ts","directive":"DIR-123"}
|
|
14
|
+
* (별칭 허용: date=day · agent=target · cell=lane · directive=directiveId)
|
|
15
|
+
*/
|
|
16
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
17
|
+
import { dirname, join } from 'node:path';
|
|
18
|
+
import { DecisionLedger } from '../../decisions/decision-ledger.js';
|
|
19
|
+
import { withFileLockSync } from '../../storage/file-lock.js';
|
|
20
|
+
import { findGitDir } from '../../git-fs/locate.js';
|
|
21
|
+
|
|
22
|
+
export interface CoordinatorShadowDispatch {
|
|
23
|
+
/** 달력 날짜(YYYY-MM-DD, 생산 기록은 UTC ISO 날짜). */
|
|
24
|
+
date: string;
|
|
25
|
+
/** 대상 에이전트(예: builder-4). */
|
|
26
|
+
agent: string;
|
|
27
|
+
/** 작업을 받은 과제 소유 seat (`tasks hand --seat`). */
|
|
28
|
+
recipient?: string;
|
|
29
|
+
/** 칸(대상 경로). */
|
|
30
|
+
cell: string;
|
|
31
|
+
/** 지시서 id. */
|
|
32
|
+
directive: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface CoordinatorShadowStreak {
|
|
36
|
+
agent: string;
|
|
37
|
+
recipient?: string;
|
|
38
|
+
cell: string;
|
|
39
|
+
directive: string;
|
|
40
|
+
/** 연속을 이룬 세 달력 날짜(직전2일·오늘, 오름차순). */
|
|
41
|
+
dates: [string, string, string];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface CoordinatorShadowTickOptions {
|
|
45
|
+
/** 저장소/worktree 루트 — 그림자 디스패치 원장 기준 경로. 생산 기본: cwd 트리. */
|
|
46
|
+
root?: string;
|
|
47
|
+
/** 결정 원장 stateDir. 생산 기본: elanousStateRoot(). */
|
|
48
|
+
stateDir?: string;
|
|
49
|
+
/** 시계 주입(생산: 실제 Date). */
|
|
50
|
+
now?: () => Date;
|
|
51
|
+
/** 원장 행 직접 주입(시험용 — 생산 호출 경로는 그대로 지나간다). */
|
|
52
|
+
dispatches?: CoordinatorShadowDispatch[];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface CoordinatorShadowTickResult {
|
|
56
|
+
/** 판정 기준일(YYYY-MM-DD). */
|
|
57
|
+
checked: string;
|
|
58
|
+
evidence: CoordinatorShadowStreak | null;
|
|
59
|
+
/** 올라간(또는 이미 있던) 결정 카드 id. */
|
|
60
|
+
cardId?: string;
|
|
61
|
+
/** 같은 스탬프(칸+지시서+마지막 날) 카드가 이미 있어 1장만 유지됐을 때. */
|
|
62
|
+
skipped?: 'duplicate';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** 그림자 디스패치 원장 생산 기본 경로. */
|
|
66
|
+
export function coordinatorShadowJournalPath(root: string): string {
|
|
67
|
+
return join(root, 'seat-state', 'OP', 'coordinator-shadow-dispatch.jsonl');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Resolve the containing checkout when the CLI was started from a repository subdirectory. */
|
|
71
|
+
export function resolveCoordinatorShadowRoot(cwd = process.cwd()): string {
|
|
72
|
+
return findGitDir(cwd)?.root ?? cwd;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** launcher가 work-order를 받아들인 뒤 그림자 근거만 덧붙인다. 발사 결정·인자는 읽거나 바꾸지 않는다. */
|
|
76
|
+
export function recordCoordinatorShadowDispatch(
|
|
77
|
+
root: string,
|
|
78
|
+
row: CoordinatorShadowDispatch,
|
|
79
|
+
): void {
|
|
80
|
+
const path = coordinatorShadowJournalPath(root);
|
|
81
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
82
|
+
withFileLockSync(`${path}.lock`, () => appendFileSync(path, `${JSON.stringify(row)}\n`));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** ④ 빌더 판별 — «빌더④» «④빌더» «builder-4» «builder_4» «builder 4» «b4» 계열을 받는다. */
|
|
86
|
+
function fourthBuilderAgentKey(agent: string): string | null {
|
|
87
|
+
const key = agent.normalize('NFC').replace(/\s+/g, '').toLowerCase();
|
|
88
|
+
return /^(?:builder|b)[-_]?4$/.test(key) || /^④?빌더4$/.test(key) || key === '④빌더' || key === '빌더④'
|
|
89
|
+
? 'builder-4'
|
|
90
|
+
: null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function isFourthBuilderAgent(agent: string): boolean {
|
|
94
|
+
return fourthBuilderAgentKey(agent) !== null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function shiftDay(isoDay: string, delta: number): string {
|
|
98
|
+
const date = new Date(`${isoDay}T00:00:00Z`);
|
|
99
|
+
date.setUTCDate(date.getUTCDate() + delta);
|
|
100
|
+
return date.toISOString().slice(0, 10);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 조율자 그림자 디스패치 기록에서 오늘과 직전 2일치를 읽어,
|
|
107
|
+
* 대상이 ④ 빌더이고 칸·지시서가 같은 달력 기준 3일 연속인 모든 쌍을 반환한다.
|
|
108
|
+
* 연속 끊김(칸·지시서·대상이 다르거나 하루 무디스패치)이면 해당 streak 는 성립하지 않는다.
|
|
109
|
+
*/
|
|
110
|
+
export function detectBuilderThreeDayStreak(
|
|
111
|
+
dispatches: readonly CoordinatorShadowDispatch[],
|
|
112
|
+
today: string,
|
|
113
|
+
): CoordinatorShadowStreak | null {
|
|
114
|
+
return detectBuilderThreeDayStreaks(dispatches, today)[0] ?? null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** 오늘의 3일 창에서 모든 적격 (agent, cell, directive) 쌍을 돌려 각 쌍의 카드를 독립 판정한다. */
|
|
118
|
+
export function detectBuilderThreeDayStreaks(
|
|
119
|
+
dispatches: readonly CoordinatorShadowDispatch[],
|
|
120
|
+
today: string,
|
|
121
|
+
): CoordinatorShadowStreak[] {
|
|
122
|
+
if (!DAY_PATTERN.test(today)) throw new Error(`calendar day required: ${today}`);
|
|
123
|
+
const window: [string, string, string] = [shiftDay(today, -2), shiftDay(today, -1), today];
|
|
124
|
+
const groups = new Map<string, { agent: string; recipient?: string; recipientDate?: string; cell: string; directive: string; days: Set<string> }>();
|
|
125
|
+
for (const row of dispatches) {
|
|
126
|
+
if (!row || typeof row.date !== 'string' || !DAY_PATTERN.test(row.date)) continue;
|
|
127
|
+
const builderKey = fourthBuilderAgentKey(String(row.agent ?? ''));
|
|
128
|
+
if (!builderKey) continue;
|
|
129
|
+
const recipient = typeof row.recipient === 'string' ? row.recipient : undefined;
|
|
130
|
+
const cell = String(row.cell ?? '');
|
|
131
|
+
const directive = String(row.directive ?? '');
|
|
132
|
+
if (!cell || !directive) continue;
|
|
133
|
+
const key = `${builderKey}\u0000${cell}\u0000${directive}`;
|
|
134
|
+
const group = groups.get(key) ?? { agent: row.agent, cell, directive, days: new Set<string>() };
|
|
135
|
+
if (recipient && window.includes(row.date as typeof window[number])
|
|
136
|
+
&& (!group.recipientDate || row.date >= group.recipientDate)) {
|
|
137
|
+
group.recipient = recipient;
|
|
138
|
+
group.recipientDate = row.date;
|
|
139
|
+
}
|
|
140
|
+
group.days.add(row.date);
|
|
141
|
+
groups.set(key, group);
|
|
142
|
+
}
|
|
143
|
+
const keys = [...groups.keys()].sort();
|
|
144
|
+
return keys.flatMap(key => {
|
|
145
|
+
const group = groups.get(key)!;
|
|
146
|
+
return window.every(day => group.days.has(day))
|
|
147
|
+
? [{ agent: group.agent, ...(group.recipient ? { recipient: group.recipient } : {}), cell: group.cell, directive: group.directive, dates: [...window] as [string, string, string] }]
|
|
148
|
+
: [];
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function readDispatchJournal(path: string): CoordinatorShadowDispatch[] {
|
|
153
|
+
if (!existsSync(path)) return [];
|
|
154
|
+
const rows: CoordinatorShadowDispatch[] = [];
|
|
155
|
+
for (const line of readFileSync(path, 'utf8').split('\n')) {
|
|
156
|
+
if (!line.trim()) continue;
|
|
157
|
+
let raw: Record<string, unknown>;
|
|
158
|
+
try { raw = JSON.parse(line) as Record<string, unknown>; } catch { continue; }
|
|
159
|
+
// JSON.parse 가 성공하는 비객체 행(`null`·스칼라 등)도 파손 행이다 — 판독에서 건너뛴다.
|
|
160
|
+
if (typeof raw !== 'object' || raw === null) continue;
|
|
161
|
+
const date = raw.day ?? raw.date;
|
|
162
|
+
const agent = raw.target ?? raw.agent;
|
|
163
|
+
const recipient = raw.recipient ?? raw.seat;
|
|
164
|
+
const cell = raw.lane ?? raw.cell;
|
|
165
|
+
const directive = raw.directiveId ?? raw.directive;
|
|
166
|
+
if (typeof date === 'string' && typeof agent === 'string' && typeof cell === 'string' && typeof directive === 'string') {
|
|
167
|
+
rows.push({ date, agent, ...(typeof recipient === 'string' ? { recipient } : {}), cell, directive });
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return rows;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** «셸 디스패처 은퇴» 결정 카드의 영구 idempotency ref(같은 칸+지시서에는 한 장만). */
|
|
174
|
+
export function retirementCardStamp(evidence: CoordinatorShadowStreak): string {
|
|
175
|
+
return `coordinator-shadow-streak:${evidence.cell}:${evidence.directive}`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* 조율자 루프의 하루 틱 — 그림자 디스패치 3일 연속 판정 → 셸 디스패처 은퇴 결정 카드 1장.
|
|
180
|
+
* 카드는 기존 결정 원장(DecisionLedger.raise) 부가 형식 그대로 append 되고,
|
|
181
|
+
* 같은 3일 창에서 성립한 모든 칸+지시서 쌍을 각자 판정하고, 카드가 이미 있으면 재사용한다.
|
|
182
|
+
* (날짜가 바뀌어도 쌍마다 1장 유지).
|
|
183
|
+
*/
|
|
184
|
+
export async function tick(options: CoordinatorShadowTickOptions = {}): Promise<CoordinatorShadowTickResult> {
|
|
185
|
+
const root = resolveCoordinatorShadowRoot(options.root ?? process.cwd());
|
|
186
|
+
const now = options.now ?? (() => new Date());
|
|
187
|
+
const dispatches = options.dispatches ?? readDispatchJournal(coordinatorShadowJournalPath(root));
|
|
188
|
+
const today = now().toISOString().slice(0, 10);
|
|
189
|
+
const evidences = detectBuilderThreeDayStreaks(dispatches, today);
|
|
190
|
+
const evidence = evidences[0] ?? null;
|
|
191
|
+
if (!evidence) return { checked: today, evidence: null };
|
|
192
|
+
|
|
193
|
+
const ledger = new DecisionLedger({ ...(options.stateDir ? { stateDir: options.stateDir } : {}), now, repoRoot: root });
|
|
194
|
+
const outcomes = evidences.map(item => {
|
|
195
|
+
const stamp = retirementCardStamp(item);
|
|
196
|
+
const alreadyRaised = ledger.list({ status: 'all' }).some(entry =>
|
|
197
|
+
Array.isArray(entry.refs) && entry.refs.includes(stamp));
|
|
198
|
+
const entry = ledger.raiseOnce({
|
|
199
|
+
title: `셸 디스패처 은퇴 — ${item.cell} × ${item.directive} 3일 연속`,
|
|
200
|
+
category: 'other',
|
|
201
|
+
scqa: {
|
|
202
|
+
s: '조율자 그림자가 ④ 빌더로 같은 칸·같은 지시서를 달력 기준 3일 연속 디스패치했다.',
|
|
203
|
+
c: '중간층 입구 디스패처가 같은 지시를 반복 산출하는 0.2.35 최우선 병목 신호가 실측됐다.',
|
|
204
|
+
q: '셸 디스패처를 은퇴시키고 입구를 조율자 그림자로 고정할까?',
|
|
205
|
+
a: '셸 디스패처 은퇴 결정 카드를 원장에 올리고 후속 조치를 연다.',
|
|
206
|
+
},
|
|
207
|
+
options: [
|
|
208
|
+
{ key: 'a', label: '은퇴 승인', consequence: '입구 디스패처를 조율자 그림자로 고정하고 셸 디스패처를 은퇴시킨다' },
|
|
209
|
+
{ key: 'b', label: '관찰 연장', consequence: '은퇴를 보류하고 3일 연속 판정 관찰을 계속한다' },
|
|
210
|
+
],
|
|
211
|
+
recommendation: { option: 'a', why: '같은 칸·같은 지시서가 달력 기준 3일 연속 — 판정 신호 충족' },
|
|
212
|
+
raisedBy: { agent: 'orchestrator-tick', track: 'OP' },
|
|
213
|
+
refs: [
|
|
214
|
+
stamp,
|
|
215
|
+
`agent:${item.agent}`,
|
|
216
|
+
...(item.recipient ? [`recipient:${item.recipient}`] : []),
|
|
217
|
+
`cell:${item.cell}`,
|
|
218
|
+
`directive:${item.directive}`,
|
|
219
|
+
`dates:${item.dates.join(',')}`,
|
|
220
|
+
],
|
|
221
|
+
}, stamp);
|
|
222
|
+
return { evidence: item, cardId: entry.id, alreadyRaised };
|
|
223
|
+
});
|
|
224
|
+
return { checked: today, evidence, cardId: outcomes[0]!.cardId,
|
|
225
|
+
...(outcomes.every(outcome => outcome.alreadyRaised) ? { skipped: 'duplicate' as const } : {}) };
|
|
226
|
+
}
|
|
@@ -1062,6 +1062,13 @@ export async function degradationDeps(node: Node, deps: { config?: () => Partial
|
|
|
1062
1062
|
return mode === 'live' ? { degradation: () => ({ llm: signal.llm, board: signal.board }) } : {};
|
|
1063
1063
|
}
|
|
1064
1064
|
|
|
1065
|
+
// COORD-ENTRANCE-FOLD (0.2.42 칸 · TASK-AGENT OP 디스패처) — 조율자 루프 하루 틱 생산 진입이
|
|
1066
|
+
// tick() 을 호출하게 배선한다: 그림자 디스패치(날짜·대상 에이전트·칸·지시서 id)에서 ④ 빌더
|
|
1067
|
+
// 같은 칸·같은 지시서 달력 기준 3일 연속을 감지하면 «셸 디스패처 은퇴» 결정 카드를 기존 결정
|
|
1068
|
+
// 원장(DecisionLedger) 부가 형식 그대로 1장 적는다(같은 스탬프=칸+지시서 중복 방지).
|
|
1069
|
+
// 구현 본체: src/loops/orchestrator/coordinator-shadow.ts · 완료 경계 시험: tick.test.ts.
|
|
1070
|
+
import { tick as runCoordinatorShadowTick } from './coordinator-shadow.js';
|
|
1071
|
+
|
|
1065
1072
|
if (import.meta.main) {
|
|
1066
1073
|
const node = process.argv[2];
|
|
1067
1074
|
const index = process.argv.indexOf('--window');
|
|
@@ -1078,6 +1085,12 @@ if (import.meta.main) {
|
|
|
1078
1085
|
void (async () => {
|
|
1079
1086
|
try { await (await import('../../domains/standalone-log-sink.js')).registerStandaloneLogSink('orchestrator'); }
|
|
1080
1087
|
catch { /* local execution can still use the per-run file */ }
|
|
1088
|
+
// 관측(그림자 틱)은 본 루프를 봉쇄할 수 없다: 파손 원장 등으로 reject 하면 원인만 warn 로그로 남기고 본 노드 실행은 계속한다.
|
|
1089
|
+
try { await runCoordinatorShadowTick({}); }
|
|
1090
|
+
catch (error) {
|
|
1091
|
+
try { debug.log('loop.orchestrator', 'coordinator-shadow-tick-failed', { node, error: String(error).slice(0, 200) }, { level: 'warn' }); }
|
|
1092
|
+
catch { /* even the diagnostic sink must not block the node */ }
|
|
1093
|
+
}
|
|
1081
1094
|
await runOrchestratorNode(node as Node, { window: window as Window | undefined, ...await degradationDeps(node as Node) });
|
|
1082
1095
|
})().catch(error => { console.error(`orchestrator ${node}: ${String(error)}`); process.exitCode = 1; });
|
|
1083
1096
|
}
|
|
@@ -59,10 +59,10 @@ export const FEATURE_MATURITY = {
|
|
|
59
59
|
},
|
|
60
60
|
// Canonical CLI command names only; aliases inherit their command's grade.
|
|
61
61
|
cliRoot: {
|
|
62
|
-
preview: 'beta', pty: 'beta', pr: 'beta', repo: 'beta', role: 'beta', machine: 'beta', image: 'beta', 'agent-env': 'beta',
|
|
62
|
+
preview: 'beta', pty: 'beta', pr: 'beta', repo: 'beta', role: 'beta', machine: 'beta', image: 'beta', 'agent-env': 'beta', catalog: 'beta',
|
|
63
63
|
where: 'stable', bench: 'beta', shadow: 'beta', llm: 'beta', storage: 'beta', leader: 'beta',
|
|
64
64
|
pod: 'beta', browser: 'beta', questions: 'beta', usage: 'stable', live: 'beta',
|
|
65
|
-
research: 'beta', release: 'beta', rfc: 'beta', know: 'beta', freeze: 'beta', herdr: 'beta', flow: 'beta', seat: 'beta', hq: 'beta', steward: 'beta', coord: 'beta', context: 'beta', 'model-watch': 'beta', doctor: 'stable',
|
|
65
|
+
research: 'beta', release: 'beta', rfc: 'beta', know: 'beta', life: 'beta', freeze: 'beta', herdr: 'beta', flow: 'beta', seat: 'beta', hq: 'beta', steward: 'beta', coord: 'beta', context: 'beta', 'model-watch': 'beta', doctor: 'stable',
|
|
66
66
|
control: 'beta', resources: 'beta', hooks: 'beta', setup: 'stable', start: 'stable',
|
|
67
67
|
grounding: 'beta', graph: 'beta', loop: 'stable', resource: 'beta', card: 'stable', 'launch-head': 'beta',
|
|
68
68
|
a2a: 'beta', plugin: 'stable', make: 'beta', skills: 'beta', connect: 'beta', import: 'beta',
|
|
@@ -77,12 +77,12 @@ export const FEATURE_MATURITY = {
|
|
|
77
77
|
'provider:rotate': 'beta', 'provider:use': 'beta', 'status-bar': 'beta',
|
|
78
78
|
schedule: 'beta', guardian: 'beta', intake: 'beta', logs: 'stable', retro: 'beta', ad: 'beta', docs: 'beta',
|
|
79
79
|
decisions: 'beta', directives: 'beta', claims: 'beta', lesson: 'beta', fleet: 'beta', ops: 'stable', outputs: 'beta', publish: 'beta',
|
|
80
|
-
env: 'beta', 'agent-mission': 'beta', dev: 'beta', keys: 'beta', finance: 'beta',
|
|
80
|
+
env: 'beta', 'agent-mission': 'beta', mission: 'beta', dev: 'beta', keys: 'beta', finance: 'beta',
|
|
81
81
|
config: 'stable', tasks: 'stable', brief: 'beta', notify: 'beta', away: 'beta', labels: 'beta', msg: 'beta', ask: 'stable',
|
|
82
82
|
onboarding: 'beta', login: 'stable', session: 'beta', chat: 'stable', repl: 'stable',
|
|
83
83
|
agent: 'stable', registry: 'beta', tier: 'stable', local: 'beta', scheduler: 'beta',
|
|
84
84
|
attach: 'beta', wf: 'beta', nexus: 'stable', phone: 'beta', token: 'beta',
|
|
85
|
-
acp: 'beta', voice: 'beta', sim: 'beta',
|
|
85
|
+
acp: 'beta', voice: 'beta', sim: 'beta', tui: 'system',
|
|
86
86
|
'run-detached': 'system', dogfood: 'system', run: 'system',
|
|
87
87
|
},
|
|
88
88
|
// Canonical names only; aliases inherit their command's grade at lookup.
|