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
|
@@ -271,6 +271,10 @@ export interface AgentToolArgs {
|
|
|
271
271
|
* child keeps running; completion emits a task-notification
|
|
272
272
|
* (P2) which the parent sees in the next turn's user message. */
|
|
273
273
|
run_in_background?: boolean;
|
|
274
|
+
/** How a background completion reaches an idle parent TUI. */
|
|
275
|
+
completion_delivery?: 'follow-up' | 'supplement';
|
|
276
|
+
/** Best-effort wall-clock budget for a research child, in minutes. */
|
|
277
|
+
budget_minutes?: number;
|
|
274
278
|
/** When true, a background launch that hits the fan-out ceiling WAITS on
|
|
275
279
|
* the session's shared admission queue instead of being refused: it spawns
|
|
276
280
|
* as soon as a live background agent terminals (subagent waits are
|
|
@@ -349,6 +353,7 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
349
353
|
'Delegate heavy multistep work that would overflow your context, fan out independent units in parallel, ' +
|
|
350
354
|
'and hand off long investigations; use run_in_background for long-running work so you can keep coordinating ' +
|
|
351
355
|
'and finish after the results arrive.\n' +
|
|
356
|
+
'For parallel research, prefer completion_delivery="supplement" and budget_minutes=8: ask each child for its best verified evidence within the budget; late results appear as one chat line without reopening a TUI turn.\n' +
|
|
352
357
|
'\n' +
|
|
353
358
|
'The sub-agent gets its own tools (Bash/Read/Edit/Grep/WebFetch by default) and its own ' +
|
|
354
359
|
'turn budget (default 20). It returns ONE final message which becomes your tool_result. ' +
|
|
@@ -377,6 +382,17 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
377
382
|
type: 'boolean',
|
|
378
383
|
description: 'When true, returns the spawn handle immediately instead of waiting for completion. The child keeps running; its final message arrives in your next turn as a <task-notification> user message. Use for long-running explorations (multi-minute research, 10+ tool calls) so you can keep working in parallel.',
|
|
379
384
|
},
|
|
385
|
+
completion_delivery: {
|
|
386
|
+
type: 'string',
|
|
387
|
+
enum: ['follow-up', 'supplement'],
|
|
388
|
+
description: 'Background-only routing. supplement adds one concise chat line when the child finishes and never opens a new TUI turn; follow-up keeps default result retrieval.',
|
|
389
|
+
},
|
|
390
|
+
budget_minutes: {
|
|
391
|
+
type: 'number',
|
|
392
|
+
minimum: 1,
|
|
393
|
+
maximum: 60,
|
|
394
|
+
description: 'Background-only best-effort wall-clock research budget. Ask the child to stop researching at this point and return currently verified evidence; default 8 minutes for supplement delivery.',
|
|
395
|
+
},
|
|
380
396
|
wait_for_slot: {
|
|
381
397
|
type: 'boolean',
|
|
382
398
|
description: 'Only meaningful with run_in_background. When the per-session background fan-out ceiling is already full, this launch waits on the shared admission queue instead of being refused, and spawns as soon as one live background agent finishes. Waiting subagent spawns (ones that name a subagent_type) are admitted before general-purpose ones; launches with the same class keep arrival order. Omit it to get the immediate "NOT SPAWNED" refusal and re-issue later.',
|
|
@@ -423,6 +439,8 @@ export function buildAgentTool(): LLMToolSpec {
|
|
|
423
439
|
}
|
|
424
440
|
|
|
425
441
|
export interface DispatchAgentOpts {
|
|
442
|
+
/** Owning conversation session, copied to background completion receipts. */
|
|
443
|
+
parentSessionId?: string;
|
|
426
444
|
/** Tools the host makes available — typically the same tool list the
|
|
427
445
|
* parent skill is using, MINUS the Agent tool itself (no recursion).
|
|
428
446
|
* When omitted, the sub-agent runs with no tools (text-only). */
|
|
@@ -507,6 +525,10 @@ export async function dispatchAgent(
|
|
|
507
525
|
|
|
508
526
|
// PFC-S1 P1: new optional fields.
|
|
509
527
|
const runInBackground = args.run_in_background === true;
|
|
528
|
+
const completionDelivery = args.completion_delivery === 'supplement' ? 'supplement' : 'follow-up';
|
|
529
|
+
const requestedBudgetMinutes = typeof args.budget_minutes === 'number' && Number.isFinite(args.budget_minutes)
|
|
530
|
+
? Math.max(1, Math.min(60, Math.floor(args.budget_minutes)))
|
|
531
|
+
: (completionDelivery === 'supplement' ? 8 : undefined);
|
|
510
532
|
const waitsForSlot = args.wait_for_slot === true;
|
|
511
533
|
const spawnName = typeof args.name === 'string' && args.name.trim() ? args.name.trim() : undefined;
|
|
512
534
|
const teamName = typeof args.team_name === 'string' && args.team_name.trim() ? args.team_name.trim() : undefined;
|
|
@@ -923,9 +945,12 @@ export async function dispatchAgent(
|
|
|
923
945
|
}
|
|
924
946
|
|
|
925
947
|
const hasNoTools = childTools.length === 0;
|
|
926
|
-
const
|
|
948
|
+
const budgetPrompt = runInBackground && completionDelivery === 'supplement' && requestedBudgetMinutes
|
|
949
|
+
? `\n\n[Research time budget: ${requestedBudgetMinutes} minutes]\nReturn the best currently verified evidence within this budget. Do not wait for more sources or extend the research; state remaining uncertainty in the final message.`
|
|
950
|
+
: '';
|
|
951
|
+
const childPrompt = (hasNoTools
|
|
927
952
|
? `${prompt}\n\nNo tools are available; if a request requires reading files or executing commands, report that as unavailable rather than guessing.`
|
|
928
|
-
: prompt;
|
|
953
|
+
: prompt) + budgetPrompt;
|
|
929
954
|
|
|
930
955
|
debug.log('agent.spawn', 'dispatch', {
|
|
931
956
|
cid: debugCorrelationId,
|
|
@@ -935,6 +960,7 @@ export async function dispatchAgent(
|
|
|
935
960
|
promptChars: childPrompt.length,
|
|
936
961
|
model: definition.model || '(inherit)',
|
|
937
962
|
maxTurns: requestedMaxTurns,
|
|
963
|
+
...(runInBackground ? { completionDelivery, ...(requestedBudgetMinutes ? { researchBudgetMinutes: requestedBudgetMinutes } : {}) } : {}),
|
|
938
964
|
tools: childTools.map(t => t.name),
|
|
939
965
|
noTools: hasNoTools,
|
|
940
966
|
});
|
|
@@ -943,6 +969,7 @@ export async function dispatchAgent(
|
|
|
943
969
|
const handle = globalAgentRegistry.spawn({
|
|
944
970
|
definition,
|
|
945
971
|
prompt: childPrompt,
|
|
972
|
+
...(opts.parentSessionId ? { parentSessionId: opts.parentSessionId } : {}),
|
|
946
973
|
label: spawnName ?? description, // PFC-S1 P1: explicit `name`
|
|
947
974
|
// wins, else fall back to the task label
|
|
948
975
|
// (kept for existing callers).
|
|
@@ -963,6 +990,7 @@ export async function dispatchAgent(
|
|
|
963
990
|
...(teamName ? { teamName } : {}),
|
|
964
991
|
...(childCwd ? { cwd: childCwd } : {}),
|
|
965
992
|
...(runInBackground ? { background: true } : {}),
|
|
993
|
+
...(runInBackground ? { completionDelivery } : {}),
|
|
966
994
|
});
|
|
967
995
|
|
|
968
996
|
// Terminal release for this dispatch's reserved fan-out slot: the
|
|
@@ -73,16 +73,39 @@ export function buildOmniSearchTool(): LLMToolSpec {
|
|
|
73
73
|
};
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
+
const RESEARCH_GROK_TIMEOUT_MS = 8_000;
|
|
77
|
+
|
|
76
78
|
export async function dispatchOmniSearch(
|
|
77
79
|
rawArgs: Record<string, unknown>,
|
|
78
80
|
opts: OmniSearchDispatchOpts = {},
|
|
81
|
+
): Promise<OmniSearchResult> {
|
|
82
|
+
return dispatchWithProviders(validate(rawArgs), opts);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export async function dispatchResearchOmniSearch(
|
|
86
|
+
rawArgs: Record<string, unknown>,
|
|
87
|
+
opts: OmniSearchDispatchOpts = {},
|
|
79
88
|
): Promise<OmniSearchResult> {
|
|
80
89
|
const args = validate(rawArgs);
|
|
90
|
+
const selected = getAvailableResearchProviders();
|
|
91
|
+
const requested = args.engines === undefined ? undefined : new Set(args.engines.map(id => id.toLowerCase()));
|
|
92
|
+
const providers = requested === undefined
|
|
93
|
+
? selected
|
|
94
|
+
: selected.filter(provider => requested.has(provider.id.toLowerCase()));
|
|
95
|
+
return dispatchWithProviders(args, opts, providers, { grokTimeoutMs: RESEARCH_GROK_TIMEOUT_MS });
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function dispatchWithProviders(
|
|
99
|
+
args: OmniSearchArgs,
|
|
100
|
+
opts: OmniSearchDispatchOpts,
|
|
101
|
+
selectedProviders?: ReturnType<typeof getAvailableWebSearchProviders>,
|
|
102
|
+
researchLimits?: { grokTimeoutMs: number },
|
|
103
|
+
): Promise<OmniSearchResult> {
|
|
81
104
|
const merge = args.merge ?? 'interleave';
|
|
82
105
|
const limit = Math.max(1, Math.min(args.limit ?? DEFAULT_LIMIT, MAX_LIMIT));
|
|
83
106
|
|
|
84
|
-
let providers = getAvailableWebSearchProviders();
|
|
85
|
-
if (args.engines && args.engines.length > 0) {
|
|
107
|
+
let providers = selectedProviders ?? getAvailableWebSearchProviders();
|
|
108
|
+
if (!selectedProviders && args.engines && args.engines.length > 0) {
|
|
86
109
|
const wanted = new Set(args.engines.map(e => e.toLowerCase()));
|
|
87
110
|
providers = providers.filter(p => wanted.has(p.id.toLowerCase()));
|
|
88
111
|
}
|
|
@@ -105,13 +128,33 @@ export async function dispatchOmniSearch(
|
|
|
105
128
|
const start = Date.now();
|
|
106
129
|
emit({ engine: p.id, phase: 'start' });
|
|
107
130
|
try {
|
|
108
|
-
const
|
|
131
|
+
const query = {
|
|
109
132
|
query: args.query,
|
|
110
133
|
limit,
|
|
111
134
|
allowDomains: args.allow_domains,
|
|
112
135
|
blockDomains: args.block_domains,
|
|
113
136
|
recencyDays: args.recency_days,
|
|
114
|
-
}
|
|
137
|
+
};
|
|
138
|
+
let result;
|
|
139
|
+
if (researchLimits && (p.id === 'grok' || p.id === 'grok-api')) {
|
|
140
|
+
const controller = new AbortController();
|
|
141
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
142
|
+
try {
|
|
143
|
+
result = await Promise.race([
|
|
144
|
+
p.search(query, controller.signal),
|
|
145
|
+
new Promise<never>((_, reject) => {
|
|
146
|
+
timer = setTimeout(() => {
|
|
147
|
+
controller.abort();
|
|
148
|
+
reject(new DOMException(`Grok research search timed out after ${researchLimits.grokTimeoutMs}ms`, 'TimeoutError'));
|
|
149
|
+
}, researchLimits.grokTimeoutMs);
|
|
150
|
+
}),
|
|
151
|
+
]);
|
|
152
|
+
} finally {
|
|
153
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
154
|
+
}
|
|
155
|
+
} else {
|
|
156
|
+
result = await p.search(query);
|
|
157
|
+
}
|
|
115
158
|
perEngine[p.id] = { hits: result.hits, durationMs: Date.now() - start };
|
|
116
159
|
for (const hit of result.hits) {
|
|
117
160
|
try {
|
|
@@ -165,11 +208,30 @@ export async function dispatchOmniSearch(
|
|
|
165
208
|
};
|
|
166
209
|
}
|
|
167
210
|
|
|
168
|
-
/** Probe-compatible: at least 2 search providers available. */
|
|
211
|
+
/** Probe-compatible: at least 2 search providers available for ordinary omni_search. */
|
|
169
212
|
export function omniSearchAvailable(): boolean {
|
|
170
213
|
return getAvailableWebSearchProviders().length >= 2;
|
|
171
214
|
}
|
|
172
215
|
|
|
216
|
+
/** Research-only probe: require the bounded Grok/Firecrawl research pair. */
|
|
217
|
+
export function researchOmniSearchAvailable(): boolean {
|
|
218
|
+
return getAvailableResearchProviders().length >= 2;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export function getAvailableResearchSearchEngineIds(): string[] {
|
|
222
|
+
return getAvailableResearchProviders().map(provider => provider.id);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function getAvailableResearchProviders(): ReturnType<typeof getAvailableWebSearchProviders> {
|
|
226
|
+
const available = getAvailableWebSearchProviders();
|
|
227
|
+
const grok = available.find(provider => provider.id === 'grok')
|
|
228
|
+
?? available.find(provider => provider.id === 'grok-api');
|
|
229
|
+
return [
|
|
230
|
+
...(grok ? [grok] : []),
|
|
231
|
+
...available.filter(provider => provider.id === 'firecrawl'),
|
|
232
|
+
];
|
|
233
|
+
}
|
|
234
|
+
|
|
173
235
|
function interleaveHits(perEngine: Record<string, { hits: WebSearchHit[] }>): WebSearchHit[] {
|
|
174
236
|
const lists = Object.values(perEngine).map(v => v.hits.slice());
|
|
175
237
|
const merged: WebSearchHit[] = [];
|
|
@@ -29,10 +29,12 @@ import { checkCompletionEvidence, deliverableReceiptEvidence } from './completio
|
|
|
29
29
|
import { judgeNextMove } from './judge.js';
|
|
30
30
|
import { checklistDevVersion, listChecklist } from '../release-loop/checklist.js';
|
|
31
31
|
import { loadRunLedger, runLedgerDir } from '../self-implement/run-ledger.js';
|
|
32
|
+
import { POD_DISTRIBUTOR_ENTRY_ENV, TASK_HAND_POD_DISTRIBUTOR_ENTRY } from './pod-distributor-entry.js';
|
|
32
33
|
// Keep doctor-visit recording synchronous: updateTaskCard callers observe it before the transition returns.
|
|
33
34
|
import { recordTaskAgentNeedsOwnerVisit } from '../self-implement/doctor-visit.js';
|
|
34
35
|
import { applyRunIdentityTag, applyRunIdentityTags, deriveBirthIdentity, parseRunIdentityTag, runIdentityFieldText, runIdentityQueuePriority, runPriorityClass, validateRunIdentity, type RunIdentity, type RunIdentityCell, type RunIdentityOrigin } from './run-identity.js';
|
|
35
36
|
import { parseWorkOrder, renderWorkOrderGoal, WORK_ORDER_FILE_PATTERN, type WorkOrder } from './work-order.js';
|
|
37
|
+
import { recordCoordinatorShadowDispatch, resolveCoordinatorShadowRoot } from '../loops/orchestrator/coordinator-shadow.js';
|
|
36
38
|
import { inspectPrelaunchAlreadyDone, type AlreadyDoneDecision, type AlreadyDoneCandidate,
|
|
37
39
|
type PrelaunchGitRunnerForTest } from './prelaunch-already-done.js';
|
|
38
40
|
import { draftClaimComment, draftClaimRecordLive, draftClaimState, draftReleaseComment } from '../self-dev/draft-triage-rules.js';
|
|
@@ -1089,6 +1091,10 @@ export type TaskLauncher = (args: string[], cwd?: string, context?: TaskLaunchCo
|
|
|
1089
1091
|
export interface HandTaskOptions {
|
|
1090
1092
|
text: string;
|
|
1091
1093
|
seat?: TaskSeat;
|
|
1094
|
+
/** Validated order parsed by the CLI; its canonical rendering is used only for shadow evidence. */
|
|
1095
|
+
workOrder?: WorkOrder;
|
|
1096
|
+
/** Repository root for shadow dispatch evidence; production defaults to the invoking repository. */
|
|
1097
|
+
coordinatorShadowRoot?: string;
|
|
1092
1098
|
checklistId?: string;
|
|
1093
1099
|
completion?: TaskCard['completion'];
|
|
1094
1100
|
/** `--project <id> --target <dir>` — target 은 존재 확인 뒤 절대 경로로 바꿔 싣는다. */
|
|
@@ -1625,6 +1631,7 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1625
1631
|
...(cardPrNumber(card) ? { ELANOUS_TASK_BOUND_PR: String(cardPrNumber(card)) } : {}),
|
|
1626
1632
|
...(card.checklistId ? { ELANOUS_POD_SLOT_ID: card.checklistId } : {}),
|
|
1627
1633
|
...(card.seat ? { ELANOUS_POD_OWNER_KIND: 'seat', ELANOUS_POD_OWNER_ID: card.seat } : {}),
|
|
1634
|
+
...(podLaunch ? { [POD_DISTRIBUTOR_ENTRY_ENV]: TASK_HAND_POD_DISTRIBUTOR_ENTRY } : {}),
|
|
1628
1635
|
...(card.taLand ? { [TA_LAND_ENV]: '1' } : {}) }, cardLabelContext: taskCardLabelContext(card),
|
|
1629
1636
|
// An omitted card provider uses the established Pod default. Carry the effective value explicitly so
|
|
1630
1637
|
// remote-parent code never has to infer a provider from the serialized CLI argv.
|
|
@@ -1645,6 +1652,26 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
|
|
|
1645
1652
|
try { debug.log('task-agent', 'launch-failed', { taskId: id, seat: card.seat ?? null, reason }); } catch { /* fail-soft */ }
|
|
1646
1653
|
throw new TaskLaunchError(failed, reason);
|
|
1647
1654
|
}
|
|
1655
|
+
// Record only an accepted dispatch: failed launcher attempts must not create a three-day retirement signal.
|
|
1656
|
+
if (opts.workOrder !== undefined) {
|
|
1657
|
+
const agent = process.env.ELANOUS_SEAT?.trim() || process.env.AI_AGENT?.trim();
|
|
1658
|
+
if (agent) {
|
|
1659
|
+
try {
|
|
1660
|
+
const directive = createHash('sha256').update(renderWorkOrderGoal(opts.workOrder)).digest('hex');
|
|
1661
|
+
recordCoordinatorShadowDispatch(resolveCoordinatorShadowRoot(opts.coordinatorShadowRoot ?? process.cwd()), {
|
|
1662
|
+
date: (opts.now ?? (() => new Date()))().toISOString().slice(0, 10),
|
|
1663
|
+
agent,
|
|
1664
|
+
...(opts.seat ? { recipient: opts.seat } : {}),
|
|
1665
|
+
cell: opts.workOrder.cellId,
|
|
1666
|
+
directive,
|
|
1667
|
+
});
|
|
1668
|
+
} catch (error) {
|
|
1669
|
+
try { debug.log('task-agent.work-order', 'shadow-dispatch-record-failed', {
|
|
1670
|
+
cellId: opts.workOrder.cellId, reason: error instanceof Error ? error.message : String(error),
|
|
1671
|
+
}, { level: 'warn' }); } catch { /* shadow evidence is fail-soft */ }
|
|
1672
|
+
}
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1648
1675
|
const launchedAt = (opts.now ?? (() => new Date()))().toISOString();
|
|
1649
1676
|
const receivedRunId = receipt && typeof receipt.runId === 'string' ? receipt.runId.trim() : '';
|
|
1650
1677
|
// 넘긴 런 id 와 «같은» 영수증만 — 다른 id 면 env 로 넘긴 런과 카드가 어긋난다(묶지 않는다).
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { PodPoolMember, PodPoolScheduler } from './pod-pool.js';
|
|
2
|
+
export { POD_DISTRIBUTOR_ENTRY_ENV, TASK_HAND_POD_DISTRIBUTOR_ENTRY } from '../../task-agent/pod-distributor-entry.js';
|
|
3
|
+
import { TASK_HAND_POD_DISTRIBUTOR_ENTRY } from '../../task-agent/pod-distributor-entry.js';
|
|
4
|
+
|
|
5
|
+
/** Origin marker carried only by `tasks hand` Pod launches. */
|
|
6
|
+
export type PodPoolAcquireMode = NonNullable<Parameters<PodPoolScheduler['tryAcquire']>[2]>;
|
|
7
|
+
|
|
8
|
+
/** Admission context that the later resource-core adapter can map to its request contract. */
|
|
9
|
+
export interface PodDistributorAdmission {
|
|
10
|
+
requestId: string;
|
|
11
|
+
idempotencyKey: string;
|
|
12
|
+
owner: { runId: string; cardId?: string; seat?: string };
|
|
13
|
+
lane: 'ta';
|
|
14
|
+
workload: { memoryLimit: string; kind: string };
|
|
15
|
+
skip?: ReadonlySet<string>;
|
|
16
|
+
onEmpty?: (reason: string) => void;
|
|
17
|
+
mode?: PodPoolAcquireMode;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Small seam between a Pod launch surface and its admission backend.
|
|
22
|
+
* The current adapter delegates to PodPoolScheduler, which owns the existing HostPoolLease accounting.
|
|
23
|
+
* CORE can replace this adapter with resource admission without changing the tasks-hand call site.
|
|
24
|
+
*/
|
|
25
|
+
export interface PodDistributorAdapter {
|
|
26
|
+
acquire(request: PodDistributorAdmission): Promise<PodPoolMember | null>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function createPodPoolDistributorAdapter(pool: PodPoolScheduler): PodDistributorAdapter {
|
|
30
|
+
// The legacy pool has no consumer for identity/workload fields; preserve them at this seam for CORE.
|
|
31
|
+
return {
|
|
32
|
+
acquire: ({ skip, onEmpty, mode }) => pool.tryAcquire(skip, onEmpty, mode),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Only the tasks-hand entry uses the adapter in this first wire slice; other launchers keep the established path. */
|
|
37
|
+
export function acquirePodPoolSlot(input: {
|
|
38
|
+
entry: string | undefined;
|
|
39
|
+
pool: PodPoolScheduler;
|
|
40
|
+
adapter?: PodDistributorAdapter;
|
|
41
|
+
request: PodDistributorAdmission;
|
|
42
|
+
}): Promise<PodPoolMember | null> {
|
|
43
|
+
const { entry, pool, adapter, request } = input;
|
|
44
|
+
if (entry === TASK_HAND_POD_DISTRIBUTOR_ENTRY) {
|
|
45
|
+
return (adapter ?? createPodPoolDistributorAdapter(pool)).acquire(request);
|
|
46
|
+
}
|
|
47
|
+
return pool.tryAcquire(request.skip, request.onEmpty, request.mode);
|
|
48
|
+
}
|
|
@@ -184,6 +184,37 @@ export function createPodLedgerFollower(opts: {
|
|
|
184
184
|
if (!Number.isFinite(stallMinutes) || stallMinutes <= 0) throw new RangeError('stallMinutes must be positive');
|
|
185
185
|
const onStall = opts.onStall ?? ((message: string) => console.error(message));
|
|
186
186
|
const path = runLedgerPath(opts.runId, dir); // runId 검증(경로·셸에 안전한 문자만)도 여기서 된다
|
|
187
|
+
function activityTimestamp(epoch: number): string {
|
|
188
|
+
const iso = new Date(Math.floor(epoch / 1_000) * 1_000).toISOString();
|
|
189
|
+
return `${iso.slice(0, 4)}${iso.slice(5, 7)}${iso.slice(8, 10)}${iso.slice(11, 13)}${iso.slice(14, 16)}.${iso.slice(17, 19)}`;
|
|
190
|
+
}
|
|
191
|
+
function activityCommand(since: string, until: string, offset: number, sinceTimestamp: string, untilTimestamp: string): string {
|
|
192
|
+
return [
|
|
193
|
+
`s="\${ELANOUS_STATE_DIR:-$HOME/.elanous}"`,
|
|
194
|
+
`f="$s/run-ledger/${opts.runId}.jsonl"`,
|
|
195
|
+
'w="$s/worktrees"',
|
|
196
|
+
'if [ -f "$f" ]; then tail -c +' + (offset + 1) + ' "$f" || exit 1; fi',
|
|
197
|
+
"target=''; matches=0",
|
|
198
|
+
'for tree in "$w"/*/*.worktrees/*; do',
|
|
199
|
+
' [ -e "$tree/.git" ] || continue',
|
|
200
|
+
' owner=$(git -C "$tree" config --worktree --get elanous.harness.owner 2>/dev/null) || continue',
|
|
201
|
+
` [ "$owner" = 'dev:${opts.runId}' ] || continue`,
|
|
202
|
+
' target="$tree"; matches=$((matches + 1))',
|
|
203
|
+
'done',
|
|
204
|
+
'if [ "$matches" -eq 1 ]; then',
|
|
205
|
+
' touch_activity_ref() { stamp_value=$1; fallback=$2; ref=$3; touch -d "@$stamp_value" "$ref" 2>/dev/null && return 0; TZ=UTC touch -t "$fallback" "$ref"; }',
|
|
206
|
+
` activity_since="$s/.pod-activity-${opts.runId}-$$-since"`,
|
|
207
|
+
` activity_until="$s/.pod-activity-${opts.runId}-$$-until"`,
|
|
208
|
+
" activity=''",
|
|
209
|
+
` if : > "$activity_since" && : > "$activity_until" && touch_activity_ref '${since}' '${sinceTimestamp}' "$activity_since" && touch_activity_ref '${until}' '${untilTimestamp}' "$activity_until"; then`,
|
|
210
|
+
' activity=$(find "$target" -type d \\( -name .git -o -name node_modules \\) -prune -o -type f -newer "$activity_since" ! -newer "$activity_until" -exec printf . \\; 2>/dev/null)',
|
|
211
|
+
' activity_status=$?',
|
|
212
|
+
' else activity_status=1; fi',
|
|
213
|
+
' rm -f "$activity_since" "$activity_until"',
|
|
214
|
+
' if [ "$activity_status" -eq 0 ]; then printf \'\\nELANOUS_ACTIVITY %s\\n\' "\${#activity}"; else printf \'\\nELANOUS_ACTIVITY_ERROR\\n\'; fi',
|
|
215
|
+
"else printf '\\nELANOUS_ACTIVITY_ERROR\\n'; fi",
|
|
216
|
+
].join('\n');
|
|
217
|
+
}
|
|
187
218
|
let offset = 0;
|
|
188
219
|
let pending = '';
|
|
189
220
|
let owned = false;
|
|
@@ -218,7 +249,13 @@ export function createPodLedgerFollower(opts: {
|
|
|
218
249
|
const since = `${Math.floor(lastActivityMeasuredAt / 1000)}.${String(lastActivityMeasuredAt % 1000).padStart(3, '0')}`;
|
|
219
250
|
const measurementStartedAt = now();
|
|
220
251
|
const until = `${Math.floor(measurementStartedAt / 1000)}.${String(measurementStartedAt % 1000).padStart(3, '0')}`;
|
|
221
|
-
const r = opts.exec(
|
|
252
|
+
const r = opts.exec(activityCommand(
|
|
253
|
+
since,
|
|
254
|
+
until,
|
|
255
|
+
offset,
|
|
256
|
+
activityTimestamp(lastActivityMeasuredAt),
|
|
257
|
+
activityTimestamp(measurementStartedAt),
|
|
258
|
+
));
|
|
222
259
|
if (r.status !== 0) { log('self-implement.pod', 'ledger-live-unavailable', { runId: opts.runId, status: r.status, stderr: r.stderr.trim().slice(0, 200) }); checkStall(false, false); return { ledgerRead: false, activityMeasured: false }; }
|
|
223
260
|
const marker = r.stdout.lastIndexOf('\nELANOUS_ACTIVITY');
|
|
224
261
|
const activityLine = marker < 0 ? '' : r.stdout.slice(marker + 1);
|
|
@@ -1,16 +1,43 @@
|
|
|
1
1
|
/** Opt-in SI warm entry; the ordinary Pod spawn remains the default. */
|
|
2
2
|
import { podSelfImplementSpawn, type PodSpawnOptions } from './self-implement-pod.js';
|
|
3
|
+
import type { SiWarmChildAttempt } from './self-implement-pod.js';
|
|
4
|
+
import type { SelfImplementJobDone, SelfImplementJobSpawn } from './self-implement.js';
|
|
5
|
+
import type { SiWarmAcquireResult } from './pod-si-warm-provider.js';
|
|
6
|
+
|
|
7
|
+
export interface SiWarmEntryAdapter {
|
|
8
|
+
acquire(input: Parameters<SelfImplementJobSpawn>[0], base: PodSpawnOptions): Promise<SiWarmAcquireResult>;
|
|
9
|
+
postprocess(input: Parameters<SelfImplementJobSpawn>[0], result: SelfImplementJobDone,
|
|
10
|
+
attempt: SiWarmChildAttempt, base: PodSpawnOptions): Promise<SelfImplementJobDone>;
|
|
11
|
+
}
|
|
3
12
|
|
|
4
13
|
export async function podSpawnWithSiWarm(base: PodSpawnOptions,
|
|
5
|
-
env: NodeJS.ProcessEnv = process.env) {
|
|
6
|
-
|
|
7
|
-
|
|
14
|
+
env: NodeJS.ProcessEnv = process.env, adapter?: SiWarmEntryAdapter) {
|
|
15
|
+
let configEnabled = false;
|
|
16
|
+
try { configEnabled = base.warmReuseConfig?.()?.ta === true; }
|
|
17
|
+
catch { /* An unreadable config must not open the warm transport. */ }
|
|
18
|
+
if (env.ELANOUS_SI_WARM_REUSE !== '1' && !configEnabled) return podSelfImplementSpawn(base);
|
|
19
|
+
const hooks = adapter ?? await import('./pod-si-warm-host.js').then(({ acquireSiWarmChild, postprocessSiWarmChild }) => ({
|
|
20
|
+
acquire: acquireSiWarmChild,
|
|
21
|
+
postprocess: postprocessSiWarmChild,
|
|
22
|
+
}));
|
|
8
23
|
return podSelfImplementSpawn({ ...base,
|
|
9
24
|
siWarmAttempt: async input => {
|
|
10
|
-
const result = await
|
|
11
|
-
|
|
25
|
+
const result = await hooks.acquire(input, base);
|
|
26
|
+
switch (result.status) {
|
|
27
|
+
case 'acquired': return result.attempt;
|
|
28
|
+
case 'no-entry': return null;
|
|
29
|
+
case 'uncertain':
|
|
30
|
+
// An uncertain lease may already be running this request. Never launch a fresh Job
|
|
31
|
+
// until its fenced worker is reconciled, or the same goal can execute twice.
|
|
32
|
+
throw new Error(`si-v1 lease state uncertain: ${result.reason}`);
|
|
33
|
+
default: {
|
|
34
|
+
const exhaustive: never = result;
|
|
35
|
+
void exhaustive;
|
|
36
|
+
throw new Error('si-v1 lease acquisition returned an unsupported state');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
12
39
|
},
|
|
13
40
|
siWarmHostPostprocess: (result, attempt, input) =>
|
|
14
|
-
|
|
41
|
+
hooks.postprocess(input, result, attempt, base),
|
|
15
42
|
});
|
|
16
43
|
}
|
|
@@ -13,8 +13,9 @@ type PackOptions = {
|
|
|
13
13
|
paths?: string[];
|
|
14
14
|
outDir: string;
|
|
15
15
|
maxSizeBytes?: number;
|
|
16
|
-
mirrorHead?: string;
|
|
16
|
+
mirrorHead?: string | null;
|
|
17
17
|
log?: (category: string, event: string, data: Record<string, unknown>) => void;
|
|
18
|
+
probeGit?: typeof gitProbe;
|
|
18
19
|
};
|
|
19
20
|
|
|
20
21
|
type PackedBundle = {
|
|
@@ -35,10 +36,21 @@ function git(repoDir: string, env: NodeJS.ProcessEnv, ...args: string[]): string
|
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
|
|
39
|
+
function gitProbe(repoDir: string, env: NodeJS.ProcessEnv, ...args: string[]): { status: number; stderr: string } {
|
|
40
|
+
try {
|
|
41
|
+
execFileSync('git', args, { cwd: repoDir, env, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
|
|
42
|
+
return { status: 0, stderr: '' };
|
|
43
|
+
} catch (error) {
|
|
44
|
+
const e = error as Error & { status?: number; stderr?: Buffer | string };
|
|
45
|
+
return { status: e.status ?? -1, stderr: String(e.stderr ?? e.message).trim() };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
38
49
|
/** Package the host's on-disk files above a fetchable remote base without touching the user's index. */
|
|
39
50
|
export function packSourceBundle(options: PackOptions): PackedBundle {
|
|
40
51
|
const { repoDir, kind, base, paths, outDir } = options;
|
|
41
52
|
const log = options.log ?? ((category: string, event: string, data: Record<string, unknown>) => debug.log(category, event, data));
|
|
53
|
+
const probeGit = options.probeGit ?? gitProbe;
|
|
42
54
|
const started = Date.now();
|
|
43
55
|
let root = resolve(repoDir);
|
|
44
56
|
const output = resolve(outDir);
|
|
@@ -50,6 +62,9 @@ export function packSourceBundle(options: PackOptions): PackedBundle {
|
|
|
50
62
|
let headCommit: string | undefined;
|
|
51
63
|
let ownsIndex = false;
|
|
52
64
|
let createdBundle = false;
|
|
65
|
+
let bundleMode: 'thin' | 'full' | 'unknown' = 'unknown';
|
|
66
|
+
let bundleReason = 'decision-not-reached';
|
|
67
|
+
let bundleSizeBytes: number | null = null;
|
|
53
68
|
try {
|
|
54
69
|
root = git(root, env, 'rev-parse', '--show-toplevel');
|
|
55
70
|
const outputRelative = relative(root, output);
|
|
@@ -110,16 +125,36 @@ export function packSourceBundle(options: PackOptions): PackedBundle {
|
|
|
110
125
|
git(root, env, 'update-ref', ref, headCommit);
|
|
111
126
|
createdBundle = true;
|
|
112
127
|
let bundleRevision = ref;
|
|
113
|
-
if (options.mirrorHead
|
|
128
|
+
if (options.mirrorHead === undefined) {
|
|
129
|
+
bundleMode = 'full';
|
|
130
|
+
bundleReason = 'mirror-head-unspecified';
|
|
131
|
+
} else if (options.mirrorHead === null) {
|
|
132
|
+
bundleMode = 'full';
|
|
133
|
+
bundleReason = 'mirror-head-missing';
|
|
134
|
+
} else {
|
|
135
|
+
bundleMode = 'full';
|
|
136
|
+
bundleReason = 'mirror-head-invalid';
|
|
114
137
|
// A thin bundle is usable only when its excluded history belongs to the packed base's lineage.
|
|
115
138
|
const mirrorHead = options.mirrorHead;
|
|
116
139
|
let sharedHistory = false;
|
|
117
140
|
if (/^[0-9a-f]{40,64}$/.test(mirrorHead)) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
sharedHistory = true;
|
|
122
|
-
|
|
141
|
+
const commitProbe = probeGit(root, { ...env, GIT_NO_LAZY_FETCH: '1' }, 'cat-file', '-e', `${mirrorHead}^{commit}`);
|
|
142
|
+
if (commitProbe.status === 0) {
|
|
143
|
+
const ancestorProbe = probeGit(root, env, 'merge-base', '--is-ancestor', mirrorHead, baseCommit);
|
|
144
|
+
if (ancestorProbe.status === 0) sharedHistory = true;
|
|
145
|
+
else if (ancestorProbe.status === 1 && !ancestorProbe.stderr) bundleReason = 'mirror-head-not-ancestor';
|
|
146
|
+
else bundleReason = 'mirror-head-check-failed';
|
|
147
|
+
} else if ((commitProbe.status === 1 && !commitProbe.stderr) || (commitProbe.status === 128 && /not a valid object name|could not get object info/i.test(commitProbe.stderr))) {
|
|
148
|
+
bundleReason = 'mirror-head-unavailable';
|
|
149
|
+
} else {
|
|
150
|
+
bundleReason = 'mirror-head-check-failed';
|
|
151
|
+
}
|
|
152
|
+
} else {
|
|
153
|
+
bundleReason = 'mirror-head-invalid';
|
|
154
|
+
}
|
|
155
|
+
if (sharedHistory) {
|
|
156
|
+
bundleMode = 'thin';
|
|
157
|
+
bundleReason = 'shared-history';
|
|
123
158
|
}
|
|
124
159
|
bundleRevision = sharedHistory ? `${mirrorHead}..${ref}` : ref;
|
|
125
160
|
}
|
|
@@ -127,15 +162,16 @@ export function packSourceBundle(options: PackOptions): PackedBundle {
|
|
|
127
162
|
git(root, env, 'update-ref', '-d', ref, headCommit);
|
|
128
163
|
ref = undefined;
|
|
129
164
|
const sizeBytes = statSync(bundlePath).size;
|
|
165
|
+
bundleSizeBytes = sizeBytes;
|
|
130
166
|
if (sizeBytes > limit) throw new Error(`bundle size ${sizeBytes} exceeds limit ${limit} bytes`);
|
|
131
167
|
const sha256 = createHash('sha256').update(readFileSync(bundlePath)).digest('hex');
|
|
132
168
|
const result = { bundlePath, sha256, sizeBytes, baseCommit, headCommit, fileCount };
|
|
133
|
-
log('pod.source', 'bundle-packed', { kind, baseCommit, headCommit, fileCount, sizeBytes, ms: Date.now() - started });
|
|
169
|
+
log('pod.source', 'bundle-packed', { kind, baseCommit, headCommit, fileCount, bundleMode, bundleReason, sizeBytes, ms: Date.now() - started });
|
|
134
170
|
return result;
|
|
135
171
|
} catch (error) {
|
|
136
172
|
if (createdBundle) rmSync(bundlePath, { force: true });
|
|
137
173
|
const reason = error instanceof Error ? error.message : String(error);
|
|
138
|
-
log('pod.source', 'bundle-refused', { kind, reason });
|
|
174
|
+
log('pod.source', 'bundle-refused', { kind, reason, bundleMode, bundleReason, sizeBytes: bundleSizeBytes });
|
|
139
175
|
throw error;
|
|
140
176
|
} finally {
|
|
141
177
|
if (ref && headCommit) git(root, env, 'update-ref', '-d', ref, headCommit);
|