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
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { spawnElanous } from '../instance/spawn-elanous.js';
|
|
5
|
+
|
|
6
|
+
export interface ClassicMissionCliResult {
|
|
7
|
+
ok: boolean;
|
|
8
|
+
status: 'completed' | 'cancelled' | 'failed';
|
|
9
|
+
interactionId?: string;
|
|
10
|
+
path: string;
|
|
11
|
+
content?: string;
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
interface MissionStatus {
|
|
15
|
+
missionId: string;
|
|
16
|
+
status: 'running' | 'done' | 'completed' | 'cancelled' | 'failed';
|
|
17
|
+
result?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const MISSION_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
21
|
+
// Status is persisted by the CLI bridge; polling every 500 ms would launch up to
|
|
22
|
+
// 7,200 short-lived CLI processes for a one-hour mission. Five seconds keeps
|
|
23
|
+
// eventual completion observable without turning the dashboard into a process loop.
|
|
24
|
+
const POLL_MS = 5_000;
|
|
25
|
+
const MAX_WAIT_MS = 60 * 60 * 1_000;
|
|
26
|
+
|
|
27
|
+
function runCli(args: string[]): Promise<{ code: number | null; stdout: string; stderr: string }> {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
// `process.argv[1]` belongs to the parent surface and can be a TUI-only
|
|
30
|
+
// entry. Always route detached mission operations through the installed
|
|
31
|
+
// CLI command, whose `mission` router owns run/status/cancel.
|
|
32
|
+
const child = spawnElanous(args, { executable: 'eln',
|
|
33
|
+
cwd: process.cwd(),
|
|
34
|
+
env: { ...process.env, ELANOUS_FAST_ROUTER: '0' },
|
|
35
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
36
|
+
});
|
|
37
|
+
if (!child.stdout || !child.stderr) { reject(new Error('Installed CLI streams could not be opened')); return; }
|
|
38
|
+
let stdout = '';
|
|
39
|
+
let stderr = '';
|
|
40
|
+
child.stdout.setEncoding('utf8');
|
|
41
|
+
child.stderr.setEncoding('utf8');
|
|
42
|
+
child.stdout.on('data', (chunk: string) => { stdout = `${stdout}${chunk}`.slice(-64_000); });
|
|
43
|
+
child.stderr.on('data', (chunk: string) => { stderr = `${stderr}${chunk}`.slice(-8_000); });
|
|
44
|
+
child.once('error', reject);
|
|
45
|
+
child.once('close', (code) => resolve({ code, stdout, stderr }));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function parseJson<T>(result: { code: number | null; stdout: string; stderr: string }): T {
|
|
50
|
+
if (result.code !== 0) throw new Error('Mission CLI command failed');
|
|
51
|
+
try { return JSON.parse(result.stdout) as T; }
|
|
52
|
+
catch { throw new Error('Mission CLI returned invalid JSON'); }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const delay = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));
|
|
56
|
+
|
|
57
|
+
export interface MissionCliConsumerDeps {
|
|
58
|
+
runCli?: typeof runCli;
|
|
59
|
+
delay?: (ms: number) => Promise<void>;
|
|
60
|
+
now?: () => number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface StartedClassicMissionCliJob {
|
|
64
|
+
ok: true;
|
|
65
|
+
status: 'running';
|
|
66
|
+
interactionId: string;
|
|
67
|
+
path: string;
|
|
68
|
+
startedAt: number;
|
|
69
|
+
completion: Promise<ClassicMissionCliResult>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export type StartClassicMissionCliResult = StartedClassicMissionCliJob | ClassicMissionCliResult;
|
|
73
|
+
|
|
74
|
+
export function redactMissionResultPath(text: string, path?: string): string {
|
|
75
|
+
return path ? text.replaceAll(path, '[internal result]') : text;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function isClassicMissionId(value: string): boolean {
|
|
79
|
+
return MISSION_ID.test(value);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Explicitly cancel a detached sidetab mission; parent-turn aborts never call this. */
|
|
83
|
+
export async function cancelClassicMissionCli(interactionId: string, executeCli: typeof runCli = runCli): Promise<boolean> {
|
|
84
|
+
if (!isClassicMissionId(interactionId)) return false;
|
|
85
|
+
const result = parseJson<{ missionId: string; status: string; cancelled: boolean }>(
|
|
86
|
+
await executeCli(['mission', 'cancel', interactionId, '--json']),
|
|
87
|
+
);
|
|
88
|
+
return result.missionId === interactionId && result.cancelled === true && result.status === 'cancelled';
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Start a detached mission and return its identity immediately; poll results independently. */
|
|
92
|
+
export async function startClassicMissionCli(input: {
|
|
93
|
+
agent: 'codex' | 'claude';
|
|
94
|
+
prompt: string;
|
|
95
|
+
onInteractionId?: (interactionId: string) => void;
|
|
96
|
+
}, deps: MissionCliConsumerDeps = {}): Promise<StartClassicMissionCliResult> {
|
|
97
|
+
const executeCli = deps.runCli ?? runCli;
|
|
98
|
+
const wait = deps.delay ?? delay;
|
|
99
|
+
const now = deps.now ?? Date.now;
|
|
100
|
+
const tempRoot = mkdtempSync(join(tmpdir(), 'elanous-classic-mission-'));
|
|
101
|
+
const promptPath = join(tempRoot, 'prompt.txt');
|
|
102
|
+
const outputPath = join(tempRoot, 'result.md');
|
|
103
|
+
let interactionId: string | undefined;
|
|
104
|
+
const startedAt = now();
|
|
105
|
+
try {
|
|
106
|
+
writeFileSync(promptPath, input.prompt, { encoding: 'utf8', mode: 0o600 });
|
|
107
|
+
const launched = parseJson<{ missionId: string; status: 'running' }>(await executeCli([
|
|
108
|
+
'mission', 'run', '--agent', input.agent, '--prompt-file', promptPath, '--out', outputPath, '--json',
|
|
109
|
+
]));
|
|
110
|
+
if (!isClassicMissionId(launched.missionId) || launched.status !== 'running') throw new Error('Mission CLI returned an invalid interaction ID');
|
|
111
|
+
interactionId = launched.missionId;
|
|
112
|
+
try { input.onInteractionId?.(interactionId); } catch { /* telemetry must not interrupt mission startup */ }
|
|
113
|
+
const completion = (async (): Promise<ClassicMissionCliResult> => {
|
|
114
|
+
try {
|
|
115
|
+
while (now() - startedAt < MAX_WAIT_MS) {
|
|
116
|
+
const status: MissionStatus = parseJson<MissionStatus>(await executeCli(['mission', 'status', interactionId!, '--json']));
|
|
117
|
+
if (status.missionId !== interactionId) throw new Error('Mission status did not match its interaction ID');
|
|
118
|
+
// `eln mission status --json` exposes completed records as `done`.
|
|
119
|
+
// Keep `completed` accepted for compatible bridges and existing callers.
|
|
120
|
+
if (status.status === 'done' || status.status === 'completed') {
|
|
121
|
+
if (typeof status.result !== 'string' || !status.result.trim()) throw new Error('Mission completed without a final answer');
|
|
122
|
+
return { ok: true, status: 'completed', interactionId, path: outputPath, content: status.result };
|
|
123
|
+
}
|
|
124
|
+
if (status.status !== 'running') return {
|
|
125
|
+
ok: false,
|
|
126
|
+
status: status.status === 'cancelled' ? 'cancelled' : 'failed',
|
|
127
|
+
interactionId,
|
|
128
|
+
path: outputPath,
|
|
129
|
+
error: 'Mission did not complete successfully',
|
|
130
|
+
};
|
|
131
|
+
await wait(POLL_MS);
|
|
132
|
+
}
|
|
133
|
+
await executeCli(['mission', 'cancel', interactionId!, '--json']).catch(() => undefined);
|
|
134
|
+
return { ok: false, status: 'failed', interactionId, path: outputPath, error: 'Mission exceeded the sidetab time limit' };
|
|
135
|
+
} catch {
|
|
136
|
+
return { ok: false, status: 'failed', interactionId, path: outputPath, error: 'Mission CLI could not complete the request' };
|
|
137
|
+
} finally {
|
|
138
|
+
try { rmSync(tempRoot, { recursive: true, force: true }); } catch { /* temp cleanup cannot replace mission outcome */ }
|
|
139
|
+
}
|
|
140
|
+
})();
|
|
141
|
+
return {
|
|
142
|
+
ok: true,
|
|
143
|
+
status: 'running',
|
|
144
|
+
interactionId,
|
|
145
|
+
path: outputPath,
|
|
146
|
+
startedAt,
|
|
147
|
+
completion,
|
|
148
|
+
};
|
|
149
|
+
} catch {
|
|
150
|
+
try { rmSync(tempRoot, { recursive: true, force: true }); } catch { /* temp cleanup cannot replace mission outcome */ }
|
|
151
|
+
return { ok: false, status: 'failed', ...(interactionId ? { interactionId } : {}), path: outputPath, error: 'Mission CLI could not complete the request' };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -95,6 +95,9 @@ export const SEAT_INTENT_ESCALATION_FLOW =
|
|
|
95
95
|
export const SEAT_MEMORY_RECALL_PREFIX = '🧠 직전 인계 회상:';
|
|
96
96
|
export const SEAT_MEMORY_RECALL_MAX_CHARS = 360;
|
|
97
97
|
const RECALL_READ_BYTES = 16_384;
|
|
98
|
+
export const SEAT_MEMORY_IMPORT_PREFIX = '🧠 자리 기억 스냅샷:';
|
|
99
|
+
export const SEAT_MEMORY_IMPORT_MAX_CHARS = 2_000;
|
|
100
|
+
const SEAT_MEMORY_HANDOFF_MAX_AGE_MS = 24 * 60 * 60 * 1_000;
|
|
98
101
|
/** 발췌(제목 — 첫 줄)에 남길 최소 글자 — 이보다 모자라면 전문 경로를 짧은 꼴로 바꾼다. */
|
|
99
102
|
const RECALL_MIN_EXCERPT = 60;
|
|
100
103
|
/** 줄에 싣는 파일명 최대 글자. */
|
|
@@ -184,6 +187,162 @@ function seatMemoryRecallLine(seatDir: string): string | null {
|
|
|
184
187
|
return recall.line;
|
|
185
188
|
}
|
|
186
189
|
|
|
190
|
+
interface SeatMemorySource {
|
|
191
|
+
path: string | null;
|
|
192
|
+
mtimeMs: number | null;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function regularMemorySource(path: string): SeatMemorySource {
|
|
196
|
+
try {
|
|
197
|
+
const stat = lstatSync(path);
|
|
198
|
+
return stat.isFile() ? { path, mtimeMs: stat.mtimeMs } : { path: null, mtimeMs: null };
|
|
199
|
+
} catch {
|
|
200
|
+
return { path: null, mtimeMs: null };
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function handoffPriorityExcerpt(path: string): { priority: string | null; evidence: string | null } {
|
|
205
|
+
// Only inspect a bounded prefix and extract explicit priority/evidence labels;
|
|
206
|
+
// arbitrary handoff prose can contain account values or stale historical claims.
|
|
207
|
+
const lines = readHead(path).split(/\r\n|[\n\r\u0085\u2028\u2029]/);
|
|
208
|
+
const priorityLabel = /^\s*(?:[-*]\s*)?(?:#{1,6}\s*)?(?:다음 한 수|현재 우선순위|1순위|최우선|next step|priority)\s*[::]/i;
|
|
209
|
+
const evidenceLabel = /^\s*(?:[-*]\s*)?(?:#{1,6}\s*)?(?:근거|증거|evidence|source)\s*[::]/i;
|
|
210
|
+
const priorityRaw = lines.find((line) => priorityLabel.test(line.replace(/\*\*/g, '')));
|
|
211
|
+
const evidenceRaw = lines.find((line) => evidenceLabel.test(line.replace(/\*\*/g, '')));
|
|
212
|
+
const cleanExcerpt = (line: string | undefined): string | null => {
|
|
213
|
+
if (!line || SHELL_CHARS.test(line)) return null;
|
|
214
|
+
const clean = oneLine(line.replace(/\*\*/g, '').replace(/^\s*[-*]\s*/, ''));
|
|
215
|
+
return clean || null;
|
|
216
|
+
};
|
|
217
|
+
const evidencePathStart = /(?:seat-state|docs|src|apps|test)\//gu;
|
|
218
|
+
const evidencePathPattern = /(?:seat-state|docs|src|apps|test)\/[\p{L}\p{N}._/@+-]+/u;
|
|
219
|
+
const paths = (line: string | undefined): { values: string[]; complete: boolean } => {
|
|
220
|
+
if (!line) return { values: [], complete: true };
|
|
221
|
+
const values: string[] = [];
|
|
222
|
+
let complete = true;
|
|
223
|
+
for (const startMatch of line.matchAll(evidencePathStart)) {
|
|
224
|
+
const start = startMatch.index ?? -1;
|
|
225
|
+
if (start < 0) {
|
|
226
|
+
complete = false;
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
const candidate = line.slice(start).match(evidencePathPattern)?.[0];
|
|
230
|
+
if (!candidate) {
|
|
231
|
+
complete = false;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
const after = line[start + candidate.length];
|
|
235
|
+
const afterNext = line[start + candidate.length + 1];
|
|
236
|
+
const boundary = after === undefined || /\s/u.test(after)
|
|
237
|
+
|| (/[;,!?()[\]{}<>]/u.test(after) && (afterNext === undefined || /\s/u.test(afterNext)));
|
|
238
|
+
const spacedTail = after === ' '
|
|
239
|
+
? line.slice(start + candidate.length).match(/^\s+([^·,;!?]*?)(?=\s*[·,;!?]|$)/u)?.[1]?.trim()
|
|
240
|
+
: undefined;
|
|
241
|
+
const looksLikeSpacedPath = Boolean(spacedTail && /\.[\p{L}\p{N}]{1,12}$/u.test(spacedTail));
|
|
242
|
+
if (!boundary || looksLikeSpacedPath) {
|
|
243
|
+
// Never publish a prefix when the source may contain a wider path token.
|
|
244
|
+
complete = false;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
values.push(redactSecretText(candidate));
|
|
248
|
+
}
|
|
249
|
+
return { values, complete };
|
|
250
|
+
};
|
|
251
|
+
const priorityPaths = paths(priorityRaw);
|
|
252
|
+
const priority = priorityPaths.complete
|
|
253
|
+
? cleanExcerpt(priorityRaw)?.replace(new RegExp(evidencePathPattern.source, 'gu'), '〔경로는 근거 포인터 참조〕') ?? null
|
|
254
|
+
: null;
|
|
255
|
+
const evidencePaths = [...new Set([...priorityPaths.values, ...paths(evidenceRaw).values])].slice(0, 2);
|
|
256
|
+
return {
|
|
257
|
+
priority: priority ? priority.slice(0, 700) : null,
|
|
258
|
+
evidence: evidencePaths.length ? evidencePaths.join(' · ') : null,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/** Session-start only: bounded source pointers plus a short, explicitly labeled priority excerpt.
|
|
263
|
+
* The card cache keeps this snapshot stable for the conversation; newer files appear next session. */
|
|
264
|
+
function buildSeatMemoryImport(cwd: string, seat: string, home: string, now: Date): string {
|
|
265
|
+
const seatDir = join(home, 'elanous-hq', 'seat-state', seat);
|
|
266
|
+
const handoff = newestHandoff(seatDir);
|
|
267
|
+
const handoffSource = handoff ? { path: handoff.path, mtimeMs: handoff.mtime.getTime() } : { path: null, mtimeMs: null };
|
|
268
|
+
const memory = regularMemorySource(join(home, 'elanous-hq', 'seat-state', 'memory', 'MEMORY.md'));
|
|
269
|
+
const knowhowCandidates = [
|
|
270
|
+
join(cwd, 'docs', 'roles', seat, 'KNOWHOW.md'),
|
|
271
|
+
join(home, 'elanous-hq', 'seats', seat, 'docs', 'roles', seat, 'KNOWHOW.md'),
|
|
272
|
+
];
|
|
273
|
+
const knowhow = knowhowCandidates.map(regularMemorySource).find((source) => source.path) ?? { path: null, mtimeMs: null };
|
|
274
|
+
const stamp = (source: SeatMemorySource): string => source.mtimeMs === null ? '미상' : new Date(source.mtimeMs).toISOString();
|
|
275
|
+
const stale = (source: SeatMemorySource): boolean => source.mtimeMs === null || handoffSource.mtimeMs === null ||
|
|
276
|
+
now.getTime() - handoffSource.mtimeMs > SEAT_MEMORY_HANDOFF_MAX_AGE_MS ||
|
|
277
|
+
handoffSource.mtimeMs > now.getTime() || source.mtimeMs > now.getTime() || source.mtimeMs < handoffSource.mtimeMs;
|
|
278
|
+
const handoffStale = handoffSource.mtimeMs === null || now.getTime() - handoffSource.mtimeMs > SEAT_MEMORY_HANDOFF_MAX_AGE_MS ||
|
|
279
|
+
handoffSource.mtimeMs > now.getTime();
|
|
280
|
+
const handoffLabel = handoffSource.path
|
|
281
|
+
? `seat-state/${seat}/${redactSecretText(basename(handoffSource.path))}`
|
|
282
|
+
: `seat-state/${seat}/HANDOFF-*.md 없음`;
|
|
283
|
+
const memoryLabel = memory.path ? 'seat-state/memory/MEMORY.md' : 'seat-state/memory/MEMORY.md 없음';
|
|
284
|
+
const knowhowLabel = knowhow.path ? `docs/roles/${seat}/KNOWHOW.md` : `docs/roles/${seat}/KNOWHOW.md 없음`;
|
|
285
|
+
const sourceLines = [
|
|
286
|
+
`- 인계 포인터: ${handoffLabel} · 갱신 ${stamp(handoffSource)}${handoffStale ? ' · stale/unknown' : ''}`,
|
|
287
|
+
`- 공통 기억 색인: ${memoryLabel} · 갱신 ${stamp(memory)}${stale(memory) ? ' · stale/unknown' : ''}`,
|
|
288
|
+
`- 역할 노하우: ${knowhowLabel} · 갱신 ${stamp(knowhow)}${stale(knowhow) ? ' · stale/unknown' : ''}`,
|
|
289
|
+
];
|
|
290
|
+
let priority: string | null = null;
|
|
291
|
+
let evidence: string | null = null;
|
|
292
|
+
if (!handoffStale && handoffSource.path) {
|
|
293
|
+
try {
|
|
294
|
+
({ priority, evidence } = handoffPriorityExcerpt(handoffSource.path));
|
|
295
|
+
} catch { /* missing/unreadable excerpt is unknown, but pointers remain useful */ }
|
|
296
|
+
}
|
|
297
|
+
const priorityPrefix = '- 현재 우선순위(인계 발췌): ';
|
|
298
|
+
const evidencePrefix = '- 근거 포인터(인계 발췌): ';
|
|
299
|
+
const priorityAvailable = !handoffStale && Boolean(priority);
|
|
300
|
+
const evidencePaths = !handoffStale && evidence ? evidence.split(' · ') : [];
|
|
301
|
+
const summary = priorityAvailable ? priorityPrefix : '- 현재 우선순위: 미관측(오래됐거나 명시된 우선순위 줄이 없음) · unknown';
|
|
302
|
+
const evidenceLine = evidencePaths.length ? evidencePrefix : '- 근거 포인터: 미관측 · 원본 확인 필요';
|
|
303
|
+
const guidance = 'stale/unknown 또는 상충하는 기억은 사실로 단정하지 말고 unknown으로 답한 뒤 위 포인터의 정본을 확인한다. 비밀·계정 값은 기억에서 가져오지 않는다.';
|
|
304
|
+
const fixedLines = [
|
|
305
|
+
`${SEAT_MEMORY_IMPORT_PREFIX} 읽기 전용 · 세션 시작 스냅샷 · 다음 세션부터 갱신`,
|
|
306
|
+
...sourceLines,
|
|
307
|
+
summary,
|
|
308
|
+
evidenceLine,
|
|
309
|
+
guidance,
|
|
310
|
+
];
|
|
311
|
+
// Reserve space separately for each excerpt. Never slice the assembled card:
|
|
312
|
+
// that could cut a path in half or remove the stale/unknown safety guidance.
|
|
313
|
+
const excerptRoom = Math.max(0, SEAT_MEMORY_IMPORT_MAX_CHARS - fixedLines.join('\n').length);
|
|
314
|
+
const excerptCount = Number(priorityAvailable) + Number(evidencePaths.length > 0);
|
|
315
|
+
const excerptBudget = Math.min(520, Math.floor(excerptRoom / (excerptCount || 1)));
|
|
316
|
+
const priorityText = priorityAvailable
|
|
317
|
+
? (priority!.length > excerptBudget ? `${priority!.slice(0, Math.max(0, excerptBudget - 1))}…` : priority!)
|
|
318
|
+
: '';
|
|
319
|
+
const evidenceParts: string[] = [];
|
|
320
|
+
let evidenceRoom = excerptBudget;
|
|
321
|
+
let omittedEvidencePaths = 0;
|
|
322
|
+
for (const path of evidencePaths) {
|
|
323
|
+
const separator = evidenceParts.length ? ' · ' : '';
|
|
324
|
+
if (separator.length + path.length <= evidenceRoom) {
|
|
325
|
+
evidenceParts.push(path);
|
|
326
|
+
evidenceRoom -= separator.length + path.length;
|
|
327
|
+
} else {
|
|
328
|
+
omittedEvidencePaths++;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
let evidenceText = evidenceParts.join(' · ');
|
|
332
|
+
if (omittedEvidencePaths) {
|
|
333
|
+
const note = `${evidenceText ? ' · ' : ''}${omittedEvidencePaths}개 긴 경로 생략(원문 인계 포인터 참조)`;
|
|
334
|
+
if (note.length <= evidenceRoom) evidenceText += note;
|
|
335
|
+
}
|
|
336
|
+
const content = [
|
|
337
|
+
`${SEAT_MEMORY_IMPORT_PREFIX} 읽기 전용 · 세션 시작 스냅샷 · 다음 세션부터 갱신`,
|
|
338
|
+
...sourceLines,
|
|
339
|
+
`${summary}${priorityText}`,
|
|
340
|
+
`${evidenceLine}${evidenceText}`,
|
|
341
|
+
guidance,
|
|
342
|
+
].join('\n');
|
|
343
|
+
return content;
|
|
344
|
+
}
|
|
345
|
+
|
|
187
346
|
function buildCardMessages(cwd: string, deps: SeatBootDeps): { messages: LLMMessage[]; observed: Record<string, unknown> } {
|
|
188
347
|
const detection = detectSeat(cwd, deps.env ?? process.env);
|
|
189
348
|
if (!detection) return { messages: [], observed: { reason: 'no-seat' } };
|
|
@@ -194,13 +353,24 @@ function buildCardMessages(cwd: string, deps: SeatBootDeps): { messages: LLMMess
|
|
|
194
353
|
if (!isSeatDir) return { messages: [], observed: { reason: 'no-seat-state', seat: detection.seat, source: detection.source } };
|
|
195
354
|
const { sections, unread } = collectSeatBootSections(detection.seat, { home, msgPath: deps.msgPath ?? defaultMsgStorePath() });
|
|
196
355
|
const card = renderSeatBootCard(detection.seat, sections, null);
|
|
197
|
-
const
|
|
356
|
+
const snapshotAt = deps.now?.() ?? new Date();
|
|
357
|
+
const at = snapshotAt.toISOString();
|
|
198
358
|
const recall = seatMemoryRecallLine(seatDir);
|
|
359
|
+
const memoryImport = buildSeatMemoryImport(cwd, detection.seat, home, snapshotAt);
|
|
360
|
+
debug.log('dashboard.seat-boot', 'memory-import', {
|
|
361
|
+
seat: detection.seat,
|
|
362
|
+
chars: memoryImport.length,
|
|
363
|
+
priority: memoryImport.includes('- 현재 우선순위(인계 발췌):'),
|
|
364
|
+
evidence: memoryImport.includes('- 근거 포인터(인계 발췌):'),
|
|
365
|
+
unknown: memoryImport.includes('- 현재 우선순위: 미관측'),
|
|
366
|
+
updatedAt: snapshotAt.toISOString(),
|
|
367
|
+
});
|
|
199
368
|
const content =
|
|
200
369
|
`## 자리 부트 카드 — 너는 이 작업 디렉터리의 ${detection.seat} 자리에서 일한다\n` +
|
|
201
370
|
`(판정: ${detection.source === 'cwd' ? `cwd 의 /seats/${detection.seat}` : 'COORD_ID'} · 세션 시작 스냅샷 ${at} · 이후 바뀐 값은 다시 조회하라)\n` +
|
|
202
371
|
`사람이 다른 일을 먼저 시키지 않았다면, 첫 답에서 자리 이름·'자리 역할' 절의 역할·안 읽은 우편 수를 각각 명시하고 처리할 일을 제안하라. 역할이 미관측이면 추측하지 말고 미관측이라고 말하라.\n` +
|
|
203
372
|
(recall ? `${recall}\n` : '') +
|
|
373
|
+
`${memoryImport}\n` +
|
|
204
374
|
'\n' +
|
|
205
375
|
`${SEAT_INTENT_ESCALATION_FLOW}\n\n` +
|
|
206
376
|
card;
|
|
@@ -12,6 +12,59 @@ export function registerClassicSideSlash(
|
|
|
12
12
|
): void {
|
|
13
13
|
registry.register(['side'], async (args, ctx) => {
|
|
14
14
|
const sub = (args[0] ?? 'list').toLowerCase();
|
|
15
|
+
const getRows = (): SidetabRow[] => ctx.classicSidetabAgent?.loadRows(ctx.chatPersona?.sessionId())
|
|
16
|
+
?? loadRows(ctx.chatPersona?.sessionId());
|
|
17
|
+
if (sub === 'open') {
|
|
18
|
+
const agent = (args[1] ?? '').toLowerCase();
|
|
19
|
+
if (args.length !== 2 || (agent !== 'codex' && agent !== 'claude')) {
|
|
20
|
+
ctx.chatLines.push(ctx.warning(' 사용법: /side open codex|claude'));
|
|
21
|
+
} else if (!ctx.classicSidetabAgent) {
|
|
22
|
+
ctx.chatLines.push(ctx.warning(' classic agent sidetab을 사용할 수 없습니다'));
|
|
23
|
+
} else {
|
|
24
|
+
ctx.classicSidetabAgent.openAgent(agent);
|
|
25
|
+
}
|
|
26
|
+
ctx.setChatScrollOffset(-1);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (sub === 'mission') {
|
|
30
|
+
const agent = (args[1] ?? '').toLowerCase();
|
|
31
|
+
const missionArgs = args.slice(2);
|
|
32
|
+
let outputPath: string | undefined;
|
|
33
|
+
const outputFlag = missionArgs.indexOf('--out');
|
|
34
|
+
if (outputFlag >= 0) {
|
|
35
|
+
outputPath = missionArgs[outputFlag + 1];
|
|
36
|
+
if (!outputPath) {
|
|
37
|
+
ctx.chatLines.push(ctx.warning(' 사용법: /side mission codex|claude [--out <path>] <mission>'));
|
|
38
|
+
ctx.setChatScrollOffset(-1);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
missionArgs.splice(outputFlag, 2);
|
|
42
|
+
}
|
|
43
|
+
const mission = missionArgs.join(' ').trim();
|
|
44
|
+
if ((agent !== 'codex' && agent !== 'claude') || !mission) {
|
|
45
|
+
ctx.chatLines.push(ctx.warning(' 사용법: /side mission codex|claude [--out <path>] <mission>'));
|
|
46
|
+
} else if (!ctx.classicSidetabAgent) {
|
|
47
|
+
ctx.chatLines.push(ctx.warning(' classic agent sidetab을 사용할 수 없습니다'));
|
|
48
|
+
} else {
|
|
49
|
+
const result = await ctx.classicSidetabAgent.runMission(agent, mission, outputPath);
|
|
50
|
+
if (result.ok) {
|
|
51
|
+
ctx.chatLines.push(ctx.success(` ${agent} 미션 완료`));
|
|
52
|
+
ctx.chatLines.push(ctx.muted(` promptReady=${Boolean(result.promptReady)}`));
|
|
53
|
+
ctx.chatLines.push(ctx.muted(` missionVisible=${Boolean(result.missionVisible)}`));
|
|
54
|
+
ctx.chatLines.push(ctx.muted(` promptReturned=${Boolean(result.promptReturned)}`));
|
|
55
|
+
ctx.chatLines.push(ctx.muted(` completionMarker=${Boolean(result.completionMarker)}`));
|
|
56
|
+
ctx.chatLines.push(ctx.muted(` 결과 파일: ${result.path}${result.firstLine ? ` · ${result.firstLine}` : ''}`));
|
|
57
|
+
} else {
|
|
58
|
+
ctx.chatLines.push(ctx.muted(` promptReady=${Boolean(result.promptReady)}`));
|
|
59
|
+
ctx.chatLines.push(ctx.muted(` missionVisible=${Boolean(result.missionVisible)}`));
|
|
60
|
+
ctx.chatLines.push(ctx.muted(` promptReturned=${Boolean(result.promptReturned)}`));
|
|
61
|
+
ctx.chatLines.push(ctx.muted(` completionMarker=${Boolean(result.completionMarker)}`));
|
|
62
|
+
ctx.chatLines.push(ctx.warning(` ${agent} 미션 실패 · ${result.error ?? '결과 확인 실패'}${result.path ? ` · ${result.path}` : ''}`));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
ctx.setChatScrollOffset(-1);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
15
68
|
if (sub === 'new') {
|
|
16
69
|
if (args.length > 1) ctx.chatLines.push(ctx.warning(' 사용법: /side new'));
|
|
17
70
|
else ctx.termSlash.openNewTerminal();
|
|
@@ -25,7 +78,7 @@ export function registerClassicSideSlash(
|
|
|
25
78
|
}
|
|
26
79
|
// Use the same filtered manifest rows for display and numeric resolution;
|
|
27
80
|
// never let an exited row shift the number shown to the user.
|
|
28
|
-
const rows =
|
|
81
|
+
const rows = getRows().filter(row => row.badge !== 'exited');
|
|
29
82
|
if (sub === 'list') {
|
|
30
83
|
if (rows.length === 0) ctx.chatLines.push(ctx.muted(' 사이드탭 없음'));
|
|
31
84
|
rows.forEach((row, i) => ctx.chatLines.push(ctx.muted(` ${i + 1}. ${row.badge} ${row.label}`)));
|
|
@@ -3,6 +3,82 @@ import type { ModalSurface } from '../display/modal-stack.js';
|
|
|
3
3
|
import type { Key } from '../tui.js';
|
|
4
4
|
import { loadSidetabRows, type SidetabRow } from '../sidetab-core/model.js';
|
|
5
5
|
|
|
6
|
+
export interface DashboardLocalAgentSession {
|
|
7
|
+
id: string;
|
|
8
|
+
title: string;
|
|
9
|
+
kind: 'shell' | 'coding-agent';
|
|
10
|
+
agentBrand?: 'claude-code' | 'codex' | 'gemini';
|
|
11
|
+
state: 'foreground' | 'background' | 'exited';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface DashboardMissionResult {
|
|
15
|
+
ok: boolean;
|
|
16
|
+
path: string;
|
|
17
|
+
content?: string;
|
|
18
|
+
firstLine?: string;
|
|
19
|
+
promptReady: boolean;
|
|
20
|
+
missionVisible: boolean;
|
|
21
|
+
promptReturned: boolean;
|
|
22
|
+
completionMarker: boolean;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Convert popup startup/adapter exceptions into the same explicit mission outcome. */
|
|
27
|
+
export async function runDashboardAgentMission<TSession, TModal>(deps: {
|
|
28
|
+
agent: string;
|
|
29
|
+
requestedOutputPath?: string;
|
|
30
|
+
open: () => TSession | undefined;
|
|
31
|
+
modal: (session: TSession) => TModal | null | undefined;
|
|
32
|
+
outputPath: (session: TSession, requested?: string) => string;
|
|
33
|
+
run: (session: TSession, modal: TModal, outputPath: string) => Promise<DashboardMissionResult>;
|
|
34
|
+
close: (session: TSession) => void;
|
|
35
|
+
}): Promise<DashboardMissionResult> {
|
|
36
|
+
let session: TSession | undefined;
|
|
37
|
+
let resultPath = deps.requestedOutputPath ?? '';
|
|
38
|
+
try {
|
|
39
|
+
session = deps.open();
|
|
40
|
+
if (session === undefined) throw new Error(`${deps.agent} PTY could not start`);
|
|
41
|
+
const modal = deps.modal(session);
|
|
42
|
+
if (!modal) throw new Error(`${deps.agent} PTY could not start`);
|
|
43
|
+
resultPath = deps.outputPath(session, deps.requestedOutputPath);
|
|
44
|
+
return await deps.run(session, modal, resultPath);
|
|
45
|
+
} catch (error) {
|
|
46
|
+
return {
|
|
47
|
+
ok: false,
|
|
48
|
+
path: resultPath,
|
|
49
|
+
promptReady: false,
|
|
50
|
+
missionVisible: false,
|
|
51
|
+
promptReturned: false,
|
|
52
|
+
completionMarker: false,
|
|
53
|
+
error: error instanceof Error ? error.message : String(error),
|
|
54
|
+
};
|
|
55
|
+
} finally {
|
|
56
|
+
if (session !== undefined) {
|
|
57
|
+
try { deps.close(session); } catch { /* closing a failed popup must not replace its mission result */ }
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Keep locally spawned coding-agent tabs attachable even when no PTY manifest row exists. */
|
|
63
|
+
export function mergeLocalAgentSessions(
|
|
64
|
+
rows: readonly SidetabRow[],
|
|
65
|
+
sessions: readonly DashboardLocalAgentSession[],
|
|
66
|
+
): SidetabRow[] {
|
|
67
|
+
const knownSessionIds = new Set(rows.map((row) => row.sessionId).filter((id): id is string => Boolean(id)));
|
|
68
|
+
const localAgents = sessions
|
|
69
|
+
.filter((session) => session.kind === 'coding-agent' && session.state !== 'exited' && !knownSessionIds.has(session.id))
|
|
70
|
+
.map((session): SidetabRow => ({
|
|
71
|
+
id: session.id,
|
|
72
|
+
label: session.title,
|
|
73
|
+
kind: session.agentBrand ?? 'coding-agent',
|
|
74
|
+
// Terminal foreground/background says where the session is attached,
|
|
75
|
+
// not whether the agent is currently working. Do not infer turn state.
|
|
76
|
+
badge: 'unknown',
|
|
77
|
+
sessionId: session.id,
|
|
78
|
+
}));
|
|
79
|
+
return [...rows, ...localAgents];
|
|
80
|
+
}
|
|
81
|
+
|
|
6
82
|
export interface DashboardSidetabRuntimeDeps {
|
|
7
83
|
currentSessionId: () => string | undefined;
|
|
8
84
|
termSize: () => { cols: number; rows: number };
|
|
@@ -10,6 +86,8 @@ export interface DashboardSidetabRuntimeDeps {
|
|
|
10
86
|
pushModal: (surface: ModalSurface) => { dispose: () => void };
|
|
11
87
|
attach: (row: SidetabRow) => void;
|
|
12
88
|
spawnShell: () => void;
|
|
89
|
+
spawnAgent: (agent: 'codex' | 'claude') => void;
|
|
90
|
+
runMission: (agent: 'codex' | 'claude', mission: string, outputPath?: string) => Promise<DashboardMissionResult>;
|
|
13
91
|
detach: (row: SidetabRow | null) => void;
|
|
14
92
|
kill: (row: SidetabRow) => void;
|
|
15
93
|
returnToParent: () => void;
|
|
@@ -17,8 +95,11 @@ export interface DashboardSidetabRuntimeDeps {
|
|
|
17
95
|
}
|
|
18
96
|
|
|
19
97
|
export interface DashboardSidetabRuntime {
|
|
98
|
+
loadRows: (sessionId?: string) => SidetabRow[];
|
|
20
99
|
routeKey: (key: Key) => boolean;
|
|
21
100
|
beginPrefix: () => void;
|
|
101
|
+
openAgent: DashboardSidetabRuntimeDeps['spawnAgent'];
|
|
102
|
+
runMission: DashboardSidetabRuntimeDeps['runMission'];
|
|
22
103
|
close: () => void;
|
|
23
104
|
}
|
|
24
105
|
|
|
@@ -196,6 +277,11 @@ export function createDashboardSidetabRuntime(
|
|
|
196
277
|
deps.spawnShell();
|
|
197
278
|
return true;
|
|
198
279
|
}
|
|
280
|
+
if (!key.ctrl && !key.alt && (name === 'c' || name === 'a')) {
|
|
281
|
+
closePanel();
|
|
282
|
+
deps.spawnAgent(name === 'c' ? 'codex' : 'claude');
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
199
285
|
if (!key.ctrl && !key.alt && name === 'd') {
|
|
200
286
|
closePanel();
|
|
201
287
|
deps.detach(null);
|
|
@@ -207,7 +293,7 @@ export function createDashboardSidetabRuntime(
|
|
|
207
293
|
confirmKill(row);
|
|
208
294
|
return true;
|
|
209
295
|
}
|
|
210
|
-
deps.status('사이드탭 키: s 목록 · p 부모 · 1–9 연결 · n 새 셸 · d 분리 · k 종료');
|
|
296
|
+
deps.status('사이드탭 키: s 목록 · p 부모 · 1–9 연결 · c Codex · a Claude · n 새 셸 · d 분리 · k 종료');
|
|
211
297
|
return true;
|
|
212
298
|
}
|
|
213
299
|
if (key.ctrl && !key.alt && (key.name === '\\' || key.name === 'backslash')) {
|
|
@@ -218,8 +304,11 @@ export function createDashboardSidetabRuntime(
|
|
|
218
304
|
};
|
|
219
305
|
|
|
220
306
|
return {
|
|
307
|
+
loadRows: (sessionId) => getRows(sessionId ?? deps.currentSessionId()),
|
|
221
308
|
routeKey,
|
|
222
309
|
beginPrefix,
|
|
310
|
+
openAgent: deps.spawnAgent,
|
|
311
|
+
runMission: deps.runMission,
|
|
223
312
|
close() {
|
|
224
313
|
prefixPending = false;
|
|
225
314
|
closePanel();
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { estimateTokens } from '../tokens.js';
|
|
2
|
+
|
|
3
|
+
export interface InstalledSkillSummary {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface InstalledSkillCatalogMessage {
|
|
9
|
+
role: 'system';
|
|
10
|
+
content: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface InstalledSkillCatalogBuild {
|
|
14
|
+
message: InstalledSkillCatalogMessage | null;
|
|
15
|
+
estimatedTokens: number;
|
|
16
|
+
budgetTokens: number;
|
|
17
|
+
mode: 'full' | 'short-description' | 'names-only' | 'names-truncated' | 'empty';
|
|
18
|
+
skillCount: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const CONTEXT_WINDOW_FALLBACK = 32_000;
|
|
22
|
+
const CATALOG_CONTEXT_FRACTION = 0.02;
|
|
23
|
+
const OMITTED_SKILLS_NOTE = 'Use elanous_skills_list to inspect other installed skills.';
|
|
24
|
+
|
|
25
|
+
let cachedKey: string | null = null;
|
|
26
|
+
let cachedBuild: InstalledSkillCatalogBuild | null = null;
|
|
27
|
+
|
|
28
|
+
function render(entries: readonly InstalledSkillSummary[], descriptionChars: number, omittedCount = 0): string {
|
|
29
|
+
const lines = entries.map(({ name, description }) => {
|
|
30
|
+
const summary = descriptionChars === 0 ? '' : description.trim().slice(0, descriptionChars).trim();
|
|
31
|
+
return summary ? `- ${name}: ${summary}` : `- ${name}`;
|
|
32
|
+
});
|
|
33
|
+
if (omittedCount > 0) lines.push(`- ${omittedCount} more omitted. ${OMITTED_SKILLS_NOTE}`);
|
|
34
|
+
return [
|
|
35
|
+
'[Installed skills]',
|
|
36
|
+
'When a listed skill fits, call skill_exec with its exact name and the user task. Call elanous_skills_list only when the needed skill is absent from this list.',
|
|
37
|
+
...lines,
|
|
38
|
+
].join('\n');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Build a stable prompt-prefix snapshot from frontmatter summaries only; skill bodies stay lazy. */
|
|
42
|
+
export function buildInstalledSkillCatalogMessage(
|
|
43
|
+
input: readonly InstalledSkillSummary[],
|
|
44
|
+
contextWindow?: number | null,
|
|
45
|
+
): InstalledSkillCatalogBuild {
|
|
46
|
+
const entries = [...input]
|
|
47
|
+
.filter(entry => entry.name.trim().length > 0)
|
|
48
|
+
.map(entry => ({ name: entry.name.trim(), description: entry.description.trim() }))
|
|
49
|
+
.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);
|
|
50
|
+
const resolvedWindow = Number.isSafeInteger(contextWindow) && (contextWindow as number) > 0
|
|
51
|
+
? contextWindow as number
|
|
52
|
+
: CONTEXT_WINDOW_FALLBACK;
|
|
53
|
+
const budgetTokens = Math.max(1, Math.floor(resolvedWindow * CATALOG_CONTEXT_FRACTION));
|
|
54
|
+
const key = JSON.stringify([budgetTokens, entries]);
|
|
55
|
+
if (cachedKey === key && cachedBuild) return cachedBuild;
|
|
56
|
+
|
|
57
|
+
if (entries.length === 0) {
|
|
58
|
+
cachedKey = key;
|
|
59
|
+
cachedBuild = { message: null, estimatedTokens: 0, budgetTokens, mode: 'empty', skillCount: 0 };
|
|
60
|
+
return cachedBuild;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let content = render(entries, Number.MAX_SAFE_INTEGER);
|
|
64
|
+
let estimatedTokens = estimateTokens(content);
|
|
65
|
+
let mode: InstalledSkillCatalogBuild['mode'] = 'full';
|
|
66
|
+
if (estimatedTokens > budgetTokens) {
|
|
67
|
+
const maxDescriptionChars = Math.max(...entries.map(entry => entry.description.length));
|
|
68
|
+
let descriptionChars = maxDescriptionChars;
|
|
69
|
+
while (descriptionChars > 0 && estimatedTokens > budgetTokens) {
|
|
70
|
+
descriptionChars = Math.floor(descriptionChars / 2);
|
|
71
|
+
content = render(entries, descriptionChars);
|
|
72
|
+
estimatedTokens = estimateTokens(content);
|
|
73
|
+
}
|
|
74
|
+
mode = descriptionChars === 0 ? 'names-only' : 'short-description';
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
let skillCount = entries.length;
|
|
78
|
+
if (estimatedTokens > budgetTokens) {
|
|
79
|
+
mode = 'names-truncated';
|
|
80
|
+
let included: InstalledSkillSummary[] = [];
|
|
81
|
+
for (let index = 0; index < entries.length; index += 1) {
|
|
82
|
+
const candidate = [...included, entries[index]!];
|
|
83
|
+
const candidateContent = render(candidate, 0, entries.length - candidate.length);
|
|
84
|
+
if (estimateTokens(candidateContent) > budgetTokens) break;
|
|
85
|
+
included = candidate;
|
|
86
|
+
}
|
|
87
|
+
content = render(included, 0, entries.length - included.length);
|
|
88
|
+
estimatedTokens = estimateTokens(content);
|
|
89
|
+
skillCount = included.length;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
cachedKey = key;
|
|
93
|
+
cachedBuild = {
|
|
94
|
+
message: { role: 'system', content },
|
|
95
|
+
estimatedTokens,
|
|
96
|
+
budgetTokens,
|
|
97
|
+
mode,
|
|
98
|
+
skillCount,
|
|
99
|
+
};
|
|
100
|
+
return cachedBuild;
|
|
101
|
+
}
|