elanous 0.2.41 → 0.2.42
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 → X1ucLw10Cds_h614NoEnh}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5159.115f1c2ca471386c.js → 1063.2fb8a9dc55c731f2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +36 -0
- package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9048.212083de42d25be3.js → 1262.e804feb8fd1acb8c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.js → 1487.2f67b79444062da6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +32 -0
- package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +286 -0
- package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +23 -0
- package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +34 -0
- package/apps/pwa/out/_next/static/chunks/2456.b6de0e1c05f28843.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +1 -0
- package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{530.d26346e18089640a.js → 2690.0521c738b7749931.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4702.4a4adc1f16d7c93b.js → 2974.595d1e29d040cb6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.js → 3207.a756c95e9ec8c3c8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9541.eb8e2f8480c7feca.js → 3285.89ee2f298682f5e5.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{9507.7026657a2f47eb64.js → 3347.f846266b5e5f3ede.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
- package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.js → 3482.a9ae9d2ad6a5bd97.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3507.97e1977bc4d5fb0a.js +2 -0
- package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +24 -0
- package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1661.0dd330f3d89f73f3.js → 3837.a210d7d0db8d8abd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2fdf2931.b431eee4fb468bc3.js → 3d0154af.5331fec737ffe8c3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4043.6b91203436c9c86b.js +309 -0
- package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +77 -0
- package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +148 -0
- package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +74 -0
- package/apps/pwa/out/_next/static/chunks/50061469.0326382241ef3b2d.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{1115.434ae2ecb0ad986d.js → 5112.4b9f300124fab7b3.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +27 -0
- package/apps/pwa/out/_next/static/chunks/53c73f84.373b6160adfa89a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +287 -0
- package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +226 -0
- package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{2073.689dcb2680113d76.js → 6377.bc7df239edbff244.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1800.f7ff51dc4978a958.js → 6632.0eac1c554f8f2ef3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +104 -0
- package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +94 -0
- package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2527-5c636a43c7cc5dde.js → 7279-c199ea83f34338fa.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{385e4574.e9886ab32759eda3.js → 73d2eb0e.4966ad55293c801a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.js → 7411.9b4b8b747dc7b802.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +1 -0
- package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2fe2c302.41b517f88d6fe502.js → 7a98bc80.fa935989e829f9c2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8138.6c10b2a356d52fca.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5574.f35accf4f132b29d.js → 8262.ddc03e06b733f184.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +8 -0
- package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +79 -0
- package/apps/pwa/out/_next/static/chunks/{8050-9b364bdef8f71927.js → 8546-6f03f8ea34dd61d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5947-135e26537d80a6b9.js → 8673-bab689a55f7e13b9.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5937.c2df9e3447e1f667.js → 9249.976f1e69a9d80754.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1971-7efb628c471dc5a0.js → 9353-12bfff0c130104cf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7191.fdc955f7d96064a4.js → 9415.69e4a21c60c7d2db.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1219.7e17964e0e7cd8e5.js → 9427.96aa912ddb5801e0.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5964-7e21164a8f2cf0ce.js → 9656-374232558fd528d0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6552.a3840aa7da35ad68.js → 9832.f4a98c878ecf2c0a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{a0a01613.6d1cca322238d7fe.js → b450776b.3db34d8d965f82d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.js → e8543907.5b040a5f22a0b0e5.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +1 -0
- package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +22 -22
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +22 -22
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +22 -22
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +21 -21
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +21 -21
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +22 -22
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +21 -21
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +22 -22
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +22 -22
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +21 -21
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +22 -22
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +23 -24
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +22 -22
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +22 -22
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +21 -21
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +22 -22
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -24
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -24
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +21 -21
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +21 -21
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +21 -21
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +22 -22
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +22 -22
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +21 -21
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +21 -21
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +21 -21
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +21 -21
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +22 -22
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +22 -22
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +21 -21
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +22 -22
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +22 -22
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +22 -22
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +22 -22
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +22 -22
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +21 -21
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +22 -22
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +22 -22
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +22 -22
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +22 -22
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +22 -22
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +22 -22
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +22 -22
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +22 -22
- 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/overlays/stop-heal-ladder.yaml +113 -0
- package/graphs/units/verbs/recipes.yaml +11 -11
- package/graphs/work/research-report.yaml +10 -2
- package/package.json +1 -1
- package/scripts/heal/run-role.ts +99 -5
- package/scripts/land-global-checks.ts +6 -1
- 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/gate-baseline-receipt.ts +47 -9
- package/scripts/release-loop/gate-image-pin.ts +81 -0
- package/scripts/release-loop/gate-node-sim.ts +207 -0
- package/scripts/release-loop/gate-node.ts +285 -46
- 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-train-receipts.ts +122 -0
- package/scripts/release-loop/resume-release.ts +83 -8
- package/scripts/ux-sim.ts +18 -1
- package/scripts/warm-pool-provider-config.ts +263 -0
- package/skills/omni-crawl/SKILL.md +5 -2
- package/skills/omni-crawl/scripts/main.ts +84 -23
- package/src/acp/core-turn-bridge.ts +13 -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/mission-cli.ts +24 -0
- package/src/agent-mission/mission-out.ts +595 -0
- package/src/agent-mission/tool-install.ts +88 -2
- package/src/agent-substrate/context-strategy.ts +4 -4
- package/src/agent-substrate/self-review-cli.ts +178 -13
- package/src/auto-research/research-turn.ts +123 -50
- package/src/autopilot/pr-manager.ts +38 -7
- package/src/autopilot/pty-control-loop.ts +2 -0
- package/src/capture/tui-self-report.ts +22 -6
- package/src/chat/index.ts +1 -1
- 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/pr-land-heavy-remote.ts +32 -0
- package/src/cli/pr-land-overlap-evidence.ts +100 -1
- package/src/cli/pr-land-pod-shadow-job.ts +60 -0
- package/src/cli/release-checklist-read-cli.ts +20 -10
- package/src/cli/research-cli.ts +4 -5
- package/src/cli/tasks-cli.ts +7 -0
- package/src/compact/auto.ts +8 -1
- package/src/control-plane/ledger.ts +52 -2
- package/src/control-plane/server.ts +16 -2
- package/src/core-turn/run-core-turn.ts +311 -90
- package/src/core-turn/run-goal-loop.ts +18 -0
- package/src/core-turn/types.ts +2 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
- package/src/dashboard/classic-sidetab-mission.ts +185 -0
- package/src/dashboard/index.ts +149 -15
- package/src/dashboard/input/agent-wake.ts +23 -1
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +9 -0
- package/src/dashboard/mission-cli-consumer.ts +153 -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/turn-preamble.ts +53 -15
- package/src/dashboard/turn-prompt-runtime.ts +4 -2
- package/src/graph-runner/graph-cli.ts +23 -7
- package/src/graph-runner/graph-tick.ts +10 -2
- package/src/graph-runner/runner.ts +1 -1
- package/src/grok/agent-search.ts +14 -4
- package/src/grok/credential.ts +28 -11
- package/src/harness/harness-pod-dispatch.ts +81 -15
- package/src/harness/harness-stop.ts +155 -11
- package/src/index.ts +34 -5
- package/src/instance/spawn-elanous.ts +6 -4
- package/src/llm.ts +166 -8
- package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
- package/src/loops/orchestrator/tick.ts +13 -0
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/native-tool-catalog.ts +2 -2
- package/src/nexus/api/harness-traversal.ts +11 -0
- package/src/pr-tool/census.ts +3 -2
- package/src/pty-shell/tui-run-state.ts +188 -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 +121 -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/decompose.ts +119 -5
- package/src/self-dev/launch-preflight-text.ts +5 -6
- package/src/self-dev/orchestrate.ts +12 -2
- 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-implement/doctor-visit.ts +88 -0
- package/src/self-implement/goal-author.ts +326 -3
- package/src/self-implement/graph-overlay-yaml.ts +7 -0
- 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/orchestrator.ts +126 -11
- 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 +119 -0
- package/src/self-implement/run-ledger.ts +112 -11
- package/src/self-implement/run-stop.ts +188 -4
- package/src/self-implement/stop-autoheal.ts +13 -0
- package/src/session/chat.ts +38 -4
- package/src/session-runtime/index.ts +98 -4
- package/src/session-runtime/tier-flip.ts +3 -3
- package/src/sidetab-core/model.ts +19 -5
- package/src/sidetab-core/visible-agent-mission.ts +186 -0
- package/src/skills/name-match.ts +20 -0
- package/src/skills/tools/agent.ts +30 -2
- package/src/skills/tools/omni-search.ts +67 -5
- package/src/task-agent/pod-distributor-entry.ts +3 -0
- package/src/task-agent/task-hand.ts +27 -0
- package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
- 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 +163 -13
- package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +209 -39
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +165 -45
- package/src/tokens.ts +35 -2
- package/src/tool-runtime/agent-runtime.ts +1 -0
- package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
- package/src/tool-runtime/skill-exec-runtime.ts +33 -13
- package/src/tool-runtime/types.ts +1 -0
- package/src/tui/entry.ts +14 -4
- package/src/tui/sidetab/attach.ts +47 -0
- package/src/tui-client/local-chat-turn.ts +26 -13
- package/src/tui.ts +22 -0
- package/src/ux-sim/fake-kubectl.ts +37 -3
- package/src/ux-sim/fault-pool-cap.ts +11 -6
- package/src/ux-sim/mock-scenario-catalog.json +41 -0
- package/src/ux-sim/mock-scenario-catalog.ts +156 -0
- package/src/ux-sim/scenario.ts +116 -23
- package/src/version/packed-revision.json +1 -1
- package/src/voice/voice-tts-singleton.ts +18 -3
- package/src/web-search/grok.ts +5 -9
- 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/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/1999-8de7b7bb36801913.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/2692-1027cb16fe4ccf49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2743.5d3f76948be32b34.js +0 -41
- 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/3230-49298c3b73ef2268.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/4133.2056bb4d78f621af.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/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/53aeb4ee-51c92f8d683f5220.js +0 -1
- 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/5744.b9415e18ad623100.js +0 -23
- package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.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/6736.1e36d3ac5fa5e41d.js +0 -24
- package/apps/pwa/out/_next/static/chunks/6874.d5cf7eb8edb2cabe.js +0 -2
- 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/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/8152.64e253c35cccfaae.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/83184dcd-0ee6247ff41eb3f2.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/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/9834.63ab2bbc3153172e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/addc2b32.8c4ff8f0aefe987d.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/release/page-40f9e19149024298.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/devices/page-a142dfb0331a05f5.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/b2271e54.c1de3347976e90b0.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/d0a48dc099ed86cf.css +0 -1
- /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → X1ucLw10Cds_h614NoEnh}/_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,
|
|
@@ -5828,8 +5931,19 @@ async function tryForceSynthesisPass(args: {
|
|
|
5828
5931
|
* / error), this function emits a clear signal to wipe any
|
|
5829
5932
|
* partial text it streamed. */
|
|
5830
5933
|
streamingHandlers?: { onText: (delta: string, accumulated: string) => void };
|
|
5934
|
+
/** TUI-PROMPT-CACHE-PREFIX — the turn's session + tools. On Codex the pass
|
|
5935
|
+
* keeps the same tools array (tool_choice:'none') and session cache key so
|
|
5936
|
+
* it reuses the cached prefix instead of rewriting it with tools dropped. */
|
|
5937
|
+
sessionId?: string;
|
|
5938
|
+
tools?: LLMToolSpec[];
|
|
5831
5939
|
}): Promise<string | null> {
|
|
5832
5940
|
const { provider, model, history, turn, modelFamily, streamingHandlers } = args;
|
|
5941
|
+
const keepToolsNoCall = provider.name === 'openai-codex' && (args.tools?.length ?? 0) > 0;
|
|
5942
|
+
const synthesisOpts: LLMOpts = {
|
|
5943
|
+
model,
|
|
5944
|
+
...(args.sessionId ? { sessionId: args.sessionId } : {}),
|
|
5945
|
+
...(keepToolsNoCall ? { tools: args.tools, toolChoice: 'none' as const } : {}),
|
|
5946
|
+
};
|
|
5833
5947
|
const synthesisPromptMsg: LLMMessage = {
|
|
5834
5948
|
role: 'user',
|
|
5835
5949
|
content:
|
|
@@ -5862,7 +5976,7 @@ async function tryForceSynthesisPass(args: {
|
|
|
5862
5976
|
try {
|
|
5863
5977
|
let collected = '';
|
|
5864
5978
|
const MAX_OUTPUT_CHARS = 8000;
|
|
5865
|
-
for await (const delta of provider.chat(synthesisHistory, {
|
|
5979
|
+
for await (const delta of provider.chat(synthesisHistory, { ...synthesisOpts, signal: f2Controller.signal })) {
|
|
5866
5980
|
collected += delta;
|
|
5867
5981
|
// Live progressive emit — TUI shows synthesis text as it
|
|
5868
5982
|
// generates instead of all-at-once at the end (user-reported
|
|
@@ -8889,6 +9003,10 @@ export async function streamLLMWithTools(
|
|
|
8889
9003
|
// read-time projection 등 교체. 문맥관리를 substrate 프리미티브로 통일(streamLLMWithTools 인라인 산재 해소).
|
|
8890
9004
|
const { createDefaultContextStrategy: _makeContextStrategy } = require('./agent-substrate/context-strategy.js') as typeof import('./agent-substrate/context-strategy.js');
|
|
8891
9005
|
const _contextStrategy = opts.contextStrategy ?? _makeContextStrategy();
|
|
9006
|
+
// Latest provider prompt usage is the trigger baseline. Add estimated growth
|
|
9007
|
+
// appended to history after that request (usually tool output) at the next loop.
|
|
9008
|
+
let previousInputTokens: number | undefined;
|
|
9009
|
+
let previousRequestEstimatedTokens: number | undefined;
|
|
8892
9010
|
let loopTermination: 'budget-exhausted' | 'aborted' = 'budget-exhausted';
|
|
8893
9011
|
let terminalTurn = maxTurns;
|
|
8894
9012
|
|
|
@@ -8976,7 +9094,21 @@ export async function streamLLMWithTools(
|
|
|
8976
9094
|
// ★ 조각2 — pluggable context 전략(기본=2-tier compaction·무회귀 이관). 판정+압축을 substrate 프리미티브가
|
|
8977
9095
|
// 수행 → caller 는 splice/관측/breaker 만. 주입(opts.contextStrategy)으로 read-time projection 등 교체 가능.
|
|
8978
9096
|
const beforeLen = history.length;
|
|
8979
|
-
const outcome = await _contextStrategy.compact(history, {
|
|
9097
|
+
const outcome = await _contextStrategy.compact(history, {
|
|
9098
|
+
model: effectiveModel,
|
|
9099
|
+
...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
|
|
9100
|
+
config: acCfg,
|
|
9101
|
+
...(previousInputTokens !== undefined ? {
|
|
9102
|
+
observedInputTokens: previousInputTokens + Math.max(
|
|
9103
|
+
0,
|
|
9104
|
+
estimateMessagesTokens(history) - (previousRequestEstimatedTokens ?? estimateMessagesTokens(history)),
|
|
9105
|
+
),
|
|
9106
|
+
} : {}),
|
|
9107
|
+
});
|
|
9108
|
+
// This usage event belongs to the request before this compaction
|
|
9109
|
+
// decision; do not carry it into another loop iteration.
|
|
9110
|
+
previousInputTokens = undefined;
|
|
9111
|
+
previousRequestEstimatedTokens = undefined;
|
|
8980
9112
|
if (outcome.fired && outcome.reduced) {
|
|
8981
9113
|
history.splice(0, history.length, ...outcome.messages);
|
|
8982
9114
|
// ★ 관측(2026-07-21) — beforeTokens/afterTokens 포함(reduced 는 개수 아닌 **토큰** 감소로 판정).
|
|
@@ -9029,7 +9161,19 @@ export async function streamLLMWithTools(
|
|
|
9029
9161
|
// revert to auto (see above).
|
|
9030
9162
|
const buildTurnOpts = () => {
|
|
9031
9163
|
const remainingFallbacks = opts.provider ? 0 : remainingFallbackProviderNames(attemptedProviders, opts).length;
|
|
9032
|
-
|
|
9164
|
+
// TUI-PROMPT-CACHE-PREFIX — on Codex the final-answer turn shares the
|
|
9165
|
+
// session cache key, so dropping tools would rewrite the cached prefix
|
|
9166
|
+
// (measured toolChars 67k → 2). Keep the same tools and forbid calls
|
|
9167
|
+
// with tool_choice:'none' instead. Other providers keep the legacy
|
|
9168
|
+
// empty tools (some ignore toolChoice).
|
|
9169
|
+
const keepToolsNoCall = completionNeedsFinalTurn && activeProvider.name === 'openai-codex';
|
|
9170
|
+
const base = {
|
|
9171
|
+
...opts,
|
|
9172
|
+
model: activeModel,
|
|
9173
|
+
tools: completionNeedsFinalTurn && !keepToolsNoCall ? [] : activeTools,
|
|
9174
|
+
remainingFallbacks,
|
|
9175
|
+
};
|
|
9176
|
+
if (keepToolsNoCall) return { ...base, toolChoice: 'none' as const };
|
|
9033
9177
|
return turn === 0 ? base : { ...base, toolChoice: undefined };
|
|
9034
9178
|
};
|
|
9035
9179
|
let turnOpts = buildTurnOpts();
|
|
@@ -9148,6 +9292,7 @@ export async function streamLLMWithTools(
|
|
|
9148
9292
|
: turnOpts.toolChoice,
|
|
9149
9293
|
};
|
|
9150
9294
|
const providerMessages = mapProviderToolNamesInMessages(history, nameMap.toProviderName);
|
|
9295
|
+
previousRequestEstimatedTokens = estimateMessagesTokens(providerMessages);
|
|
9151
9296
|
streamIter = restoreProviderToolCallNames(
|
|
9152
9297
|
activeProvider.streamChat!(providerMessages, providerOpts),
|
|
9153
9298
|
nameMap.toOriginalName,
|
|
@@ -9397,6 +9542,10 @@ export async function streamLLMWithTools(
|
|
|
9397
9542
|
} else if (ev.type === 'usage') {
|
|
9398
9543
|
// Provider parsers normalize inputTokens to uncached input; cache
|
|
9399
9544
|
// reads/writes are separate fields (prompt-cache/types.ts contract).
|
|
9545
|
+
const observedPromptTokens = (ev.usage.inputTokens ?? 0)
|
|
9546
|
+
+ (ev.usage.cacheReadInputTokens ?? 0)
|
|
9547
|
+
+ (ev.usage.cacheCreationInputTokens ?? 0);
|
|
9548
|
+
if (observedPromptTokens > 0) previousInputTokens = observedPromptTokens;
|
|
9400
9549
|
// ⭐ 주 에이전트 턴의 토큰·비용을 «게이트 없이» 남긴다(2026-09-24 실측: 이 줄이 없어 3시간 `llm.usage`
|
|
9401
9550
|
// 18행이 전부 곁가지 두 자리였고, 하니스 런 비용의 거의 전부가 관측 밖이었다). 곁가지와 같은 모양 ·
|
|
9402
9551
|
// 모르는 모델은 금액 대신 `cost.kind='unknown'`. runId 는 debug.log 가 붙인다. 실패해도 턴은 계속.
|
|
@@ -11552,6 +11701,8 @@ export async function streamLLMWithTools(
|
|
|
11552
11701
|
history,
|
|
11553
11702
|
turn,
|
|
11554
11703
|
modelFamily,
|
|
11704
|
+
...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
|
|
11705
|
+
tools: activeTools,
|
|
11555
11706
|
// Live progressive streaming — deltas emit through handlers
|
|
11556
11707
|
// during collection so TUI shows synthesis text as it
|
|
11557
11708
|
// generates instead of one big chunk at the end.
|
|
@@ -12198,6 +12349,7 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
|
|
|
12198
12349
|
acceptToolImages: codexAcceptToolImages,
|
|
12199
12350
|
acceptUserMessageImages: codexAcceptUserImages,
|
|
12200
12351
|
replayCodexReasoning: !useStore,
|
|
12352
|
+
stablePrefix: true,
|
|
12201
12353
|
onOrphanToolResult: (callId) => {
|
|
12202
12354
|
try { debug.log('llm.codex', 'orphan-tool-output-dropped', { callId }); }
|
|
12203
12355
|
catch { /* observation must not block the request */ }
|
|
@@ -12254,6 +12406,7 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
|
|
|
12254
12406
|
? messagesToResponsesInput(messages, {
|
|
12255
12407
|
acceptToolImages: codexAcceptToolImages,
|
|
12256
12408
|
acceptUserMessageImages: codexAcceptUserImages,
|
|
12409
|
+
stablePrefix: true,
|
|
12257
12410
|
}).input
|
|
12258
12411
|
: input);
|
|
12259
12412
|
const wirePrevId = (delta && lastResponseId) ? lastResponseId : undefined;
|
|
@@ -12274,9 +12427,12 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
|
|
|
12274
12427
|
};
|
|
12275
12428
|
const requestGuard = opts.requestSizeGuard;
|
|
12276
12429
|
const promptCache = opts.promptCache !== false;
|
|
12430
|
+
// TUI-PROMPT-CACHE-PREFIX — the preflight must measure the same body
|
|
12431
|
+
// streamCodexResponsesEvents would build (session-derived key).
|
|
12432
|
+
const sessionCacheKey = codexSessionCacheKey(opts.sessionId, process.env.ELANOUS_RUN_ID)?.key;
|
|
12277
12433
|
let serializedWireBody: string | undefined;
|
|
12278
12434
|
if (requestGuard) {
|
|
12279
|
-
serializedWireBody = serializeCodexResponsesWireBody(requestBody, promptCache);
|
|
12435
|
+
serializedWireBody = serializeCodexResponsesWireBody(requestBody, promptCache, sessionCacheKey);
|
|
12280
12436
|
let requestChars = serializedWireBody.length;
|
|
12281
12437
|
const initialRequestChars = requestChars;
|
|
12282
12438
|
let requestCompacted = false;
|
|
@@ -12295,9 +12451,10 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
|
|
|
12295
12451
|
// Compaction runs only when store threading is off, matching
|
|
12296
12452
|
// the original non-threaded wire input policy.
|
|
12297
12453
|
replayCodexReasoning: !useStore,
|
|
12454
|
+
stablePrefix: true,
|
|
12298
12455
|
});
|
|
12299
12456
|
const compactBody = { ...requestBody, instructions: compactInput.instructions, input: compactInput.input };
|
|
12300
|
-
const compactWireBody = serializeCodexResponsesWireBody(compactBody, promptCache);
|
|
12457
|
+
const compactWireBody = serializeCodexResponsesWireBody(compactBody, promptCache, sessionCacheKey);
|
|
12301
12458
|
const compactChars = compactWireBody.length;
|
|
12302
12459
|
if (compactChars < requestChars) {
|
|
12303
12460
|
messages.splice(0, messages.length, ...compacted.messages);
|
|
@@ -12341,6 +12498,7 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
|
|
|
12341
12498
|
yield* streamCodexResponsesEvents(responsesUrl, tokens.accessToken, requestBody, opts.signal, {
|
|
12342
12499
|
accountId,
|
|
12343
12500
|
promptCache,
|
|
12501
|
+
...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
|
|
12344
12502
|
...(serializedWireBody ? { serializedWireBody } : {}),
|
|
12345
12503
|
// Capture the new response id from the SSE stream so the
|
|
12346
12504
|
// 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
|
}
|
|
@@ -77,7 +77,7 @@ 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',
|
|
@@ -676,8 +676,8 @@ export const nativeToolCatalog: NativeToolCatalogEntry[] = [
|
|
|
676
676
|
kind: 'execute',
|
|
677
677
|
aliases: ['SkillExec', 'skill_exec'],
|
|
678
678
|
displayName: 'SkillExec',
|
|
679
|
-
description: 'Execute one explicitly named allowlisted skill with the supplied task.
|
|
680
|
-
promptSummary: '`SkillExec(skill, task)` (
|
|
679
|
+
description: 'Execute one explicitly named allowlisted skill with the supplied task. Names may omit spaces or punctuation (for example, "krflow" resolves to "kr-flow") only when the installed match is unique. Call elanous_skills_list when uncertain.',
|
|
680
|
+
promptSummary: '`SkillExec(skill, task)` (resolve omitted spaces or punctuation only when the installed skill name is unique; call elanous_skills_list when uncertain)',
|
|
681
681
|
host: ['skill', 'tui', 'mcp'],
|
|
682
682
|
safety: ['process'],
|
|
683
683
|
supportsParallel: false,
|