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
|
@@ -72,13 +72,25 @@ export async function detectDashboardSkillRoute(
|
|
|
72
72
|
visibleIndex: SkillIndexEntry[],
|
|
73
73
|
deps: DashboardSkillDetectionRuntimeDeps,
|
|
74
74
|
): Promise<DetectResult> {
|
|
75
|
+
const detectionStartedAt = performance.now();
|
|
75
76
|
const detectKeyword = deps.detectKeyword ?? detectSkillTrigger;
|
|
76
77
|
const detectWithLLM = deps.detectWithLLM ?? detectLLM;
|
|
77
78
|
const parseClassifier = deps.parseClassifier ?? parseClassifierJson;
|
|
78
79
|
const keywordDetection = detectKeyword(userText, visibleIndex, {});
|
|
79
|
-
if (!deps.llmFallback)
|
|
80
|
+
if (!deps.llmFallback) {
|
|
81
|
+
try {
|
|
82
|
+
debug.log('skill.router.timing', 'detection-complete', {
|
|
83
|
+
mode: 'keyword',
|
|
84
|
+
elapsedMs: Math.round((performance.now() - detectionStartedAt) * 10) / 10,
|
|
85
|
+
skillCount: visibleIndex.length,
|
|
86
|
+
candidateCount: keywordDetection.candidates.length,
|
|
87
|
+
});
|
|
88
|
+
} catch { /* observation must never delay routing */ }
|
|
89
|
+
return keywordDetection;
|
|
90
|
+
}
|
|
80
91
|
|
|
81
92
|
const classify = async (prompt: string, signal?: AbortSignal): Promise<LLMClassifyResult> => {
|
|
93
|
+
const roleStartedAt = performance.now();
|
|
82
94
|
const resolved = resolveRoleLlm('classify');
|
|
83
95
|
const provider = llm.PROVIDERS[resolved.provider];
|
|
84
96
|
if (!provider) throw new Error(`Unknown classify provider: ${resolved.provider}`);
|
|
@@ -89,21 +101,49 @@ export async function detectDashboardSkillRoute(
|
|
|
89
101
|
provider: resolved.provider,
|
|
90
102
|
source: resolved.source,
|
|
91
103
|
});
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
104
|
+
try {
|
|
105
|
+
debug.log('skill.router.timing', 'classifier-role-ready', {
|
|
106
|
+
elapsedMs: Math.round((performance.now() - roleStartedAt) * 10) / 10,
|
|
107
|
+
provider: resolved.provider,
|
|
108
|
+
source: resolved.source,
|
|
109
|
+
});
|
|
110
|
+
} catch { /* observation must never delay routing */ }
|
|
111
|
+
const streamStartedAt = performance.now();
|
|
112
|
+
let raw: string;
|
|
113
|
+
try {
|
|
114
|
+
raw = await deps.streamLLM(
|
|
115
|
+
[{ role: 'user', content: prompt }],
|
|
116
|
+
() => {},
|
|
117
|
+
{ signal, maxTokens: 120, temperature: 0, model: resolved.model, provider, usageRole: 'classify' },
|
|
118
|
+
);
|
|
119
|
+
} finally {
|
|
120
|
+
try {
|
|
121
|
+
debug.log('skill.router.timing', 'classifier-stream-complete', {
|
|
122
|
+
elapsedMs: Math.round((performance.now() - streamStartedAt) * 10) / 10,
|
|
123
|
+
provider: resolved.provider,
|
|
124
|
+
});
|
|
125
|
+
} catch { /* observation must never delay routing */ }
|
|
126
|
+
}
|
|
97
127
|
return parseClassifier(raw);
|
|
98
128
|
};
|
|
99
129
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
130
|
+
try {
|
|
131
|
+
return await detectWithLLM(userText, visibleIndex, {
|
|
132
|
+
classify,
|
|
133
|
+
keywordScoreThreshold: deps.keywordScoreThreshold,
|
|
134
|
+
llmConfidenceThreshold: deps.llmConfidenceThreshold,
|
|
135
|
+
...(deps.signal ? { signal: deps.signal } : {}),
|
|
136
|
+
...(deps.activeTier ? { activeTier: deps.activeTier } : {}),
|
|
137
|
+
...(deps.fullMenuTier ? { fullMenuTier: deps.fullMenuTier } : {}),
|
|
138
|
+
...(deps.fullMenuConfidenceThreshold != null ? { fullMenuConfidenceThreshold: deps.fullMenuConfidenceThreshold } : {}),
|
|
139
|
+
});
|
|
140
|
+
} finally {
|
|
141
|
+
try {
|
|
142
|
+
debug.log('skill.router.timing', 'detection-complete', {
|
|
143
|
+
mode: 'llm-fallback',
|
|
144
|
+
elapsedMs: Math.round((performance.now() - detectionStartedAt) * 10) / 10,
|
|
145
|
+
skillCount: visibleIndex.length,
|
|
146
|
+
});
|
|
147
|
+
} catch { /* observation must never delay routing */ }
|
|
148
|
+
}
|
|
109
149
|
}
|
|
@@ -422,6 +422,21 @@ const COST_SLASH_DESCRIPTOR = buildCostSlashCommand();
|
|
|
422
422
|
const MEMORY_SLASH_DESCRIPTOR = buildMemorySlashCommand();
|
|
423
423
|
|
|
424
424
|
export interface DashboardSlashContext {
|
|
425
|
+
/** Classic /side agent commands supplied by the dashboard host. */
|
|
426
|
+
classicSidetabAgent?: {
|
|
427
|
+
loadRows(sessionId?: string): import('../../sidetab-core/model.js').SidetabRow[];
|
|
428
|
+
openAgent(agent: 'codex' | 'claude'): void;
|
|
429
|
+
runMission(agent: 'codex' | 'claude', mission: string, outputPath?: string): Promise<{
|
|
430
|
+
ok: boolean;
|
|
431
|
+
path: string;
|
|
432
|
+
firstLine?: string;
|
|
433
|
+
promptReady: boolean;
|
|
434
|
+
missionVisible: boolean;
|
|
435
|
+
promptReturned: boolean;
|
|
436
|
+
completionMarker: boolean;
|
|
437
|
+
error?: string;
|
|
438
|
+
}>;
|
|
439
|
+
};
|
|
425
440
|
// Chat surface refs / mutators
|
|
426
441
|
chatLines: string[];
|
|
427
442
|
/** Same status-line producer the agent immediate executor uses. Absent in tests → empty. */
|
|
@@ -41,6 +41,8 @@ import {
|
|
|
41
41
|
import type { getUserConfig } from '../user-config.js';
|
|
42
42
|
import { isNativeStructureEnabledForProvider, resolveActiveProvider } from '../user-config.js';
|
|
43
43
|
import { measureInputLagTurnStart } from '../tui/input-lag-probe.js';
|
|
44
|
+
import { resolveModelContextWindow } from '../models/context-window.js';
|
|
45
|
+
import { buildInstalledSkillCatalogMessage, type InstalledSkillSummary } from './skill-catalog-preamble.js';
|
|
44
46
|
import { effectiveInstanceRoot, prodInstanceRoot } from '../instance/resolve.js';
|
|
45
47
|
import { buildSelfHealthLine, type InstalledRecord, type SelfHealthErrors } from '../pty-shell/tui-run-state.js';
|
|
46
48
|
import type { PtyBuildIdentity } from '../pty-shell/pty-manifest.js';
|
|
@@ -71,6 +73,12 @@ export interface DashboardTurnPreambleContext {
|
|
|
71
73
|
* one-liner directives (e.g. AskUserQuestion → use for tool-deny
|
|
72
74
|
* clarification). Pass `tools.map(t => t.name)` from the caller. */
|
|
73
75
|
enabledTools?: readonly string[];
|
|
76
|
+
/** Installed frontmatter summaries for the stable skill-routing prompt prefix. */
|
|
77
|
+
skillCatalog?: readonly InstalledSkillSummary[];
|
|
78
|
+
/** Active model context size, when known. Unknown models use the conservative helper default. */
|
|
79
|
+
skillCatalogContextWindow?: number | null;
|
|
80
|
+
/** Runtime-selected model can differ from the configured default model. */
|
|
81
|
+
skillCatalogModelId?: string;
|
|
74
82
|
/** 🪪 L1 자리 부트 카드를 싣나(`seat-boot-preamble.ts`). 대화형 TUI 호출부만 켠다 — 기본 꺼짐이라
|
|
75
83
|
* 다른 호출부·시험은 셸의 `COORD_ID` 에 따라 출력이 갈리지 않는다. */
|
|
76
84
|
seatBoot?: boolean | SeatBootDeps;
|
|
@@ -100,6 +108,12 @@ export interface DashboardTurnPreambleContext {
|
|
|
100
108
|
};
|
|
101
109
|
}
|
|
102
110
|
|
|
111
|
+
/** Flag per-prompt system layers so the Codex Responses serializer keeps
|
|
112
|
+
* them out of the cached `instructions` prefix (TUI-PROMPT-CACHE-PREFIX). */
|
|
113
|
+
function markCacheVolatile(messages: readonly LLMMessage[]): LLMMessage[] {
|
|
114
|
+
return messages.map((m) => (m.role === 'system' ? { ...m, cacheVolatile: true } : m));
|
|
115
|
+
}
|
|
116
|
+
|
|
103
117
|
export function buildControllerSystemMessage(controller: string, channels?: string): LLMMessage {
|
|
104
118
|
return {
|
|
105
119
|
role: 'system',
|
|
@@ -172,6 +186,15 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
172
186
|
): LLMMessage[] {
|
|
173
187
|
const builderMs: BuilderMs | null = debug.enabled ? {} : null;
|
|
174
188
|
const startedAt = builderMs === null ? 0 : performance.now();
|
|
189
|
+
// This is the first stable block in the system preamble. Its cached content changes only
|
|
190
|
+
// when the installed/visible skill list or model context budget changes.
|
|
191
|
+
const skillCatalogBuild = ctx.skillCatalog
|
|
192
|
+
? timed(builderMs, 'skillCatalog', () => buildInstalledSkillCatalogMessage(
|
|
193
|
+
ctx.skillCatalog!,
|
|
194
|
+
ctx.skillCatalogContextWindow ?? resolveModelContextWindow(ctx.skillCatalogModelId ?? ctx.userConfig.llm.model),
|
|
195
|
+
))
|
|
196
|
+
: null;
|
|
197
|
+
const skillCatalogSystemMsgs = skillCatalogBuild?.message ? [skillCatalogBuild.message] : [];
|
|
175
198
|
// Universal preamble — surface-agnostic anchor (AGENTS.md +
|
|
176
199
|
// CLAUDE.md). Spread first so the project context lands BEFORE any
|
|
177
200
|
// surface-specific guidance, mirroring Claude Code's Phase 0
|
|
@@ -294,21 +317,30 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
294
317
|
const controllerSystemMsgs = controller
|
|
295
318
|
? timed(builderMs, 'controller', () => [buildControllerSystemMessage(controller, controlEnv.channels)])
|
|
296
319
|
: [];
|
|
297
|
-
|
|
320
|
+
// TUI-PROMPT-CACHE-PREFIX — only the universal anchor (AGENTS.md ·
|
|
321
|
+
// CLAUDE.md · tool discipline) is stable for the life of a session. Every
|
|
322
|
+
// other layer can change between prompts (boot card · memory · git
|
|
323
|
+
// snapshot · plan/approval mode · per-userText guidance · self health), so
|
|
324
|
+
// it is flagged `cacheVolatile`: the Codex serializer then keeps it out of
|
|
325
|
+
// `instructions` and sends it as a developer item after the cached history.
|
|
326
|
+
const preamble: LLMMessage[] = [
|
|
327
|
+
...skillCatalogSystemMsgs,
|
|
298
328
|
...universalPreamble,
|
|
299
|
-
...
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
329
|
+
...markCacheVolatile([
|
|
330
|
+
...seatBootSystemMsgs,
|
|
331
|
+
...planModeSystemMsgs,
|
|
332
|
+
...askSystemMsgs,
|
|
333
|
+
...approvalSystemMsgs,
|
|
334
|
+
...sandboxSystemMsgs,
|
|
335
|
+
...memorySystemMsgs,
|
|
336
|
+
...gitSnapshotSystemMsgs,
|
|
337
|
+
...surfaceSystemMsgs,
|
|
338
|
+
...selfOpsSystemMsgs,
|
|
339
|
+
...selfHealthSystemMsgs,
|
|
340
|
+
...controllerSystemMsgs,
|
|
341
|
+
...implDisciplineSystemMsgs,
|
|
342
|
+
...concisenessSystemMsgs,
|
|
343
|
+
]),
|
|
312
344
|
];
|
|
313
345
|
// Capture exactly what the ACP path's getPreamble emits so we can
|
|
314
346
|
// verify what codex actually sees as system prompt at turn-start.
|
|
@@ -328,7 +360,9 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
328
360
|
if (notificationOnlyWake) {
|
|
329
361
|
preamble.push({ role: 'system', content: '[알림 전용 턴] 이것은 완료 알림을 전달한 비요청 status receipt다. 작업 요청으로 취급하지 말고 Agent 또는 SelfImplement 위임을 시작하지 않는다. 포함된 결과를 바탕으로 한 번의 간결한 상태 요약만 답하고 멈춘다. 결과가 전달되지 않았다면 결과가 아직 제공되지 않았다고 알리고 내용을 추측하지 않는다.' });
|
|
330
362
|
}
|
|
331
|
-
const pendingNotifications =
|
|
363
|
+
const pendingNotifications = ctx.sessionId
|
|
364
|
+
? globalTaskNotificationQueue.drainForParentSessionOrUnscoped(ctx.sessionId)
|
|
365
|
+
: globalTaskNotificationQueue.drain();
|
|
332
366
|
taskNotificationCount = pendingNotifications.length;
|
|
333
367
|
if (pendingNotifications.length === 0) {
|
|
334
368
|
if (notificationOnlyWake) {
|
|
@@ -370,6 +404,7 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
370
404
|
hasTurnProfile: ctx.turnProfile != null,
|
|
371
405
|
builderCounts: {
|
|
372
406
|
universal: universalPreamble.length,
|
|
407
|
+
...(ctx.skillCatalog ? { skillCatalog: skillCatalogSystemMsgs.length } : {}),
|
|
373
408
|
seatBoot: seatBootSystemMsgs.length,
|
|
374
409
|
planMode: planModeSystemMsgs.length,
|
|
375
410
|
ask: askSystemMsgs.length,
|
|
@@ -390,6 +425,9 @@ function buildDashboardTurnPreambleUnmeasured(
|
|
|
390
425
|
builderTotalMs: Math.round((performance.now() - startedAt) * 10) / 10,
|
|
391
426
|
totalMessageCount: preamble.length,
|
|
392
427
|
taskNotificationCount,
|
|
428
|
+
skillCatalogTokens: skillCatalogBuild?.estimatedTokens ?? 0,
|
|
429
|
+
skillCatalogBudgetTokens: skillCatalogBuild?.budgetTokens ?? 0,
|
|
430
|
+
skillCatalogMode: skillCatalogBuild?.mode ?? 'not-provided',
|
|
393
431
|
totalChars: total,
|
|
394
432
|
userTextPreview: ctx.userText.length > 80 ? `${ctx.userText.slice(0, 80)}…` : ctx.userText,
|
|
395
433
|
});
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
type PromptBankStore,
|
|
6
6
|
} from '../prompt-bank/index.js';
|
|
7
7
|
import {
|
|
8
|
-
|
|
8
|
+
resolveSessionTurnProfileWithHistory,
|
|
9
9
|
type SessionTurnProfile,
|
|
10
10
|
} from '../session-runtime/index.js';
|
|
11
11
|
import type { InputSourceRef } from '../input/input-source-kind.js';
|
|
@@ -39,6 +39,7 @@ export function buildDashboardTurnPromptRuntime(
|
|
|
39
39
|
turnId: string,
|
|
40
40
|
deps: DashboardTurnPromptRuntimeDeps,
|
|
41
41
|
inputSource?: InputSourceRef | null,
|
|
42
|
+
priorUserTexts: readonly string[] = [],
|
|
42
43
|
): DashboardTurnPromptRuntimeResult {
|
|
43
44
|
const turnIntents = ['chat', ...classifyUserIntents(userText)];
|
|
44
45
|
const promptBankInjection = deps.promptBankConfig.enabled && deps.promptBankConfig.dashboardTurns
|
|
@@ -62,8 +63,9 @@ export function buildDashboardTurnPromptRuntime(
|
|
|
62
63
|
slots: ['context', 'tool-hint', 'user-prefix'],
|
|
63
64
|
})
|
|
64
65
|
: '';
|
|
65
|
-
const turnProfile =
|
|
66
|
+
const turnProfile = resolveSessionTurnProfileWithHistory({
|
|
66
67
|
userText,
|
|
68
|
+
priorUserTexts,
|
|
67
69
|
chatModeState: deps.chatModeState,
|
|
68
70
|
inputSource,
|
|
69
71
|
});
|
|
@@ -5,10 +5,10 @@ import { parse as parseYaml } from 'yaml';
|
|
|
5
5
|
import { writeStdoutJson } from '../cli/stdout-json.js';
|
|
6
6
|
import type { GraphVariantPlan } from '../self-implement/graph-variant.js';
|
|
7
7
|
import { debug } from '../debug/log.js';
|
|
8
|
-
import { decideGraphApproval, graphRunAlive, lastJsonObject, latestGraphRun, listGraphRuns, manageGraphRun, runGraph, type GraphRunState } from './runner.js';
|
|
8
|
+
import { decideGraphApproval, graphRunAlive, lastJsonObject, latestGraphRun, listGraphRuns, manageGraphRun, runGraph, type GraphRunOptions, type GraphRunState } from './runner.js';
|
|
9
9
|
|
|
10
|
-
function findGraphFile(graphId: string): string | undefined {
|
|
11
|
-
const roots = [resolve('graphs'), resolve(import.meta.dir, '../../graphs')];
|
|
10
|
+
function findGraphFile(graphId: string, extraRoots: string[] = []): string | undefined {
|
|
11
|
+
const roots = [...extraRoots.map((root) => resolve(root)), resolve('graphs'), resolve(import.meta.dir, '../../graphs')];
|
|
12
12
|
for (const root of roots) {
|
|
13
13
|
for (const dir of [root, ...['release', 'ops'].map((part) => join(root, part))]) {
|
|
14
14
|
if (!existsSync(dir)) continue;
|
|
@@ -26,7 +26,10 @@ function findGraphFile(graphId: string): string | undefined {
|
|
|
26
26
|
return undefined;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
export function registerGraphCommands(program: Command, runsDeps: {
|
|
29
|
+
export function registerGraphCommands(program: Command, runsDeps: {
|
|
30
|
+
root?: string; processStartMs?: (pid: number) => number | null; graphRoots?: string[];
|
|
31
|
+
runBash?: NonNullable<GraphRunOptions['deps']>['runBash'];
|
|
32
|
+
} = {}): void {
|
|
30
33
|
const graph = program.command('graph').description('Run a declared command graph or inspect its latest run');
|
|
31
34
|
graph.command('adapt-report')
|
|
32
35
|
.description('Measure recorded graph path diversity, unit calls, adaptations and landings for one goal')
|
|
@@ -333,10 +336,23 @@ export function registerGraphCommands(program: Command, runsDeps: { root?: strin
|
|
|
333
336
|
graph.command('approve <graph_id> <run_id>')
|
|
334
337
|
.option('--reject', 'Reject instead of approving')
|
|
335
338
|
.option('--by <name>', 'Record the approver name')
|
|
336
|
-
.action((graphId: string, runId: string, opts: { reject?: boolean; by?: string }) => {
|
|
339
|
+
.action(async (graphId: string, runId: string, opts: { reject?: boolean; by?: string }) => {
|
|
337
340
|
try {
|
|
338
|
-
|
|
339
|
-
|
|
341
|
+
// A release approval is the decision point for a live publish run. Resume its
|
|
342
|
+
// saved graph immediately so approval does not depend on a later manual tick.
|
|
343
|
+
// Resolve the release graph before recording the irreversible decision; if it
|
|
344
|
+
// is unavailable, leave the approval undecided so an operator can retry.
|
|
345
|
+
const releaseGraph = graphId === 'release-loop' ? findGraphFile(graphId, runsDeps.graphRoots) : undefined;
|
|
346
|
+
if (graphId === 'release-loop' && !releaseGraph) throw new Error('release-loop graph file not found; approval was not recorded');
|
|
347
|
+
const state = decideGraphApproval(graphId, runId, opts.reject ? 'rejected' : 'approved', opts.by, runsDeps.root);
|
|
348
|
+
if (releaseGraph) {
|
|
349
|
+
await (await import('../domains/standalone-log-sink.js')).registerStandaloneLogSink('graph');
|
|
350
|
+
const { graphTick } = await import('./graph-tick.js');
|
|
351
|
+
const result = await graphTick(releaseGraph, { resumeRunId: runId, deps: { root: runsDeps.root, runBash: runsDeps.runBash } });
|
|
352
|
+
console.log(`${state.graphId} ${state.runId}: ${state.pending?.decision} · ${result.action} ${result.status ?? ''}`.trim());
|
|
353
|
+
} else {
|
|
354
|
+
console.log(`${state.graphId} ${state.runId}: ${state.pending?.decision}`);
|
|
355
|
+
}
|
|
340
356
|
} catch (error) {
|
|
341
357
|
console.error(`graph approve: ${error instanceof Error ? error.message : String(error)}`);
|
|
342
358
|
process.exitCode = 1;
|
|
@@ -8,10 +8,12 @@ import { peerEditRunGate } from '../nexus/api/graph-peer-edit.js';
|
|
|
8
8
|
import { observeModelInputTokens } from '../harness/model-input-observation.js';
|
|
9
9
|
import { effectiveInstanceRoot } from '../instance/resolve.js';
|
|
10
10
|
import { DecisionLedger } from '../decisions/decision-ledger.js';
|
|
11
|
-
import { latestGraphRun, runGraph, type GraphRunOptions, type GraphRunState } from './runner.js';
|
|
11
|
+
import { latestGraphRun, listGraphRuns, runGraph, type GraphRunOptions, type GraphRunState } from './runner.js';
|
|
12
12
|
|
|
13
13
|
export interface GraphTickOptions {
|
|
14
14
|
startIfIdle?: boolean;
|
|
15
|
+
/** Resume this exact persisted run instead of whichever run happens to be latest. */
|
|
16
|
+
resumeRunId?: string;
|
|
15
17
|
input?: unknown;
|
|
16
18
|
mineDir?: string;
|
|
17
19
|
deps?: GraphRunOptions['deps'] & { notify?: () => void | Promise<void>; isAlive?: (pid: number) => boolean };
|
|
@@ -96,7 +98,13 @@ export async function graphTick(path: string, options: GraphTickOptions = {}): P
|
|
|
96
98
|
if (refusedAfterNotify) return refusedAfterNotify;
|
|
97
99
|
// The run identity and executed bytes must agree with the ledger and the gate.
|
|
98
100
|
if (current.graphId !== graphId) throw new Error(`graph id changed during tick: ${graphId} -> ${current.graphId}`);
|
|
99
|
-
const latest =
|
|
101
|
+
const latest = options.resumeRunId
|
|
102
|
+
? listGraphRuns(root).runs.find(run => run.graphId === graphId && run.runId === options.resumeRunId) ?? null
|
|
103
|
+
: latestGraphRun(graphId, root);
|
|
104
|
+
if (options.resumeRunId && !latest) throw new Error(`graph run not found: ${graphId}/${options.resumeRunId}`);
|
|
105
|
+
if (options.resumeRunId && (latest?.status !== 'awaiting-approval' || !latest.pending?.decision)) {
|
|
106
|
+
throw new Error(`graph run is not awaiting a recorded decision: ${graphId}/${options.resumeRunId}`);
|
|
107
|
+
}
|
|
100
108
|
const growthCard = latest?.growthPark
|
|
101
109
|
? (options.deps?.growthDecision?.list ?? ((filters: { status: 'all' }) => new DecisionLedger({ stateDir: root }).list(filters)))({ status: 'all' })
|
|
102
110
|
.find(entry => entry.id === latest.growthPark?.decisionId && entry.refs?.includes(latest.growthPark.decisionRef))
|
|
@@ -1227,7 +1227,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
|
|
|
1227
1227
|
? (lastPriorOutput as Record<string, unknown>).result : undefined;
|
|
1228
1228
|
const inputs: Record<string, unknown> = Object.create(null);
|
|
1229
1229
|
for (const key of contract.inputs) {
|
|
1230
|
-
const value = Object.hasOwn(supplied, key) ? supplied[key] : key === 'prior' ? priorResult : previous[key];
|
|
1230
|
+
const value = Object.hasOwn(supplied, key) ? supplied[key] : key === 'prior' ? (priorResult === undefined ? {} : priorResult) : previous[key];
|
|
1231
1231
|
if (value !== undefined) inputs[key] = value;
|
|
1232
1232
|
}
|
|
1233
1233
|
const alreadySpent = state.path.length + (state.unitCalls ?? []).reduce((sum, call) => sum + call.steps, 0);
|
package/src/grok/agent-search.ts
CHANGED
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
// Reference: https://docs.x.ai/docs/guides/tools/overview
|
|
25
25
|
|
|
26
26
|
import { getGrokApiKey, refreshKeyFromCache } from '../config.js';
|
|
27
|
+
import { resolveFreshGrokCredential } from './credential.js';
|
|
27
28
|
import { debug } from '../debug/log.js';
|
|
28
29
|
|
|
29
30
|
/** Agent Tools API endpoint (distinct from GROK_API_URL=chat/completions). */
|
|
@@ -58,6 +59,10 @@ export interface GrokAgentSearchOpts {
|
|
|
58
59
|
/** Subscription proxy endpoint and required CLI headers. Omit for the metered xAI API. */
|
|
59
60
|
baseUrl?: string;
|
|
60
61
|
headers?: Record<string, string>;
|
|
62
|
+
/** Opt-in credential order for search callers; unset preserves the direct API-key behavior. */
|
|
63
|
+
credentialPreference?: 'api_key';
|
|
64
|
+
/** Model used only when resolving a fallback subscription credential. */
|
|
65
|
+
credentialModel?: string;
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
export interface GrokCitation {
|
|
@@ -89,7 +94,11 @@ export async function grokAgentSearch(
|
|
|
89
94
|
query: string,
|
|
90
95
|
opts: GrokAgentSearchOpts = {},
|
|
91
96
|
): Promise<GrokAgentSearchResult> {
|
|
92
|
-
const
|
|
97
|
+
const credential = opts.credentialPreference
|
|
98
|
+
? resolveFreshGrokCredential({ prefer: opts.credentialPreference, ...(opts.credentialModel ? { model: opts.credentialModel } : {}) })
|
|
99
|
+
: null;
|
|
100
|
+
if (credential) debug.log('grok.agent-search', 'credential-selected', { kind: credential.kind, source: credential.source });
|
|
101
|
+
const apiKey = opts.apiKey ?? credential?.token ?? getGrokApiKey();
|
|
93
102
|
if (!apiKey) return { ok: false, status: 0, text: '', citations: [], error: 'missing-api-key' };
|
|
94
103
|
|
|
95
104
|
const fetchImpl = opts.fetchImpl ?? (globalThis.fetch as unknown as FetchLike);
|
|
@@ -109,13 +118,14 @@ export async function grokAgentSearch(
|
|
|
109
118
|
|
|
110
119
|
let res: Response;
|
|
111
120
|
try {
|
|
112
|
-
const
|
|
113
|
-
|
|
121
|
+
const baseUrl = opts.baseUrl ?? credential?.baseUrl;
|
|
122
|
+
const endpoint = baseUrl
|
|
123
|
+
? `${baseUrl.replace(/\/$/, '').replace(/\/responses$/, '')}/responses`
|
|
114
124
|
: GROK_RESPONSES_URL;
|
|
115
125
|
res = await fetchImpl(endpoint, {
|
|
116
126
|
method: 'POST',
|
|
117
127
|
signal: ac.signal,
|
|
118
|
-
headers: { 'content-type': 'application/json', authorization: `Bearer ${apiKey}`, ...opts.headers },
|
|
128
|
+
headers: { 'content-type': 'application/json', authorization: `Bearer ${apiKey}`, ...credential?.headers, ...opts.headers },
|
|
119
129
|
body: JSON.stringify({
|
|
120
130
|
model,
|
|
121
131
|
input,
|
package/src/grok/credential.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
// ── Grok 자격 해석 — ⭐
|
|
1
|
+
// ── Grok 자격 해석 — ⭐ 기본은 구독 1순위, 검색은 명시적으로 API 키 우선 ──
|
|
2
2
|
//
|
|
3
3
|
// 대표 지시 2026-08-13: *"엘라누스 안에서 grok 이 구독으로 도는 경우도 진행해야 합니다.
|
|
4
4
|
// 구독이 있는 경우 api key 는 항상 2순위로 되게 해주세요."*
|
|
5
5
|
//
|
|
6
|
-
// ⛔ **왜 이 파일이 «하나»여야 하나** — elanous 에는 grok 이 나가는 경로가
|
|
6
|
+
// ⛔ **왜 이 파일이 «하나»여야 하나** — elanous 에는 grok 이 나가는 경로가 여럿이다:
|
|
7
7
|
// ⑴ ACP 백엔드 `grok agent stdio` (자식 바이너리가 auth.json 을 직접 읽는다)
|
|
8
8
|
// ⑵ LLM 프로바이더 `streamChat` (elanous 가 Bearer 를 «직접» 실어 보낸다)
|
|
9
|
+
// ⑶ 검색 검색만 `prefer: 'api_key'` 로 비용 출처를 분리하고, 키가 없으면 구독으로 폴백한다
|
|
9
10
|
// 예전엔 ⑴만 구독을 강제(env 스크럽)하고 ⑵는 무조건 API 키였다. 규칙이 갈리면
|
|
10
11
|
// 「구독을 켰는데 지갑이 열리는」 사고가 난다. ⇒ 두 경로가 이 파일 하나를 읽는다.
|
|
11
12
|
//
|
|
@@ -29,6 +30,7 @@
|
|
|
29
30
|
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
30
31
|
import { homedir } from 'node:os';
|
|
31
32
|
import { join } from 'node:path';
|
|
33
|
+
import { keyFromCacheOrEnv } from '../config.js';
|
|
32
34
|
|
|
33
35
|
/** 구독 프록시 베이스. ⛔ `api.x.ai` 가 «아니다** — 그쪽은 API 키(토큰 과금) 전용. */
|
|
34
36
|
export const GROK_SUBSCRIPTION_BASE_URL = 'https://cli-chat-proxy.grok.com/v1';
|
|
@@ -312,11 +314,30 @@ function readGrokCredential(opts: {
|
|
|
312
314
|
home?: string;
|
|
313
315
|
model?: string;
|
|
314
316
|
cliVersion?: string;
|
|
317
|
+
/** Search surfaces may prefer metered API credentials; all other callers retain subscription-first. */
|
|
318
|
+
prefer?: 'api_key';
|
|
315
319
|
/** 구독을 «건너뛴다** — 401 을 맞은 뒤 호출자가 강등할 때만 쓴다. */
|
|
316
320
|
skipSubscription?: boolean;
|
|
317
321
|
} = {}): GrokCredential | null {
|
|
318
322
|
const env = opts.env ?? process.env;
|
|
319
323
|
|
|
324
|
+
const readApiKey = (cacheFirst = false): GrokCredential | null => {
|
|
325
|
+
for (const name of ['XAI_API_KEY', 'GROK_API_KEY', 'GROK_CODE_XAI_API_KEY'] as const) {
|
|
326
|
+
const useCache = cacheFirst && (!opts.env || opts.env === process.env);
|
|
327
|
+
const value = useCache ? keyFromCacheOrEnv(name) : env[name];
|
|
328
|
+
if (value && value.length > 0) {
|
|
329
|
+
const source = env[name] === value ? name : `${name.toLowerCase()}-cache`;
|
|
330
|
+
return { kind: 'api_key', baseUrl: GROK_API_BASE_URL, token: value, headers: {}, source };
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return null;
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
if (opts.prefer === 'api_key') {
|
|
337
|
+
const apiKey = readApiKey(true);
|
|
338
|
+
if (apiKey) return apiKey;
|
|
339
|
+
}
|
|
340
|
+
|
|
320
341
|
if (opts.skipSubscription !== true) {
|
|
321
342
|
const sub = readSubscriptionToken(grokAuthFilePath(opts.home));
|
|
322
343
|
if (sub) {
|
|
@@ -335,18 +356,12 @@ function readGrokCredential(opts: {
|
|
|
335
356
|
}
|
|
336
357
|
}
|
|
337
358
|
|
|
338
|
-
//
|
|
339
|
-
|
|
340
|
-
const value = env[name];
|
|
341
|
-
if (value && value.length > 0) {
|
|
342
|
-
return { kind: 'api_key', baseUrl: GROK_API_BASE_URL, token: value, headers: {}, source: name };
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
return null;
|
|
359
|
+
// Default callers keep subscription-first. Search surfaces opt into API-key-first above.
|
|
360
|
+
return readApiKey();
|
|
346
361
|
}
|
|
347
362
|
|
|
348
363
|
/** Read-only credential check for synchronous provider availability. Never refreshes or calls the network. */
|
|
349
|
-
export function peekGrokCredential(opts: { home?: string; model?: string } = {}): GrokCredential | null {
|
|
364
|
+
export function peekGrokCredential(opts: { home?: string; model?: string; prefer?: 'api_key' } = {}): GrokCredential | null {
|
|
350
365
|
return readGrokCredential(opts);
|
|
351
366
|
}
|
|
352
367
|
|
|
@@ -607,6 +622,8 @@ export interface ResolveFreshGrokOpts {
|
|
|
607
622
|
model?: string;
|
|
608
623
|
cliVersion?: string;
|
|
609
624
|
skipSubscription?: boolean;
|
|
625
|
+
/** Search surfaces may prefer API-key billing; omitted callers remain subscription-first. */
|
|
626
|
+
prefer?: 'api_key';
|
|
610
627
|
/** ⛔ 테스트 심 — 실 바이너리 없이 계약을 문다. */
|
|
611
628
|
execImpl?: (cmd: string, args: string[], timeoutMs: number) => void;
|
|
612
629
|
now?: () => number;
|
|
@@ -107,7 +107,29 @@ export function podOrchestrateArgs(input: HarnessPodDispatchInput, goalFile: str
|
|
|
107
107
|
];
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
type
|
|
110
|
+
type PodDispatchExitObservation = {
|
|
111
|
+
status: number | null;
|
|
112
|
+
parentSignalReceived: NodeJS.Signals | null;
|
|
113
|
+
parentSignalReceivedAt: string | null;
|
|
114
|
+
parentSignalLastReceived?: NodeJS.Signals | null;
|
|
115
|
+
parentSignalLastReceivedAt?: string | null;
|
|
116
|
+
signalDelivery: 'requested' | 'child-not-running' | 'kill-failed' | null;
|
|
117
|
+
signalDeliveryFor?: NodeJS.Signals | null;
|
|
118
|
+
orchestratorProcessSignal: NodeJS.Signals | null;
|
|
119
|
+
observedAt: string;
|
|
120
|
+
};
|
|
121
|
+
type PodDispatchRunResult = number | null | PodDispatchExitObservation;
|
|
122
|
+
type PodDispatchDeps = { run?: (cmd: string, args: readonly string[], env: NodeJS.ProcessEnv) => PodDispatchRunResult; readFile?: (path: string) => string; cwd?: string; spawnChild?: typeof spawn; onOutput?: (text: string) => void; recordRunLedgerEntry?: typeof appendRunLedgerEntry; nowMs?: number };
|
|
123
|
+
|
|
124
|
+
export function classifyPodDispatchSignalSource(observation: Pick<PodDispatchExitObservation, 'parentSignalReceived' | 'signalDelivery' | 'orchestratorProcessSignal' | 'status'> & Partial<Pick<PodDispatchExitObservation, 'parentSignalLastReceived' | 'signalDeliveryFor'>>): 'parent-signal-forward-requested' | 'orchestrator-process-signaled' | 'unknown-143' | 'unknown-signal-exit' | 'non-signal-exit' {
|
|
125
|
+
const lastSignal = observation.parentSignalLastReceived ?? observation.parentSignalReceived;
|
|
126
|
+
const deliveryFor = observation.signalDeliveryFor ?? lastSignal;
|
|
127
|
+
if (lastSignal && observation.signalDelivery === 'requested' && deliveryFor === lastSignal) return 'parent-signal-forward-requested';
|
|
128
|
+
if (observation.orchestratorProcessSignal) return 'orchestrator-process-signaled';
|
|
129
|
+
if (observation.status === 143) return 'unknown-143';
|
|
130
|
+
if (observation.status === 130 || observation.status === null) return 'unknown-signal-exit';
|
|
131
|
+
return 'non-signal-exit';
|
|
132
|
+
}
|
|
111
133
|
|
|
112
134
|
/** Default Pod source clones origin HEAD. Never infer its file occupation from an unrelated worktree. */
|
|
113
135
|
function defaultPodSourceHeadAt(root: string): string | undefined {
|
|
@@ -294,39 +316,83 @@ export function dispatchHarnessOnPod(input: HarnessPodDispatchInput, deps: PodDi
|
|
|
294
316
|
childLlmProvider: input.childLlmProvider ?? null, childLlmModel: input.childLlmModel ?? null,
|
|
295
317
|
goalChars, ...(input.entrance === 'cli-harness-ask' ? { goalPath: input.input } : {}),
|
|
296
318
|
});
|
|
297
|
-
const run = deps.run ?? ((cmd: string, a: readonly string[], childEnv: NodeJS.ProcessEnv) => new Promise<
|
|
319
|
+
const run = deps.run ?? ((cmd: string, a: readonly string[], childEnv: NodeJS.ProcessEnv) => new Promise<PodDispatchExitObservation>((resolveStatus) => {
|
|
298
320
|
const ownsOutput = Boolean(deps.onOutput);
|
|
299
321
|
const child = (deps.spawnChild ?? spawn)(cmd, [...a], {
|
|
300
|
-
stdio: ownsOutput ? ['ignore', 'pipe', 'pipe'] : 'inherit',
|
|
301
|
-
env: childEnv,
|
|
322
|
+
stdio: ownsOutput ? ['ignore', 'pipe', 'pipe'] : 'inherit', env: childEnv,
|
|
302
323
|
});
|
|
303
324
|
child.stdout?.setEncoding('utf8');
|
|
304
325
|
child.stdout?.on('data', (chunk: string) => { process.stdout.write(chunk); deps.onOutput?.(chunk); });
|
|
305
326
|
if (ownsOutput) forwardChildStderr(child.stderr);
|
|
306
|
-
let
|
|
327
|
+
let parentSignalReceived: NodeJS.Signals | undefined;
|
|
328
|
+
let parentSignalReceivedAt: string | undefined;
|
|
329
|
+
let parentSignalLastReceived: NodeJS.Signals | undefined;
|
|
330
|
+
let parentSignalLastReceivedAt: string | undefined;
|
|
331
|
+
let signalDelivery: PodDispatchExitObservation['signalDelivery'];
|
|
332
|
+
let signalDeliveryFor: NodeJS.Signals | undefined;
|
|
307
333
|
const forward = (signal: NodeJS.Signals) => {
|
|
308
|
-
|
|
309
|
-
|
|
334
|
+
const receivedAt = new Date().toISOString();
|
|
335
|
+
parentSignalReceived ??= signal;
|
|
336
|
+
parentSignalReceivedAt ??= receivedAt;
|
|
337
|
+
parentSignalLastReceived = signal;
|
|
338
|
+
parentSignalLastReceivedAt = receivedAt;
|
|
339
|
+
signalDeliveryFor = signal;
|
|
340
|
+
if (child.exitCode !== null || child.signalCode !== null) {
|
|
341
|
+
signalDelivery = 'child-not-running';
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
try { signalDelivery = child.kill(signal) ? 'requested' : 'kill-failed'; }
|
|
345
|
+
catch { signalDelivery = 'kill-failed'; }
|
|
310
346
|
};
|
|
311
347
|
const onTerm = () => forward('SIGTERM');
|
|
312
348
|
const onInt = () => forward('SIGINT');
|
|
313
349
|
process.on('SIGTERM', onTerm);
|
|
314
350
|
process.on('SIGINT', onInt);
|
|
315
351
|
const cleanup = () => { process.off('SIGTERM', onTerm); process.off('SIGINT', onInt); };
|
|
316
|
-
child.once('error', () => {
|
|
317
|
-
|
|
352
|
+
child.once('error', () => {
|
|
353
|
+
cleanup();
|
|
354
|
+
resolveStatus({ status: 1, parentSignalReceived: parentSignalReceived ?? null, parentSignalReceivedAt: parentSignalReceivedAt ?? null,
|
|
355
|
+
parentSignalLastReceived: parentSignalLastReceived ?? null, parentSignalLastReceivedAt: parentSignalLastReceivedAt ?? null,
|
|
356
|
+
signalDelivery: signalDelivery ?? null, signalDeliveryFor: signalDeliveryFor ?? null,
|
|
357
|
+
orchestratorProcessSignal: null, observedAt: new Date().toISOString() });
|
|
358
|
+
});
|
|
359
|
+
child.once('close', (code, signal) => {
|
|
360
|
+
cleanup();
|
|
361
|
+
resolveStatus({
|
|
362
|
+
status: code ?? ((signal ?? parentSignalReceived) === 'SIGINT' ? 130 : 143),
|
|
363
|
+
parentSignalReceived: parentSignalReceived ?? null,
|
|
364
|
+
parentSignalReceivedAt: parentSignalReceivedAt ?? null,
|
|
365
|
+
parentSignalLastReceived: parentSignalLastReceived ?? null,
|
|
366
|
+
parentSignalLastReceivedAt: parentSignalLastReceivedAt ?? null,
|
|
367
|
+
signalDelivery: signalDelivery ?? null,
|
|
368
|
+
signalDeliveryFor: signalDeliveryFor ?? null,
|
|
369
|
+
orchestratorProcessSignal: signal ?? null,
|
|
370
|
+
observedAt: new Date().toISOString(),
|
|
371
|
+
});
|
|
372
|
+
});
|
|
318
373
|
}));
|
|
374
|
+
const recordExit = (result: PodDispatchRunResult): number => {
|
|
375
|
+
const observation = typeof result === 'number' || result === null
|
|
376
|
+
? { status: result, parentSignalReceived: null, parentSignalReceivedAt: null, parentSignalLastReceived: null, parentSignalLastReceivedAt: null,
|
|
377
|
+
signalDelivery: null, signalDeliveryFor: null, orchestratorProcessSignal: null, observedAt: new Date().toISOString() }
|
|
378
|
+
: result;
|
|
379
|
+
debug.log('harness.substrate', 'dispatch-pod-exit', {
|
|
380
|
+
entrance: input.entrance,
|
|
381
|
+
reporterSeat: input.seat ?? process.env.ELANOUS_HARNESS_SEAT ?? null,
|
|
382
|
+
reporterCommand: input.entrance === 'cli-harness-ask' ? 'harness ask' : 'harness say',
|
|
383
|
+
...observation, signalSource: classifyPodDispatchSignalSource(observation),
|
|
384
|
+
});
|
|
385
|
+
return observation.status ?? 1;
|
|
386
|
+
};
|
|
319
387
|
const cleanup = () => { if (tempDir) rmSync(tempDir, { recursive: true, force: true }); };
|
|
320
388
|
try {
|
|
321
389
|
const status = run(process.execPath, args, env);
|
|
322
|
-
if (typeof status === 'number' || status === null) {
|
|
390
|
+
if (typeof status === 'number' || status === null || !('then' in status)) {
|
|
323
391
|
cleanup();
|
|
324
|
-
|
|
325
|
-
return status ?? 1;
|
|
392
|
+
return recordExit(status);
|
|
326
393
|
}
|
|
327
|
-
return status.then((
|
|
328
|
-
|
|
329
|
-
return code;
|
|
394
|
+
return status.then((result) => {
|
|
395
|
+
return recordExit(result);
|
|
330
396
|
}).finally(cleanup);
|
|
331
397
|
} catch (error) {
|
|
332
398
|
cleanup();
|