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
|
@@ -18,6 +18,7 @@ export interface ResearchGapFollowupInput {
|
|
|
18
18
|
request: string;
|
|
19
19
|
questions: readonly BloomResearchQuestion[];
|
|
20
20
|
evidence: readonly ResearchEvidenceEnvelope[];
|
|
21
|
+
signal?: AbortSignal;
|
|
21
22
|
/** Optional remaining time supplied by the owning turn; omitted uses the fixed 2-minute cap. */
|
|
22
23
|
remainingBudgetMs?: number;
|
|
23
24
|
roundsUsed?: number;
|
|
@@ -128,6 +129,7 @@ export async function runGapFollowup(
|
|
|
128
129
|
deps: ResearchGapFollowupDeps = {},
|
|
129
130
|
): Promise<ResearchGapFollowupResult> {
|
|
130
131
|
const plan = planGapFollowup(input);
|
|
132
|
+
if (input.signal?.aborted) return { ...plan, followupEvidence: [], discoveryCards: [] };
|
|
131
133
|
const startedAt = (deps.now ?? Date.now)();
|
|
132
134
|
const deadline = startedAt + plan.timeBudgetMs;
|
|
133
135
|
const discover = async (failedQuestions: ReadonlySet<string>): Promise<{ cards: string[]; evidence: ResearchEvidenceEnvelope[] }> => {
|
|
@@ -139,6 +141,9 @@ export async function runGapFollowup(
|
|
|
139
141
|
const remainingMs = deadline - (deps.now ?? Date.now)();
|
|
140
142
|
if (remainingMs <= 0) break;
|
|
141
143
|
const controller = new AbortController();
|
|
144
|
+
const abortFromParent = () => controller.abort(input.signal?.reason);
|
|
145
|
+
input.signal?.addEventListener('abort', abortFromParent, { once: true });
|
|
146
|
+
if (input.signal?.aborted) abortFromParent();
|
|
142
147
|
const timer = setTimeout(() => controller.abort(new Error('plugin discovery time budget exhausted')),
|
|
143
148
|
Math.min(10_000, remainingMs));
|
|
144
149
|
try {
|
|
@@ -158,7 +163,10 @@ export async function runGapFollowup(
|
|
|
158
163
|
questionId: gap.questionId, reason: error instanceof Error ? error.message.slice(0, 160) : String(error).slice(0, 160),
|
|
159
164
|
}, { level: 'warn' });
|
|
160
165
|
}
|
|
161
|
-
finally {
|
|
166
|
+
finally {
|
|
167
|
+
clearTimeout(timer);
|
|
168
|
+
input.signal?.removeEventListener('abort', abortFromParent);
|
|
169
|
+
}
|
|
162
170
|
}
|
|
163
171
|
return { cards, evidence };
|
|
164
172
|
};
|
|
@@ -168,6 +176,9 @@ export async function runGapFollowup(
|
|
|
168
176
|
}
|
|
169
177
|
|
|
170
178
|
const controller = new AbortController();
|
|
179
|
+
const abortFromParent = () => controller.abort(input.signal?.reason);
|
|
180
|
+
input.signal?.addEventListener('abort', abortFromParent, { once: true });
|
|
181
|
+
if (input.signal?.aborted) abortFromParent();
|
|
171
182
|
const timer = setTimeout(() => controller.abort(new Error('research gap follow-up time budget exhausted')),
|
|
172
183
|
Math.max(1, deadline - (deps.now ?? Date.now)()));
|
|
173
184
|
try {
|
|
@@ -200,6 +211,7 @@ export async function runGapFollowup(
|
|
|
200
211
|
return { ...plan, followupEvidence: [...outcomes, ...discovered.evidence], discoveryCards: discovered.cards };
|
|
201
212
|
} finally {
|
|
202
213
|
clearTimeout(timer);
|
|
214
|
+
input.signal?.removeEventListener('abort', abortFromParent);
|
|
203
215
|
}
|
|
204
216
|
}
|
|
205
217
|
|
|
@@ -136,15 +136,30 @@ function card(gap: string, candidates: readonly PluginDiscoveryCandidate[], inst
|
|
|
136
136
|
|
|
137
137
|
/** One bounded, fail-soft discovery attempt for a research capability gap. */
|
|
138
138
|
export async function discoverResearchPlugin(gapText: string, deps: PluginDiscoveryDeps = {}): Promise<PluginDiscoveryResult> {
|
|
139
|
+
const discoveryStartedAt = performance.now();
|
|
140
|
+
const log = deps.log ?? ((event: string, data: Record<string, unknown>) => debug.log('research.plugin-discovery', event, data));
|
|
141
|
+
const observe = (event: string, data: Record<string, unknown>): void => {
|
|
142
|
+
try { log(event, data); } catch { /* timing must not change discovery behavior */ }
|
|
143
|
+
};
|
|
144
|
+
observe('started', {});
|
|
145
|
+
const finish = (result: PluginDiscoveryResult): PluginDiscoveryResult => {
|
|
146
|
+
observe('completed', {
|
|
147
|
+
elapsedMs: Math.round((performance.now() - discoveryStartedAt) * 10) / 10,
|
|
148
|
+
outcome: result.outcome,
|
|
149
|
+
candidateCount: result.candidates.length,
|
|
150
|
+
installed: result.installed !== undefined,
|
|
151
|
+
});
|
|
152
|
+
return result;
|
|
153
|
+
};
|
|
139
154
|
const gap = safeGap(gapText);
|
|
140
|
-
if (!gap) return { candidates: [], card: 'Plugin discovery skipped: unsafe or empty gap.', outcome: 'invalid-gap' };
|
|
155
|
+
if (!gap) return finish({ candidates: [], card: 'Plugin discovery skipped: unsafe or empty gap.', outcome: 'invalid-gap' });
|
|
141
156
|
const aborted = (): PluginDiscoveryResult => ({ candidates: [], card: 'Plugin discovery skipped: time budget exhausted.', outcome: 'create-suggestion' });
|
|
142
|
-
if (deps.signal?.aborted) return aborted();
|
|
143
|
-
const log = deps.log ?? ((event: string, data: Record<string, unknown>) => debug.log('research.plugin-discovery', event, data));
|
|
157
|
+
if (deps.signal?.aborted) return finish(aborted());
|
|
144
158
|
const threshold = Number.isSafeInteger(deps.githubStarThreshold) && (deps.githubStarThreshold as number) > 0
|
|
145
159
|
? deps.githubStarThreshold as number : configuredStarThreshold();
|
|
146
160
|
const candidates: PluginDiscoveryCandidate[] = [];
|
|
147
161
|
|
|
162
|
+
const marketStartedAt = performance.now();
|
|
148
163
|
try {
|
|
149
164
|
const market = await (deps.market ?? (() => ensureMarketIndex('elanous')))();
|
|
150
165
|
// A signed index is the only built-in source with a verifiable install spec.
|
|
@@ -159,15 +174,19 @@ export async function discoverResearchPlugin(gapText: string, deps: PluginDiscov
|
|
|
159
174
|
installSpec: `${entry.name}@elanous` });
|
|
160
175
|
}
|
|
161
176
|
}
|
|
162
|
-
} catch {
|
|
163
|
-
|
|
177
|
+
} catch { observe('market-unavailable', { gap: gap.slice(0, 80) }); }
|
|
178
|
+
finally {
|
|
179
|
+
observe('stage-complete', { stage: 'signed-market', elapsedMs: Math.round((performance.now() - marketStartedAt) * 10) / 10 });
|
|
180
|
+
}
|
|
181
|
+
if (deps.signal?.aborted) return finish(aborted());
|
|
164
182
|
|
|
183
|
+
const searchStartedAt = performance.now();
|
|
165
184
|
try {
|
|
166
185
|
const found = await (deps.search ?? ((query: string, signal?: AbortSignal) => discoverCapability(query,
|
|
167
186
|
{ layer: 'skill', limit: MAX_CANDIDATES, community: false, signal })))(gap, deps.signal);
|
|
168
|
-
if (deps.signal?.aborted) return aborted();
|
|
187
|
+
if (deps.signal?.aborted) return finish(aborted());
|
|
169
188
|
for (const hit of found.slice(0, MAX_CANDIDATES)) {
|
|
170
|
-
if (deps.signal?.aborted) return aborted();
|
|
189
|
+
if (deps.signal?.aborted) return finish(aborted());
|
|
171
190
|
let url: URL;
|
|
172
191
|
try { url = new URL(hit.url); } catch { continue; }
|
|
173
192
|
if (url.protocol !== 'https:' || url.username || url.password) continue;
|
|
@@ -186,8 +205,11 @@ export async function discoverResearchPlugin(gapText: string, deps: PluginDiscov
|
|
|
186
205
|
? { installSpec: `https://github.com/${repo!.owner}/${repo!.repo}.git#${github.sha}` } : {}),
|
|
187
206
|
});
|
|
188
207
|
}
|
|
189
|
-
} catch {
|
|
190
|
-
|
|
208
|
+
} catch { observe('search-unavailable', { gap: gap.slice(0, 80) }); }
|
|
209
|
+
finally {
|
|
210
|
+
observe('stage-complete', { stage: 'capability-search', elapsedMs: Math.round((performance.now() - searchStartedAt) * 10) / 10 });
|
|
211
|
+
}
|
|
212
|
+
if (deps.signal?.aborted) return finish(aborted());
|
|
191
213
|
|
|
192
214
|
const deduped = candidates.filter((item, index) => candidates.findIndex(other => other.url === item.url && other.name === item.name) === index)
|
|
193
215
|
.slice(0, MAX_CANDIDATES);
|
|
@@ -197,20 +219,20 @@ export async function discoverResearchPlugin(gapText: string, deps: PluginDiscov
|
|
|
197
219
|
if (installable.length === 1) {
|
|
198
220
|
const candidate = installable[0]!;
|
|
199
221
|
try {
|
|
200
|
-
if (deps.signal?.aborted) return aborted();
|
|
222
|
+
if (deps.signal?.aborted) return finish(aborted());
|
|
201
223
|
const item = await (deps.install ?? defaultInstall)(candidate.installSpec!);
|
|
202
224
|
const undo = `eln plugin remove ${item.name}`;
|
|
203
225
|
installed = { name: item.name, path: item.path,
|
|
204
226
|
notice: `Reason: missing research capability ${gap}; source: ${candidate.source}; permissions: ${candidate.permissions.join(', ') || 'none declared'}.`, undo };
|
|
205
|
-
|
|
227
|
+
observe('installed', { name: item.name, source: candidate.source, undo });
|
|
206
228
|
} catch (error) {
|
|
207
|
-
|
|
229
|
+
observe('install-refused', { name: candidate.name, reason: error instanceof Error ? error.message.slice(0, 120) : 'unknown' });
|
|
208
230
|
}
|
|
209
231
|
}
|
|
210
232
|
const outcome: PluginDiscoveryResult['outcome'] = installed ? 'installed' : deduped.length ? 'proposed' : 'create-suggestion';
|
|
211
233
|
const result = { candidates: deduped, installed, card: card(gap, deduped, installed), outcome };
|
|
212
|
-
|
|
213
|
-
return result;
|
|
234
|
+
observe(outcome, { gap: gap.slice(0, 80), count: deduped.length, installed: installed?.name });
|
|
235
|
+
return finish(result);
|
|
214
236
|
}
|
|
215
237
|
|
|
216
238
|
/** Re-query through exactly one installed, declared read-only skill with no local-file or shell tools. */
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// isolation without standing up the LLM stack.
|
|
15
15
|
|
|
16
16
|
import type { ExternalResearchResult, InvokeResearchOpts } from './types.js';
|
|
17
|
-
import type { SkillManifest } from '../skills/runner.js';
|
|
17
|
+
import type { ExecuteSkillOpts, SkillManifest } from '../skills/runner.js';
|
|
18
18
|
import type { BloomResearchQuestion } from '../auto-research/question-ladder-contract.js';
|
|
19
19
|
import type { AxisFanoutDeps, AxisFanoutResult } from '../research/axis-fanout.js';
|
|
20
20
|
import { recordResult } from './store.js';
|
|
@@ -76,8 +76,23 @@ export type ResearchInvoker = (
|
|
|
76
76
|
args: string,
|
|
77
77
|
onProgress?: (delta: string) => void,
|
|
78
78
|
signal?: AbortSignal,
|
|
79
|
+
skillRootDir?: string,
|
|
79
80
|
) => Promise<ResearchInvocationOutcome>;
|
|
80
81
|
|
|
82
|
+
export type ResearchSkillExecutorForTest = (
|
|
83
|
+
manifest: SkillManifest,
|
|
84
|
+
args: string,
|
|
85
|
+
onProgress?: (delta: string) => void,
|
|
86
|
+
opts?: ExecuteSkillOpts,
|
|
87
|
+
) => Promise<{ finalResponse: string }>;
|
|
88
|
+
|
|
89
|
+
let researchSkillExecutorForTest: ResearchSkillExecutorForTest | null = null;
|
|
90
|
+
|
|
91
|
+
/** Replace only skill execution in tests; manifest parsing still uses the real selected skill root. */
|
|
92
|
+
export function setResearchSkillExecutorForTest(executor: ResearchSkillExecutorForTest | null): void {
|
|
93
|
+
researchSkillExecutorForTest = executor;
|
|
94
|
+
}
|
|
95
|
+
|
|
81
96
|
let invoker: ResearchInvoker | null = null;
|
|
82
97
|
|
|
83
98
|
/** Register the production / test invoker. Pass null to revert to
|
|
@@ -103,19 +118,21 @@ async function defaultInvoker(
|
|
|
103
118
|
args: string,
|
|
104
119
|
onProgress?: (delta: string) => void,
|
|
105
120
|
signal?: AbortSignal,
|
|
121
|
+
skillRootDir?: string,
|
|
106
122
|
): Promise<ResearchInvocationOutcome> {
|
|
107
123
|
const { parseSkillMd, executeSkill } = await import('../skills/runner.js');
|
|
108
|
-
const manifest = parseSkillMd(skillName);
|
|
124
|
+
const manifest = parseSkillMd(skillName, skillRootDir);
|
|
109
125
|
if (!manifest) {
|
|
110
126
|
return {
|
|
111
127
|
output: '',
|
|
112
128
|
ok: false,
|
|
113
|
-
error: `skill "${skillName}" not found under ~/.claude/skills/`,
|
|
129
|
+
error: `skill "${skillName}" not found under ${skillRootDir ?? '~/.claude/skills'}/`,
|
|
114
130
|
};
|
|
115
131
|
}
|
|
116
132
|
try {
|
|
117
133
|
// ★ research 격리 — 파일-쓰기 도구 deny 주입(main 트리 오염 차단). Bash·검색도구는 유지.
|
|
118
|
-
const
|
|
134
|
+
const run = researchSkillExecutorForTest ?? executeSkill;
|
|
135
|
+
const result = await run(withResearchIsolation(manifest), args, (delta) => {
|
|
119
136
|
if (onProgress) onProgress(delta);
|
|
120
137
|
}, { signal });
|
|
121
138
|
return researchOutcomeFromSkillRun(result);
|
|
@@ -138,7 +155,7 @@ export async function invokeResearch(
|
|
|
138
155
|
): Promise<ExternalResearchResult> {
|
|
139
156
|
const skillName = opts.skill || DEFAULT_SKILL;
|
|
140
157
|
const startedAt = new Date();
|
|
141
|
-
const outcome = await (invoker ?? defaultInvoker)(skillName, topic, opts.onProgress, opts.signal);
|
|
158
|
+
const outcome = await (invoker ?? defaultInvoker)(skillName, topic, opts.onProgress, opts.signal, opts.skillRootDir);
|
|
142
159
|
const finishedAt = new Date();
|
|
143
160
|
const result: ExternalResearchResult = {
|
|
144
161
|
topic,
|
|
@@ -28,6 +28,8 @@ export interface ExternalResearchResult {
|
|
|
28
28
|
export interface InvokeResearchOpts {
|
|
29
29
|
/** Skill name override; default 'omni-crawl'. */
|
|
30
30
|
skill?: string;
|
|
31
|
+
/** Root directory containing the selected catalog entry. */
|
|
32
|
+
skillRootDir?: string;
|
|
31
33
|
/** Stream progress chunks back to the caller (e.g. dashboard chat
|
|
32
34
|
* pane) so the user sees activity for long-running invocations. */
|
|
33
35
|
onProgress?: (delta: string) => void;
|
|
@@ -107,7 +107,7 @@ export interface SelfDevDecompositionMeta {
|
|
|
107
107
|
* `authored-empty` Fabric 저작이 분해할 arc를 만들지 못했다
|
|
108
108
|
* `llm-failed` LLM 호출 자체가 «실패»했다(타임아웃·제공자 장애) ⇒ 분해를 «못 한» 것이다
|
|
109
109
|
* ⛔ 「쪼갤 필요가 없었다」와 Fabric 사전분해 실패는 다른 값이다. */
|
|
110
|
-
outcome: 'decomposed' | 'single-no-subtasks' | 'missing-research-context' | 'grounding-empty' | 'authored-empty' | 'llm-failed';
|
|
110
|
+
outcome: 'decomposed' | 'single-no-subtasks' | 'slice-rejected' | 'missing-research-context' | 'grounding-empty' | 'authored-empty' | 'llm-failed';
|
|
111
111
|
/** `llm-failed` 일 때만 실린다 — 문면의 «머리»를 자르지 않는다. */
|
|
112
112
|
error?: string;
|
|
113
113
|
/** Present for Fabric decomposition, including zero, to distinguish no omissions from no report. */
|
|
@@ -399,6 +399,10 @@ export function buildSelfDevDecomposePrompt(feature: string, maxTasks = DEFAULT_
|
|
|
399
399
|
'- SEPARATE DEFINE FROM WIRE: adding a new function/type/export is a SEPARATE task from wiring it into an existing runtime call site. A task that both defines a new symbol AND integrates it across modules tends to leave dead-code (defined but never called) that fails integration gates. Pattern: (a) add the function + its unit test; then (b) a dependent task that wires it into the specific existing call site — name the exact `file.ts:function` to modify.',
|
|
400
400
|
'- Exception to SEPARATE DEFINE FROM WIRE: Keep a definition and its registration/wiring in the same sub-feature — a handler with its route, a command with its CLI registration, a node with its graph/recipe entry.',
|
|
401
401
|
'- Each sub-feature must be a self-contained, mergeable unit of work.',
|
|
402
|
+
'- LANDABLE SLICE CONTRACT: every sub-feature must state a completionBoundary that can be implemented and verified without a later sub-feature, future component, or unwired operational path. If it cannot stand alone, split it further or omit it.',
|
|
403
|
+
'- Every sub-feature must name one existing mock scenario as mockScenario.id (MS-01, MS-02, ...), plus a concrete mockScenario.injection and mockScenario.observation. Describe the event or input injected and the output/event that proves the slice works.',
|
|
404
|
+
'- List every required earlier slice explicitly in dependsOn. An empty list means this slice has no predecessor; never rely on implicit order or a future capability.',
|
|
405
|
+
'- Declare futureAssumptions as an array. If the slice needs any future component, later slice, or unwired operational path, list it there; that slice will be rejected with a decompose.slice-rejected event containing its id and reason, and must be split or omitted.',
|
|
402
406
|
'- `dependsOn`: list the `id`s of sub-features that MUST land first (e.g. a shared',
|
|
403
407
|
' type/interface before its consumers). Independent sub-features share NO dependency',
|
|
404
408
|
' so they run in parallel. No cycles.',
|
|
@@ -410,8 +414,10 @@ export function buildSelfDevDecomposePrompt(feature: string, maxTasks = DEFAULT_
|
|
|
410
414
|
'',
|
|
411
415
|
'## Output (STRICT JSON — no prose, no code fence)',
|
|
412
416
|
'{"subtasks":[{"id":"<short-slug>","feature":"<imperative sub-feature text>",',
|
|
413
|
-
' "
|
|
414
|
-
' "
|
|
417
|
+
' "completionBoundary":"<standalone change and observable outcome>",',
|
|
418
|
+
' "mockScenario":{"id":"MS-01","injection":"<input/event injected>","observation":"<output/event observed>"},',
|
|
419
|
+
' "futureAssumptions":[],"dependsOn":["<explicit predecessor id>",...],',
|
|
420
|
+
' "hotPaths":["<path>",...],"goalType":"<implement|research|document|operate>"}]}',
|
|
415
421
|
].join('\n');
|
|
416
422
|
}
|
|
417
423
|
|
|
@@ -421,6 +427,19 @@ interface RawSubtask {
|
|
|
421
427
|
dependsOn?: unknown;
|
|
422
428
|
hotPaths?: unknown;
|
|
423
429
|
goalType?: unknown;
|
|
430
|
+
completionBoundary?: unknown;
|
|
431
|
+
mockScenario?: unknown;
|
|
432
|
+
futureAssumptions?: unknown;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
interface RejectedDecompositionSlice {
|
|
436
|
+
id: string | null;
|
|
437
|
+
reasons: string[];
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
interface ValidatedDecomposition {
|
|
441
|
+
goals: SelfDevGoal[];
|
|
442
|
+
rejected: RejectedDecompositionSlice[];
|
|
424
443
|
}
|
|
425
444
|
|
|
426
445
|
const SELF_DEV_GOAL_TYPES = new Set(['implement', 'research', 'document', 'operate'] as const);
|
|
@@ -625,6 +644,90 @@ export function parseSelfDevDecomposition(
|
|
|
625
644
|
return goals;
|
|
626
645
|
}
|
|
627
646
|
|
|
647
|
+
/** Parse the production decomposition contract and keep a reason for each rejected slice. */
|
|
648
|
+
function parseValidatedSelfDevDecomposition(
|
|
649
|
+
subtasks: readonly unknown[],
|
|
650
|
+
defaults: { base?: string; autoMerge?: boolean },
|
|
651
|
+
): ValidatedDecomposition {
|
|
652
|
+
const goals: SelfDevGoal[] = [];
|
|
653
|
+
const rejected: RejectedDecompositionSlice[] = [];
|
|
654
|
+
const allIds = new Set(subtasks.flatMap((value) => isRawSubtask(value)
|
|
655
|
+
&& typeof value.id === 'string' && value.id.trim() ? [value.id.trim()] : []));
|
|
656
|
+
const seenIds = new Set<string>();
|
|
657
|
+
|
|
658
|
+
subtasks.forEach((value, index) => {
|
|
659
|
+
if (!isRawSubtask(value)) {
|
|
660
|
+
rejected.push({ id: null, reasons: ['slice must be an object'] });
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
663
|
+
const feature = typeof value.feature === 'string' ? value.feature.trim() : '';
|
|
664
|
+
const id = typeof value.id === 'string' && value.id.trim() ? value.id.trim() : String(index);
|
|
665
|
+
const reasons: string[] = [];
|
|
666
|
+
const completionBoundary = typeof value.completionBoundary === 'string' ? value.completionBoundary.trim() : '';
|
|
667
|
+
if (!feature) reasons.push('feature is missing');
|
|
668
|
+
if (!completionBoundary) reasons.push('completionBoundary is missing');
|
|
669
|
+
|
|
670
|
+
const mock = value.mockScenario as { id?: unknown; injection?: unknown; observation?: unknown } | undefined;
|
|
671
|
+
const scenarioId = typeof mock?.id === 'string' ? mock.id.trim() : '';
|
|
672
|
+
const injection = typeof mock?.injection === 'string' ? mock.injection.trim() : '';
|
|
673
|
+
const observation = typeof mock?.observation === 'string' ? mock.observation.trim() : '';
|
|
674
|
+
if (!/^MS-[A-Z0-9][A-Z0-9-]*$/i.test(scenarioId)) reasons.push('mockScenario.id must be an MS id');
|
|
675
|
+
if (!injection) reasons.push('mockScenario.injection is missing');
|
|
676
|
+
if (!observation) reasons.push('mockScenario.observation is missing');
|
|
677
|
+
|
|
678
|
+
if (!Array.isArray(value.futureAssumptions)) reasons.push('futureAssumptions must be declared as an array');
|
|
679
|
+
else if (value.futureAssumptions.length > 0) reasons.push('future assumptions require split or omission');
|
|
680
|
+
|
|
681
|
+
if (value.dependsOn === undefined) reasons.push('dependsOn is missing; declare an explicit id array');
|
|
682
|
+
else if (!Array.isArray(value.dependsOn)) reasons.push('dependsOn must be an explicit id array');
|
|
683
|
+
const dependsOn = Array.isArray(value.dependsOn)
|
|
684
|
+
? value.dependsOn.filter((dependency): dependency is string => typeof dependency === 'string' && dependency.trim().length > 0)
|
|
685
|
+
: [];
|
|
686
|
+
if (Array.isArray(value.dependsOn) && dependsOn.length !== value.dependsOn.length) reasons.push('dependsOn contains an invalid predecessor id');
|
|
687
|
+
for (const dependency of dependsOn) {
|
|
688
|
+
if (dependency === id || !allIds.has(dependency)) reasons.push(`dependsOn references a missing or self predecessor: ${dependency}`);
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
let uniqueId = id;
|
|
692
|
+
if (seenIds.has(uniqueId)) uniqueId = `${uniqueId}-${index}`;
|
|
693
|
+
seenIds.add(uniqueId);
|
|
694
|
+
if (reasons.length) {
|
|
695
|
+
rejected.push({ id, reasons: [...new Set(reasons)] });
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
const llmHot = Array.isArray(value.hotPaths)
|
|
700
|
+
? value.hotPaths.filter((path): path is string => typeof path === 'string')
|
|
701
|
+
: [];
|
|
702
|
+
const hotPaths = [...new Set([...llmHot, ...inferHotPaths(feature)])];
|
|
703
|
+
goals.push({
|
|
704
|
+
id: uniqueId,
|
|
705
|
+
feature,
|
|
706
|
+
completionBoundary,
|
|
707
|
+
mockScenario: { id: scenarioId, injection, observation },
|
|
708
|
+
...(dependsOn.length ? { dependsOn } : {}),
|
|
709
|
+
...(hotPaths.length ? { hotPaths } : {}),
|
|
710
|
+
...(isSelfDevGoalType(value.goalType) ? { goalType: value.goalType } : {}),
|
|
711
|
+
...defaults,
|
|
712
|
+
});
|
|
713
|
+
});
|
|
714
|
+
|
|
715
|
+
// A dependent slice cannot stay independently landable when its predecessor was rejected.
|
|
716
|
+
let removedDependent = true;
|
|
717
|
+
while (removedDependent) {
|
|
718
|
+
removedDependent = false;
|
|
719
|
+
const validIds = new Set(goals.map((goal) => goal.id));
|
|
720
|
+
for (const goal of [...goals]) {
|
|
721
|
+
const missing = (goal.dependsOn ?? []).filter((dependency) => !validIds.has(dependency));
|
|
722
|
+
if (missing.length === 0) continue;
|
|
723
|
+
goals.splice(goals.indexOf(goal), 1);
|
|
724
|
+
rejected.push({ id: goal.id ?? null, reasons: [`dependsOn references a rejected predecessor: ${missing.join(', ')}`] });
|
|
725
|
+
removedDependent = true;
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
return { goals, rejected };
|
|
729
|
+
}
|
|
730
|
+
|
|
628
731
|
/**
|
|
629
732
|
* Decompose a feature into a self-dev DAG via the LLM seam. Falls back to
|
|
630
733
|
* a single goal (the whole feature) when decomposition yields nothing —
|
|
@@ -710,10 +813,21 @@ export async function decomposeSelfDevGoal(
|
|
|
710
813
|
const rawSubtasks = extractRawSubtasks(raw);
|
|
711
814
|
const actualTaskCount = rawSubtasks.length;
|
|
712
815
|
const decomposition: SelfDevDecompositionMeta = { recommendedMaxTasks: maxTasks, actualTaskCount, truncatedAtHardMax: actualTaskCount > hardMaxTasks, exceededRecommendedMax: actualTaskCount > maxTasks, outcome: actualTaskCount === 0 ? 'single-no-subtasks' : 'decomposed' };
|
|
713
|
-
const
|
|
816
|
+
const validated = parseValidatedSelfDevDecomposition(rawSubtasks.slice(0, hardMaxTasks), defaults);
|
|
817
|
+
for (const rejection of validated.rejected) {
|
|
818
|
+
debug.log(opts.observation?.category ?? 'self-dev.decompose', 'decompose.slice-rejected', {
|
|
819
|
+
...observationIdentity(opts.observation ?? {}),
|
|
820
|
+
sliceId: rejection.id,
|
|
821
|
+
reasons: rejection.reasons,
|
|
822
|
+
}, { level: 'warn' });
|
|
823
|
+
}
|
|
824
|
+
const parsedGoals = validated.goals;
|
|
714
825
|
const foldedGoals = foldRegistrationOnlyGoals(parsedGoals);
|
|
715
826
|
const goals = parsedGoals.length > 0 ? pruneDanglingDependencies(foldedGoals) : [single];
|
|
716
|
-
|
|
827
|
+
const finalDecomposition = parsedGoals.length === 0 && validated.rejected.length > 0
|
|
828
|
+
? { ...decomposition, outcome: 'slice-rejected' as const }
|
|
829
|
+
: decomposition;
|
|
830
|
+
return finalizeDecomposition(feature, goals, finalDecomposition, opts, parsedGoals.length > 0 ? arcHint : undefined, parsedGoals.length - foldedGoals.length);
|
|
717
831
|
}
|
|
718
832
|
|
|
719
833
|
/** Where the decompose model came from — `'explicit'` is the caller's `model` argument layer. */
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { parseTargetPathHintLine } from '../release-loop/checklist-target-path-hint.js';
|
|
2
|
+
|
|
1
3
|
export type WorktreePathTouchAxis = 'touched' | 'untouched' | 'unreadable';
|
|
2
4
|
|
|
3
5
|
/** 겹친 경로가 실제로 손대어졌는지의 읽기 전용 관측. */
|
|
@@ -534,15 +536,12 @@ export interface AskTargetPathHintsParseResult {
|
|
|
534
536
|
}
|
|
535
537
|
|
|
536
538
|
export function parseAskTargetPathHintsResult(askText: string): AskTargetPathHintsParseResult {
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
if (firstLine === undefined) return { paths: [], rejected: [], labelMissing: true };
|
|
540
|
-
const match = /^\s*(?:대상\s*경로|target\s*paths?)\s*[::]\s*(.*)$/i.exec(firstLine);
|
|
541
|
-
if (!match) return { paths: [], rejected: [], labelMissing: true };
|
|
539
|
+
const parsed = parseTargetPathHintLine(askText);
|
|
540
|
+
if (parsed.labelMissing) return { paths: [], rejected: [], labelMissing: true };
|
|
542
541
|
|
|
543
542
|
const paths: string[] = [];
|
|
544
543
|
const rejected: AskTargetPathHintRejection[] = [];
|
|
545
|
-
for (const fragment of
|
|
544
|
+
for (const fragment of parsed.fragments) {
|
|
546
545
|
const piece = fragment.trim().replace(/^`+|`+$/g, '');
|
|
547
546
|
if (piece === '') rejected.push({ fragment, reason: 'empty' });
|
|
548
547
|
// ⛔ 「경로처럼 생긴 것」만 남긴다 — 확장자나 디렉터리 구분자가 있어야 한다.
|
|
@@ -147,6 +147,16 @@ function shardIdentityFeature(feature: string, identity: SelfDevShardIdentity |
|
|
|
147
147
|
: `${feature}\n\n## Shard identity\n${JSON.stringify(identity)}`;
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
+
function selfDevGoalFeature(goal: SelfDevGoal): string {
|
|
151
|
+
const { completionBoundary, mockScenario } = goal;
|
|
152
|
+
const acceptance: string[] = [];
|
|
153
|
+
if (completionBoundary?.trim()) acceptance.push(`Completion boundary: ${completionBoundary.trim()}`);
|
|
154
|
+
if (mockScenario?.id?.trim()) acceptance.push(`Mock scenario: ${mockScenario.id.trim()}`);
|
|
155
|
+
if (mockScenario?.injection?.trim()) acceptance.push(`Injection: ${mockScenario.injection.trim()}`);
|
|
156
|
+
if (mockScenario?.observation?.trim()) acceptance.push(`Observation: ${mockScenario.observation.trim()}`);
|
|
157
|
+
return acceptance.length ? `${goal.feature}\n\n## Slice acceptance\n${acceptance.join('\n')}` : goal.feature;
|
|
158
|
+
}
|
|
159
|
+
|
|
150
160
|
const SHARD_WORKING_MEMORY_EMIT_HINT =
|
|
151
161
|
'\n\n## Working-memory handoff\nA downstream shard depends on this work. Before your final response, emit the following marker and one JSON object so it can reuse your findings. Put reusable boundaries in `reusables` and your key choices in `decisions`; use empty arrays when there are none.\n[WORKING-MEMORY]\n{"reusables":[],"decisions":[],"summary":"What this shard established for downstream work."}';
|
|
152
162
|
|
|
@@ -1236,7 +1246,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1236
1246
|
surfaceKind: 'self-implement',
|
|
1237
1247
|
surface: (goal) => ({
|
|
1238
1248
|
kind: 'self-implement',
|
|
1239
|
-
feature: goal
|
|
1249
|
+
feature: selfDevGoalFeature(goal),
|
|
1240
1250
|
...(goal.after !== undefined ? { after: goal.after } : {}),
|
|
1241
1251
|
...(goal.base !== undefined ? { base: goal.base } : {}),
|
|
1242
1252
|
...(goal.autoMerge !== undefined ? { autoMerge: goal.autoMerge } : {}),
|
|
@@ -1386,7 +1396,7 @@ export function orchestrateSelfDev(opts: OrchestrateSelfDevOptions): Promise<Sel
|
|
|
1386
1396
|
const task = graph.getTask(taskId);
|
|
1387
1397
|
if (task?.surface.kind === 'self-implement') {
|
|
1388
1398
|
graph.updateTask(taskId, {
|
|
1389
|
-
surface: { ...task.surface, feature: shardIdentityFeature(shard.goal
|
|
1399
|
+
surface: { ...task.surface, feature: shardIdentityFeature(selfDevGoalFeature(shard.goal), identity) },
|
|
1390
1400
|
}, { now: now() });
|
|
1391
1401
|
}
|
|
1392
1402
|
}
|
|
@@ -230,6 +230,7 @@ export async function runSubscriptionReviewer(
|
|
|
230
230
|
}
|
|
231
231
|
|
|
232
232
|
export type ReviewFailureReason =
|
|
233
|
+
| 'credentials-unavailable'
|
|
233
234
|
| 'overloaded'
|
|
234
235
|
| 'rate-limited'
|
|
235
236
|
| 'server-error'
|
|
@@ -238,11 +239,17 @@ export type ReviewFailureReason =
|
|
|
238
239
|
| 'unknown-model-provider'
|
|
239
240
|
| 'other';
|
|
240
241
|
|
|
241
|
-
export type ReviewFallbackReason = Extract<ReviewFailureReason, 'overloaded' | 'rate-limited' | 'server-error' | 'timeout'>;
|
|
242
|
+
export type ReviewFallbackReason = Extract<ReviewFailureReason, 'credentials-unavailable' | 'overloaded' | 'rate-limited' | 'server-error' | 'timeout'>;
|
|
242
243
|
|
|
243
244
|
/** 실패 사유는 집계 가능한 유한 값으로 남긴다. */
|
|
244
245
|
export function classifyReviewProviderFailure(message: string): ReviewFailureReason {
|
|
245
246
|
const m = message.toLowerCase();
|
|
247
|
+
// Credential absence is provider-local: move to the next configured provider, then let the caller
|
|
248
|
+
// preserve its current artifact if every configured provider is keyless.
|
|
249
|
+
if ((m.includes('unavailable') && /(api\s*key|credentials?)/.test(m))
|
|
250
|
+
|| /configure\s+(?:an?\s+)?api\s*key/.test(m)
|
|
251
|
+
|| /(?:missing|no)\s+(?:provider\s+)?(?:api\s*)?key\b/.test(m)
|
|
252
|
+
|| /credentials?\s+(?:are\s+)?unavailable/.test(m)) return 'credentials-unavailable';
|
|
246
253
|
// ⭐ 실물 문면을 먼저 둔다 — `#10069` 가 낸 그 문장이다.
|
|
247
254
|
if (m.includes('overloaded') || m.includes('server_overloaded')) return 'overloaded';
|
|
248
255
|
if (m.includes('rate limit') || m.includes('rate_limit') || m.includes('429')) return 'rate-limited';
|
|
@@ -253,7 +260,7 @@ export function classifyReviewProviderFailure(message: string): ReviewFailureRea
|
|
|
253
260
|
}
|
|
254
261
|
|
|
255
262
|
function isReviewFallbackReason(reason: ReviewFailureReason): reason is ReviewFallbackReason {
|
|
256
|
-
return reason === 'overloaded' || reason === 'rate-limited' || reason === 'server-error' || reason === 'timeout';
|
|
263
|
+
return reason === 'credentials-unavailable' || reason === 'overloaded' || reason === 'rate-limited' || reason === 'server-error' || reason === 'timeout';
|
|
257
264
|
}
|
|
258
265
|
|
|
259
266
|
export interface ReviewProviderAttempt {
|
|
@@ -7,6 +7,8 @@ import { authorRepairGoal } from '../harness/helper-repair.js';
|
|
|
7
7
|
export type { SupervisorStopReason } from './run-types.js';
|
|
8
8
|
export { SUPERVISOR_STOP_REASONS } from './run-types.js';
|
|
9
9
|
import { recordSelfDevRunSupervisorStop, selfDevRunsDir } from './run-store.js';
|
|
10
|
+
import { readRunChart, recordRunChartDecision } from '../self-implement/run-chart.js';
|
|
11
|
+
import { runLedgerDir } from '../self-implement/run-ledger.js';
|
|
10
12
|
import { debug } from '../debug/log.js';
|
|
11
13
|
import { sweepFrozenMerges } from '../self-implement/frozen-merges.js';
|
|
12
14
|
import { selectKnowhowPack } from '../self-implement/knowhow-pack.js';
|
|
@@ -215,8 +217,8 @@ export function needsHumanRepairGoal(result: SupervisorJobResult, reason: NeedsH
|
|
|
215
217
|
const outside = expandedBeyondTargetPaths(result);
|
|
216
218
|
const repairTargets = result.targetPaths?.length ? result.targetPaths : undefined;
|
|
217
219
|
return [
|
|
218
|
-
`[supervisor-needs-human-repair:${reason}] ${NEEDS_HUMAN_REPAIR_INSTRUCTION[reason]}`,
|
|
219
220
|
...(repairTargets?.length ? [`대상 경로: ${repairTargets.join(', ')}`] : []),
|
|
221
|
+
`[supervisor-needs-human-repair:${reason}] ${NEEDS_HUMAN_REPAIR_INSTRUCTION[reason]}`,
|
|
220
222
|
...(outside.length ? [`대상 경로 밖 변경: ${outside.join(', ')}`] : []),
|
|
221
223
|
...(result.error?.message ? [`이전 실패: ${result.error.message.slice(0, 200)}`] : []),
|
|
222
224
|
result.feature,
|
|
@@ -447,7 +449,7 @@ function mustFixScopeDecision(
|
|
|
447
449
|
return { byTask, ...(split.length ? { split } : {}), ...(askOwner.length ? { askOwner } : {}) };
|
|
448
450
|
}
|
|
449
451
|
|
|
450
|
-
|
|
452
|
+
type DecideNextRunInput = {
|
|
451
453
|
results: readonly SupervisorJobResult[];
|
|
452
454
|
history?: readonly SupervisorRound[];
|
|
453
455
|
limits?: SupervisorLimits;
|
|
@@ -463,7 +465,11 @@ export function decideNextRun(input: {
|
|
|
463
465
|
needsHumanReasonRepairExecution?: boolean;
|
|
464
466
|
/** 분해 제안을 실제 조각 실행으로 승격할 수 있는 supervisor 경로에만 true. */
|
|
465
467
|
decompositionExecution?: boolean;
|
|
466
|
-
|
|
468
|
+
/** Chart context available to the outer-supervisor judgment; pulled from this same run only. */
|
|
469
|
+
runChart?: readonly { device: string; stopKey: string; observed: string; verdict: string; action: string; handoff: string | null; why: string; readStopKeys: readonly string[] }[];
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
function decideNextRunCore(input: DecideNextRunInput): SupervisorDecision {
|
|
467
473
|
const results = [...input.results];
|
|
468
474
|
const history = [...(input.history ?? [])];
|
|
469
475
|
const maxRounds = input.limits?.maxRounds ?? DEFAULT_MAX_ROUNDS;
|
|
@@ -923,6 +929,26 @@ export function decideNextRun(input: {
|
|
|
923
929
|
};
|
|
924
930
|
}
|
|
925
931
|
|
|
932
|
+
/** Consume an unread doctor→reauthor chart handoff before returning a terminal exit. */
|
|
933
|
+
export function decideNextRun(input: DecideNextRunInput): SupervisorDecision {
|
|
934
|
+
const decision = decideNextRunCore(input);
|
|
935
|
+
if (decision.action !== 'stop' || decision.stopReason === 'max-rounds') return decision;
|
|
936
|
+
const pendingReauthor = [...(input.runChart ?? [])].reverse().find((cell) => cell.handoff === 'reauthor'
|
|
937
|
+
&& !input.runChart?.some((later) => later.device === 'outer-supervisor' && later.readStopKeys.includes(cell.stopKey)));
|
|
938
|
+
if (!pendingReauthor) return decision;
|
|
939
|
+
const eligible = input.results.filter((result) => decision.needsHuman.includes(result.taskId)
|
|
940
|
+
&& result.status === 'failed' && result.feature.trim() && result.prNumber === undefined && !result.prUrl);
|
|
941
|
+
if (eligible.length === 0 || decision.round > (input.limits?.maxRounds ?? DEFAULT_MAX_ROUNDS)) return decision;
|
|
942
|
+
const taskIds = eligible.map((result) => result.taskId);
|
|
943
|
+
return { ...decision, action: 'relaunch', stopReason: undefined,
|
|
944
|
+
rerunnable: [...new Set([...decision.rerunnable, ...taskIds])],
|
|
945
|
+
needsHuman: decision.needsHuman.filter((taskId) => !taskIds.includes(taskId)),
|
|
946
|
+
classifications: decision.classifications.map((classification) => taskIds.includes(classification.taskId)
|
|
947
|
+
? { ...classification, action: 'rerun' as const } : classification),
|
|
948
|
+
why: `run-chart handoff=reauthor consumed (${pendingReauthor.stopKey}) — needs-human 조각 ${taskIds.length}개를 재발사`,
|
|
949
|
+
};
|
|
950
|
+
}
|
|
951
|
+
|
|
926
952
|
export function appendRound(
|
|
927
953
|
history: readonly SupervisorRound[],
|
|
928
954
|
results: readonly SupervisorJobResult[],
|
|
@@ -1298,6 +1324,10 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1298
1324
|
const allUnreviewedAreNoDiff = unreviewed.length > 0
|
|
1299
1325
|
&& unreviewed.every((result) => result.reviewReason === 'no-diff');
|
|
1300
1326
|
|
|
1327
|
+
const chartRunId = opts.runStore?.runId ?? results.find((result) => result.runId?.trim())?.runId ?? null;
|
|
1328
|
+
const chartDir = opts.runStore?.dir ?? runLedgerDir();
|
|
1329
|
+
const chartBeforeJudgment = chartRunId ? readRunChart(chartRunId, 'outer-supervisor', chartDir) : [];
|
|
1330
|
+
|
|
1301
1331
|
let decision = decideNextRun({
|
|
1302
1332
|
results,
|
|
1303
1333
|
history,
|
|
@@ -1309,11 +1339,19 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1309
1339
|
...(opts.limits ? { limits: opts.limits } : {}),
|
|
1310
1340
|
...(observed.deployFindings ? { deployFindings: observed.deployFindings } : {}),
|
|
1311
1341
|
deliverableObservation: observed.state,
|
|
1342
|
+
runChart: chartBeforeJudgment,
|
|
1312
1343
|
...(unreviewed.length > 0 ? {
|
|
1313
1344
|
reviewed: false,
|
|
1314
1345
|
...(allUnreviewedAreNoDiff ? { reviewReason: 'no-diff' } : {}),
|
|
1315
1346
|
} : {}),
|
|
1316
1347
|
});
|
|
1348
|
+
if (chartRunId) {
|
|
1349
|
+
recordRunChartDecision({ runId: chartRunId, device: 'outer-supervisor',
|
|
1350
|
+
stopKey: `${chartRunId}:outer-supervisor:${history.length + 1}`, observed: `results=${results.length}`,
|
|
1351
|
+
verdict: decision.action, action: decision.action === 'stop' ? decision.stopReason ?? 'stop' : 'relaunch',
|
|
1352
|
+
handoff: decision.action === 'stop' ? 'human' : 'macrophage', why: decision.why,
|
|
1353
|
+
readStopKeys: chartBeforeJudgment.map((cell) => cell.stopKey), dir: chartDir });
|
|
1354
|
+
}
|
|
1317
1355
|
|
|
1318
1356
|
const reasonRepairSkipped = decision.action !== 'stop' || decision.stopReason !== 'needs-human' || history.length + 1 > maxRounds
|
|
1319
1357
|
? [] : results.flatMap((result) => {
|
|
@@ -1342,7 +1380,7 @@ export async function superviseRun(opts: SuperviseRunOptions): Promise<Superviso
|
|
|
1342
1380
|
}
|
|
1343
1381
|
}
|
|
1344
1382
|
|
|
1345
|
-
const runId =
|
|
1383
|
+
const runId = chartRunId;
|
|
1346
1384
|
|
|
1347
1385
|
let decomposePromotion: DecomposePromotionObservation = decision.decomposable.length === 0
|
|
1348
1386
|
? { attempted: false, reason: 'no-decomposable-decision' }
|
|
@@ -27,6 +27,10 @@ export interface SelfDevGoal {
|
|
|
27
27
|
kind?: JobKind;
|
|
28
28
|
/** Decomposition intent; deliberately distinct from executable `kind`. */
|
|
29
29
|
goalType?: SelfDevGoalType;
|
|
30
|
+
/** Required for default-LLM decomposition slices; included in the child task prompt. */
|
|
31
|
+
completionBoundary?: string;
|
|
32
|
+
/** Existing simulation evidence required to make a decomposed slice independently reviewable. */
|
|
33
|
+
mockScenario?: { id: string; injection: string; observation: string };
|
|
30
34
|
/** Feature/goal text → `elanous self implement <feature>` for dev jobs. */
|
|
31
35
|
feature: string;
|
|
32
36
|
/** Pod lease predecessor goal ID or PR number. */
|