elanous 0.2.40 → 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/README.md +7 -7
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → 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/{4769.9fd582071301f382.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/{470.51a72a2348306455.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/{7219-15bdd9a80661af8e.js → 1455-530ca16c7e71baff.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1281.d81877e35b9068f4.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/{1350.59f40e39e02d91b1.js → 2456.b6de0e1c05f28843.js} +1 -1
- 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/2690.0521c738b7749931.js +115 -0
- package/apps/pwa/out/_next/static/chunks/{5436.fdf6fa8ae3e9588d.js → 2974.595d1e29d040cb6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5383.bdfa5d886e39a826.js → 3207.a756c95e9ec8c3c8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +93 -0
- package/apps/pwa/out/_next/static/chunks/{2177.df8547f9d7215c4e.js → 3347.f846266b5e5f3ede.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
- package/apps/pwa/out/_next/static/chunks/{9184.45afbf44fec87574.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/{8099.1cccf31c1baa7e1c.js → 3741.9cf76acaa2ee5298.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +1 -0
- 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/{4864a2ca.1c1c280a7772c5e5.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/{3330.7443183b7e6fdbdf.js → 4276.336d76d858fcdf1b.js} +1 -1
- 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/{3b355b3d.6f73c98bf6f9c749.js → 50061469.0326382241ef3b2d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +149 -0
- 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/{8d173e38.18a2f7b4e1848bdb.js → 53c73f84.373b6160adfa89a4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1537-6bb97b5214928ea9.js → 5431-72a1dbde59400691.js} +1 -1
- 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/{261.0d471e8aded799f3.js → 6131.348b7d6bdcd267ce.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
- package/apps/pwa/out/_next/static/chunks/{9175.2de5209a5ce6f68a.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/{2226.2cf61ec781827219.js → 6632.0eac1c554f8f2ef3.js} +2 -2
- 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/7279-c199ea83f34338fa.js +1 -0
- 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/{b84cad00.594027ebe0531fe2.js → 73d2eb0e.4966ad55293c801a.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/{6257.c0037b8949239f5e.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/{9189505a.980427ac048c8c60.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/{2566.beaffc3a5e1fcd2e.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/{8272-025653884f9645d2.js → 8546-6f03f8ea34dd61d9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6051-0ae955eedb10adb9.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/{4351.0f37a6db2b34d50b.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/9353-12bfff0c130104cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6749.0744ce6eb08d40e9.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/{7611.85f045bf232053ac.js → 9633.ce5bddc56784da72.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3746-f80a78f220bf37b5.js → 9656-374232558fd528d0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +62 -0
- 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-83d27757e2b8060a.js → page-0e3d7b9421b79dac.js} +1 -1
- 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-139d722de1dcd6c1.js → page-bf067887b3307423.js} +1 -1
- 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/{409c787b.e48c5bec8ec10456.js → b450776b.3db34d8d965f82d3.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{ca3702f8.2913182e73889fa2.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/bin/elanous.mjs +6 -1
- package/catalog/models/openai/gpt-6.1-sol.yaml +16 -0
- package/catalog/models/openai/gpt-6.1-terra.yaml +16 -0
- package/docs/goal-context/04-mock-scenarios.md +13 -0
- package/graphs/catalog/catalog.yaml +1 -1
- package/graphs/demo/persona-teacher/lesson-pack.yaml +16 -0
- package/graphs/demo/persona-teacher/recipes.yaml +17 -0
- package/graphs/demo/persona-teacher/weekly-lesson.yaml +36 -0
- package/graphs/heal/heal-loop.yaml +1 -0
- package/graphs/overlays/stop-heal-ladder.yaml +136 -2
- package/graphs/release/release-loop.yaml +3 -1
- package/graphs/units/gate/gate.yaml +20 -0
- package/graphs/units/git/git.yaml +26 -0
- package/graphs/units/implement/implement.yaml +19 -0
- package/graphs/units/landing/landing.yaml +18 -0
- package/graphs/units/review/review.yaml +20 -0
- package/graphs/units/verbs/recipes.yaml +13 -10
- package/graphs/units/verbs/research.yaml +20 -0
- package/graphs/work/research-report.yaml +21 -3
- package/package.json +1 -1
- package/scripts/disk-steward.ts +46 -0
- package/scripts/fleet/node-setup.sh +50 -0
- package/scripts/graph-units/verbs/research.ts +55 -0
- 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/llm-cost-ledger.ts +179 -8
- package/scripts/measure-nl-routing-corpus.ts +10 -2
- package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
- package/scripts/public-copy-lint.ts +163 -19
- package/scripts/ratchets/train-side-invariants.sh +0 -1
- package/scripts/release-loop/gate-autoheal.ts +117 -0
- package/scripts/release-loop/gate-baseline-receipt.ts +55 -10
- package/scripts/release-loop/gate-diff.ts +22 -3
- 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 +489 -62
- 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-shard-load-flaky.ts +256 -0
- package/scripts/release-loop/gate-train-receipts.ts +122 -0
- package/scripts/release-loop/gate-triage-node.ts +70 -10
- package/scripts/release-loop/resume-release.ts +330 -23
- package/scripts/release-loop/traffic-node.ts +6 -3
- package/scripts/release-loop/unattended-release.ts +4 -2
- package/scripts/shadow-authoring-probe.ts +20 -0
- package/scripts/ux-sim.ts +37 -3
- 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 +99 -4
- 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 +267 -40
- package/src/auto-research/research-turn.ts +133 -51
- package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
- package/src/autopilot/pr-manager.ts +38 -7
- package/src/autopilot/pty-control-loop.ts +2 -0
- package/src/boot/daemon-tools/self-implement.ts +46 -9
- package/src/budget/shadow-arms.ts +52 -0
- package/src/capture/tui-self-report.ts +22 -6
- package/src/chat/index.ts +1 -1
- package/src/chat/pickers/state.ts +7 -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/log-event-names.ts +5 -0
- package/src/cli/mcp-login.ts +8 -18
- package/src/cli/msg-cli.ts +57 -1
- package/src/cli/pr-land-heavy-remote.ts +47 -9
- 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/release-cli.ts +27 -1
- package/src/cli/research-cli.ts +4 -5
- package/src/cli/sim-cli.ts +7 -1
- package/src/cli/tasks-cli.ts +12 -4
- package/src/codex/models.ts +30 -15
- 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 +313 -89
- package/src/core-turn/run-goal-loop.ts +106 -2
- package/src/core-turn/types.ts +2 -0
- package/src/dashboard/acp-boot.ts +72 -3
- package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
- package/src/dashboard/classic-sidetab-mission.ts +185 -0
- package/src/dashboard/index.ts +155 -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 +65 -16
- package/src/dashboard/turn-prompt-runtime.ts +4 -2
- package/src/disk-steward/judge.ts +73 -0
- package/src/disk-steward/ledger.ts +122 -0
- package/src/disk-steward/steward.ts +373 -0
- package/src/domains/guardian-tick.ts +191 -2
- package/src/graph-runner/graph-cli.ts +44 -7
- package/src/graph-runner/graph-tick.ts +10 -2
- package/src/graph-runner/in-process-registry.ts +37 -0
- package/src/graph-runner/runner.ts +34 -4
- package/src/grok/agent-search.ts +14 -4
- package/src/grok/credential.ts +28 -11
- package/src/grounding/ref-index.ts +19 -0
- package/src/grounding/sources-cli.ts +9 -1
- package/src/harness/harness-cli-command.ts +267 -14
- package/src/harness/harness-incidents.ts +312 -7
- package/src/harness/harness-pod-dispatch.ts +81 -15
- package/src/harness/harness-space.ts +15 -1
- package/src/harness/harness-stop.ts +155 -11
- package/src/harness/progress-worker-entry.ts +59 -0
- package/src/harness/progress-worker-runtime.ts +11 -0
- package/src/index.ts +52 -7
- package/src/instance/dev-project.ts +25 -0
- package/src/instance/spawn-elanous.ts +6 -4
- package/src/intelligence-map/model-alias.ts +6 -5
- package/src/intelligence-map/model-catalog.ts +59 -2
- package/src/llm/model-defaults.ts +4 -4
- package/src/llm.ts +208 -19
- package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
- package/src/loops/orchestrator/tick.ts +61 -0
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/mcp/mcp-oauth.ts +3 -1
- package/src/model-tier/llm-tier-map.ts +9 -9
- package/src/model-tier/turn-tier.ts +1 -1
- package/src/msg/msg-mirror-github.ts +80 -0
- package/src/msg/msg-mirror-policy.ts +61 -0
- package/src/msg/msg-mirror-runner.ts +219 -0
- package/src/msg/msg-mirror-state.ts +33 -0
- package/src/msg/msg-store.ts +11 -0
- package/src/native-tool-catalog.ts +2 -2
- package/src/nexus/api/harness-traversal.ts +11 -0
- package/src/output-truncation.ts +41 -12
- package/src/pr-tool/census.ts +3 -2
- package/src/project/project-store.ts +48 -1
- 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/release-loop/gate-host-reservation.ts +144 -0
- package/src/release-loop/release-schedule.ts +90 -1
- package/src/repl/index.ts +43 -2
- package/src/research/axis-fanout.ts +121 -16
- package/src/research/bloom-exemplars.ts +137 -0
- package/src/research/gap-followup.ts +13 -1
- package/src/research/plugin-discovery.ts +36 -14
- package/src/research-bridge/invoke.ts +22 -5
- package/src/research-bridge/types.ts +2 -0
- package/src/self-dev/ask-launch-flow.ts +39 -25
- package/src/self-dev/decompose.ts +119 -5
- package/src/self-dev/dev-cli.ts +17 -17
- package/src/self-dev/graph-front-nodes.ts +23 -0
- package/src/self-dev/launch-preflight-text.ts +5 -6
- package/src/self-dev/launch-preflight.ts +9 -4
- package/src/self-dev/orchestrate.ts +27 -2
- package/src/self-dev/review-provider-fallback.ts +9 -2
- package/src/self-dev/run-supervisor.ts +226 -6
- package/src/self-dev/run-types.ts +7 -0
- package/src/self-implement/doctor-visit.ts +88 -0
- package/src/self-implement/gate-artifacts.ts +13 -0
- package/src/self-implement/gate-cli.ts +54 -24
- package/src/self-implement/gate-remote.ts +23 -5
- package/src/self-implement/goal-author-clarification.ts +31 -12
- package/src/self-implement/goal-author.ts +403 -8
- package/src/self-implement/graph-overlay-yaml.ts +7 -0
- package/src/self-implement/graph-stage-units.ts +172 -0
- package/src/self-implement/graph-templates.ts +162 -1
- package/src/self-implement/graph-variant.ts +37 -4
- 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 +31 -8
- package/src/self-implement/knowhow-pack.ts +38 -0
- package/src/self-implement/merge-train.ts +5 -0
- package/src/self-implement/orchestrator.ts +359 -30
- 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 +176 -17
- package/src/self-implement/run-stop.ts +208 -5
- package/src/self-implement/running-runs.ts +35 -12
- package/src/self-implement/self-implement-cli.ts +36 -4
- package/src/self-implement/stop-autoheal-operational.ts +43 -0
- package/src/self-implement/stop-autoheal.ts +28 -6
- package/src/session/chat.ts +69 -58
- package/src/session/request-size-guard.ts +123 -0
- package/src/session-runtime/index.ts +98 -4
- package/src/session-runtime/tier-flip.ts +3 -3
- package/src/sidetab-core/model.ts +150 -0
- 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/parent-host.ts +14 -1
- package/src/task-agent/pod-distributor-entry.ts +3 -0
- package/src/task-agent/task-hand.ts +31 -1
- package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +43 -0
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
- 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 +280 -60
- package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
- 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 +24 -7
- package/src/tui/sidetab/attach.ts +47 -0
- package/src/tui/sidetab/list.ts +45 -0
- package/src/tui/sidetab/nl-tool.ts +2 -136
- package/src/tui/sidetab/peek.ts +52 -0
- package/src/tui-client/dashboard-session.ts +3 -0
- package/src/tui-client/local-chat-turn.ts +26 -13
- package/src/tui.ts +22 -0
- package/src/user-config.ts +11 -5
- package/src/ux-sim/fake-kubectl.ts +37 -3
- package/src/ux-sim/fault-needs-human-reason-repair.ts +107 -0
- package/src/ux-sim/fault-pod-child-result.ts +42 -0
- 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/release-sim-rig.ts +262 -0
- package/src/ux-sim/scenario.ts +116 -23
- package/src/ux-sim/seminar-rehearsal.ts +109 -0
- package/src/ux-sim/subagent-tools-device.ts +2 -2
- 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/1060.014f1f01a17aec26.js +0 -115
- package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +0 -286
- package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +0 -90
- package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +0 -104
- package/apps/pwa/out/_next/static/chunks/2047.8f23e210995d4548.js +0 -2
- package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2066.a77257c8c350770a.js +0 -23
- package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2522.f2766b76d22c8bdf.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +0 -27
- package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +0 -1
- package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +0 -24
- package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +0 -77
- package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +0 -36
- package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +0 -287
- package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +0 -1
- package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +0 -8
- package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +0 -62
- package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +0 -94
- package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +0 -32
- package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +0 -148
- package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +0 -93
- package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8357.1aaa713b052a78b1.js +0 -309
- package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +0 -41
- package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +0 -79
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +0 -1
- package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/d8de0de2-dd0f4ac8e5ab1832.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +0 -1
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
- package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
- /package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_ssgManifest.js +0 -0
|
@@ -123,6 +123,8 @@ export interface PodChildEvidence {
|
|
|
123
123
|
/** Bounded, redacted diagnostics copied only from a failed child terminal result. */
|
|
124
124
|
error?: string;
|
|
125
125
|
detail?: string;
|
|
126
|
+
/** Tail of the child detail, retained separately so long reports keep their final diagnostic lines. */
|
|
127
|
+
detailTail?: string;
|
|
126
128
|
stderr?: string;
|
|
127
129
|
/** Bounded, redacted complete Pod log tail. Separate from child stderr to avoid replacing stronger child facts. */
|
|
128
130
|
podLogTail?: string[];
|
|
@@ -130,6 +132,8 @@ export interface PodChildEvidence {
|
|
|
130
132
|
podLogUnavailable?: string;
|
|
131
133
|
exitCode?: number;
|
|
132
134
|
classification?: string;
|
|
135
|
+
/** Why the child assigned its failure classification; independent from the label itself. */
|
|
136
|
+
classificationBasis?: string;
|
|
133
137
|
scopeEscape?: true;
|
|
134
138
|
outOfScopeEdits?: unknown;
|
|
135
139
|
/** SCOPE-ESCAPE-AS-REFINE — why held out-of-scope edits stop the run (deletion · protected path · cap). Present only with scopeEscape. */
|
|
@@ -156,6 +160,14 @@ export interface PodChildEvidence {
|
|
|
156
160
|
goalPlanRevision?: SelfDevJobResult['goalPlanRevision'];
|
|
157
161
|
}
|
|
158
162
|
|
|
163
|
+
function utf8Tail(value: string, maxBytes: number): string {
|
|
164
|
+
const bytes = Buffer.from(value, 'utf8');
|
|
165
|
+
let start = Math.max(0, bytes.length - maxBytes);
|
|
166
|
+
// Move past continuation bytes so decoding starts at a complete UTF-8 code point.
|
|
167
|
+
while (start < bytes.length && (bytes[start]! & 0xc0) === 0x80) start++;
|
|
168
|
+
return bytes.subarray(start).toString('utf8');
|
|
169
|
+
}
|
|
170
|
+
|
|
159
171
|
const SCOPE_STOP_REASON_ORDER: readonly ScopeStopReason[] = SCOPE_STOP_REASONS;
|
|
160
172
|
|
|
161
173
|
/** Stop reasons for held out-of-scope edits: the child's own `scopeStopReasons` (orchestrator decideScopeExpansion) plus
|
|
@@ -218,12 +230,18 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
|
|
|
218
230
|
const classification = scopeEscape ? 'scope-escape'
|
|
219
231
|
: typeof abandoned?.classification === 'string' ? redactSecretText(abandoned.classification)
|
|
220
232
|
: typeof o.failureClassification === 'string' ? redactSecretText(o.failureClassification) : undefined;
|
|
233
|
+
const rawClassificationBasis = abandoned?.classificationBasis ?? o.classificationBasis;
|
|
234
|
+
const classificationBasis = typeof rawClassificationBasis === 'string' && rawClassificationBasis.trim()
|
|
235
|
+
? redactSecretText(rawClassificationBasis).slice(0, 200) : undefined;
|
|
221
236
|
const evidence: PodChildEvidence = {
|
|
222
237
|
...(failedText(o.error) ? { error: failedText(o.error) } : {}),
|
|
223
238
|
...(failedText(o.detail) ? { detail: failedText(o.detail) } : {}),
|
|
239
|
+
...(o.ok === false && typeof o.detail === 'string' && o.detail.trim()
|
|
240
|
+
? { detailTail: utf8Tail(redactSecretText(o.detail), 4_096) } : {}),
|
|
224
241
|
...(failedText(o.stderr) ? { stderr: failedText(o.stderr) } : {}),
|
|
225
242
|
...(failureExitCode !== undefined ? { exitCode: failureExitCode } : {}),
|
|
226
243
|
...(classification ? { classification } : {}),
|
|
244
|
+
...(classificationBasis ? { classificationBasis } : {}),
|
|
227
245
|
...(scopeEscape ? { scopeEscape: true, scopeStopReasons } : {}),
|
|
228
246
|
...(outOfScopeEdits !== undefined ? { outOfScopeEdits } : {}),
|
|
229
247
|
...(newScope ? { newScope } : {}),
|
package/src/tokens.ts
CHANGED
|
@@ -33,7 +33,32 @@ export function estimateTokens(text: string): number {
|
|
|
33
33
|
return Math.ceil(ascii / 4 + wide / 2);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
export interface MessageLike {
|
|
36
|
+
export interface MessageLike {
|
|
37
|
+
role: string;
|
|
38
|
+
content: string | unknown[];
|
|
39
|
+
/** Opaque reasoning replayed by the Codex Responses adapter. */
|
|
40
|
+
codexReasoningItems?: unknown[];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function estimateStructuredTokens(value: unknown, ancestors = new Set<object>()): number {
|
|
44
|
+
if (typeof value === 'string') return estimateTokens(value);
|
|
45
|
+
if (value === null || typeof value !== 'object') return 1;
|
|
46
|
+
if (ancestors.has(value)) return 200; // malformed cyclic extension: conservative block floor
|
|
47
|
+
ancestors.add(value);
|
|
48
|
+
let total = 2; // JSON brackets/braces
|
|
49
|
+
if (Array.isArray(value)) {
|
|
50
|
+
total += Math.ceil(value.length / 4); // commas
|
|
51
|
+
for (const item of value) total += estimateStructuredTokens(item, ancestors);
|
|
52
|
+
} else {
|
|
53
|
+
const entries = Object.entries(value);
|
|
54
|
+
total += Math.ceil(entries.length / 4); // commas
|
|
55
|
+
for (const [key, item] of entries) {
|
|
56
|
+
total += estimateTokens(key) + 1 + estimateStructuredTokens(item, ancestors);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
ancestors.delete(value);
|
|
60
|
+
return total;
|
|
61
|
+
}
|
|
37
62
|
|
|
38
63
|
export function estimateMessagesTokens(messages: MessageLike[]): number {
|
|
39
64
|
let total = 0;
|
|
@@ -44,7 +69,12 @@ export function estimateMessagesTokens(messages: MessageLike[]): number {
|
|
|
44
69
|
for (const block of m.content) {
|
|
45
70
|
if (!block || typeof block !== 'object') continue;
|
|
46
71
|
const obj = block as Record<string, unknown>;
|
|
47
|
-
if (
|
|
72
|
+
if (obj.type === 'tool_use' || obj.type === 'tool_result') {
|
|
73
|
+
// These payloads are replayed as structured JSON; fixed block cost
|
|
74
|
+
// misses large args/results. Retain the old 200-token floor for
|
|
75
|
+
// tiny blocks so many small calls cannot under-trigger compaction.
|
|
76
|
+
total += Math.max(200, estimateStructuredTokens(obj));
|
|
77
|
+
} else if (typeof obj.text === 'string') {
|
|
48
78
|
total += estimateTokens(obj.text);
|
|
49
79
|
} else if (typeof obj.content === 'string') {
|
|
50
80
|
// Wave 2 (2026-05-04) · tool_result block content matters
|
|
@@ -58,6 +88,9 @@ export function estimateMessagesTokens(messages: MessageLike[]): number {
|
|
|
58
88
|
}
|
|
59
89
|
}
|
|
60
90
|
}
|
|
91
|
+
if (m.role === 'assistant' && m.codexReasoningItems?.length) {
|
|
92
|
+
total += estimateStructuredTokens(m.codexReasoningItems);
|
|
93
|
+
}
|
|
61
94
|
}
|
|
62
95
|
return total;
|
|
63
96
|
}
|
|
@@ -10,6 +10,7 @@ export const agentRuntime: ToolRuntime<Record<string, unknown>, AgentToolResult>
|
|
|
10
10
|
spec: buildAgentTool(),
|
|
11
11
|
async run(req, ctx) {
|
|
12
12
|
return await dispatchAgent(req, {
|
|
13
|
+
...(ctx.parentSessionId ? { parentSessionId: ctx.parentSessionId } : {}),
|
|
13
14
|
...(ctx.agentCwd ? { cwd: ctx.agentCwd } : {}),
|
|
14
15
|
hostTools: ctx.agentHostTools,
|
|
15
16
|
dispatchTool: ctx.agentDispatchTool,
|
|
@@ -15,6 +15,7 @@ import { join } from 'node:path';
|
|
|
15
15
|
import { readdir, readFile } from 'node:fs/promises';
|
|
16
16
|
import { defaultSkillDirs } from '../user-config.js';
|
|
17
17
|
import { SKILLS_LIST_DESCRIPTION } from '../onboarding/entry-hints.js';
|
|
18
|
+
import { normalizeSkillName } from '../skills/name-match.js';
|
|
18
19
|
import type { LLMToolSpec } from '../llm.js';
|
|
19
20
|
import type { ToolRuntime } from './types.js';
|
|
20
21
|
|
|
@@ -69,6 +70,7 @@ export async function dispatchElanousSkillsList(
|
|
|
69
70
|
const skillsDir = dirs[0] ?? ''; // 단일 경로 계약 보존(첫 dir)·전체는 skillsDirs
|
|
70
71
|
const label = dirs.join(', '); // 표시용(다중 루트면 콤마 결합)
|
|
71
72
|
const query = (args.query ?? '').toLowerCase();
|
|
73
|
+
const normalizedQuery = normalizeSkillName(query);
|
|
72
74
|
const seen = new Set<string>();
|
|
73
75
|
const entries: ElanousSkillsListEntry[] = [];
|
|
74
76
|
const errors: string[] = [];
|
|
@@ -91,7 +93,9 @@ export async function dispatchElanousSkillsList(
|
|
|
91
93
|
}
|
|
92
94
|
}
|
|
93
95
|
let filtered = entries;
|
|
94
|
-
if (query.length > 0) filtered = entries.filter((e) =>
|
|
96
|
+
if (query.length > 0) filtered = entries.filter((e) =>
|
|
97
|
+
e.name.toLowerCase().includes(query)
|
|
98
|
+
|| (normalizedQuery.length > 0 && normalizeSkillName(e.name).includes(normalizedQuery)));
|
|
95
99
|
filtered.sort((a, b) => a.name.localeCompare(b.name));
|
|
96
100
|
// 모든 dir 열거 실패(산출 0)면 실패 보고(단일 dir 부재 계약 보존).
|
|
97
101
|
if (entries.length === 0 && errors.length > 0 && errors.length === dirs.length) {
|
|
@@ -3,6 +3,8 @@ import * as harnessSkillExec from '../harness/skill-exec.js';
|
|
|
3
3
|
import { invokeResearch } from '../research-bridge/invoke.js';
|
|
4
4
|
import * as skillIndex from '../skills/index.js';
|
|
5
5
|
import type { SkillIndexEntry } from '../skills/index.js';
|
|
6
|
+
import { dirname } from 'node:path';
|
|
7
|
+
import { resolveSkillName } from '../skills/name-match.js';
|
|
6
8
|
import { getUserConfig } from '../user-config.js';
|
|
7
9
|
import type { LLMToolSpec } from '../llm.js';
|
|
8
10
|
import type { ToolRuntime } from './types.js';
|
|
@@ -17,7 +19,7 @@ export interface SkillExecRunOptions {
|
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
export interface SkillExecArgs {
|
|
20
|
-
/**
|
|
22
|
+
/** Installed skill name; spaces/punctuation may be omitted if the match is unique. */
|
|
21
23
|
skill: string;
|
|
22
24
|
/** Task text passed verbatim to the named skill. */
|
|
23
25
|
task: string;
|
|
@@ -33,6 +35,8 @@ export interface SkillExecResult extends Record<string, unknown> {
|
|
|
33
35
|
|
|
34
36
|
export interface SkillExecDiscoveryDeps {
|
|
35
37
|
discoverPlugin?: (gap: string, deps?: { signal?: AbortSignal }) => Promise<{ card: string }>;
|
|
38
|
+
/** Test seam for the bounded plugin-discovery follow-up. */
|
|
39
|
+
discoveryTimeoutMs?: number;
|
|
36
40
|
}
|
|
37
41
|
|
|
38
42
|
export type SkillExecIndexProvider = () => readonly SkillIndexEntry[];
|
|
@@ -71,13 +75,13 @@ function obtainSkillIndex(): readonly SkillIndexEntry[] {
|
|
|
71
75
|
export function buildSkillExecTool(): LLMToolSpec {
|
|
72
76
|
return {
|
|
73
77
|
name: 'skill_exec',
|
|
74
|
-
description: 'Execute one explicitly named allowlisted skill with the supplied task.
|
|
78
|
+
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.',
|
|
75
79
|
parameters: {
|
|
76
80
|
type: 'object',
|
|
77
81
|
properties: {
|
|
78
82
|
skill: {
|
|
79
83
|
type: 'string',
|
|
80
|
-
description: '
|
|
84
|
+
description: 'Installed skill name; spaces and punctuation may be omitted when the match is unique.',
|
|
81
85
|
},
|
|
82
86
|
task: {
|
|
83
87
|
type: 'string',
|
|
@@ -95,9 +99,19 @@ export async function dispatchSkillExec(
|
|
|
95
99
|
deps: SkillExecDiscoveryDeps = {},
|
|
96
100
|
options: SkillExecRunOptions = {},
|
|
97
101
|
): Promise<SkillExecResult> {
|
|
98
|
-
const { skill, task } = args;
|
|
102
|
+
const { skill: requestedSkill, task } = args;
|
|
103
|
+
if (requestedSkill !== requestedSkill.trim()) {
|
|
104
|
+
return { skill: requestedSkill, ok: false, output: REJECT_OUTPUT(requestedSkill) };
|
|
105
|
+
}
|
|
99
106
|
const extra = getUserConfig().skillRouter.harnessExecAllowlist;
|
|
100
107
|
const index = obtainSkillIndex();
|
|
108
|
+
const resolution = resolveSkillName(requestedSkill, index);
|
|
109
|
+
const skill = resolution.entry?.name ?? requestedSkill;
|
|
110
|
+
if (resolution.ambiguous.length > 0) {
|
|
111
|
+
const candidates = resolution.ambiguous.map((entry) => entry.name).sort().join(', ');
|
|
112
|
+
return { skill: requestedSkill, ok: false, output: `스킬 이름이 여러 항목과 일치합니다: ${candidates}. elanous_skills_list에서 정확한 이름을 골라 다시 호출하세요.` };
|
|
113
|
+
}
|
|
114
|
+
const selected = resolution.entry;
|
|
101
115
|
const allowlist = harnessSkillExec.resolveHarnessExecAllowlist(
|
|
102
116
|
extra,
|
|
103
117
|
(rejected, reason) => observe('allowlist-reject', { skill: rejected, reason }),
|
|
@@ -163,13 +177,18 @@ export async function dispatchSkillExec(
|
|
|
163
177
|
let interruption: 'skill-exec-timeout' | 'skill-exec-cancelled' | undefined;
|
|
164
178
|
try {
|
|
165
179
|
const outcome = await Promise.race([
|
|
166
|
-
invokeResearch(task, {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
180
|
+
invokeResearch(task, {
|
|
181
|
+
skill,
|
|
182
|
+
...(selected ? { skillRootDir: dirname(selected.skillDir) } : {}),
|
|
183
|
+
signal: child.signal,
|
|
184
|
+
onProgress: (delta) => {
|
|
185
|
+
progressChunks += 1;
|
|
186
|
+
progressBytes += delta.length;
|
|
187
|
+
if (progressChunks === 1 || progressChunks % 32 === 0) {
|
|
188
|
+
observe('progress', { skill, progressChunks, progressBytes });
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
}).then((value) => ({ result: value })),
|
|
173
192
|
interrupted.then((reason) => ({ interruption: reason })),
|
|
174
193
|
]);
|
|
175
194
|
settled = true;
|
|
@@ -195,10 +214,11 @@ export async function dispatchSkillExec(
|
|
|
195
214
|
// A low-quality research result is a capability gap. Keep the original failure,
|
|
196
215
|
// and attach a bounded discovery card rather than silently switching tools.
|
|
197
216
|
let discoveryCard: string | undefined;
|
|
198
|
-
|
|
217
|
+
const localSkillMissing = /not found under (?:~\/\.claude\/skills|\/)/i.test(result.error ?? '');
|
|
218
|
+
if (!result.ok && !localSkillMissing && /\b(?:no data|no evidence|missing|unavailable|not found|empty)\b|(?:자료가 없|데이터가 없|자료 부족|미확인|찾지 못)/i
|
|
199
219
|
.test(`${result.output} ${result.error ?? ''}`)) {
|
|
200
220
|
const controller = new AbortController();
|
|
201
|
-
const timer = setTimeout(() => controller.abort(new Error('plugin discovery time budget exhausted')), 10_000);
|
|
221
|
+
const timer = setTimeout(() => controller.abort(new Error('plugin discovery time budget exhausted')), deps.discoveryTimeoutMs ?? 10_000);
|
|
202
222
|
try {
|
|
203
223
|
const discovery = deps.discoverPlugin ?? (await import('../research/plugin-discovery.js')).discoverResearchPlugin;
|
|
204
224
|
const found = await discovery(task, { signal: controller.signal });
|
|
@@ -56,6 +56,7 @@ export interface ToolRuntimeContext {
|
|
|
56
56
|
* supported (e.g. streaming fetch, long-running agent calls). */
|
|
57
57
|
signal?: AbortSignal;
|
|
58
58
|
/** Parent catalog and dispatcher inherited by an Agent runtime's child. */
|
|
59
|
+
parentSessionId?: string;
|
|
59
60
|
agentHostTools?: LLMToolSpec[];
|
|
60
61
|
/** Host-selected working directory for an Agent spawned through MCP. */
|
|
61
62
|
agentCwd?: string;
|
package/src/tui/entry.ts
CHANGED
|
@@ -346,15 +346,23 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
346
346
|
const sidetabLines = sidetabOpen
|
|
347
347
|
? sidetabApi!.formatSidetabLines(sidetabRows, sidetabSelected, sidetabWidth, Math.max(1, rows - 1), sidetabMode)
|
|
348
348
|
: [];
|
|
349
|
-
const
|
|
350
|
-
|
|
351
|
-
|
|
349
|
+
const screenLineCount = sidetabOpen ? Math.max(lines.length, sidetabLines.length) : lines.length;
|
|
350
|
+
const screenLines = Array.from({ length: screenLineCount }, (_, index) => {
|
|
351
|
+
const line = lines[index] ?? '';
|
|
352
|
+
return sidetabOpen ? `${sidetabLines[index] ?? ' '.repeat(sidetabWidth)}│${line}` : line;
|
|
353
|
+
});
|
|
352
354
|
process.stdout.write(`\x1b[H\x1b[2J${screenLines.join('\n')}\x1b[${promptRow};${prompt.cursorCol + (sidetabOpen ? sidetabWidth + 1 : 0)}H\x1b[?25h`);
|
|
353
355
|
if (sidetabAttachments?.hasModal() && !paintingCoordinatorFrame) sidetabAttachments.refresh();
|
|
354
356
|
};
|
|
355
357
|
|
|
356
358
|
const ensureSidetabAttachments = async (): Promise<void> => {
|
|
357
359
|
if (sidetabAttachments) return;
|
|
360
|
+
const installer = await import('../agent-mission/tool-install.js') as unknown as {
|
|
361
|
+
detectAgentCli?: (agent: 'codex' | 'claude') => Promise<{
|
|
362
|
+
agent: 'codex' | 'claude'; installed: boolean; version: string | null;
|
|
363
|
+
login: 'ready' | 'needed' | 'unknown'; message: string;
|
|
364
|
+
}>;
|
|
365
|
+
};
|
|
358
366
|
sidetabAttachments = (await import('./sidetab/attach.js')).createSidetabAttachmentController({
|
|
359
367
|
drawBase: () => {
|
|
360
368
|
paintingCoordinatorFrame = true;
|
|
@@ -362,6 +370,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
362
370
|
},
|
|
363
371
|
termSize: () => ({ cols: process.stdout.columns || 80, rows: process.stdout.rows || 24 }),
|
|
364
372
|
setStatus: (message) => { status = safeStatusText(message); },
|
|
373
|
+
...(installer.detectAgentCli ? { detectAgentCli: installer.detectAgentCli } : {}),
|
|
365
374
|
drawRemoteFrame: (frame) => {
|
|
366
375
|
sidetabRemoteFrame = frame || null;
|
|
367
376
|
if (sidetabRemoteFrame !== null) {
|
|
@@ -573,7 +582,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
573
582
|
.then(({ runLocalChatTurn, onLocalChatBackgroundStatus, onLocalChatSelfHealthStatus }) => {
|
|
574
583
|
observeSession(turnSessionId, onLocalChatBackgroundStatus, onLocalChatSelfHealthStatus);
|
|
575
584
|
let firstResponseSeen = false;
|
|
576
|
-
return runLocalChatTurn(turnSessionId, turnText, abort.signal, undefined, undefined, (delta) => {
|
|
585
|
+
return runLocalChatTurn(turnSessionId, turnText, abort.signal, undefined, undefined, (delta, replace = false) => {
|
|
577
586
|
// 스트림 텍스트 = 진전 신호 — 마지막 진전 시각을 올린다(녹음기 없으면 아무 일도 안 한다).
|
|
578
587
|
reportTuiProgress();
|
|
579
588
|
// 첫 응답 경계: 첫 스트림 델타에서 턴 시작 트레이스를 닫는다(endedBy=stream-open).
|
|
@@ -583,7 +592,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
583
592
|
}
|
|
584
593
|
// The first model token is visible before the final JSONL frame. Keep only
|
|
585
594
|
// a bounded tail until session history becomes the canonical display.
|
|
586
|
-
streamingReply = (streamingReply + delta).slice(-32_768);
|
|
595
|
+
streamingReply = replace ? delta.slice(-32_768) : (streamingReply + delta).slice(-32_768);
|
|
587
596
|
activity = streamReplyLines(streamingReply, process.stdout.columns || 80);
|
|
588
597
|
const now = performance.now();
|
|
589
598
|
if (streamRenderAt === 0 || now - streamRenderAt >= 33) {
|
|
@@ -690,8 +699,9 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
690
699
|
try {
|
|
691
700
|
{
|
|
692
701
|
const { createNextTuiWakeup, setNextTuiWakeupTool } = await import('../tui-client/next-wakeup.js');
|
|
693
|
-
const { setNextSidetabHandler } = await import('../tui-client/local-chat-turn.js');
|
|
702
|
+
const { setNextSidetabHandler, setNextSidetabIpcEnabled } = await import('../tui-client/local-chat-turn.js');
|
|
694
703
|
const { createNextSidetabHostHandler } = await import('./sidetab/nl-tool.js');
|
|
704
|
+
setNextSidetabIpcEnabled(true);
|
|
695
705
|
wakeup = createNextTuiWakeup({
|
|
696
706
|
isTurnRunning: () => busy,
|
|
697
707
|
getBufferText: () => editor.text,
|
|
@@ -720,6 +730,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
720
730
|
attach: async (row) => { await ensureSidetabAttachments(); const ok = sidetabAttachments!.select(row); render(); return { ok, action: 'attach', target: row.id }; },
|
|
721
731
|
detach: () => { if (sidetabAttachments?.hasRemoteView()) sidetabAttachments.showMain(); else if (sidetabAttachments?.hasModal()) { sidetabAttachments.handleKey({ name: '\\', ctrl: true, shift: false, raw: '' }); sidetabAttachments.handleKey({ name: 'd', ctrl: false, shift: false, raw: 'd' }); } render(); return { ok: true, action: 'detach' }; },
|
|
722
732
|
spawn: async (character) => { await ensureSidetabAttachments(); const ok = sidetabAttachments!.spawn(character); refreshSidetabRows(); render(); return { ok, action: 'new', character }; },
|
|
733
|
+
runMission: async (agent, mission) => { await ensureSidetabAttachments(); const result = await sidetabAttachments!.runMission(agent, mission); refreshSidetabRows(); render(); return result; },
|
|
723
734
|
kill: async (row) => { await ensureSidetabAttachments(); const ok = sidetabAttachments!.kill(row); refreshSidetabRows(); render(); return { ok, action: 'kill', target: row.id }; },
|
|
724
735
|
}));
|
|
725
736
|
const gate = wakeup.gate;
|
|
@@ -1258,10 +1269,15 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
1258
1269
|
}
|
|
1259
1270
|
if (submitted === '/help' || submitted === '/help next') {
|
|
1260
1271
|
activity.push(
|
|
1272
|
+
'Commands',
|
|
1261
1273
|
'Next TUI: /side · /sidetab — 세션/PTY 목록',
|
|
1262
1274
|
'사이드탭: Ctrl+\\ 토글 · ↑↓ 선택 · 빈 prompt Enter=attach · /side new · /side kill',
|
|
1263
1275
|
'새 PTY: s shell · e elanous · c codex 구독 · l claude code 구독',
|
|
1264
1276
|
'PTY 분리: Ctrl+\\ 후 d · /term help 는 읽기 전용 목록 명령',
|
|
1277
|
+
'',
|
|
1278
|
+
'Keys',
|
|
1279
|
+
'Enter 전송 · Esc 취소 · PgUp/PgDn 대화 스크롤 · Ctrl+Q 종료',
|
|
1280
|
+
'Ctrl+\\ 사이드탭 토글 · ↑/↓ 목록 이동 · Esc 입력으로 돌아오기',
|
|
1265
1281
|
);
|
|
1266
1282
|
status = 'Enter 전송';
|
|
1267
1283
|
render();
|
|
@@ -1383,8 +1399,9 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
|
|
|
1383
1399
|
const { setNextTuiWakeupTool } = await import('../tui-client/next-wakeup.js');
|
|
1384
1400
|
setNextTuiWakeupTool(null);
|
|
1385
1401
|
}
|
|
1386
|
-
const { setNextSidetabHandler } = await import('../tui-client/local-chat-turn.js');
|
|
1402
|
+
const { setNextSidetabHandler, setNextSidetabIpcEnabled } = await import('../tui-client/local-chat-turn.js');
|
|
1387
1403
|
setNextSidetabHandler(null);
|
|
1404
|
+
setNextSidetabIpcEnabled(false);
|
|
1388
1405
|
turnAbort?.abort();
|
|
1389
1406
|
await turnDone;
|
|
1390
1407
|
backgroundSubscription.stop?.();
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { join } from 'node:path';
|
|
2
3
|
import { resolveBackendSpawn, claudeBackend, codexBackend } from '../../agent-mission/driver.js';
|
|
3
4
|
import { DisplayCoordinator } from '../../display/coordinator.js';
|
|
4
5
|
import { createDisplayEventBus } from '../../display/events.js';
|
|
@@ -6,6 +7,7 @@ import { createTerminalModalRouter } from '../../terminal/terminal-modal-router.
|
|
|
6
7
|
import { getSessionCwd } from '../../session/working-dir.js';
|
|
7
8
|
import { TerminalSessionRegistry, type TerminalSession } from '../../terminal/session-registry.js';
|
|
8
9
|
import { requestRemotePtyControl } from '../../pty-shell/pty-control-ipc.js';
|
|
10
|
+
import { runVisibleAgentMission } from '../../sidetab-core/visible-agent-mission.js';
|
|
9
11
|
import type { Key } from '../../tui.js';
|
|
10
12
|
import type { SidetabRow } from './list.js';
|
|
11
13
|
|
|
@@ -16,6 +18,7 @@ export interface SidetabAttachmentController {
|
|
|
16
18
|
select(row: SidetabRow): boolean;
|
|
17
19
|
showMain(): void;
|
|
18
20
|
spawn(character: SidetabCharacter): boolean;
|
|
21
|
+
runMission(agent: 'codex' | 'claude', mission: string): Promise<Awaited<ReturnType<typeof runVisibleAgentMission>>>;
|
|
19
22
|
kill(row: SidetabRow): boolean;
|
|
20
23
|
handleKey(key: Key): boolean;
|
|
21
24
|
hasModal(): boolean;
|
|
@@ -24,11 +27,21 @@ export interface SidetabAttachmentController {
|
|
|
24
27
|
close(): void;
|
|
25
28
|
}
|
|
26
29
|
|
|
30
|
+
export interface AgentCliDetection {
|
|
31
|
+
agent: 'codex' | 'claude';
|
|
32
|
+
installed: boolean;
|
|
33
|
+
version: string | null;
|
|
34
|
+
login: 'ready' | 'needed' | 'unknown';
|
|
35
|
+
message: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
27
38
|
export function createSidetabAttachmentController(deps: {
|
|
28
39
|
drawBase(): void;
|
|
29
40
|
termSize(): { cols: number; rows: number };
|
|
30
41
|
setStatus(message: string): void;
|
|
31
42
|
drawRemoteFrame(frame: string): void;
|
|
43
|
+
/** Owned by OPT; a missing detector keeps the hook inert until its API lands. */
|
|
44
|
+
detectAgentCli?(agent: 'codex' | 'claude'): Promise<AgentCliDetection>;
|
|
32
45
|
}): SidetabAttachmentController {
|
|
33
46
|
const eventBus = createDisplayEventBus();
|
|
34
47
|
const coordinator = new DisplayCoordinator({
|
|
@@ -45,6 +58,7 @@ export function createSidetabAttachmentController(deps: {
|
|
|
45
58
|
let remoteFrameTimer: ReturnType<typeof setInterval> | null = null;
|
|
46
59
|
let remoteFramePending = false;
|
|
47
60
|
let remoteHasFrame = false;
|
|
61
|
+
let lastSpawnedSession: TerminalSession | null = null;
|
|
48
62
|
|
|
49
63
|
const stopRemote = (): void => {
|
|
50
64
|
if (remoteFrameTimer !== null) clearInterval(remoteFrameTimer);
|
|
@@ -164,6 +178,7 @@ export function createSidetabAttachmentController(deps: {
|
|
|
164
178
|
}
|
|
165
179
|
},
|
|
166
180
|
}, { termCols: cols, termRows: rows });
|
|
181
|
+
lastSpawnedSession = session;
|
|
167
182
|
if (character === 'codex' || character === 'claude') {
|
|
168
183
|
deps.setStatus(`${character} 실행 · agent-mission 구독 경로 scrub 적용(${unsetEnv?.length ?? 0}개 env 제거)`);
|
|
169
184
|
}
|
|
@@ -204,6 +219,38 @@ export function createSidetabAttachmentController(deps: {
|
|
|
204
219
|
},
|
|
205
220
|
showMain,
|
|
206
221
|
spawn,
|
|
222
|
+
async runMission(agent, mission) {
|
|
223
|
+
if (deps.detectAgentCli) {
|
|
224
|
+
let detection: AgentCliDetection;
|
|
225
|
+
try { detection = await deps.detectAgentCli(agent); }
|
|
226
|
+
catch (error) {
|
|
227
|
+
const message = `${agent} CLI 확인에 실패했습니다: ${error instanceof Error ? error.message : String(error)}`;
|
|
228
|
+
deps.setStatus(message);
|
|
229
|
+
return { ok: false, path: '', promptReady: false, missionVisible: false, completionMarker: false, error: message };
|
|
230
|
+
}
|
|
231
|
+
if (!detection.installed) {
|
|
232
|
+
const message = `${detection.message} · 설치 확인 후 미션을 다시 요청하세요`;
|
|
233
|
+
deps.setStatus(message);
|
|
234
|
+
return { ok: false, path: '', promptReady: false, missionVisible: false, completionMarker: false, error: message };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
lastSpawnedSession = null;
|
|
238
|
+
if (!spawn(agent) || !lastSpawnedSession?.modal) {
|
|
239
|
+
return { ok: false, path: '', promptReady: false, missionVisible: false, completionMarker: false, error: `${agent} side-tab PTY could not start` };
|
|
240
|
+
}
|
|
241
|
+
const session = lastSpawnedSession;
|
|
242
|
+
const outputPath = join(session.cwd, '.elanous', 'mission-results', `sidetab-${Date.now()}.md`);
|
|
243
|
+
const backend = agent === 'codex' ? codexBackend : claudeBackend;
|
|
244
|
+
const result = await runVisibleAgentMission({
|
|
245
|
+
pty: session.modal,
|
|
246
|
+
mission,
|
|
247
|
+
outputPath,
|
|
248
|
+
handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
|
|
249
|
+
});
|
|
250
|
+
showMain();
|
|
251
|
+
deps.setStatus(result.ok ? `미션 결과 확인 · ${result.path}` : `미션 확인 실패 · ${result.error}`);
|
|
252
|
+
return result;
|
|
253
|
+
},
|
|
207
254
|
kill(row) {
|
|
208
255
|
if (row.currentProcess) {
|
|
209
256
|
deps.setStatus('현재 TUI 세션은 사이드탭에서 종료할 수 없습니다');
|
package/src/tui/sidetab/list.ts
CHANGED
|
@@ -1,2 +1,47 @@
|
|
|
1
1
|
/** Compatibility entry point for existing Next TUI callers. Shared behavior lives in sidetab-core. */
|
|
2
2
|
export * from '../../sidetab-core/model.js';
|
|
3
|
+
import {
|
|
4
|
+
formatSidetabLines as formatCoreSidetabLines,
|
|
5
|
+
loadSidetabRows as loadCoreSidetabRows,
|
|
6
|
+
type SidetabRow,
|
|
7
|
+
} from '../../sidetab-core/model.js';
|
|
8
|
+
import { listPtyManifestRows } from '../../pty-shell/pty-manifest.js';
|
|
9
|
+
import { formatSidetabPeekLines } from './peek.js';
|
|
10
|
+
|
|
11
|
+
type PreviewSidetabRow = SidetabRow & { readonly previewSource?: string };
|
|
12
|
+
|
|
13
|
+
/** Attach the latest manifest snapshot without changing the shared row contract. */
|
|
14
|
+
export function loadSidetabRows(all = false, currentSessionId?: string): SidetabRow[] {
|
|
15
|
+
const snapshots = new Map<string, string>(listPtyManifestRows().map((row) => [row.id, row.snapshot || row.frame] as const));
|
|
16
|
+
return loadCoreSidetabRows(all, currentSessionId).map((row) => ({
|
|
17
|
+
...row,
|
|
18
|
+
previewSource: snapshots.get(row.id) ?? '',
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Render the core list and reserve a bounded tail preview for the selected PTY row. */
|
|
23
|
+
export function formatSidetabLines(
|
|
24
|
+
rows: readonly SidetabRow[],
|
|
25
|
+
selected: number,
|
|
26
|
+
width: number,
|
|
27
|
+
height = Number.POSITIVE_INFINITY,
|
|
28
|
+
mode: 'list' | 'new' = 'list',
|
|
29
|
+
): string[] {
|
|
30
|
+
const selectedRow = rows[selected] as PreviewSidetabRow | undefined;
|
|
31
|
+
const peekLines = mode === 'list' && selectedRow
|
|
32
|
+
? formatSidetabPeekLines(selectedRow.previewSource ?? '', width)
|
|
33
|
+
: [];
|
|
34
|
+
if (peekLines.length === 0) return formatCoreSidetabLines(rows, selected, width, height, mode);
|
|
35
|
+
|
|
36
|
+
const reservedRows = peekLines.length + 1;
|
|
37
|
+
const coreLines = formatCoreSidetabLines(rows, selected, width, Math.max(0, height - reservedRows), mode);
|
|
38
|
+
// The core formatter reserves the leading ` › ` token for selection; a
|
|
39
|
+
// session label may itself contain `›`, so searching anywhere in the line
|
|
40
|
+
// can place the preview under the wrong row.
|
|
41
|
+
const selectedLine = coreLines.findIndex((line) => line.startsWith(' › '));
|
|
42
|
+
if (selectedLine < 0) return coreLines;
|
|
43
|
+
|
|
44
|
+
const lines = [...coreLines];
|
|
45
|
+
lines.splice(selectedLine + 1, 0, ' '.repeat(width), ...peekLines);
|
|
46
|
+
return Number.isFinite(height) ? lines.slice(0, Math.max(0, Math.floor(height))) : lines;
|
|
47
|
+
}
|
|
@@ -1,136 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export const NEXT_SIDETAB_TOOL_NAME = 'NextSidetab';
|
|
5
|
-
const CALL = 'elanous.sidetab.call';
|
|
6
|
-
const RESULT = 'elanous.sidetab.result';
|
|
7
|
-
|
|
8
|
-
export type NextSidetabAction = 'list' | 'switch' | 'attach' | 'detach' | 'new' | 'kill';
|
|
9
|
-
export interface NextSidetabRequest {
|
|
10
|
-
action: NextSidetabAction;
|
|
11
|
-
target?: string;
|
|
12
|
-
character?: 'shell' | 'elanous';
|
|
13
|
-
confirm?: boolean;
|
|
14
|
-
}
|
|
15
|
-
export interface NextSidetabCall { type: typeof CALL; callId: string; request: NextSidetabRequest }
|
|
16
|
-
export interface NextSidetabResult { type: typeof RESULT; callId: string; result: unknown }
|
|
17
|
-
export type NextSidetabHandler = (request: NextSidetabRequest) => Promise<unknown>;
|
|
18
|
-
export interface NextSidetabHostDeps {
|
|
19
|
-
rows(): readonly SidetabRow[] | Promise<readonly SidetabRow[]>;
|
|
20
|
-
selected(): number;
|
|
21
|
-
switchSession(row: SidetabRow): Promise<unknown>;
|
|
22
|
-
attach(row: SidetabRow): Promise<unknown>;
|
|
23
|
-
detach(): unknown;
|
|
24
|
-
spawn(character: 'shell' | 'elanous'): unknown;
|
|
25
|
-
kill(row: SidetabRow): unknown;
|
|
26
|
-
}
|
|
27
|
-
export interface NextSidetabIpcProcess {
|
|
28
|
-
send?: (message: unknown) => boolean | void;
|
|
29
|
-
on(event: 'message', listener: (message: unknown) => void): unknown;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export const nextSidetabToolSpec: LLMToolSpec = {
|
|
33
|
-
name: NEXT_SIDETAB_TOOL_NAME,
|
|
34
|
-
description: 'Control the Next TUI side tab: list/view sessions and PTYs, switch sessions, attach or detach, start a local shell or elanous PTY, or kill a PTY. Ask the user to confirm before calling kill with confirm=true. Starting coding agents is not supported.',
|
|
35
|
-
parameters: {
|
|
36
|
-
type: 'object',
|
|
37
|
-
properties: {
|
|
38
|
-
action: { type: 'string', enum: ['list', 'switch', 'attach', 'detach', 'new', 'kill'] },
|
|
39
|
-
target: { type: 'string', description: 'Optional exact or partial row id/label; required for targeted actions.' },
|
|
40
|
-
character: { type: 'string', enum: ['shell', 'elanous'], description: 'Only used with action=new.' },
|
|
41
|
-
confirm: { type: 'boolean', description: 'Must be true only after the user explicitly confirmed killing the selected PTY.' },
|
|
42
|
-
},
|
|
43
|
-
required: ['action'],
|
|
44
|
-
additionalProperties: false,
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
export function isNextSidetabCall(value: unknown): value is NextSidetabCall {
|
|
49
|
-
const call = value as Partial<NextSidetabCall> | null;
|
|
50
|
-
return Boolean(call && call.type === CALL && typeof call.callId === 'string'
|
|
51
|
-
&& call.request && typeof call.request === 'object');
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export async function answerNextSidetabCall(handler: NextSidetabHandler, call: NextSidetabCall): Promise<NextSidetabResult> {
|
|
55
|
-
try { return { type: RESULT, callId: call.callId, result: await handler(call.request) }; }
|
|
56
|
-
catch (error) {
|
|
57
|
-
return { type: RESULT, callId: call.callId, result: { error: error instanceof Error ? error.message : String(error) } };
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export function createNextSidetabHostHandler(deps: NextSidetabHostDeps): NextSidetabHandler {
|
|
62
|
-
return async (request) => {
|
|
63
|
-
if (!request || !['list', 'switch', 'attach', 'detach', 'new', 'kill'].includes(request.action)) {
|
|
64
|
-
return { error: '지원하지 않는 사이드탭 동작입니다' };
|
|
65
|
-
}
|
|
66
|
-
if (request.action === 'new') {
|
|
67
|
-
if (request.character !== 'shell' && request.character !== 'elanous') return { error: 'character는 shell 또는 elanous여야 합니다' };
|
|
68
|
-
return deps.spawn(request.character);
|
|
69
|
-
}
|
|
70
|
-
if (request.action === 'detach') return deps.detach();
|
|
71
|
-
const rows = await deps.rows();
|
|
72
|
-
if (request.action === 'list') return rows.map(({ id, label, kind, badge, sessionId }) => ({ id, label, kind, badge, ...(sessionId ? { sessionId } : {}) }));
|
|
73
|
-
const target = request.target?.trim();
|
|
74
|
-
const exact = target ? rows.find((item) => item.id === target)
|
|
75
|
-
?? rows.find((item) => item.label.toLowerCase() === target.toLowerCase()) : undefined;
|
|
76
|
-
const partial = target && !exact ? rows.filter((item) => item.label.toLowerCase().includes(target.toLowerCase())) : [];
|
|
77
|
-
if (partial.length > 1) return { error: `사이드탭 항목이 여러 개 일치합니다: ${target}` };
|
|
78
|
-
const row = exact ?? partial[0] ?? (target ? undefined : rows[deps.selected()]);
|
|
79
|
-
if (!row) return { error: target ? `사이드탭 항목을 찾지 못했습니다: ${target}` : '선택된 사이드탭 항목이 없습니다' };
|
|
80
|
-
if (request.action === 'switch') return row.kind === 'tui' ? deps.switchSession(row) : { error: 'Next TUI 세션만 전환할 수 있습니다' };
|
|
81
|
-
if (request.action === 'attach') return deps.attach(row);
|
|
82
|
-
if (row.currentProcess) return { error: '현재 TUI 세션은 사이드탭에서 종료할 수 없습니다' };
|
|
83
|
-
if (request.confirm !== true) return { needsConfirmation: true, message: `PTY 종료 확인 필요: ${row.label}` };
|
|
84
|
-
return deps.kill(row);
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function createReplNextSidetabTool(
|
|
89
|
-
proc: NextSidetabIpcProcess,
|
|
90
|
-
env: NodeJS.ProcessEnv = process.env,
|
|
91
|
-
timeoutMs = 15_000,
|
|
92
|
-
): { spec: LLMToolSpec; dispatch: (args: Record<string, unknown>) => Promise<unknown> } | null {
|
|
93
|
-
if (env.ELANOUS_NEXT_TUI_SIDETAB_IPC !== '1' || typeof proc.send !== 'function') return null;
|
|
94
|
-
const send = proc.send.bind(proc);
|
|
95
|
-
const waiting = new Map<string, (result: unknown) => void>();
|
|
96
|
-
let sequence = 0;
|
|
97
|
-
const listener = (message: unknown): void => {
|
|
98
|
-
const result = message as Partial<NextSidetabResult> | null;
|
|
99
|
-
if (!result || result.type !== RESULT || typeof result.callId !== 'string') return;
|
|
100
|
-
const resolve = waiting.get(result.callId);
|
|
101
|
-
if (!resolve) return;
|
|
102
|
-
waiting.delete(result.callId);
|
|
103
|
-
resolve(result.result);
|
|
104
|
-
};
|
|
105
|
-
proc.on('message', listener);
|
|
106
|
-
return {
|
|
107
|
-
spec: nextSidetabToolSpec,
|
|
108
|
-
dispatch: (args) => new Promise((resolve) => {
|
|
109
|
-
const callId = `s${++sequence}`;
|
|
110
|
-
const timer = setTimeout(() => {
|
|
111
|
-
if (!waiting.delete(callId)) return;
|
|
112
|
-
resolve({ error: 'Next TUI did not answer the side-tab request' });
|
|
113
|
-
}, timeoutMs);
|
|
114
|
-
waiting.set(callId, (result) => { clearTimeout(timer); resolve(result); });
|
|
115
|
-
try {
|
|
116
|
-
send({ type: CALL, callId, request: args as unknown as NextSidetabRequest } satisfies NextSidetabCall);
|
|
117
|
-
} catch (error) {
|
|
118
|
-
waiting.delete(callId);
|
|
119
|
-
clearTimeout(timer);
|
|
120
|
-
resolve({ error: `Next TUI IPC send failed: ${error instanceof Error ? error.message : String(error)}` });
|
|
121
|
-
}
|
|
122
|
-
}),
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export function registerNextSidetabReplTool(
|
|
127
|
-
specs: LLMToolSpec[],
|
|
128
|
-
dispatchByName: Map<string, (args: Record<string, unknown>) => Promise<unknown>>,
|
|
129
|
-
proc: NextSidetabIpcProcess,
|
|
130
|
-
env: NodeJS.ProcessEnv = process.env,
|
|
131
|
-
): void {
|
|
132
|
-
const tool = createReplNextSidetabTool(proc, env);
|
|
133
|
-
if (!tool) return;
|
|
134
|
-
specs.push(tool.spec);
|
|
135
|
-
dispatchByName.set(tool.spec.name, tool.dispatch);
|
|
136
|
-
}
|
|
1
|
+
/** Compatibility entry point for Next TUI callers. Shared contracts and policy live in sidetab-core. */
|
|
2
|
+
export * from '../../sidetab-core/model.js';
|