elanous 0.2.41 → 0.2.43
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 → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{2fe2c302.41b517f88d6fe502.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{385e4574.e9886ab32759eda3.js → 0ad6802e.ae7afb63fdcb4491.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1200.6a37c202f9f17e9a.js +226 -0
- package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1313-19f737e0222c4444.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6874.d5cf7eb8edb2cabe.js → 1406.a1dc2ab6f8449374.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5744.b9415e18ad623100.js → 1961.a81b12872c3e93a9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1970cf59.2d4d8ce5d6c81853.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2073-ba274e00e4f9efb4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.js → 2144.25b292396712196d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{3230-49298c3b73ef2268.js → 2268-53861f339e0b65a2.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{9834.63ab2bbc3153172e.js → 2312.0c8b61e22d3136d7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1800.f7ff51dc4978a958.js → 2573.387a707f6f9d720c.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9048.212083de42d25be3.js → 3072.01338851ca21a6f7.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +90 -0
- package/apps/pwa/out/_next/static/chunks/3095.dc44586a5f83b86d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.js → 3113.d7472bbc27d580c7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3402.44b565b314f2263c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{addc2b32.8c4ff8f0aefe987d.js → 3557ac4a.c8931684475018ad.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/360.ae9f9f4c33c395e8.js +79 -0
- package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
- package/apps/pwa/out/_next/static/chunks/{a0a01613.6d1cca322238d7fe.js → 363bfab3.9623b9f89363541f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3694.e0099884345f0198.js +64 -0
- package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3903.3ef4656c67572764.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3935.16701e33f8982dc9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3955.6922286237f2ac2b.js +24 -0
- package/apps/pwa/out/_next/static/chunks/3969.272ee7f9fd6c62e5.js +34 -0
- package/apps/pwa/out/_next/static/chunks/4199.ce86b281fd0a60b7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{530.d26346e18089640a.js → 4445.7990c76b3751a918.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4894.fec2ca9e99caefa2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +94 -0
- package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +36 -0
- package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +93 -0
- package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1219.7e17964e0e7cd8e5.js → 5564.9e72532188f57586.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5628.6ddb2d5ffba4ff4c.js +309 -0
- package/apps/pwa/out/_next/static/chunks/5730.43d7ccc09988e646.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.js → 5789.2da35c258292e1e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{4133.2056bb4d78f621af.js → 5824.da9527b15a3221e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.js → 5930.8b4df3b46c32b05a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +27 -0
- package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +104 -0
- package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +287 -0
- package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9507.7026657a2f47eb64.js → 6540.c7bef57ad8f90a87.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5574.f35accf4f132b29d.js → 6944.309f4e3ea54d1537.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7483.427a2fe2049e388d.js +148 -0
- package/apps/pwa/out/_next/static/chunks/7502-be74718178e13e56.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +24 -0
- package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7900.096f455c7c1efc53.js +77 -0
- package/apps/pwa/out/_next/static/chunks/7910-6f139bcafd238b9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5947-135e26537d80a6b9.js → 8062-7cd0bcc7f01455ba.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +74 -0
- package/apps/pwa/out/_next/static/chunks/8205.282ca4bb62d54a0a.js +62 -0
- package/apps/pwa/out/_next/static/chunks/8313-dfa1021bb58a46d6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/837-81336ebaca8198a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8588.d1c6a2903727ce87.js +149 -0
- package/apps/pwa/out/_next/static/chunks/8637.90f92d5c8db4732c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{2743.5d3f76948be32b34.js → 868.6e953be05bcf6dca.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5964-7e21164a8f2cf0ce.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8967-7dfebf710c9dec9d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5159.115f1c2ca471386c.js → 8986.8e2e4efbfa655c59.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +1 -0
- package/apps/pwa/out/_next/static/chunks/923.2034d10ae91e9c20.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
- package/apps/pwa/out/_next/static/chunks/943.39ae5e82f4f1893f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +32 -0
- package/apps/pwa/out/_next/static/chunks/9770.5f75bc6088b16109.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +8 -0
- package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{b2271e54.c1de3347976e90b0.js → aa57532f.510551854ff239b1.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-9ee28f7df07428ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-40f9e19149024298.js → page-79a8b5fee4c20871.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-a142dfb0331a05f5.js → page-ca2d09128c585ca4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-0a815f34367b6db6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{53aeb4ee-51c92f8d683f5220.js → c7945435-b44d4dbe90ba0dcb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{2fdf2931.b431eee4fb468bc3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.js → d96660fb.cbc21a2a88539dbb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/ea514caa.05a24f78d9dffe5f.js +122 -0
- package/apps/pwa/out/_next/static/chunks/{83184dcd-0ee6247ff41eb3f2.js → fb7d20d5-6892502b6ee39ca6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +1 -0
- package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
- package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +24 -25
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +23 -23
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +24 -25
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +24 -25
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/catalog/external-commands.yaml +5 -3
- package/catalog/meta/catalogVersion.yaml +2 -1
- package/catalog/signing/catalog-signing-public.pem +3 -0
- 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/intake/intake-daily.yaml +16 -0
- package/graphs/intake/news-sources.yaml +1 -0
- package/graphs/intake/recipes.yaml +7 -0
- package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
- package/graphs/overlays/stop-heal-ladder.yaml +113 -0
- package/graphs/profiles/local.yaml +5 -0
- package/graphs/profiles/pod.yaml +4 -0
- package/graphs/units/verbs/recipes.yaml +11 -11
- package/graphs/work/research-report.yaml +10 -2
- package/package.json +6 -2
- package/plugins/demo-absorption-briefing/plugin.json +18 -0
- package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
- package/plugins/demo-browser-hand/plugin.json +13 -0
- package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
- package/plugins/demo-linear-secretary/plugin.json +15 -0
- package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
- package/plugins/demo-plugin-wizard/plugin.json +11 -0
- package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
- package/plugins/demo-research/plugin.json +16 -0
- package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
- package/plugins/demo-video-briefing/plugin.json +15 -0
- package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
- package/scripts/build-signed-catalog.ts +48 -0
- package/scripts/ci-typecheck-main-delta.sh +88 -0
- package/scripts/codex-fallback-live-probe.ts +1 -1
- package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
- package/scripts/demo/demo1104-stage.config.ts +21 -0
- package/scripts/demo/demo1104-stage.ts +316 -0
- package/scripts/goal-method-audit.ts +17 -1
- package/scripts/graph-units/land-enqueue.ts +90 -0
- package/scripts/heal/run-role.ts +99 -5
- package/scripts/hooks/codex-notify.sh +32 -0
- package/scripts/install.sh +10 -38
- package/scripts/land-global-checks.ts +6 -1
- package/scripts/landing-heal/land-plan.ts +57 -0
- 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/auto-approve-node.ts +1 -1
- package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
- 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-method.ts +139 -0
- package/scripts/release-loop/gate-node-sim.ts +207 -0
- package/scripts/release-loop/gate-node.ts +463 -64
- 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-traffic-mode.ts +151 -3
- package/scripts/release-loop/gate-train-receipts.ts +122 -0
- package/scripts/release-loop/node-verdict.ts +38 -25
- package/scripts/release-loop/preflight.ts +362 -8
- package/scripts/release-loop/resume-release.ts +83 -8
- package/scripts/release-loop/unattended-release.ts +20 -9
- package/scripts/rhythm/daily.ts +36 -4
- package/scripts/rhythm/linear-progress-sync.ts +298 -0
- package/scripts/ux-sim.ts +18 -1
- package/scripts/video-pipeline.ts +9 -1
- package/scripts/warm-pool-provider-config.ts +286 -0
- package/skills/omni-crawl/SKILL.md +5 -2
- package/skills/omni-crawl/scripts/main.ts +84 -23
- package/src/acp/agent-manager.ts +1 -0
- package/src/acp/codex-app-server-agent.ts +33 -0
- package/src/acp/codex-app-server-client.ts +153 -16
- package/src/acp/core-turn-bridge.ts +27 -9
- package/src/acp/event-router.ts +20 -1
- package/src/acp/server.ts +6 -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/browser-roundtrip-coordinator.ts +85 -0
- package/src/agent-mission/claude-headless.ts +4 -1
- package/src/agent-mission/codex-exec.ts +105 -0
- package/src/agent-mission/driver.ts +192 -11
- package/src/agent-mission/grok-auth-status.ts +47 -0
- package/src/agent-mission/hand-hooks.ts +101 -0
- package/src/agent-mission/mission-cli.ts +63 -4
- package/src/agent-mission/mission-hand-reply.ts +118 -0
- package/src/agent-mission/mission-line.ts +180 -0
- package/src/agent-mission/mission-out.ts +833 -0
- package/src/agent-mission/tool-install.ts +200 -3
- package/src/agent-substrate/context-strategy.ts +4 -4
- package/src/agent-substrate/self-review-cli.ts +178 -13
- package/src/agents/general-purpose.md +1 -1
- package/src/auto-research/research-turn.ts +211 -53
- package/src/autopilot/pr-manager.ts +69 -10
- package/src/autopilot/pty-control-loop.ts +2 -0
- package/src/boot/daemon-tools/self-implement.ts +3 -1
- package/src/boot/daemon-tools/web-search.ts +1 -2
- package/src/briefing/brief-items.ts +55 -11
- package/src/capture/tui-self-report.ts +22 -6
- package/src/chat/index.ts +1 -1
- package/src/cli/agent-cli.ts +2 -1
- package/src/cli/catalog-cli.ts +31 -0
- package/src/cli/connector-cli.ts +16 -0
- package/src/cli/doctor-fix.ts +2 -2
- 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/intake-source-cli.ts +44 -8
- package/src/cli/msg-cli.ts +32 -3
- package/src/cli/pr-cli.ts +21 -1
- package/src/cli/pr-land-heavy-remote.ts +75 -5
- package/src/cli/pr-land-overlap-evidence.ts +113 -2
- package/src/cli/pr-land-pod-shadow-job.ts +202 -4
- package/src/cli/pr-land-pod-shadow.ts +9 -2
- package/src/cli/release-checklist-read-cli.ts +57 -19
- package/src/cli/release-cli.ts +23 -3
- package/src/cli/research-cli.ts +13 -5
- package/src/cli/setup-cli.ts +166 -6
- package/src/cli/setup-keys.ts +187 -0
- package/src/cli/task-plugin-wizard-host.ts +114 -0
- package/src/cli/tasks-cli.ts +61 -9
- package/src/cli/tui-test-cli.ts +186 -0
- package/src/compact/auto.ts +8 -1
- package/src/config.ts +4 -2
- package/src/connectors/linear-daily-progress.ts +228 -0
- package/src/connectors/linear-projector.ts +34 -12
- package/src/connectors/linear.ts +151 -7
- package/src/control-plane/ledger.ts +52 -2
- package/src/control-plane/server.ts +16 -2
- package/src/core-turn/deep-turn-bloom.ts +67 -0
- package/src/core-turn/research-policy.ts +37 -0
- package/src/core-turn/run-core-turn.ts +606 -95
- package/src/core-turn/run-goal-loop.ts +18 -0
- package/src/core-turn/types.ts +4 -0
- package/src/dashboard/chat/acp-chat.ts +10 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +161 -0
- package/src/dashboard/classic-sidetab-mission-pair.ts +81 -0
- package/src/dashboard/classic-sidetab-mission-trio.ts +219 -0
- package/src/dashboard/classic-sidetab-mission.ts +347 -0
- package/src/dashboard/index.ts +517 -18
- package/src/dashboard/input/agent-wake.ts +23 -1
- package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +17 -0
- package/src/dashboard/mission-cli-consumer.ts +165 -0
- package/src/dashboard/plugin-wizard-runtime.ts +50 -0
- package/src/dashboard/plugin-wizard-tool.ts +55 -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/terminal-popup-runtime.ts +6 -3
- package/src/dashboard/turn-preamble.ts +53 -15
- package/src/dashboard/turn-prompt-runtime.ts +4 -2
- package/src/decisions/linear-progress-summary.ts +78 -0
- package/src/decisions/linear-progress-sync.ts +152 -0
- package/src/domains/outbound-alert.ts +49 -11
- package/src/domains/telegram-kind-route.ts +16 -9
- package/src/graph-runner/arg-allowance.ts +13 -0
- package/src/graph-runner/graph-cli.ts +23 -7
- package/src/graph-runner/graph-run-api.ts +3 -1
- package/src/graph-runner/graph-tick.ts +10 -2
- package/src/graph-runner/runner.ts +86 -18
- package/src/graph-wizard/mission-compose.ts +407 -12
- package/src/grok/agent-search.ts +14 -4
- package/src/grok/credential.ts +28 -11
- package/src/harness/dispatch-backpressure.ts +54 -1
- package/src/harness/dispatch-shadow-compare.ts +74 -0
- package/src/harness/harness-cli-command.ts +11 -1
- package/src/harness/harness-pod-dispatch.ts +81 -15
- package/src/harness/harness-stop.ts +155 -11
- package/src/harness/skill-exec.ts +21 -9
- package/src/harness/skill-select.ts +1 -1
- package/src/hooks/error-report-cloud.ts +101 -0
- package/src/hooks/receiver.ts +29 -2
- package/src/index.ts +159 -13
- package/src/instance/spawn-elanous.ts +6 -4
- package/src/intake-plane/actions.ts +354 -0
- package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
- package/src/intake-plane/intake-sources.ts +78 -8
- package/src/intake-plane/items.ts +14 -4
- package/src/intake-plane/linear-mission-sync.ts +80 -0
- package/src/intake-plane/linear-secretary-runtime.ts +178 -0
- package/src/intake-plane/linear-wish.ts +227 -1
- package/src/life/life-cli.ts +168 -0
- package/src/life/life-kinds.ts +160 -0
- package/src/live-supply/budget-consumer.ts +78 -0
- package/src/live-supply/read.ts +3 -0
- package/src/live-supply/snapshot.ts +45 -0
- package/src/llm/provider-credentials.ts +8 -2
- package/src/llm.ts +168 -9
- package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
- package/src/loops/orchestrator/tick.ts +13 -0
- package/src/maturity/feature-maturity.ts +4 -4
- package/src/msg/msg-sse-server.ts +3 -3
- package/src/msg/msg-store.ts +177 -19
- package/src/native-tool-catalog.ts +38 -4
- package/src/nexus/api/harness-traversal.ts +11 -0
- package/src/nexus/api/http-server.ts +37 -1
- package/src/nexus/api/mcp-public-allowlist.ts +2 -0
- package/src/nexus/index.ts +7 -2
- package/src/nexus/outbound/format.ts +9 -0
- package/src/nexus/outbound/router.ts +98 -13
- package/src/nexus/setup-status.ts +9 -0
- package/src/nexus/state/state.ts +3 -0
- package/src/oauth/codex-account-store.ts +20 -7
- package/src/oauth/codex-owner-mirror.ts +44 -0
- package/src/oauth/codex.ts +17 -2
- package/src/oauth/fallback-chain.ts +47 -17
- package/src/onboarding/first-run-doctor.ts +8 -1
- package/src/onboarding/first-run.ts +85 -26
- package/src/onboarding/key-setup.ts +103 -0
- package/src/onboarding/menu-answer.ts +13 -0
- package/src/onboarding/secret-prompt.ts +37 -0
- package/src/plugins/install/plugin-install.ts +59 -0
- package/src/pr-tool/census.ts +133 -2
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/pty-shell/tui-run-state.ts +188 -2
- package/src/registry/catalog-server.ts +232 -0
- package/src/registry/loader.ts +45 -1
- package/src/registry/types.ts +1 -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 +136 -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/ask-launch-flow.ts +72 -1
- package/src/self-dev/decompose.ts +119 -5
- package/src/self-dev/dev-cli.ts +4 -1
- package/src/self-dev/dev-pipeline.ts +5 -0
- package/src/self-dev/draft-residue.ts +64 -5
- package/src/self-dev/graph-front-nodes.ts +2 -1
- package/src/self-dev/graph-journey-route.ts +76 -21
- package/src/self-dev/launch-preflight-text.ts +5 -6
- package/src/self-dev/launch-preflight.ts +58 -0
- package/src/self-dev/orchestrate.ts +13 -3
- 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-dev/shard-aggregate.ts +4 -0
- package/src/self-dev/shard-run.ts +36 -15
- package/src/self-implement/abandoned-classification.ts +12 -3
- package/src/self-implement/budget-gate.ts +7 -0
- package/src/self-implement/child-llm-preference.ts +10 -1
- package/src/self-implement/doctor-visit.ts +118 -8
- package/src/self-implement/elanous-tui-spawn.ts +3 -0
- package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
- package/src/self-implement/gate-artifacts.ts +2 -1
- package/src/self-implement/goal-author-cli.ts +4 -2
- package/src/self-implement/goal-author.ts +684 -7
- package/src/self-implement/graph-overlay-yaml.ts +37 -4
- package/src/self-implement/graph-overlay.ts +3 -1
- package/src/self-implement/graph-profile-yaml.ts +107 -0
- package/src/self-implement/graph-yaml.ts +26 -3
- 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/off-diff-evidence.ts +249 -5
- package/src/self-implement/orchestrator.ts +365 -25
- 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 +122 -0
- package/src/self-implement/run-ledger.ts +162 -11
- package/src/self-implement/run-stop.ts +188 -4
- package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
- package/src/self-implement/stop-autoheal.ts +13 -0
- package/src/self-implement/tdd-evidence-tags.ts +9 -0
- package/src/self-implement/train-gate-receipt.ts +166 -0
- package/src/self-implement/train-gate-remote.ts +62 -18
- package/src/session/chat.ts +40 -4
- package/src/session/session-fanout.ts +2 -0
- package/src/session/streaming/acp-stream-sink.ts +2 -1
- package/src/session/streaming/chunk-producer.ts +6 -0
- package/src/session/streaming/stream-compositor.ts +3 -2
- package/src/session-runtime/index.ts +135 -5
- package/src/session-runtime/retry-policy.ts +1 -1
- package/src/session-runtime/tier-flip.ts +3 -3
- package/src/setup/llm-env-detect.ts +3 -0
- package/src/setup/service-key-catalog.ts +46 -0
- package/src/setup/service-keys.ts +241 -0
- package/src/sidetab-core/model.ts +19 -5
- package/src/sidetab-core/visible-agent-mission.ts +262 -0
- package/src/skills/name-match.ts +20 -0
- package/src/skills/tools/agent.ts +53 -6
- package/src/skills/tools/omni-search.ts +173 -13
- package/src/task-agent/parent-host.ts +10 -0
- package/src/task-agent/pod-distributor-entry.ts +3 -0
- package/src/task-agent/repair-outcomes.ts +65 -0
- package/src/task-agent/task-hand.ts +47 -7
- package/src/task-orchestrator/dispatcher.ts +14 -1
- package/src/task-orchestrator/linear-capture-events.ts +55 -0
- package/src/task-orchestrator/store.ts +16 -5
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +4 -0
- package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
- 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 +178 -16
- package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +237 -41
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +337 -51
- package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
- package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
- package/src/task-orchestrator/types.ts +14 -0
- package/src/telegram.ts +14 -16
- package/src/terminal/coding-agent.ts +14 -5
- package/src/terminal/session-registry.ts +1 -1
- package/src/tokens.ts +35 -2
- package/src/tool-hints/gate.ts +1 -0
- package/src/tool-runtime/agent-runtime.ts +2 -0
- package/src/tool-runtime/browser-hand-runtime.ts +381 -0
- package/src/tool-runtime/browser-runtime.ts +2 -1
- package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
- package/src/tool-runtime/elanous-linear-secretary-runtime.ts +57 -0
- package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
- package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
- package/src/tool-runtime/index.ts +6 -0
- package/src/tool-runtime/skill-exec-runtime.ts +33 -13
- package/src/tool-runtime/types.ts +4 -0
- package/src/tui/entry.ts +38 -5
- package/src/tui/sidetab/attach.ts +177 -1
- package/src/tui/sidetab/herdr-portal.ts +225 -0
- package/src/tui-client/local-chat-turn.ts +26 -13
- package/src/tui.ts +22 -0
- package/src/user-config.ts +34 -9
- package/src/user-intent/types.ts +4 -3
- package/src/ux-sim/browser-hand.ts +165 -0
- package/src/ux-sim/draft-inventory-builder.ts +198 -0
- package/src/ux-sim/fake-browser-page.ts +81 -0
- package/src/ux-sim/fake-kubectl.ts +37 -3
- package/src/ux-sim/fake-linear-device.ts +31 -0
- package/src/ux-sim/fault-pool-cap.ts +11 -6
- package/src/ux-sim/graph-engine-sim.ts +47 -0
- package/src/ux-sim/linear-secretary.ts +216 -0
- package/src/ux-sim/mock-scenario-catalog.json +93 -0
- package/src/ux-sim/mock-scenario-catalog.ts +274 -0
- package/src/ux-sim/onboarding-first-run-device.ts +31 -21
- package/src/ux-sim/scenario.ts +185 -48
- package/src/ux-sim/service-key-setup.ts +50 -0
- package/src/ux-sim/term-slash-device.ts +74 -0
- package/src/ux-sim/turn-throw-sim.ts +31 -0
- package/src/version/packed-revision.json +1 -1
- package/src/voice/voice-tts-singleton.ts +18 -3
- package/src/web-search/exa.ts +77 -0
- package/src/web-search/grok.ts +5 -9
- package/src/web-search/index.ts +30 -9
- package/src/web-search/provider.ts +4 -1
- package/src/web-search/x-intent.ts +5 -0
- package/apps/pwa/out/_next/static/chunks/1115.434ae2ecb0ad986d.js +0 -149
- 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/1661.0dd330f3d89f73f3.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/1971-7efb628c471dc5a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2073.689dcb2680113d76.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/2527-5c636a43c7cc5dde.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +0 -1
- 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/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/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/4702.4a4adc1f16d7c93b.js +0 -64
- 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/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/5892.2526d962339662d8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5937.c2df9e3447e1f667.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/6552.a3840aa7da35ad68.js +0 -62
- package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +0 -24
- 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/7191.fdc955f7d96064a4.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/8050-9b364bdef8f71927.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/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/9541.eb8e2f8480c7feca.js +0 -93
- 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/9869.81a1e24ca682d5a0.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/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/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/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/be9019f696217521.css +0 -1
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
- /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
|
@@ -107,7 +107,7 @@ export interface SelfDevDecompositionMeta {
|
|
|
107
107
|
* `authored-empty` Fabric 저작이 분해할 arc를 만들지 못했다
|
|
108
108
|
* `llm-failed` LLM 호출 자체가 «실패»했다(타임아웃·제공자 장애) ⇒ 분해를 «못 한» 것이다
|
|
109
109
|
* ⛔ 「쪼갤 필요가 없었다」와 Fabric 사전분해 실패는 다른 값이다. */
|
|
110
|
-
outcome: 'decomposed' | 'single-no-subtasks' | 'missing-research-context' | 'grounding-empty' | 'authored-empty' | 'llm-failed';
|
|
110
|
+
outcome: 'decomposed' | 'single-no-subtasks' | 'slice-rejected' | 'missing-research-context' | 'grounding-empty' | 'authored-empty' | 'llm-failed';
|
|
111
111
|
/** `llm-failed` 일 때만 실린다 — 문면의 «머리»를 자르지 않는다. */
|
|
112
112
|
error?: string;
|
|
113
113
|
/** Present for Fabric decomposition, including zero, to distinguish no omissions from no report. */
|
|
@@ -399,6 +399,10 @@ export function buildSelfDevDecomposePrompt(feature: string, maxTasks = DEFAULT_
|
|
|
399
399
|
'- SEPARATE DEFINE FROM WIRE: adding a new function/type/export is a SEPARATE task from wiring it into an existing runtime call site. A task that both defines a new symbol AND integrates it across modules tends to leave dead-code (defined but never called) that fails integration gates. Pattern: (a) add the function + its unit test; then (b) a dependent task that wires it into the specific existing call site — name the exact `file.ts:function` to modify.',
|
|
400
400
|
'- Exception to SEPARATE DEFINE FROM WIRE: Keep a definition and its registration/wiring in the same sub-feature — a handler with its route, a command with its CLI registration, a node with its graph/recipe entry.',
|
|
401
401
|
'- Each sub-feature must be a self-contained, mergeable unit of work.',
|
|
402
|
+
'- LANDABLE SLICE CONTRACT: every sub-feature must state a completionBoundary that can be implemented and verified without a later sub-feature, future component, or unwired operational path. If it cannot stand alone, split it further or omit it.',
|
|
403
|
+
'- Every sub-feature must name one existing mock scenario as mockScenario.id (MS-01, MS-02, ...), plus a concrete mockScenario.injection and mockScenario.observation. Describe the event or input injected and the output/event that proves the slice works.',
|
|
404
|
+
'- List every required earlier slice explicitly in dependsOn. An empty list means this slice has no predecessor; never rely on implicit order or a future capability.',
|
|
405
|
+
'- Declare futureAssumptions as an array. If the slice needs any future component, later slice, or unwired operational path, list it there; that slice will be rejected with a decompose.slice-rejected event containing its id and reason, and must be split or omitted.',
|
|
402
406
|
'- `dependsOn`: list the `id`s of sub-features that MUST land first (e.g. a shared',
|
|
403
407
|
' type/interface before its consumers). Independent sub-features share NO dependency',
|
|
404
408
|
' so they run in parallel. No cycles.',
|
|
@@ -410,8 +414,10 @@ export function buildSelfDevDecomposePrompt(feature: string, maxTasks = DEFAULT_
|
|
|
410
414
|
'',
|
|
411
415
|
'## Output (STRICT JSON — no prose, no code fence)',
|
|
412
416
|
'{"subtasks":[{"id":"<short-slug>","feature":"<imperative sub-feature text>",',
|
|
413
|
-
' "
|
|
414
|
-
' "
|
|
417
|
+
' "completionBoundary":"<standalone change and observable outcome>",',
|
|
418
|
+
' "mockScenario":{"id":"MS-01","injection":"<input/event injected>","observation":"<output/event observed>"},',
|
|
419
|
+
' "futureAssumptions":[],"dependsOn":["<explicit predecessor id>",...],',
|
|
420
|
+
' "hotPaths":["<path>",...],"goalType":"<implement|research|document|operate>"}]}',
|
|
415
421
|
].join('\n');
|
|
416
422
|
}
|
|
417
423
|
|
|
@@ -421,6 +427,19 @@ interface RawSubtask {
|
|
|
421
427
|
dependsOn?: unknown;
|
|
422
428
|
hotPaths?: unknown;
|
|
423
429
|
goalType?: unknown;
|
|
430
|
+
completionBoundary?: unknown;
|
|
431
|
+
mockScenario?: unknown;
|
|
432
|
+
futureAssumptions?: unknown;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
interface RejectedDecompositionSlice {
|
|
436
|
+
id: string | null;
|
|
437
|
+
reasons: string[];
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
interface ValidatedDecomposition {
|
|
441
|
+
goals: SelfDevGoal[];
|
|
442
|
+
rejected: RejectedDecompositionSlice[];
|
|
424
443
|
}
|
|
425
444
|
|
|
426
445
|
const SELF_DEV_GOAL_TYPES = new Set(['implement', 'research', 'document', 'operate'] as const);
|
|
@@ -625,6 +644,90 @@ export function parseSelfDevDecomposition(
|
|
|
625
644
|
return goals;
|
|
626
645
|
}
|
|
627
646
|
|
|
647
|
+
/** Parse the production decomposition contract and keep a reason for each rejected slice. */
|
|
648
|
+
function parseValidatedSelfDevDecomposition(
|
|
649
|
+
subtasks: readonly unknown[],
|
|
650
|
+
defaults: { base?: string; autoMerge?: boolean },
|
|
651
|
+
): ValidatedDecomposition {
|
|
652
|
+
const goals: SelfDevGoal[] = [];
|
|
653
|
+
const rejected: RejectedDecompositionSlice[] = [];
|
|
654
|
+
const allIds = new Set(subtasks.flatMap((value) => isRawSubtask(value)
|
|
655
|
+
&& typeof value.id === 'string' && value.id.trim() ? [value.id.trim()] : []));
|
|
656
|
+
const seenIds = new Set<string>();
|
|
657
|
+
|
|
658
|
+
subtasks.forEach((value, index) => {
|
|
659
|
+
if (!isRawSubtask(value)) {
|
|
660
|
+
rejected.push({ id: null, reasons: ['slice must be an object'] });
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
663
|
+
const feature = typeof value.feature === 'string' ? value.feature.trim() : '';
|
|
664
|
+
const id = typeof value.id === 'string' && value.id.trim() ? value.id.trim() : String(index);
|
|
665
|
+
const reasons: string[] = [];
|
|
666
|
+
const completionBoundary = typeof value.completionBoundary === 'string' ? value.completionBoundary.trim() : '';
|
|
667
|
+
if (!feature) reasons.push('feature is missing');
|
|
668
|
+
if (!completionBoundary) reasons.push('completionBoundary is missing');
|
|
669
|
+
|
|
670
|
+
const mock = value.mockScenario as { id?: unknown; injection?: unknown; observation?: unknown } | undefined;
|
|
671
|
+
const scenarioId = typeof mock?.id === 'string' ? mock.id.trim() : '';
|
|
672
|
+
const injection = typeof mock?.injection === 'string' ? mock.injection.trim() : '';
|
|
673
|
+
const observation = typeof mock?.observation === 'string' ? mock.observation.trim() : '';
|
|
674
|
+
if (!/^MS-[A-Z0-9][A-Z0-9-]*$/i.test(scenarioId)) reasons.push('mockScenario.id must be an MS id');
|
|
675
|
+
if (!injection) reasons.push('mockScenario.injection is missing');
|
|
676
|
+
if (!observation) reasons.push('mockScenario.observation is missing');
|
|
677
|
+
|
|
678
|
+
if (!Array.isArray(value.futureAssumptions)) reasons.push('futureAssumptions must be declared as an array');
|
|
679
|
+
else if (value.futureAssumptions.length > 0) reasons.push('future assumptions require split or omission');
|
|
680
|
+
|
|
681
|
+
if (value.dependsOn === undefined) reasons.push('dependsOn is missing; declare an explicit id array');
|
|
682
|
+
else if (!Array.isArray(value.dependsOn)) reasons.push('dependsOn must be an explicit id array');
|
|
683
|
+
const dependsOn = Array.isArray(value.dependsOn)
|
|
684
|
+
? value.dependsOn.filter((dependency): dependency is string => typeof dependency === 'string' && dependency.trim().length > 0)
|
|
685
|
+
: [];
|
|
686
|
+
if (Array.isArray(value.dependsOn) && dependsOn.length !== value.dependsOn.length) reasons.push('dependsOn contains an invalid predecessor id');
|
|
687
|
+
for (const dependency of dependsOn) {
|
|
688
|
+
if (dependency === id || !allIds.has(dependency)) reasons.push(`dependsOn references a missing or self predecessor: ${dependency}`);
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
let uniqueId = id;
|
|
692
|
+
if (seenIds.has(uniqueId)) uniqueId = `${uniqueId}-${index}`;
|
|
693
|
+
seenIds.add(uniqueId);
|
|
694
|
+
if (reasons.length) {
|
|
695
|
+
rejected.push({ id, reasons: [...new Set(reasons)] });
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
const llmHot = Array.isArray(value.hotPaths)
|
|
700
|
+
? value.hotPaths.filter((path): path is string => typeof path === 'string')
|
|
701
|
+
: [];
|
|
702
|
+
const hotPaths = [...new Set([...llmHot, ...inferHotPaths(feature)])];
|
|
703
|
+
goals.push({
|
|
704
|
+
id: uniqueId,
|
|
705
|
+
feature,
|
|
706
|
+
completionBoundary,
|
|
707
|
+
mockScenario: { id: scenarioId, injection, observation },
|
|
708
|
+
...(dependsOn.length ? { dependsOn } : {}),
|
|
709
|
+
...(hotPaths.length ? { hotPaths } : {}),
|
|
710
|
+
...(isSelfDevGoalType(value.goalType) ? { goalType: value.goalType } : {}),
|
|
711
|
+
...defaults,
|
|
712
|
+
});
|
|
713
|
+
});
|
|
714
|
+
|
|
715
|
+
// A dependent slice cannot stay independently landable when its predecessor was rejected.
|
|
716
|
+
let removedDependent = true;
|
|
717
|
+
while (removedDependent) {
|
|
718
|
+
removedDependent = false;
|
|
719
|
+
const validIds = new Set(goals.map((goal) => goal.id));
|
|
720
|
+
for (const goal of [...goals]) {
|
|
721
|
+
const missing = (goal.dependsOn ?? []).filter((dependency) => !validIds.has(dependency));
|
|
722
|
+
if (missing.length === 0) continue;
|
|
723
|
+
goals.splice(goals.indexOf(goal), 1);
|
|
724
|
+
rejected.push({ id: goal.id ?? null, reasons: [`dependsOn references a rejected predecessor: ${missing.join(', ')}`] });
|
|
725
|
+
removedDependent = true;
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
return { goals, rejected };
|
|
729
|
+
}
|
|
730
|
+
|
|
628
731
|
/**
|
|
629
732
|
* Decompose a feature into a self-dev DAG via the LLM seam. Falls back to
|
|
630
733
|
* a single goal (the whole feature) when decomposition yields nothing —
|
|
@@ -710,10 +813,21 @@ export async function decomposeSelfDevGoal(
|
|
|
710
813
|
const rawSubtasks = extractRawSubtasks(raw);
|
|
711
814
|
const actualTaskCount = rawSubtasks.length;
|
|
712
815
|
const decomposition: SelfDevDecompositionMeta = { recommendedMaxTasks: maxTasks, actualTaskCount, truncatedAtHardMax: actualTaskCount > hardMaxTasks, exceededRecommendedMax: actualTaskCount > maxTasks, outcome: actualTaskCount === 0 ? 'single-no-subtasks' : 'decomposed' };
|
|
713
|
-
const
|
|
816
|
+
const validated = parseValidatedSelfDevDecomposition(rawSubtasks.slice(0, hardMaxTasks), defaults);
|
|
817
|
+
for (const rejection of validated.rejected) {
|
|
818
|
+
debug.log(opts.observation?.category ?? 'self-dev.decompose', 'decompose.slice-rejected', {
|
|
819
|
+
...observationIdentity(opts.observation ?? {}),
|
|
820
|
+
sliceId: rejection.id,
|
|
821
|
+
reasons: rejection.reasons,
|
|
822
|
+
}, { level: 'warn' });
|
|
823
|
+
}
|
|
824
|
+
const parsedGoals = validated.goals;
|
|
714
825
|
const foldedGoals = foldRegistrationOnlyGoals(parsedGoals);
|
|
715
826
|
const goals = parsedGoals.length > 0 ? pruneDanglingDependencies(foldedGoals) : [single];
|
|
716
|
-
|
|
827
|
+
const finalDecomposition = parsedGoals.length === 0 && validated.rejected.length > 0
|
|
828
|
+
? { ...decomposition, outcome: 'slice-rejected' as const }
|
|
829
|
+
: decomposition;
|
|
830
|
+
return finalizeDecomposition(feature, goals, finalDecomposition, opts, parsedGoals.length > 0 ? arcHint : undefined, parsedGoals.length - foldedGoals.length);
|
|
717
831
|
}
|
|
718
832
|
|
|
719
833
|
/** Where the decompose model came from — `'explicit'` is the caller's `model` argument layer. */
|
package/src/self-dev/dev-cli.ts
CHANGED
|
@@ -67,6 +67,7 @@ import { BEDROCK_DEFAULT_MODEL, BEDROCK_MODELS, findBedrockModel, resolveBedrock
|
|
|
67
67
|
import { ZAI_CODING_DEFAULT_MODEL, ZAI_CODING_MODELS } from '../llm/zai-coding-plan.js';
|
|
68
68
|
import { isVerifiedOpenGatewayModel, OPENGATEWAY_DEFAULT_MODEL, OPENGATEWAY_VERIFIED_MODELS } from '../llm/opengateway-models.js';
|
|
69
69
|
import { DEV_PLAN_REPLACEMENT } from './cli-help-text.js';
|
|
70
|
+
import { DEFAULT_TUI_TEST_READY_TIMEOUT_MS } from '../self-implement/elanous-tui-spawn.js';
|
|
70
71
|
export { DEV_PLAN_REPLACEMENT, formatDevPlanOptionHelp } from './cli-help-text.js';
|
|
71
72
|
|
|
72
73
|
/** dev CLI 옵션(commander) — `--no-*` 는 false 로 도착. input/executor 는 액션이 빌드해 별도 전달. */
|
|
@@ -2187,7 +2188,9 @@ export function buildDevCliSpec(
|
|
|
2187
2188
|
...spec,
|
|
2188
2189
|
elanous: {
|
|
2189
2190
|
...(opts.hold ? { hold: true } : {}),
|
|
2190
|
-
...(opts.readyTimeoutMs !== undefined
|
|
2191
|
+
...(opts.readyTimeoutMs !== undefined
|
|
2192
|
+
? { readyTimeoutMs: parsePositiveInt(opts.readyTimeoutMs, '--ready-timeout-ms') }
|
|
2193
|
+
: opts.hold ? { readyTimeoutMs: DEFAULT_TUI_TEST_READY_TIMEOUT_MS } : {}),
|
|
2191
2194
|
...(opts.json ? { json: true } : {}),
|
|
2192
2195
|
...(opts.goal !== undefined ? { goal: opts.goal } : {}),
|
|
2193
2196
|
...(opts.maxSteps !== undefined ? { maxSteps: parsePositiveInt(opts.maxSteps, '--max-steps') } : {}),
|
|
@@ -68,6 +68,8 @@ export interface DevMissionOpts {
|
|
|
68
68
|
resources?: 'on' | 'off';
|
|
69
69
|
backendExplicit?: string;
|
|
70
70
|
headless?: boolean;
|
|
71
|
+
/** Optional second user turn resumed in the same Claude/Codex CLI session. */
|
|
72
|
+
followUp?: string;
|
|
71
73
|
evidence?: EvidenceMode;
|
|
72
74
|
maxRounds?: number;
|
|
73
75
|
commit?: boolean;
|
|
@@ -643,6 +645,7 @@ export function toAgentMissionSpec(
|
|
|
643
645
|
evidence: m.evidence ?? { kind: 'tsc' }, // 기본 tsc(mission 옵션 미지정 시)
|
|
644
646
|
agent: resolveBackend(plan.executor.backend),
|
|
645
647
|
...(m.headless === true ? { headless: true } : {}),
|
|
648
|
+
...(m.followUp !== undefined ? { followUp: m.followUp } : {}),
|
|
646
649
|
...(m.chain ? { chain: m.chain } : {}),
|
|
647
650
|
...(m.plugin ? { plugin: m.plugin } : {}),
|
|
648
651
|
...(m.resources !== undefined ? { resources: m.resources } : {}),
|
|
@@ -670,6 +673,7 @@ export function buildAgentMissionDevSpec(o: {
|
|
|
670
673
|
branch: string;
|
|
671
674
|
base?: string;
|
|
672
675
|
headless?: boolean;
|
|
676
|
+
followUp?: string;
|
|
673
677
|
chain?: readonly ('codex' | 'claude' | 'elanous')[];
|
|
674
678
|
plugin?: { plugin: string; marketplace: string };
|
|
675
679
|
resources?: 'on' | 'off';
|
|
@@ -691,6 +695,7 @@ export function buildAgentMissionDevSpec(o: {
|
|
|
691
695
|
mission: {
|
|
692
696
|
evidence: o.evidence,
|
|
693
697
|
...(o.headless === true ? { headless: true } : {}),
|
|
698
|
+
...(o.followUp !== undefined ? { followUp: o.followUp } : {}),
|
|
694
699
|
...(o.chain ? { chain: o.chain } : {}),
|
|
695
700
|
...(o.plugin ? { plugin: o.plugin } : {}),
|
|
696
701
|
...(o.resources !== undefined ? { resources: o.resources } : {}),
|
|
@@ -3,7 +3,7 @@ import { readdirSync, readFileSync, existsSync } from 'node:fs';
|
|
|
3
3
|
import { gunzipSync } from 'node:zlib';
|
|
4
4
|
import { basename, dirname, join } from 'node:path';
|
|
5
5
|
import { findGitDir } from '../git-fs/locate.js';
|
|
6
|
-
import { debug } from '../debug/log.js';
|
|
6
|
+
import { debug, redactSecretText } from '../debug/log.js';
|
|
7
7
|
import { PR_LABELS, PR_LABEL_NAMES } from '../github/pr-labels.js';
|
|
8
8
|
import { appendRunLedgerEntry, listRunLedgers, loadRunLedger, runLedgerDir, type RunLedgerEntry } from '../self-implement/run-ledger.js';
|
|
9
9
|
import { queryRunningRuns } from '../self-implement/running-runs.js';
|
|
@@ -161,9 +161,42 @@ const GH_MAX_BUFFER = 64 * 1024 * 1024;
|
|
|
161
161
|
* several times larger than this projection, so the listing asks gh to project each page down to these fields. */
|
|
162
162
|
const OPEN_DRAFT_FIELDS = '[.[] | {number, title, headRefName: .head.ref, createdAt: .created_at, body, labels: [.labels[] | {name}], draft}]';
|
|
163
163
|
|
|
164
|
+
interface GhFailureEvidence {
|
|
165
|
+
args: readonly string[];
|
|
166
|
+
status: number | null;
|
|
167
|
+
signal: NodeJS.Signals | null;
|
|
168
|
+
errorCode?: string;
|
|
169
|
+
stderr: string;
|
|
170
|
+
capturedStderrBytes: number;
|
|
171
|
+
stdoutBytes: number;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
class GhCommandError extends Error {
|
|
175
|
+
constructor(message: string, readonly evidence: GhFailureEvidence) {
|
|
176
|
+
super(message);
|
|
177
|
+
this.name = 'GhCommandError';
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function executionSha(): string | undefined {
|
|
182
|
+
const sha = process.env.ELANOUS_EXECUTION_SHA?.trim();
|
|
183
|
+
return sha && /^[a-f0-9]{40}$/i.test(sha) ? sha : undefined;
|
|
184
|
+
}
|
|
185
|
+
|
|
164
186
|
function gh(args: string[]): string {
|
|
165
|
-
const
|
|
166
|
-
|
|
187
|
+
const cwd = findGitDir(process.cwd())?.root ?? process.cwd();
|
|
188
|
+
const result = spawnSync('gh', args, { cwd, encoding: 'utf8', timeout: 60_000, maxBuffer: GH_MAX_BUFFER });
|
|
189
|
+
if (result.status !== 0) {
|
|
190
|
+
const spawnError = result.error as NodeJS.ErrnoException | undefined;
|
|
191
|
+
const stderr = result.stderr ?? '';
|
|
192
|
+
const reason = (stderr || spawnError?.message || `gh exited ${result.status}`).trim().slice(0, 200);
|
|
193
|
+
throw new GhCommandError(reason, {
|
|
194
|
+
args: [...args], status: result.status, signal: result.signal,
|
|
195
|
+
...(spawnError?.code ? { errorCode: spawnError.code } : {}),
|
|
196
|
+
stderr: redactSecretText(stderr).replace(/[\r\n\t\x00-\x1f\x7f]+/g, ' ').slice(0, 4_000), capturedStderrBytes: Buffer.byteLength(stderr),
|
|
197
|
+
stdoutBytes: Buffer.byteLength(result.stdout ?? ''),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
167
200
|
return result.stdout.trim();
|
|
168
201
|
}
|
|
169
202
|
function ghPr(row: { number: number; title: string; headRefName: string; headRefOid?: string; isDraft?: boolean; createdAt: string; body: string; labels: Array<{ name: string }>; comments?: Array<{ body: string }>; state?: string }): ResiduePr {
|
|
@@ -233,8 +266,9 @@ export function defaultAdapters(sources: ResidueRunStatusSources = defaultRunSta
|
|
|
233
266
|
},
|
|
234
267
|
listOpenDrafts: (repository) => {
|
|
235
268
|
const rows: ResiduePr[] = [];
|
|
269
|
+
let page = 0;
|
|
236
270
|
try {
|
|
237
|
-
for (
|
|
271
|
+
for (page = 1; page <= 100; page++) {
|
|
238
272
|
const result = JSON.parse(gh(['api', `repos/${repository}/pulls?state=open&per_page=100&page=${page}`, '--jq', OPEN_DRAFT_FIELDS])) as Array<{
|
|
239
273
|
number: number; title: string; headRefName: string; createdAt: string; body: string;
|
|
240
274
|
labels: Array<{ name: string }>; draft: boolean;
|
|
@@ -246,7 +280,32 @@ export function defaultAdapters(sources: ResidueRunStatusSources = defaultRunSta
|
|
|
246
280
|
throw new Error('Open PR inventory exceeded pagination limit');
|
|
247
281
|
} catch (error) {
|
|
248
282
|
// «못 셌음»: a failed (or truncated) listing is unmeasurable — it must never surface as a counted zero.
|
|
249
|
-
|
|
283
|
+
const ghEvidence = error instanceof GhCommandError ? error.evidence : undefined;
|
|
284
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
285
|
+
const isEnobufs = ghEvidence?.errorCode === 'ENOBUFS' || /ENOBUFS/.test(reason);
|
|
286
|
+
const runSha = executionSha();
|
|
287
|
+
const responseBytes = !ghEvidence
|
|
288
|
+
? { status: 'unmeasured', complete: false,
|
|
289
|
+
reason: /pagination limit/.test(reason) ? 'pagination limit reached; aggregate page response bytes were not retained'
|
|
290
|
+
: 'the failed inventory response byte count was not retained' }
|
|
291
|
+
: isEnobufs || ghEvidence.errorCode || ghEvidence.status === null || ghEvidence.signal !== null
|
|
292
|
+
? { status: 'unmeasured', capturedBytes: ghEvidence.stdoutBytes, complete: false,
|
|
293
|
+
reason: isEnobufs ? 'spawnSync ENOBUFS truncates child output before the complete REST response length is known'
|
|
294
|
+
: ghEvidence.signal ? `child process was terminated by ${ghEvidence.signal}`
|
|
295
|
+
: ghEvidence.status === null ? 'child exit status is unavailable, so response completeness is unknown'
|
|
296
|
+
: 'the child process ended with an error before response completeness could be established' }
|
|
297
|
+
: { status: 'measured', bytes: ghEvidence.stdoutBytes, complete: true };
|
|
298
|
+
debug.log('draft.residue', 'list-open-drafts-unobserved', {
|
|
299
|
+
repository, reason: redactSecretText(reason), requestedPage: page <= 100 ? page : null,
|
|
300
|
+
paginationLimitExceeded: page > 100, request: ghEvidence?.args ?? null,
|
|
301
|
+
exitStatus: ghEvidence?.status ?? null, signal: ghEvidence?.signal ?? null,
|
|
302
|
+
errorCode: ghEvidence?.errorCode ?? null,
|
|
303
|
+
stderr: ghEvidence?.stderr ?? null, capturedStderrBytes: ghEvidence?.capturedStderrBytes ?? null,
|
|
304
|
+
responseBytes,
|
|
305
|
+
executionSha: runSha ? { status: 'measured', value: runSha } : {
|
|
306
|
+
status: 'unmeasured', reason: 'ELANOUS_EXECUTION_SHA is absent or invalid for this process invocation',
|
|
307
|
+
},
|
|
308
|
+
});
|
|
250
309
|
return undefined;
|
|
251
310
|
}
|
|
252
311
|
},
|
|
@@ -220,7 +220,8 @@ export function observeFrontNodeExit(exit: FrontNodeExit, data: FrontNodeExitDat
|
|
|
220
220
|
const graphRoute: JourneyRoute = { ...route, to: budget.to };
|
|
221
221
|
const taken = data.taken ?? budget.to ?? exit.outcome;
|
|
222
222
|
const reason = [budget.budgetReason, data.reason].filter((part): part is string => part !== undefined).join(' · ');
|
|
223
|
-
recordJourneyEdge(graphRoute, taken, reason.length > 0 ? reason : undefined
|
|
223
|
+
recordJourneyEdge(graphRoute, taken, reason.length > 0 ? reason : undefined,
|
|
224
|
+
data.runId === undefined ? {} : { runId: data.runId });
|
|
224
225
|
recorded = graphRoute;
|
|
225
226
|
const payload = {
|
|
226
227
|
graphId: 'self-implement',
|
|
@@ -4,6 +4,8 @@ import { applyGraphOverlays, defaultOverlaysDir, loadGraphOverlays, selectOverla
|
|
|
4
4
|
import { L1_PROTECTED_ROUTE_NODES, type GraphTemplateSpec } from '../self-implement/graph-yaml.js';
|
|
5
5
|
import { evaluateOverlayCondition } from '../self-implement/graph-overlay-condition.js';
|
|
6
6
|
import { journeyJoinFields } from './graph-journey-nodes.js';
|
|
7
|
+
import { defaultProfilesDir, loadGraphProfiles, selectGraphProfiles, type GraphProfileSpec } from '../self-implement/graph-profile-yaml.js';
|
|
8
|
+
import { appendRunLedgerEntry, runLedgerDir } from '../self-implement/run-ledger.js';
|
|
7
9
|
|
|
8
10
|
/** ⭐ HARNESS-FULL-GRAPH 2판 — 「다음 노드」를 코드가 아니라 «그래프»가 정한다.
|
|
9
11
|
*
|
|
@@ -29,11 +31,14 @@ export interface JourneyRoute {
|
|
|
29
31
|
readonly skippedNode?: string;
|
|
30
32
|
readonly skipCondition?: string;
|
|
31
33
|
readonly skippedNodes?: readonly { readonly node: string; readonly condition: string }[];
|
|
34
|
+
readonly profileIds?: readonly string[];
|
|
35
|
+
readonly profileRejections?: readonly string[];
|
|
32
36
|
}
|
|
33
37
|
|
|
34
38
|
/** ⛔ 캐시하지 않는다 — 여러 런을 처리하는 프로세스(데몬·대기열 tick)가 다음 발사에서 오버레이 변경을 봐야 한다.
|
|
35
39
|
* 여정 판정은 발사당 몇 번뿐이라 디렉터리 한 번 읽기가 싸다. */
|
|
36
40
|
let overlaysForTesting: readonly GraphOverlaySpec[] | undefined;
|
|
41
|
+
let profilesForTesting: readonly GraphProfileSpec[] | undefined;
|
|
37
42
|
function launchOverlays(): readonly GraphOverlaySpec[] {
|
|
38
43
|
if (overlaysForTesting !== undefined) return overlaysForTesting;
|
|
39
44
|
try { return loadGraphOverlays(defaultOverlaysDir()).overlays; }
|
|
@@ -45,21 +50,50 @@ export function setJourneyOverlaysForTesting(overlays: readonly GraphOverlaySpec
|
|
|
45
50
|
overlaysForTesting = overlays;
|
|
46
51
|
}
|
|
47
52
|
|
|
53
|
+
/** Test seam for a stable profile set; undefined reads the profile directory beside the graph sources. */
|
|
54
|
+
export function setJourneyProfilesForTesting(profiles: readonly GraphProfileSpec[] | undefined): void {
|
|
55
|
+
profilesForTesting = profiles;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function launchProfiles(): { readonly profiles: readonly GraphProfileSpec[]; readonly errors: readonly string[] } {
|
|
59
|
+
if (profilesForTesting !== undefined) return { profiles: profilesForTesting, errors: [] };
|
|
60
|
+
const loaded = loadGraphProfiles(defaultProfilesDir());
|
|
61
|
+
return { profiles: loaded.profiles, errors: loaded.errors.map((issue) => `${issue.path}: ${issue.message}`) };
|
|
62
|
+
}
|
|
63
|
+
|
|
48
64
|
/** 상태 값으로 고른 «이 런의 여정 선언» — 기준 YAML ⊕ 조건이 맞는 launch 오버레이. */
|
|
49
65
|
export function journeySpec(
|
|
50
66
|
state: Readonly<Record<string, unknown>>,
|
|
51
67
|
base: GraphTemplateSpec | undefined = GRAPH_SPECS['self-implement'],
|
|
52
68
|
overlays: readonly GraphOverlaySpec[] = launchOverlays(),
|
|
53
|
-
|
|
54
|
-
|
|
69
|
+
profiles: readonly GraphProfileSpec[] = launchProfiles().profiles,
|
|
70
|
+
profileLoadErrors: readonly string[] = [],
|
|
71
|
+
): { readonly spec: GraphTemplateSpec | undefined; readonly applied: readonly string[]; readonly profileIds: readonly string[]; readonly profileRejections: readonly string[] } {
|
|
72
|
+
if (base === undefined) return { spec: undefined, applied: [], profileIds: [], profileRejections: [] };
|
|
55
73
|
try {
|
|
56
|
-
const
|
|
57
|
-
|
|
74
|
+
const selection = selectGraphProfiles(profiles, state);
|
|
75
|
+
const profileIds = selection.applied.map((profile) => profile.profileId);
|
|
76
|
+
const profileOverlayIds = new Set(selection.applied.flatMap((profile) => profile.overlays));
|
|
77
|
+
const overlayRejections = [...profileOverlayIds].flatMap((id) => {
|
|
78
|
+
const overlay = overlays.find((candidate) => candidate.overlayId === id);
|
|
79
|
+
if (!overlay) return [`profile overlay not found: ${id}`];
|
|
80
|
+
if (overlay.target !== base.graphId) return [`profile overlay target mismatch: ${id} (${overlay.target})`];
|
|
81
|
+
if (overlay.stage !== 'launch') return [`profile overlay wrong stage: ${id} (${overlay.stage})`];
|
|
82
|
+
return [];
|
|
83
|
+
});
|
|
84
|
+
const profileRejections = [...profileLoadErrors, ...selection.errors, ...overlayRejections];
|
|
85
|
+
if (profileRejections.length > 0) return { spec: base, applied: [], profileIds: [], profileRejections };
|
|
86
|
+
const { applied: candidates } = selectOverlays(overlays, { graphId: base.graphId, stage: 'launch', state: selection.state });
|
|
87
|
+
const ownedState = Object.assign({}, ...selection.applied.map((profile) => profile.state));
|
|
88
|
+
const applied = candidates.filter((overlay) => !profileOverlayIds.has(overlay.overlayId)
|
|
89
|
+
|| evaluateOverlayCondition(overlay.appliesWhen, ownedState).kind === 'applies');
|
|
90
|
+
if (applied.length === 0) return { spec: base, applied: [], profileIds, profileRejections: [] };
|
|
58
91
|
const result = applyGraphOverlays(base, applied);
|
|
59
92
|
// ⛔ 거절된 오버레이는 길을 바꾸지 않는다 — 기준 선언으로 간다.
|
|
60
|
-
return result.ok ? { spec: result.template, applied: result.overlayIds
|
|
93
|
+
return result.ok ? { spec: result.template, applied: result.overlayIds, profileIds, profileRejections: [] }
|
|
94
|
+
: { spec: base, applied: [], profileIds: [], profileRejections: result.rejections.map((item) => `${item.kind}: ${item.overlayId}`) };
|
|
61
95
|
} catch {
|
|
62
|
-
return { spec: base, applied: [] };
|
|
96
|
+
return { spec: base, applied: [], profileIds: [], profileRejections: ['profile selection failed'] };
|
|
63
97
|
}
|
|
64
98
|
}
|
|
65
99
|
|
|
@@ -69,10 +103,11 @@ export function readJourneyEdge(
|
|
|
69
103
|
from: string,
|
|
70
104
|
label: string,
|
|
71
105
|
state: Readonly<Record<string, unknown>> = {},
|
|
72
|
-
deps: { readonly base?: GraphTemplateSpec; readonly overlays?: readonly GraphOverlaySpec[] } = {},
|
|
106
|
+
deps: { readonly base?: GraphTemplateSpec; readonly overlays?: readonly GraphOverlaySpec[]; readonly profiles?: readonly GraphProfileSpec[] } = {},
|
|
73
107
|
): JourneyRoute {
|
|
74
|
-
const
|
|
75
|
-
|
|
108
|
+
const profileSet = deps.profiles === undefined ? launchProfiles() : { profiles: deps.profiles, errors: [] as readonly string[] };
|
|
109
|
+
const { spec, applied, profileIds, profileRejections } = journeySpec(state, deps.base ?? GRAPH_SPECS['self-implement'], deps.overlays ?? launchOverlays(), profileSet.profiles, profileSet.errors);
|
|
110
|
+
let route: JourneyRoute = { from, on: null, label, to: null, source: 'code-default', overlays: applied, profileIds, profileRejections };
|
|
76
111
|
const outgoing = (spec?.edges ?? []).filter(edge => edge.from === from);
|
|
77
112
|
const protectedFrom = L1_PROTECTED_ROUTE_NODES.has(from) || spec?.nodes.some(node => node.nodeId === from && node.kind === 'gate') ||
|
|
78
113
|
spec?.terminalNodes.includes(from);
|
|
@@ -80,14 +115,14 @@ export function readJourneyEdge(
|
|
|
80
115
|
const matching = conditions.filter(({ verdict }) => verdict.kind === 'applies').map(({ edge }) => edge);
|
|
81
116
|
const unobservedConditions = conditions.filter(({ verdict }) => verdict.kind === 'key-absent').map(({ edge }) => edge.when!);
|
|
82
117
|
if (matching.length === 1 && unobservedConditions.length === 0 && matching[0]!.to !== undefined) {
|
|
83
|
-
route = { from, on: null, label, to: matching[0]!.to!, source: 'graph', overlays: applied,
|
|
118
|
+
route = { ...route, from, on: null, label, to: matching[0]!.to!, source: 'graph', overlays: applied,
|
|
84
119
|
via: 'when', condition: matching[0]!.when };
|
|
85
120
|
} else {
|
|
86
121
|
const mapped = outgoing.find(edge => edge.when === undefined && edge.map !== undefined && Object.hasOwn(edge.map, label));
|
|
87
122
|
const defaultEdge = mapped ?? outgoing.find(edge => edge.when === undefined && edge.to !== undefined);
|
|
88
|
-
if (defaultEdge?.map !== undefined) route = { from, on: defaultEdge.on ?? null, label,
|
|
123
|
+
if (defaultEdge?.map !== undefined) route = { ...route, from, on: defaultEdge.on ?? null, label,
|
|
89
124
|
to: defaultEdge.map[label]!, source: 'graph', overlays: applied, via: 'outcome' };
|
|
90
|
-
else if (defaultEdge?.to !== undefined) route = { from, on: null, label,
|
|
125
|
+
else if (defaultEdge?.to !== undefined) route = { ...route, from, on: null, label,
|
|
91
126
|
to: defaultEdge.to, source: 'graph', overlays: applied, via: 'outcome' };
|
|
92
127
|
if (matching.length > 1) route = { ...route, ambiguousConditions: matching.map(edge => edge.when!) };
|
|
93
128
|
if (unobservedConditions.length > 0) route = { ...route, unobservedConditions };
|
|
@@ -129,31 +164,51 @@ export interface JourneyEdgeFields {
|
|
|
129
164
|
readonly [key: string]: unknown;
|
|
130
165
|
}
|
|
131
166
|
|
|
167
|
+
function recordGraphPathEvent(event: string, data: Record<string, unknown>, runId?: string): void {
|
|
168
|
+
try { debug.log('graph.path', event, data); } catch { /* fail-soft */ }
|
|
169
|
+
if (!runId) return;
|
|
170
|
+
try { appendRunLedgerEntry({ timestamp: new Date().toISOString(), runId, event: 'graph.path', data: { event, ...data } }, runLedgerDir()); }
|
|
171
|
+
catch { /* path observation must not change execution */ }
|
|
172
|
+
}
|
|
173
|
+
|
|
132
174
|
/** 실제로 탄 간선을 남긴다 — `taken` 은 실제 다음 노드(그래프 답과 다르면 `honored: false` · 그 이유를 `reason` 에). */
|
|
133
175
|
export function recordJourneyEdge(route: JourneyRoute, taken: string, reason?: string, data: JourneyEdgeFields = {}): void {
|
|
134
176
|
try {
|
|
177
|
+
const runId = typeof data.runId === 'string' ? data.runId : undefined;
|
|
178
|
+
for (const rejection of route.profileRejections ?? []) recordGraphPathEvent('profile-rejected', {
|
|
179
|
+
graphId: 'self-implement', reason: rejection, profileIds: route.profileIds ?? [],
|
|
180
|
+
...(runId === undefined ? {} : { runId }), ...journeyJoinFields(),
|
|
181
|
+
}, runId);
|
|
135
182
|
if (route.ambiguousConditions?.length) debug.log('self-implement', 'edge-ambiguous', {
|
|
136
183
|
graphId: 'self-implement', from: route.from, conditions: route.ambiguousConditions,
|
|
137
184
|
fallback: taken, ...journeyJoinFields(),
|
|
138
185
|
});
|
|
186
|
+
if (route.ambiguousConditions?.length) recordGraphPathEvent('edge-ambiguous', {
|
|
187
|
+
graphId: 'self-implement', from: route.from, conditions: route.ambiguousConditions,
|
|
188
|
+
fallback: taken, profileIds: route.profileIds ?? [], ...(runId === undefined ? {} : { runId }), ...journeyJoinFields(),
|
|
189
|
+
}, runId);
|
|
139
190
|
if (route.unobservedConditions?.length) debug.log('self-implement', 'edge-unobserved', {
|
|
140
191
|
graphId: 'self-implement', from: route.from, conditions: route.unobservedConditions,
|
|
141
192
|
fallback: taken, ...journeyJoinFields(),
|
|
142
193
|
});
|
|
143
|
-
if (route.to === taken) for (const skipped of route.skippedNodes ?? [])
|
|
144
|
-
graphId: 'self-implement', node: skipped.node, reason: 'condition', condition: skipped.condition,
|
|
145
|
-
|
|
146
|
-
|
|
194
|
+
if (route.to === taken) for (const skipped of route.skippedNodes ?? []) {
|
|
195
|
+
const skippedData = { graphId: 'self-implement', node: skipped.node, reason: 'condition', condition: skipped.condition,
|
|
196
|
+
profileIds: route.profileIds ?? [], ...(runId === undefined ? {} : { runId }), ...journeyJoinFields() };
|
|
197
|
+
debug.log('self-implement', 'node-skipped', skippedData);
|
|
198
|
+
recordGraphPathEvent('node-skipped', skippedData, runId);
|
|
199
|
+
}
|
|
147
200
|
// Evidence never overrides an edge field: the later spread wins. Explicit repair join keys win over ambient context.
|
|
148
201
|
const { reason: _reservedReason, journeyKey: _reservedJourney, queueLaunchId: _reservedLaunch,
|
|
149
|
-
runId, card, pr, head, moveId, ...evidence } = data ?? {};
|
|
150
|
-
|
|
202
|
+
runId: _reservedRunId, card, pr, head, moveId, ...evidence } = data ?? {};
|
|
203
|
+
const edgeData = {
|
|
151
204
|
...evidence, graphId: 'self-implement', ...route, taken, honored: route.to === null || route.to === taken,
|
|
152
205
|
...(reason === undefined ? {} : { reason }), ...journeyJoinFields(),
|
|
153
206
|
...(runId === undefined ? {} : { runId }), ...(card === undefined ? {} : { card }),
|
|
154
207
|
...(pr === undefined ? {} : { pr }), ...(head === undefined ? {} : { head }),
|
|
155
208
|
...(moveId === undefined ? {} : { moveId }),
|
|
156
|
-
}
|
|
209
|
+
};
|
|
210
|
+
debug.log('self-implement', 'graph-edge-taken', edgeData);
|
|
211
|
+
recordGraphPathEvent('edge-taken', edgeData, runId);
|
|
157
212
|
} catch { /* 관측은 fail-soft */ }
|
|
158
213
|
}
|
|
159
214
|
|
|
@@ -162,10 +217,10 @@ export function routeJourneyEdge(
|
|
|
162
217
|
from: string,
|
|
163
218
|
label: string,
|
|
164
219
|
state: Readonly<Record<string, unknown>> = {},
|
|
165
|
-
deps: { readonly base?: GraphTemplateSpec; readonly overlays?: readonly GraphOverlaySpec[] } = {},
|
|
220
|
+
deps: { readonly base?: GraphTemplateSpec; readonly overlays?: readonly GraphOverlaySpec[]; readonly profiles?: readonly GraphProfileSpec[]; readonly runId?: string } = {},
|
|
166
221
|
): JourneyRoute {
|
|
167
222
|
const route = readJourneyEdge(from, label, state, deps);
|
|
168
|
-
recordJourneyEdge(route, route.to ?? label);
|
|
223
|
+
recordJourneyEdge(route, route.to ?? label, undefined, deps.runId === undefined ? {} : { runId: deps.runId });
|
|
169
224
|
return route;
|
|
170
225
|
}
|
|
171
226
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { parseTargetPathHintLine } from '../release-loop/checklist-target-path-hint.js';
|
|
2
|
+
|
|
1
3
|
export type WorktreePathTouchAxis = 'touched' | 'untouched' | 'unreadable';
|
|
2
4
|
|
|
3
5
|
/** 겹친 경로가 실제로 손대어졌는지의 읽기 전용 관측. */
|
|
@@ -534,15 +536,12 @@ export interface AskTargetPathHintsParseResult {
|
|
|
534
536
|
}
|
|
535
537
|
|
|
536
538
|
export function parseAskTargetPathHintsResult(askText: string): AskTargetPathHintsParseResult {
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
if (firstLine === undefined) return { paths: [], rejected: [], labelMissing: true };
|
|
540
|
-
const match = /^\s*(?:대상\s*경로|target\s*paths?)\s*[::]\s*(.*)$/i.exec(firstLine);
|
|
541
|
-
if (!match) return { paths: [], rejected: [], labelMissing: true };
|
|
539
|
+
const parsed = parseTargetPathHintLine(askText);
|
|
540
|
+
if (parsed.labelMissing) return { paths: [], rejected: [], labelMissing: true };
|
|
542
541
|
|
|
543
542
|
const paths: string[] = [];
|
|
544
543
|
const rejected: AskTargetPathHintRejection[] = [];
|
|
545
|
-
for (const fragment of
|
|
544
|
+
for (const fragment of parsed.fragments) {
|
|
546
545
|
const piece = fragment.trim().replace(/^`+|`+$/g, '');
|
|
547
546
|
if (piece === '') rejected.push({ fragment, reason: 'empty' });
|
|
548
547
|
// ⛔ 「경로처럼 생긴 것」만 남긴다 — 확장자나 디렉터리 구분자가 있어야 한다.
|
|
@@ -340,6 +340,64 @@ export interface LaunchPreflightInput {
|
|
|
340
340
|
/** AUTO-TARGET: blocker name for a NOT-GROUNDED goal whose only target paths were machine-suggested (a scope card). */
|
|
341
341
|
export const NOT_GROUNDED_SCOPE_CARD_BLOCKER = '(NOT-GROUNDED 범위 카드)';
|
|
342
342
|
|
|
343
|
+
/** CARD-TARGET-PATHS 가 읽기 전용으로 제공하는 같은-경로 카드 맥락. */
|
|
344
|
+
export interface SiblingContextCard {
|
|
345
|
+
readonly cardId: string;
|
|
346
|
+
readonly runId?: string;
|
|
347
|
+
readonly overlapPaths: readonly string[];
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function siblingContextPaths(result: LaunchPreflightResult, warning: LaunchPreflightBlocker): readonly string[] {
|
|
351
|
+
return warning.overlapPaths?.map(({ path }) => path)
|
|
352
|
+
?? result.paths.filter((path) => warning.detail.includes(path));
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function siblingContextAxis(
|
|
356
|
+
label: string,
|
|
357
|
+
status: PreflightAxisStatus,
|
|
358
|
+
entries: readonly string[],
|
|
359
|
+
): string {
|
|
360
|
+
if (status.state === 'unknown') return `[sibling-context] ${label}: 못 쟀다 (${status.reason})`;
|
|
361
|
+
if (entries.length === 0) return `[sibling-context] ${label}: 없음`;
|
|
362
|
+
const partial = status.state === 'truncated' ? ` · 부분 측정(상한 ${status.limit})` : '';
|
|
363
|
+
return `[sibling-context] ${label}: ${entries.join(' · ')}${partial}`;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/** 같은 대상 경로의 비차단 형제 관측을 골 문서 머리에 넣을 정확히 세 줄로 렌더한다. */
|
|
367
|
+
export function renderSiblingContextLines(
|
|
368
|
+
result: LaunchPreflightResult,
|
|
369
|
+
cards: readonly SiblingContextCard[] = [],
|
|
370
|
+
): readonly [string, string, string] {
|
|
371
|
+
const liveRuns = result.warnings
|
|
372
|
+
.filter((warning) => warning.kind === 'live-run')
|
|
373
|
+
.map((warning) => {
|
|
374
|
+
const paths = siblingContextPaths(result, warning);
|
|
375
|
+
const cardIds = cards
|
|
376
|
+
.filter((card) => card.runId === warning.name && card.overlapPaths.some((path) => paths.includes(path)))
|
|
377
|
+
.map((card) => card.cardId);
|
|
378
|
+
return [warning.name, ...cardIds.map((cardId) => `카드 ${cardId}`), ...paths].join(' · ');
|
|
379
|
+
});
|
|
380
|
+
const openPrs = result.warnings
|
|
381
|
+
.filter((warning) => warning.kind === 'open-pr' || warning.kind === 'sibling-pr')
|
|
382
|
+
.map((warning) => {
|
|
383
|
+
const draft = /\bdraft\b|초안/u.test(warning.detail) ? ' (draft)' : '';
|
|
384
|
+
const paths = siblingContextPaths(result, warning);
|
|
385
|
+
return `${warning.name}${draft}${paths.length > 0 ? ` · ${paths.join(', ')}` : ''}`;
|
|
386
|
+
});
|
|
387
|
+
const recentLanded = result.warnings
|
|
388
|
+
.filter((warning) => warning.kind === 'recent-change' && result.paths.includes(warning.name))
|
|
389
|
+
.map((warning) => {
|
|
390
|
+
const count = /최근 \d+일 안에 (\d+)건 변경됨/u.exec(warning.detail)?.[1];
|
|
391
|
+
return `sha·PR 미상 · ${warning.name}${count === undefined ? '' : ` ${count}건`}`;
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
return [
|
|
395
|
+
siblingContextAxis('같은 경로 도는 런', result.liveRuns, liveRuns),
|
|
396
|
+
siblingContextAxis('같은 경로 열린 PR', result.openPrs, openPrs),
|
|
397
|
+
siblingContextAxis(`같은 경로 최근 ${result.recentChangeWindowDays}일 착지`, result.recentChanges, recentLanded),
|
|
398
|
+
];
|
|
399
|
+
}
|
|
400
|
+
|
|
343
401
|
export function evaluateLaunchPreflight(input: LaunchPreflightInput): LaunchPreflightResult {
|
|
344
402
|
const paths = [...new Set(input.paths.filter((path) => path.trim().length > 0))];
|
|
345
403
|
const blockers: LaunchPreflightBlocker[] = [];
|