elanous 0.2.42 → 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/{X1ucLw10Cds_h614NoEnh → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.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/{3507.97e1977bc4d5fb0a.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/1961.a81b12872c3e93a9.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{53c73f84.373b6160adfa89a4.js → 1970cf59.2d4d8ce5d6c81853.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9211-330b6736a63d4cb3.js → 2073-ba274e00e4f9efb4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{7411.9b4b8b747dc7b802.js → 2144.25b292396712196d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/2268-53861f339e0b65a2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2312.0c8b61e22d3136d7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6632.0eac1c554f8f2ef3.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/{1262.e804feb8fd1acb8c.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/{2456.b6de0e1c05f28843.js → 3095.dc44586a5f83b86d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3207.a756c95e9ec8c3c8.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/3557ac4a.c8931684475018ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8505.fd803c6c33b54cc3.js → 360.ae9f9f4c33c395e8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
- package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.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/{8138.6c10b2a356d52fca.js → 4199.ce86b281fd0a60b7.js} +1 -1
- 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/{2690.0521c738b7749931.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/{1945.7b54990d578c119b.js → 4894.fec2ca9e99caefa2.js} +1 -1
- 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/{9427.96aa912ddb5801e0.js → 5564.9e72532188f57586.js} +16 -16
- 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/{4043.6b91203436c9c86b.js → 5628.6ddb2d5ffba4ff4c.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/{1319.b9b815ae0f181e06.js → 5730.43d7ccc09988e646.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.js → 5789.2da35c258292e1e5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5824.da9527b15a3221e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1487.2f67b79444062da6.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/{3347.f846266b5e5f3ede.js → 6540.c7bef57ad8f90a87.js} +3 -3
- 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/{8262.ddc03e06b733f184.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/{4770.769c9cd9c7034eba.js → 7483.427a2fe2049e388d.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{1147-5196d19c222051b3.js → 7502-be74718178e13e56.js} +1 -1
- 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/{8673-bab689a55f7e13b9.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/868.6e953be05bcf6dca.js +41 -0
- 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/{9656-374232558fd528d0.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{5440-4236de26c5ea5856.js → 8967-7dfebf710c9dec9d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{1063.2fb8a9dc55c731f2.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/{4320.583cbab64db6be02.js → 923.2034d10ae91e9c20.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1574.878c18ecc97b1bd4.js → 943.39ae5e82f4f1893f.js} +1 -1
- 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/aa57532f.510551854ff239b1.js +1 -0
- 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-0f291d3c8fd55a3a.js → page-9ee28f7df07428ea.js} +1 -1
- 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-79a8b5fee4c20871.js +1 -0
- 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-ca2d09128c585ca4.js +1 -0
- 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/c7945435-b44d4dbe90ba0dcb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{e8543907.5b040a5f22a0b0e5.js → d96660fb.cbc21a2a88539dbb.js} +7 -7
- package/apps/pwa/out/_next/static/chunks/{50061469.0326382241ef3b2d.js → ea514caa.05a24f78d9dffe5f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/fb7d20d5-6892502b6ee39ca6.js +1 -0
- 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/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 +23 -23
- 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 +22 -22
- 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 +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +23 -23
- 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/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/profiles/local.yaml +5 -0
- package/graphs/profiles/pod.yaml +4 -0
- 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/hooks/codex-notify.sh +32 -0
- package/scripts/install.sh +10 -38
- package/scripts/landing-heal/land-plan.ts +57 -0
- 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-method.ts +139 -0
- package/scripts/release-loop/gate-node.ts +180 -20
- package/scripts/release-loop/gate-traffic-mode.ts +151 -3
- package/scripts/release-loop/node-verdict.ts +38 -25
- package/scripts/release-loop/preflight.ts +362 -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/video-pipeline.ts +9 -1
- package/scripts/warm-pool-provider-config.ts +29 -6
- 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 +17 -12
- package/src/acp/event-router.ts +20 -1
- package/src/acp/server.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 +56 -21
- 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 +256 -18
- package/src/agent-mission/tool-install.ts +122 -11
- package/src/agents/general-purpose.md +1 -1
- package/src/auto-research/research-turn.ts +95 -10
- package/src/autopilot/pr-manager.ts +31 -3
- 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/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/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 +44 -6
- package/src/cli/pr-land-overlap-evidence.ts +13 -1
- package/src/cli/pr-land-pod-shadow-job.ts +143 -5
- package/src/cli/pr-land-pod-shadow.ts +9 -2
- package/src/cli/release-checklist-read-cli.ts +44 -16
- package/src/cli/release-cli.ts +23 -3
- package/src/cli/research-cli.ts +9 -0
- 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 +54 -9
- package/src/cli/tui-test-cli.ts +186 -0
- 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/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 +320 -30
- package/src/core-turn/types.ts +2 -0
- package/src/dashboard/chat/acp-chat.ts +10 -0
- package/src/dashboard/classic-sidetab-mission-job.ts +103 -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 +167 -5
- package/src/dashboard/index.ts +378 -13
- package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
- package/src/dashboard/mission-cli-consumer.ts +20 -8
- package/src/dashboard/plugin-wizard-runtime.ts +50 -0
- package/src/dashboard/plugin-wizard-tool.ts +55 -0
- package/src/dashboard/sidetab-runtime.ts +1 -1
- package/src/dashboard/terminal-popup-runtime.ts +6 -3
- 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-run-api.ts +3 -1
- package/src/graph-runner/runner.ts +85 -17
- package/src/graph-wizard/mission-compose.ts +407 -12
- 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/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 +127 -10
- 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 +2 -1
- package/src/maturity/feature-maturity.ts +3 -3
- package/src/msg/msg-sse-server.ts +3 -3
- package/src/msg/msg-store.ts +177 -19
- package/src/native-tool-catalog.ts +36 -2
- 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 +130 -0
- package/src/pty-shell/pty-control-ipc.ts +4 -1
- package/src/registry/catalog-server.ts +232 -0
- package/src/registry/loader.ts +45 -1
- package/src/registry/types.ts +1 -2
- package/src/research/axis-fanout.ts +43 -28
- package/src/self-dev/ask-launch-flow.ts +72 -1
- 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.ts +58 -0
- package/src/self-dev/orchestrate.ts +1 -1
- 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 +30 -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 +358 -4
- package/src/self-implement/graph-overlay-yaml.ts +30 -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/off-diff-evidence.ts +249 -5
- package/src/self-implement/orchestrator.ts +240 -15
- package/src/self-implement/run-chart.ts +6 -3
- package/src/self-implement/run-ledger.ts +51 -1
- package/src/self-implement/runtime-overlay-run-steps.ts +95 -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 +4 -2
- 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 +37 -1
- package/src/session-runtime/retry-policy.ts +1 -1
- 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/visible-agent-mission.ts +98 -22
- package/src/skills/tools/agent.ts +23 -4
- package/src/skills/tools/omni-search.ts +123 -25
- package/src/task-agent/parent-host.ts +10 -0
- package/src/task-agent/repair-outcomes.ts +65 -0
- package/src/task-agent/task-hand.ts +20 -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-failure-reason.ts +92 -1
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
- package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +35 -9
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +172 -6
- 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/tool-hints/gate.ts +1 -0
- package/src/tool-runtime/agent-runtime.ts +1 -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/graph-mcp-runtimes.ts +240 -0
- package/src/tool-runtime/index.ts +6 -0
- package/src/tool-runtime/types.ts +3 -0
- package/src/tui/entry.ts +24 -1
- package/src/tui/sidetab/attach.ts +140 -11
- package/src/tui/sidetab/herdr-portal.ts +225 -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-linear-device.ts +31 -0
- 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 +75 -23
- package/src/ux-sim/mock-scenario-catalog.ts +120 -2
- package/src/ux-sim/onboarding-first-run-device.ts +31 -21
- package/src/ux-sim/scenario.ts +70 -26
- 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/web-search/exa.ts +77 -0
- 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/0244e5b5.6fc7670f8223d82d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
- package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
- package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
- package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +0 -23
- package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
- package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
- package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
- package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
- package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
- package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
- package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
- package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
- package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
- package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
- package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +0 -287
- package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
- package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
- package/apps/pwa/out/_next/static/chunks/6377.bc7df239edbff244.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
- package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
- package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
- package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
- package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
- package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
- package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
- /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { defaultHerdrCliRunner, type HerdrCliRunner } from '../../pty-shell/herdr-prompt.js';
|
|
2
|
+
import type { SidetabRow } from '../../sidetab-core/model.js';
|
|
3
|
+
|
|
4
|
+
const HERDR_ROW_PREFIX = 'herdr:';
|
|
5
|
+
const SNAPSHOT_TIMEOUT_MS = 1_500;
|
|
6
|
+
const PANE_READ_TIMEOUT_MS = 1_000;
|
|
7
|
+
const PANE_INPUT_TIMEOUT_MS = 1_000;
|
|
8
|
+
|
|
9
|
+
export type HerdrSidetabStatus =
|
|
10
|
+
| 'working' | 'idle' | 'needs-approval' | 'done-verified' | 'done-unverified' | 'stopped' | 'unknown';
|
|
11
|
+
|
|
12
|
+
export interface HerdrPaneSnapshot {
|
|
13
|
+
readonly pane_id: string;
|
|
14
|
+
readonly workspace_id?: string;
|
|
15
|
+
readonly agent?: string;
|
|
16
|
+
readonly agent_status?: string;
|
|
17
|
+
readonly terminal_title?: string;
|
|
18
|
+
readonly terminal_title_stripped?: string;
|
|
19
|
+
readonly cwd?: string;
|
|
20
|
+
readonly alive?: boolean;
|
|
21
|
+
readonly cost_usd?: number;
|
|
22
|
+
readonly costUsd?: number;
|
|
23
|
+
readonly cost?: number;
|
|
24
|
+
readonly [key: string]: unknown;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface HerdrSidetabPortalOptions {
|
|
28
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
29
|
+
readonly run?: HerdrCliRunner;
|
|
30
|
+
/** Independent completion evidence; Herdr's own `done` report is never treated as verification. */
|
|
31
|
+
readonly isVerified?: (pane: HerdrPaneSnapshot) => boolean;
|
|
32
|
+
readonly log?: (event: string, data: Record<string, unknown>) => void;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface HerdrSidetabPortal {
|
|
36
|
+
enabled(): boolean;
|
|
37
|
+
refreshRows(): Promise<readonly SidetabRow[]>;
|
|
38
|
+
rows(): readonly SidetabRow[];
|
|
39
|
+
readPane(paneId: string): Promise<string>;
|
|
40
|
+
sendText(paneId: string, text: string): Promise<void>;
|
|
41
|
+
sendKey(paneId: string, key: string): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function asRecord(value: unknown): Record<string, unknown> | undefined {
|
|
45
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function paneRowsFromSnapshot(value: unknown): HerdrPaneSnapshot[] {
|
|
49
|
+
const root = asRecord(value);
|
|
50
|
+
const result = asRecord(root?.result);
|
|
51
|
+
if (!result) throw new Error('Herdr snapshot 형식 오류 · result 객체가 없습니다');
|
|
52
|
+
const session = asRecord(result?.session_snapshot);
|
|
53
|
+
const panes = result?.panes ?? session?.panes;
|
|
54
|
+
if (!Array.isArray(panes)) throw new Error('Herdr snapshot 형식 오류 · panes 배열이 없습니다');
|
|
55
|
+
const invalidPane = panes.findIndex((candidate) => {
|
|
56
|
+
const pane = asRecord(candidate);
|
|
57
|
+
return typeof pane?.pane_id !== 'string' || pane.pane_id.length === 0;
|
|
58
|
+
});
|
|
59
|
+
if (invalidPane >= 0) throw new Error(`Herdr snapshot 형식 오류 · panes[${invalidPane}].pane_id가 없습니다`);
|
|
60
|
+
return panes as HerdrPaneSnapshot[];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function statusOf(pane: HerdrPaneSnapshot, verified: boolean): HerdrSidetabStatus {
|
|
64
|
+
const state = (pane.agent_status ?? '').trim().toLowerCase().replaceAll('_', '-');
|
|
65
|
+
// Approval is a first-class state. Never collapse it into idle, even if a pane has no running process.
|
|
66
|
+
if (state === 'blocked' || state === 'needs-approval' || state === 'approval-required') return 'needs-approval';
|
|
67
|
+
// A completed pane remains completed after its process exits. Herdr's `done` is not verification.
|
|
68
|
+
if (state === 'done' || state === 'complete' || state === 'completed') return verified ? 'done-verified' : 'done-unverified';
|
|
69
|
+
if (pane.alive === false || state === 'stopped' || state === 'exited') return 'stopped';
|
|
70
|
+
if (state === 'working' || state === 'busy') return 'working';
|
|
71
|
+
if (state === 'idle') return 'idle';
|
|
72
|
+
return 'unknown';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function displayState(status: HerdrSidetabStatus): { badge: SidetabRow['badge']; label: string } {
|
|
76
|
+
switch (status) {
|
|
77
|
+
case 'working': return { badge: 'busy', label: '실행 중' };
|
|
78
|
+
case 'idle': return { badge: 'idle', label: '대기' };
|
|
79
|
+
case 'needs-approval': return { badge: 'busy', label: '승인 필요' };
|
|
80
|
+
case 'done-verified': return { badge: 'idle', label: '검증 완료' };
|
|
81
|
+
case 'done-unverified': return { badge: 'unknown', label: '미검증 완료' };
|
|
82
|
+
case 'stopped': return { badge: 'exited', label: '멈춤' };
|
|
83
|
+
case 'unknown': return { badge: 'unknown', label: '상태 미상' };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function finiteCost(pane: HerdrPaneSnapshot): number | undefined {
|
|
88
|
+
for (const value of [pane.cost_usd, pane.costUsd, pane.cost]) {
|
|
89
|
+
if (typeof value === 'number' && Number.isFinite(value) && value >= 0) return value;
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function rowFromPane(pane: HerdrPaneSnapshot, verified: boolean): SidetabRow {
|
|
95
|
+
const status = statusOf(pane, verified);
|
|
96
|
+
const display = displayState(status);
|
|
97
|
+
const title = pane.terminal_title_stripped || pane.terminal_title || pane.agent || pane.pane_id;
|
|
98
|
+
const cost = finiteCost(pane);
|
|
99
|
+
const costText = cost === undefined ? '비용 —' : `비용 $${cost.toFixed(2)}`;
|
|
100
|
+
return {
|
|
101
|
+
id: `${HERDR_ROW_PREFIX}${pane.pane_id}`,
|
|
102
|
+
label: `Herdr · ${display.label} · ${title} · ${costText}`,
|
|
103
|
+
kind: 'herdr',
|
|
104
|
+
badge: display.badge,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function paneIdFromRow(row: SidetabRow): string | undefined {
|
|
109
|
+
if (row.kind !== 'herdr' || !row.id.startsWith(HERDR_ROW_PREFIX)) return undefined;
|
|
110
|
+
const id = row.id.slice(HERDR_ROW_PREFIX.length);
|
|
111
|
+
return /^w[A-Za-z0-9_-]+:p[A-Za-z0-9_-]+$/.test(id) ? id : undefined;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function commandOutput(result: { code: number | null; stdout: string; stderr: string }): string {
|
|
115
|
+
if (result.code !== 0) {
|
|
116
|
+
const body = result.stderr.trim();
|
|
117
|
+
let message = body || `herdr exited with rc=${result.code ?? 'unknown'}`;
|
|
118
|
+
if (body.startsWith('{')) {
|
|
119
|
+
try {
|
|
120
|
+
const error = asRecord(asRecord(JSON.parse(body))?.error);
|
|
121
|
+
if (typeof error?.message === 'string') message = error.message;
|
|
122
|
+
} catch { /* preserve stderr */ }
|
|
123
|
+
}
|
|
124
|
+
throw new Error(message);
|
|
125
|
+
}
|
|
126
|
+
const text = result.stdout.trim();
|
|
127
|
+
if (!text.startsWith('{')) return text;
|
|
128
|
+
try {
|
|
129
|
+
const resultEnvelope = asRecord(asRecord(JSON.parse(text))?.result);
|
|
130
|
+
for (const key of ['text', 'output', 'screen', 'content'] as const) {
|
|
131
|
+
if (typeof resultEnvelope?.[key] === 'string') return resultEnvelope[key] as string;
|
|
132
|
+
}
|
|
133
|
+
} catch { /* plain terminal text may begin with a brace */ }
|
|
134
|
+
return text;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function logicalKey(key: string): string {
|
|
138
|
+
const aliases: Record<string, string> = {
|
|
139
|
+
'\r': 'enter', '\n': 'enter', '\x1b': 'esc', '\x7f': 'backspace', '\t': 'tab',
|
|
140
|
+
'\x03': 'ctrl+c', '\x04': 'ctrl+d', '\x1b[A': 'up', '\x1bOA': 'up', '\x1b[B': 'down', '\x1bOB': 'down',
|
|
141
|
+
'\x1b[C': 'right', '\x1bOC': 'right', '\x1b[D': 'left', '\x1bOD': 'left',
|
|
142
|
+
};
|
|
143
|
+
const mapped = aliases[key];
|
|
144
|
+
if (mapped) return mapped;
|
|
145
|
+
if (key.startsWith('\x1b')) throw new Error('지원되지 않는 Herdr escape key입니다');
|
|
146
|
+
return key;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function createHerdrSidetabPortal(options: HerdrSidetabPortalOptions = {}): HerdrSidetabPortal {
|
|
150
|
+
const env = options.env ?? process.env;
|
|
151
|
+
const run = options.run ?? defaultHerdrCliRunner(env);
|
|
152
|
+
const isVerified = options.isVerified ?? (() => false);
|
|
153
|
+
const log = options.log ?? (() => {});
|
|
154
|
+
let cachedRows: SidetabRow[] = [];
|
|
155
|
+
let snapshotError: string | null = null;
|
|
156
|
+
let refreshPending: Promise<readonly SidetabRow[]> | null = null;
|
|
157
|
+
|
|
158
|
+
const visibleRows = (): SidetabRow[] => {
|
|
159
|
+
const rows = snapshotError
|
|
160
|
+
? cachedRows.map((row) => ({ ...row, label: `${row.label} · 오래된 스냅샷` }))
|
|
161
|
+
: [...cachedRows];
|
|
162
|
+
if (snapshotError) {
|
|
163
|
+
rows.push({
|
|
164
|
+
id: 'herdr:snapshot-status',
|
|
165
|
+
label: `Herdr · snapshot 갱신 실패 · ${snapshotError}`,
|
|
166
|
+
kind: 'status',
|
|
167
|
+
badge: 'unknown',
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return rows;
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const requireEnabledPane = (paneId: string): void => {
|
|
174
|
+
if (env.HERDR_ENV !== '1') throw new Error('Herdr 포털은 Herdr 관리 pane 안에서만 사용할 수 있습니다');
|
|
175
|
+
if (!/^w[A-Za-z0-9_-]+:p[A-Za-z0-9_-]+$/.test(paneId)) throw new Error('Herdr pane id가 올바르지 않습니다');
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
enabled: () => env.HERDR_ENV === '1',
|
|
180
|
+
async refreshRows() {
|
|
181
|
+
if (env.HERDR_ENV !== '1') return [];
|
|
182
|
+
if (refreshPending) return refreshPending;
|
|
183
|
+
refreshPending = (async () => {
|
|
184
|
+
const result = await run(['api', 'snapshot'], SNAPSHOT_TIMEOUT_MS);
|
|
185
|
+
const output = commandOutput(result);
|
|
186
|
+
let snapshot: unknown;
|
|
187
|
+
try { snapshot = JSON.parse(output); }
|
|
188
|
+
catch { throw new Error('Herdr snapshot 형식 오류 · JSON을 읽을 수 없습니다'); }
|
|
189
|
+
const panes = paneRowsFromSnapshot(snapshot);
|
|
190
|
+
cachedRows = panes.map((pane) => rowFromPane(pane, isVerified(pane)));
|
|
191
|
+
snapshotError = null;
|
|
192
|
+
log('snapshot', { panes: cachedRows.length });
|
|
193
|
+
return visibleRows();
|
|
194
|
+
})().catch((error: unknown) => {
|
|
195
|
+
snapshotError = (error instanceof Error ? error.message : String(error)).replace(/[\r\n\t]/g, ' ').slice(0, 160);
|
|
196
|
+
log('snapshot-failed', { error: snapshotError });
|
|
197
|
+
return visibleRows();
|
|
198
|
+
}).finally(() => { refreshPending = null; });
|
|
199
|
+
return refreshPending;
|
|
200
|
+
},
|
|
201
|
+
rows: visibleRows,
|
|
202
|
+
async readPane(paneId) {
|
|
203
|
+
requireEnabledPane(paneId);
|
|
204
|
+
const result = await run(['pane', 'read', paneId, '--source', 'visible', '--format', 'ansi'], PANE_READ_TIMEOUT_MS);
|
|
205
|
+
return commandOutput(result);
|
|
206
|
+
},
|
|
207
|
+
async sendText(paneId, text) {
|
|
208
|
+
requireEnabledPane(paneId);
|
|
209
|
+
if (!text) return;
|
|
210
|
+
const result = await run(['pane', 'send-text', paneId, text], PANE_INPUT_TIMEOUT_MS);
|
|
211
|
+
commandOutput(result);
|
|
212
|
+
},
|
|
213
|
+
async sendKey(paneId, key) {
|
|
214
|
+
requireEnabledPane(paneId);
|
|
215
|
+
const normalized = logicalKey(key);
|
|
216
|
+
if (!normalized) return;
|
|
217
|
+
const result = await run(['pane', 'send-keys', paneId, normalized], PANE_INPUT_TIMEOUT_MS);
|
|
218
|
+
commandOutput(result);
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export function herdrPaneIdFromSidetabRow(row: SidetabRow): string | undefined {
|
|
224
|
+
return paneIdFromRow(row);
|
|
225
|
+
}
|
package/src/user-config.ts
CHANGED
|
@@ -187,6 +187,8 @@ export interface LLMConfig {
|
|
|
187
187
|
apiKey?: string;
|
|
188
188
|
model?: string;
|
|
189
189
|
baseUrl?: string;
|
|
190
|
+
/** Host that owns Codex OAuth refresh authority. Defaults to the HQ's mbp host. */
|
|
191
|
+
codexTokenOwnerHost?: string;
|
|
190
192
|
/** Override the text stream idle watchdog in milliseconds. Omitted keeps provider/family defaults. */
|
|
191
193
|
streamIdleTimeoutMs?: number;
|
|
192
194
|
/** OpenRouter 설정 한 곳(두 골이 같은 키를 쓴다):
|
|
@@ -1177,6 +1179,8 @@ export interface SelfImplementToolConfig {
|
|
|
1177
1179
|
goalRecordInDoc: boolean;
|
|
1178
1180
|
/** Controls the persistent grounding loop used while authoring goals; absent preserves it. */
|
|
1179
1181
|
goalAuthorPersistentGrounding?: boolean;
|
|
1182
|
+
/** Explicit opt-in for the one-shot Terra medium goal-author reviewer precheck; absent/off preserves legacy authoring. */
|
|
1183
|
+
goalAuthorReviewerPrecheck?: boolean;
|
|
1180
1184
|
/** Uses the Fabric decomposer for SelfOrchestrate requests that omit `fabric_decompose`. */
|
|
1181
1185
|
fabricDecompose: boolean;
|
|
1182
1186
|
/** Normalized SelfOrchestrate goal count that automatically selects Fabric; null disables auto-selection. */
|
|
@@ -1294,7 +1298,7 @@ const TOOLS_DEFAULTS: ToolsConfig = {
|
|
|
1294
1298
|
selfOrchestrate: {},
|
|
1295
1299
|
nativeStructure: { enabled: false },
|
|
1296
1300
|
// 대표 결정(2026-07-26): 오토 선호 — 기본 ON.
|
|
1297
|
-
selfImplement: { worktreeRoot: join(homedir(), '.elanous', 'worktrees'), childInstanceMode: 'isolated', prApprovalDelivery: 'terminal' as const, observeOnly: false, goalRecordInDoc: true, fabricDecompose: false, fabricDecomposeAutoPathThreshold: 5, autoOpenPr: true, supervisor: { reasonRepair: false }, autoStop: { enabled: true, minRung: 2 }, autoAssist: { enabled: true, minRung: 2 }, screenStallTermination: { enabled: true, minRung: 2 }, reworkBudget: { shadowStop: false, maxRounds: 3 }, decompositionShadow: { enabled: false }, clarificationEscalation: { enabled: false } },
|
|
1301
|
+
selfImplement: { worktreeRoot: join(homedir(), '.elanous', 'worktrees'), childInstanceMode: 'isolated', prApprovalDelivery: 'terminal' as const, observeOnly: false, goalRecordInDoc: true, goalAuthorReviewerPrecheck: false, fabricDecompose: false, fabricDecomposeAutoPathThreshold: 5, autoOpenPr: true, supervisor: { reasonRepair: false }, autoStop: { enabled: true, minRung: 2 }, autoAssist: { enabled: true, minRung: 2 }, screenStallTermination: { enabled: true, minRung: 2 }, reworkBudget: { shadowStop: false, maxRounds: 3 }, decompositionShadow: { enabled: false }, clarificationEscalation: { enabled: false } },
|
|
1298
1302
|
};
|
|
1299
1303
|
|
|
1300
1304
|
// ── Debug ────────────────────────────────────────────────────────────
|
|
@@ -2664,6 +2668,7 @@ function parseToolsConfig(raw: unknown): ToolsConfig {
|
|
|
2664
2668
|
const goalAuthorPersistentGrounding = typeof selfImplRaw.goalAuthorPersistentGrounding === 'boolean'
|
|
2665
2669
|
? selfImplRaw.goalAuthorPersistentGrounding
|
|
2666
2670
|
: undefined;
|
|
2671
|
+
const goalAuthorReviewerPrecheck = selfImplRaw.goalAuthorReviewerPrecheck === true;
|
|
2667
2672
|
const fabricDecompose = selfImplRaw.fabricDecompose === true;
|
|
2668
2673
|
const fabricDecomposeAutoPathThresholdRaw = selfImplRaw.fabricDecomposeAutoPathThreshold;
|
|
2669
2674
|
const fabricDecomposeAutoPathThreshold = fabricDecomposeAutoPathThresholdRaw === null
|
|
@@ -2813,7 +2818,7 @@ function parseToolsConfig(raw: unknown): ToolsConfig {
|
|
|
2813
2818
|
runDevHarness,
|
|
2814
2819
|
selfOrchestrate,
|
|
2815
2820
|
nativeStructure,
|
|
2816
|
-
selfImplement: { worktreeRoot, childInstanceMode, prApprovalDelivery, observeOnly, goalRecordInDoc, goalAuthorPersistentGrounding, fabricDecompose, fabricDecomposeAutoPathThreshold, autoOpenPr, supervisor, draftOnStop, salvageRetention, autoStop, autoAssist, screenStallTermination, reworkBudget, decompositionShadow, clarificationEscalation, ...(childLlm ? { childLlm } : {}), ...(escalateChild && Object.keys(escalateChild).length ? { escalateChild } : {}), ...(selfImplRaw.podChildDefault !== undefined ? { podChildDefault: selfImplRaw.podChildDefault } : {}), ...(runTtlHours !== undefined ? { runTtlHours } : {}), ...(draftSweepCloseCap !== undefined ? { draftSweepCloseCap } : {}), ...(runTtl ? { runTtl } : {}), ...(autoheal ? { autoheal } : {}) },
|
|
2821
|
+
selfImplement: { worktreeRoot, childInstanceMode, prApprovalDelivery, observeOnly, goalRecordInDoc, goalAuthorPersistentGrounding, goalAuthorReviewerPrecheck, fabricDecompose, fabricDecomposeAutoPathThreshold, autoOpenPr, supervisor, draftOnStop, salvageRetention, autoStop, autoAssist, screenStallTermination, reworkBudget, decompositionShadow, clarificationEscalation, ...(childLlm ? { childLlm } : {}), ...(escalateChild && Object.keys(escalateChild).length ? { escalateChild } : {}), ...(selfImplRaw.podChildDefault !== undefined ? { podChildDefault: selfImplRaw.podChildDefault } : {}), ...(runTtlHours !== undefined ? { runTtlHours } : {}), ...(draftSweepCloseCap !== undefined ? { draftSweepCloseCap } : {}), ...(runTtl ? { runTtl } : {}), ...(autoheal ? { autoheal } : {}) },
|
|
2817
2822
|
};
|
|
2818
2823
|
}
|
|
2819
2824
|
|
|
@@ -3948,8 +3953,8 @@ export interface UserConfig {
|
|
|
3948
3953
|
nexus?: { demoMode?: boolean };
|
|
3949
3954
|
/** Execution-phase HITL answer deadline; absent means 30 minutes. */
|
|
3950
3955
|
hitl?: { executionDeadlineMinutes?: number };
|
|
3951
|
-
/**
|
|
3952
|
-
outbound?: { deferredMaxAttempts?: number };
|
|
3956
|
+
/** Outbound notifications. quietHours is `off` or `HH:MM-HH:MM` KST; absent keeps 00:00-06:30. */
|
|
3957
|
+
outbound?: { deferredMaxAttempts?: number; quietHours?: 'off' | string };
|
|
3953
3958
|
coo?: { linearProject?: string };
|
|
3954
3959
|
decisions?: { linearProjection: { enabled: boolean }; requireCrossCheck: boolean;
|
|
3955
3960
|
crossCheckNeighbor: Record<EventSeat, EventSeat>; crossCheckWaitMinutes: number };
|
|
@@ -5032,6 +5037,21 @@ export function parseHqConfig(raw: unknown): HqConfig | undefined {
|
|
|
5032
5037
|
return Object.keys(out).length ? out : undefined;
|
|
5033
5038
|
}
|
|
5034
5039
|
|
|
5040
|
+
function parseOutboundConfig(raw: unknown): UserConfig['outbound'] {
|
|
5041
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
|
|
5042
|
+
const outbound = raw as Record<string, unknown>;
|
|
5043
|
+
const attempts = outbound.deferredMaxAttempts;
|
|
5044
|
+
const quietHours = outbound.quietHours;
|
|
5045
|
+
const validQuietHours = quietHours === 'off'
|
|
5046
|
+
|| (typeof quietHours === 'string'
|
|
5047
|
+
&& /^(?:[01]\d|2[0-3]):[0-5]\d-(?:[01]\d|2[0-3]):[0-5]\d$/.test(quietHours)
|
|
5048
|
+
&& quietHours.slice(0, 5) !== quietHours.slice(6));
|
|
5049
|
+
const result: NonNullable<UserConfig['outbound']> = {};
|
|
5050
|
+
if (Number.isSafeInteger(attempts) && (attempts as number) > 0) result.deferredMaxAttempts = attempts as number;
|
|
5051
|
+
if (validQuietHours) result.quietHours = quietHours as 'off' | string;
|
|
5052
|
+
return Object.keys(result).length ? result : undefined;
|
|
5053
|
+
}
|
|
5054
|
+
|
|
5035
5055
|
export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
5036
5056
|
if (!existsSync(path)) return defaultConfigWithRuntimeProvider();
|
|
5037
5057
|
let raw: unknown;
|
|
@@ -5156,6 +5176,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5156
5176
|
const tuiRaw = rawObj.tui && typeof rawObj.tui === 'object' && !Array.isArray(rawObj.tui) ? rawObj.tui as Record<string, unknown> : {};
|
|
5157
5177
|
const gateRemoteConfig = parseGateRemoteConfig(rawObj.gateRemote);
|
|
5158
5178
|
const projects = parseProjectsConfig(rawObj.projects);
|
|
5179
|
+
const outboundConfig = parseOutboundConfig(rawObj.outbound);
|
|
5159
5180
|
return {
|
|
5160
5181
|
tui: {
|
|
5161
5182
|
sidetab: tuiRaw.sidetab === 'off' || tuiRaw.sidetab === 'open' ? tuiRaw.sidetab : 'collapsed',
|
|
@@ -5330,6 +5351,9 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5330
5351
|
};
|
|
5331
5352
|
})(),
|
|
5332
5353
|
model: resolveRuntimeLlmModel(baseProvider, selectedProvider, str(llm.model), escalationProvider || undefined),
|
|
5354
|
+
codexTokenOwnerHost: typeof llm.codexTokenOwnerHost === 'string'
|
|
5355
|
+
&& /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(llm.codexTokenOwnerHost.trim())
|
|
5356
|
+
? llm.codexTokenOwnerHost.trim() : undefined,
|
|
5333
5357
|
streamIdleTimeoutMs: positiveFiniteNumber(llm.streamIdleTimeoutMs),
|
|
5334
5358
|
openrouter: (() => {
|
|
5335
5359
|
const router = llm.openrouter;
|
|
@@ -5954,11 +5978,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
|
|
|
5954
5978
|
&& typeof (rawObj.hitl as Record<string, unknown>).executionDeadlineMinutes === 'number'
|
|
5955
5979
|
? { hitl: { executionDeadlineMinutes: (rawObj.hitl as { executionDeadlineMinutes: number }).executionDeadlineMinutes } }
|
|
5956
5980
|
: {}),
|
|
5957
|
-
...(
|
|
5958
|
-
&& Number.isSafeInteger((rawObj.outbound as Record<string, unknown>).deferredMaxAttempts)
|
|
5959
|
-
&& ((rawObj.outbound as { deferredMaxAttempts: number }).deferredMaxAttempts) > 0
|
|
5960
|
-
? { outbound: { deferredMaxAttempts: (rawObj.outbound as { deferredMaxAttempts: number }).deferredMaxAttempts } }
|
|
5961
|
-
: {}),
|
|
5981
|
+
...(outboundConfig ? { outbound: outboundConfig } : {}),
|
|
5962
5982
|
...(parseHqConfig(rawObj.hq) ? { hq: parseHqConfig(rawObj.hq)! } : {}),
|
|
5963
5983
|
...(gateRemoteConfig ? { gateRemote: gateRemoteConfig } : {}),
|
|
5964
5984
|
cli: { helpRole: parseCliHelpRole(rawObj.cli) },
|
|
@@ -6527,6 +6547,9 @@ export function saveUserConfig(
|
|
|
6527
6547
|
},
|
|
6528
6548
|
};
|
|
6529
6549
|
const rawRest = { ...(cfg.raw ?? {}) };
|
|
6550
|
+
const rawOutbound = rawRest.outbound && typeof rawRest.outbound === 'object' && !Array.isArray(rawRest.outbound)
|
|
6551
|
+
? rawRest.outbound as Record<string, unknown> : undefined;
|
|
6552
|
+
delete rawRest.outbound;
|
|
6530
6553
|
const rawTui = rawRest.tui && typeof rawRest.tui === 'object' && !Array.isArray(rawRest.tui)
|
|
6531
6554
|
? rawRest.tui as Record<string, unknown> : {};
|
|
6532
6555
|
// projects: raw entries are kept verbatim — an invalid entry loaded from disk is preserved, not blocked (its error
|
|
@@ -6680,6 +6703,7 @@ export function saveUserConfig(
|
|
|
6680
6703
|
// picks up capability fallback 'medium' → user thinks fix
|
|
6681
6704
|
// regressed).
|
|
6682
6705
|
reasoningLevel: cfg.llm.reasoningLevel,
|
|
6706
|
+
codexTokenOwnerHost: cfg.llm.codexTokenOwnerHost,
|
|
6683
6707
|
codexReasoning: cfg.llm.codexReasoning,
|
|
6684
6708
|
goalLoop: cfg.llm.goalLoop,
|
|
6685
6709
|
memoryJudge: cfg.llm.memoryJudge,
|
|
@@ -6974,6 +6998,7 @@ export function saveUserConfig(
|
|
|
6974
6998
|
// M1-2b: sparse — emit only when explicitly set. Keeps Path-A-only
|
|
6975
6999
|
// users' file clean (no empty modelTier:{} blobs).
|
|
6976
7000
|
...(cfg.modelTier ? { modelTier: parseModelTierConfig(cfg.modelTier) } : {}),
|
|
7001
|
+
...((cfg.outbound || rawOutbound) ? { outbound: stripUndef({ ...rawOutbound, ...cfg.outbound }) } : {}),
|
|
6977
7002
|
...(cfg.sessionFabric ? { sessionFabric: cfg.sessionFabric } : {}),
|
|
6978
7003
|
...(cfg.nextFluent ? { nextFluent: cfg.nextFluent } : {}),
|
|
6979
7004
|
...(cfg.taste ? { taste: cfg.taste } : {}),
|
package/src/user-intent/types.ts
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
// PLAN: 내부 문서 `PLAN-user-intent-logging-2026-05-12` §2
|
|
4
4
|
// MANUAL: 내부 문서 `MANUAL-user-intent-logging-2026-05-12`
|
|
5
5
|
//
|
|
6
|
-
// Single shape for every user-intent signal across the
|
|
7
|
-
// (tui · pwa · ios · watch · airpods · discord · telegram) and 7
|
|
6
|
+
// Single shape for every user-intent signal across the 8 surfaces
|
|
7
|
+
// (tui · ask · pwa · ios · watch · airpods · discord · telegram) and 7
|
|
8
8
|
// layers (utterance · gesture · selection · navigation · ambient ·
|
|
9
9
|
// device_state · system). Patcher (Y3) consumes the JSONL stream as
|
|
10
10
|
// raw input; KGS card conversion happens in the Patcher, not here.
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
export type UserIntentSurface =
|
|
22
22
|
| 'unknown'
|
|
23
23
|
| 'tui'
|
|
24
|
+
| 'ask'
|
|
24
25
|
| 'pwa'
|
|
25
26
|
| 'ios'
|
|
26
27
|
| 'watch'
|
|
@@ -29,7 +30,7 @@ export type UserIntentSurface =
|
|
|
29
30
|
| 'telegram';
|
|
30
31
|
|
|
31
32
|
export const USER_INTENT_SURFACES: readonly UserIntentSurface[] = [
|
|
32
|
-
'unknown', 'tui', 'pwa', 'ios', 'watch', 'airpods', 'discord', 'telegram',
|
|
33
|
+
'unknown', 'tui', 'ask', 'pwa', 'ios', 'watch', 'airpods', 'discord', 'telegram',
|
|
33
34
|
];
|
|
34
35
|
|
|
35
36
|
export type UserIntentLayer =
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// BrowserHand 시뮬레이션 — 페이지·Linear 네트워크 경계만 대역하고 생산 coordinator와 browser-act를 부른다.
|
|
2
|
+
import {
|
|
3
|
+
dispatchBrowserHand,
|
|
4
|
+
type BrowserHandArgs,
|
|
5
|
+
type BrowserHandDeps,
|
|
6
|
+
type BrowserHandRepairNode,
|
|
7
|
+
type BrowserHandResult,
|
|
8
|
+
} from '../tool-runtime/browser-hand-runtime.js';
|
|
9
|
+
import { performBrowserAction, type BrowserActionDeps, type BrowserActionResult } from '../harness/browser-act.js';
|
|
10
|
+
import type { CdpClient, CdpEventListener } from '../browser-cdp/client.js';
|
|
11
|
+
|
|
12
|
+
export type BrowserHandScenario = 'attach' | 'paywall-fallback' | 'selection-roundtrip';
|
|
13
|
+
|
|
14
|
+
export interface BrowserHandSimulationResult {
|
|
15
|
+
scenario: BrowserHandScenario;
|
|
16
|
+
runId: string;
|
|
17
|
+
observedRunId: string | null;
|
|
18
|
+
observedBrowserActionRunIds: readonly (string | null)[];
|
|
19
|
+
result: BrowserHandResult;
|
|
20
|
+
pageReads: readonly string[];
|
|
21
|
+
browserActions: readonly string[];
|
|
22
|
+
repairNodes: readonly BrowserHandRepairNode[];
|
|
23
|
+
linear: {
|
|
24
|
+
uploads: readonly { filename: string; contentType: string; bytes: number }[];
|
|
25
|
+
attachments: readonly { issueId: string; title: string; url: string }[];
|
|
26
|
+
comments: readonly { issueId: string; body: string }[];
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const ISSUE_ID = 'c0ffee00-0000-4000-8000-000000000001';
|
|
31
|
+
const PERSONA = {
|
|
32
|
+
personaId: 'ux-sim-browser-hand',
|
|
33
|
+
displayName: 'UX simulation browser',
|
|
34
|
+
actionHosts: ['ir.example.test', 'archive.example.test'],
|
|
35
|
+
};
|
|
36
|
+
const PRIMARY_URL = 'https://ir.example.test/filing';
|
|
37
|
+
const ALTERNATE_URL = 'https://archive.example.test/filing';
|
|
38
|
+
const CAPTURE_REF = 'ux-sim://browser-hand/capture.png';
|
|
39
|
+
|
|
40
|
+
function fakeCdp(): CdpClient {
|
|
41
|
+
let lifecycleListener: CdpEventListener | undefined;
|
|
42
|
+
return {
|
|
43
|
+
port: 0,
|
|
44
|
+
pid: 0,
|
|
45
|
+
get isAlive() { return true; },
|
|
46
|
+
on(method, listener) {
|
|
47
|
+
if (method === 'Page.lifecycleEvent') lifecycleListener = listener;
|
|
48
|
+
return () => { lifecycleListener = undefined; };
|
|
49
|
+
},
|
|
50
|
+
async navigate() {
|
|
51
|
+
queueMicrotask(() => lifecycleListener?.({
|
|
52
|
+
method: 'Page.lifecycleEvent',
|
|
53
|
+
params: { name: 'load', frameId: 'ux-sim-frame', loaderId: 'ux-sim-loader' },
|
|
54
|
+
}));
|
|
55
|
+
return { frameId: 'ux-sim-frame', loaderId: 'ux-sim-loader' };
|
|
56
|
+
},
|
|
57
|
+
async screenshot() { return Buffer.from([137, 80, 78, 71]); },
|
|
58
|
+
async evaluate() { throw new Error('unexpected page evaluation; execute seam supplies click coordinates'); },
|
|
59
|
+
async setScriptExecutionDisabled(value) {
|
|
60
|
+
// Canary: BrowserHand must not disable page scripts; fail loudly if that production behavior is introduced.
|
|
61
|
+
if (value) throw new Error('BrowserHand simulation must not disable page scripts');
|
|
62
|
+
},
|
|
63
|
+
async close() {},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Run the real BrowserHand coordinator and performBrowserAction with only browser and Linear I/O faked. */
|
|
68
|
+
export async function simBrowserHand(scenario: BrowserHandScenario, linearSubtaskId = ISSUE_ID, runId = 'run-ux-sim-browser-hand'): Promise<BrowserHandSimulationResult> {
|
|
69
|
+
let observedRunId: string | null = null;
|
|
70
|
+
const observedBrowserActionRunIds: Array<string | null> = [];
|
|
71
|
+
const pageReads: string[] = [];
|
|
72
|
+
const browserActions: string[] = [];
|
|
73
|
+
const repairNodes: BrowserHandRepairNode[] = [];
|
|
74
|
+
const uploads: Array<{ filename: string; contentType: string; bytes: number }> = [];
|
|
75
|
+
const attachments: Array<{ issueId: string; title: string; url: string }> = [];
|
|
76
|
+
const comments: Array<{ issueId: string; body: string }> = [];
|
|
77
|
+
|
|
78
|
+
const args: BrowserHandArgs = {
|
|
79
|
+
url: PRIMARY_URL,
|
|
80
|
+
target: 'body',
|
|
81
|
+
armed: true,
|
|
82
|
+
linearSubtaskId,
|
|
83
|
+
persona: PERSONA.personaId,
|
|
84
|
+
...(scenario === 'paywall-fallback' ? { alternateUrl: ALTERNATE_URL } : {}),
|
|
85
|
+
...(scenario === 'selection-roundtrip'
|
|
86
|
+
? { includeThisToo: true, selection: { text: 'Revenue rose 12%', tab: 'Q3 filing' } }
|
|
87
|
+
: {}),
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const browserAct = async (request: Parameters<typeof performBrowserAction>[0], deps?: BrowserActionDeps): Promise<BrowserActionResult> => {
|
|
91
|
+
browserActions.push(request.url);
|
|
92
|
+
return performBrowserAction(request, {
|
|
93
|
+
...deps,
|
|
94
|
+
connect: async () => fakeCdp(),
|
|
95
|
+
// `performBrowserAction` uses this injected click boundary, so the fake page's evaluate must stay unused.
|
|
96
|
+
execute: async () => ({ x: 41, y: 73 }),
|
|
97
|
+
loadWaitTimeoutMs: 20,
|
|
98
|
+
captureTimeoutMs: 20,
|
|
99
|
+
reclaimOpenedTabs: false,
|
|
100
|
+
saveAttachment: async () => ({
|
|
101
|
+
ok: true,
|
|
102
|
+
entry: {
|
|
103
|
+
id: 'ux-sim-browser-hand-capture',
|
|
104
|
+
path: CAPTURE_REF,
|
|
105
|
+
filename: 'capture.png',
|
|
106
|
+
mediaType: 'image/png',
|
|
107
|
+
size: 4,
|
|
108
|
+
createdAt: 0,
|
|
109
|
+
},
|
|
110
|
+
}),
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const deps: BrowserHandDeps = {
|
|
115
|
+
browserAct,
|
|
116
|
+
confirmHuman: async () => true,
|
|
117
|
+
resolvePersona: async () => PERSONA,
|
|
118
|
+
readPageText: async url => {
|
|
119
|
+
pageReads.push(url);
|
|
120
|
+
return scenario === 'paywall-fallback' && url === PRIMARY_URL
|
|
121
|
+
? 'Subscribe to continue'
|
|
122
|
+
: 'Public filing content';
|
|
123
|
+
},
|
|
124
|
+
browserActDeps: {
|
|
125
|
+
getRunId: () => { observedRunId = runId; return runId; },
|
|
126
|
+
observe(event, data) {
|
|
127
|
+
if (event === 'repair-node') repairNodes.push(data as BrowserHandRepairNode);
|
|
128
|
+
if (event === 'executed') {
|
|
129
|
+
const row = data as { runId?: unknown };
|
|
130
|
+
observedBrowserActionRunIds.push(typeof row.runId === 'string' ? row.runId : null);
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
getApiKey: async () => 'ux-sim-fake-linear-key',
|
|
135
|
+
readCapture: async path => {
|
|
136
|
+
if (path !== CAPTURE_REF) throw new Error(`unexpected simulated capture ref: ${path}`);
|
|
137
|
+
return Buffer.from([137, 80, 78, 71]);
|
|
138
|
+
},
|
|
139
|
+
upload: async input => {
|
|
140
|
+
uploads.push({ filename: input.filename, contentType: input.contentType, bytes: input.body.byteLength });
|
|
141
|
+
return 'https://uploads.example.test/browser-hand.png';
|
|
142
|
+
},
|
|
143
|
+
attach: async input => {
|
|
144
|
+
attachments.push({ issueId: input.issueId, title: input.title, url: input.url });
|
|
145
|
+
return 'ux-sim-attachment-1';
|
|
146
|
+
},
|
|
147
|
+
reflectSelection: async input => {
|
|
148
|
+
comments.push(input);
|
|
149
|
+
return true;
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
const result = await dispatchBrowserHand(args, undefined, deps);
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
scenario,
|
|
156
|
+
runId,
|
|
157
|
+
observedRunId,
|
|
158
|
+
observedBrowserActionRunIds,
|
|
159
|
+
result,
|
|
160
|
+
pageReads,
|
|
161
|
+
browserActions,
|
|
162
|
+
repairNodes,
|
|
163
|
+
linear: { uploads, attachments, comments },
|
|
164
|
+
};
|
|
165
|
+
}
|