feat(providers): add Hoplite as a built-in provider

Bundle a `hoplite-provider` plugin that registers the `hoplite` provider
through the plugin SDK's ACP shim over `hoplite acp`, with the official
Hoplite mark as its icon. A narrow transformer turns Hoplite's
`_hoplite/run_phase` provisioning notifications into one in-place
"Hoplite workspace" timeline row per run.

Add Hoplite to the ACP provider catalog next to Devin, with the same
mark, so daemons without the bundled plugin can still install it over
ACP. The catalog hides the entry wherever the built-in is registered.

Document setup, project selection (`HOPLITE_PROJECT_ID`), and limits,
and add a real-provider daemon E2E that runs when `HOPLITE_E2E_CWD`
points at a repository linked to a Hoplite project.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Odin Glynn-Martin
2026-10-04 20:54:51 +01:00
committed by Odin Glynn-Martin
co-authored by Claude Opus 5.5
parent c062280429
commit 62a2ff4b38
22 changed files with 256 additions and 6 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
Paseo is a mobile app for monitoring and controlling your local AI coding agents from anywhere. Your dev environment, in your pocket. Connects directly to your actual development environment — your code stays on your machine.
**Supported agents:** Claude Code, Codex, GitHub Copilot, OpenCode, Pi, Antigravity, and Muse Code.
**Supported agents:** Claude Code, Codex, GitHub Copilot, OpenCode, Pi, Antigravity, Muse Code, and Hoplite.
## Repository map
+3 -2
View File
@@ -29,7 +29,7 @@
</a>
</p>
<p align="center">One interface for Claude Code, Codex, Copilot, OpenCode, Pi, Antigravity, and Muse Code agents.</p>
<p align="center">One interface for Claude Code, Codex, Copilot, OpenCode, Pi, Antigravity, Muse Code, and Hoplite agents.</p>
<p align="center">
<img src="https://paseo.sh/hero-mockup.png" alt="Paseo app screenshot" width="100%">
@@ -42,7 +42,7 @@
Run agents in parallel on your own machines. Ship from your phone or your desk.
- **Self-hosted:** Agents run on your machine with your full dev environment. Use your tools, your configs, and your skills.
- **Multi-provider:** Claude Code, Codex, Copilot, OpenCode, Pi, Antigravity, and Muse Code through the same interface. Pick the right model for each job.
- **Multi-provider:** Claude Code, Codex, Copilot, OpenCode, Pi, Antigravity, Muse Code, and Hoplite through the same interface. Pick the right model for each job.
- **Voice control:** Dictate tasks or talk through problems in voice mode. Hands-free when you need it.
- **Cross-device:** iOS, Android, desktop, web, and CLI. Start work at your desk, check in from your phone, script it from the terminal.
- **Privacy-first:** Paseo doesn't have any telemetry, tracking, or forced log-ins.
@@ -69,6 +69,7 @@ You need at least one agent CLI installed and configured with your credentials:
- [OpenCode](https://github.com/anomalyco/opencode)
- [Pi](https://pi.dev)
- [Antigravity](https://paseo.sh/docs/supported-providers#antigravity)
- [Hoplite](https://paseo.sh/docs/supported-providers#hoplite)
- [Muse Code](https://paseo.sh/docs/muse-code)
### Desktop app (recommended)
+2 -1
View File
@@ -6,7 +6,7 @@ server integrations.
## Plugin providers
Keep a bundled provider in `plugins/<id>/` and register it through
`@getpaseo/plugin/server/provider`. Antigravity and Muse Code follow this pattern. Built-in loading and SDK
`@getpaseo/plugin/server/provider`. Antigravity, Muse Code, and Hoplite follow this pattern. Built-in loading and SDK
import rules belong to [plugins.md](plugins.md#built-in-plugins); the
[public provider guide](../public-docs/plugins/providers.md) covers the provider contract.
@@ -19,6 +19,7 @@ provider icon map. You do not need a core manifest entry or provider factory.
| ----------- | ------------------------------------------ | ---------------------------------------------------------------- |
| Antigravity | Installed `agy` CLI | [Antigravity](../public-docs/supported-providers.md#antigravity) |
| Muse Code | MSP over one `muse serve` host per session | [Muse Code](../public-docs/muse-code.md) |
| Hoplite | ACP shim over `hoplite acp` | [Hoplite](../public-docs/supported-providers.md#hoplite) |
## Provider-native session options
Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

@@ -48,6 +48,8 @@ export const ACP_PROVIDER_ICON_SVGS = {
goose:
'<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24">\n <path fill="currentColor" d="M20.9093 19.3861L19.5185 18.2413C18.7624 17.619 18.1189 16.8713 17.6157 16.0313C16.9205 14.8706 15.9599 13.8912 14.8133 13.1735L14.2533 12.8475C14.0614 12.7141 13.9276 12.5062 13.9086 12.2716C13.8963 12.1204 13.9326 11.9852 14.0171 11.8662C14.3087 11.4553 15.896 9.74698 16.1722 9.51845C16.528 9.22442 16.9243 8.97987 17.2921 8.69986C17.3443 8.66 17.3968 8.62035 17.4485 8.57989C17.4503 8.57808 17.4529 8.57668 17.4545 8.57508C17.5725 8.48195 17.6838 8.383 17.7724 8.26563C18.2036 7.76631 18.195 7.3443 18.195 7.3443C18.195 7.3443 18.1954 7.3439 18.1956 7.3437C18.1497 7.23133 17.9847 6.88163 17.6492 6.71759C17.9458 6.71178 18.2805 6.82294 18.4323 6.97156C18.6148 6.68534 18.7328 6.49967 18.9162 6.18762C18.9599 6.11352 18.9831 5.97652 18.8996 5.89981C18.8996 5.89981 18.8992 5.89981 18.8988 5.89981C18.8988 5.89981 18.8988 5.8994 18.8988 5.899C18.8972 5.8974 18.8952 5.8962 18.8936 5.8946C18.892 5.893 18.891 5.89119 18.8892 5.88939C18.8892 5.88939 18.8888 5.88939 18.8884 5.88939C18.8884 5.88939 18.8884 5.88899 18.8884 5.88859C18.885 5.88518 18.8812 5.88258 18.8776 5.87938C18.8754 5.87717 18.8736 5.87457 18.8716 5.87217C18.8692 5.87016 18.8665 5.86836 18.8643 5.86616C18.8609 5.86275 18.8587 5.85855 18.8551 5.85534C18.8551 5.85534 18.8545 5.85514 18.8543 5.85534C18.8543 5.85534 18.8543 5.85494 18.8543 5.85454C18.8527 5.85294 18.8507 5.85174 18.8491 5.85013C18.8475 5.84853 18.8463 5.84653 18.8447 5.84493C18.8447 5.84493 18.8441 5.84473 18.8439 5.84493C18.8439 5.84493 18.8439 5.84453 18.8439 5.84413C18.7672 5.7606 18.6302 5.78384 18.5561 5.8275C18.1503 6.06625 17.7555 6.32322 17.3996 6.54855C17.3996 6.54855 16.9778 6.53973 16.4783 6.97116C16.3607 7.05989 16.2618 7.17125 16.1688 7.28902C16.167 7.29082 16.1654 7.29322 16.164 7.29503C16.1234 7.3465 16.0837 7.39898 16.0441 7.45145C15.7639 7.81939 15.5195 8.21556 15.2255 8.57128C14.9971 8.84768 13.2887 10.4348 12.8777 10.7264C12.7587 10.8109 12.6237 10.8474 12.4723 10.835C12.2379 10.8161 12.0298 10.6821 11.8965 10.4903L11.5704 9.93024C10.8527 8.78318 9.87332 7.82299 8.71264 7.12778C7.87262 6.62466 7.12514 5.98092 6.50264 5.22503L5.35778 3.83421C5.3013 3.76571 5.19314 3.77693 5.15268 3.85585C5.02249 4.10941 4.77393 4.64479 4.58346 5.36483C4.57885 5.38186 4.58286 5.39988 4.59407 5.4135C4.83082 5.69952 5.37901 6.32983 6.03196 6.863C6.07742 6.90005 6.04017 6.97336 5.98369 6.95774C5.42047 6.80432 4.87288 6.55796 4.46308 6.34805C4.42964 6.33103 4.38918 6.35226 4.38437 6.38951C4.32068 6.89985 4.30425 7.46027 4.37155 8.05112C4.37355 8.07035 4.38577 8.08697 4.4036 8.09479C4.87088 8.29808 5.61816 8.59311 6.40269 8.78078C6.45958 8.7944 6.45777 8.87632 6.40029 8.88733C5.78941 9.0023 5.14968 9.02794 4.62973 9.02113C4.59327 9.02073 4.56643 9.05518 4.57625 9.09023C4.6806 9.45896 4.822 9.8339 5.00847 10.2115C5.08559 10.3811 5.16951 10.5475 5.25944 10.7104C5.27486 10.7382 5.3047 10.7548 5.33655 10.7534C5.76577 10.7324 6.28452 10.6871 6.80608 10.595C6.89501 10.5794 6.94268 10.6964 6.86757 10.7466C6.51345 10.9834 6.13571 11.1873 5.7844 11.3551C5.73733 11.3777 5.72211 11.4378 5.75315 11.4797C5.96186 11.7625 6.19139 12.0301 6.44075 12.2794C6.44075 12.2794 7.66853 13.5441 7.70198 13.6432C8.41841 12.9096 9.59612 12.0964 10.8966 11.3864C9.15488 12.8036 8.18387 13.8499 7.69517 14.4444L7.35447 14.9225C7.17742 15.1708 7.02379 15.4346 6.89541 15.7112C6.46579 16.6356 5.75756 18.5051 5.75756 18.5051C5.70328 18.6515 5.74754 18.7959 5.84168 18.89C5.84388 18.8922 5.84609 18.8944 5.84849 18.8964C5.85069 18.8986 5.8527 18.901 5.8549 18.9032C5.94924 18.9976 6.09345 19.0416 6.23986 18.9874C6.23986 18.9874 8.10897 18.2791 9.03371 17.8495C9.31031 17.7211 9.57429 17.5673 9.82245 17.3905L10.349 17.0153C10.6278 16.8166 11.0096 16.8483 11.2517 17.0904L12.4655 18.3042C12.7148 18.5535 12.9824 18.7831 13.2652 18.9918C13.3073 19.0226 13.3672 19.0076 13.3898 18.9605C13.5579 18.6094 13.7618 18.2313 13.9983 17.8774C14.0486 17.8022 14.1657 17.8501 14.1499 17.9388C14.0576 18.4606 14.0127 18.9794 13.9915 19.4084C13.9899 19.44 14.0067 19.4701 14.0345 19.4855C14.1972 19.5756 14.3636 19.6595 14.5335 19.7364C14.911 19.9229 15.2862 20.0645 15.6547 20.1687C15.6897 20.1785 15.7242 20.1516 15.7238 20.1152C15.7168 19.595 15.7424 18.9553 15.8576 18.3446C15.8684 18.2869 15.9503 18.2851 15.9641 18.3422C16.1516 19.127 16.4466 19.8742 16.6501 20.3413C16.6579 20.3591 16.6744 20.3712 16.6938 20.3734C17.2847 20.4407 17.8451 20.4242 18.3554 20.3606C18.3929 20.3559 18.4141 20.3155 18.3969 20.2818C18.187 19.872 17.9406 19.3241 17.7872 18.7612C17.7718 18.7046 17.8449 18.6675 17.8819 18.713C18.4151 19.3659 19.0454 19.9141 19.3314 20.1508C19.345 20.1621 19.3633 20.1659 19.3801 20.1615C20.1003 19.9712 20.6357 19.7226 20.8891 19.5922C20.968 19.5518 20.9792 19.4436 20.9107 19.3871L20.9093 19.3861Z"/>\n</svg>\n',
grok: '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 1024 1024" fill="none">\n <path fill="currentColor" d="M395.479 633.828L735.91 381.105C752.599 368.715 776.454 373.548 784.406 392.792C826.26 494.285 807.561 616.253 724.288 699.996C641.016 783.739 525.151 802.104 419.247 760.277L303.556 814.143C469.49 928.202 670.987 899.995 796.901 773.282C896.776 672.843 927.708 535.937 898.785 412.476L899.047 412.739C857.105 231.37 909.358 158.874 1016.4 10.6326C1018.93 7.11771 1021.47 3.60279 1024 0L883.144 141.651V141.212L395.392 633.916"/>\n <path fill="currentColor" d="M325.226 695.251C206.128 580.84 226.662 403.776 328.285 301.668C403.431 226.097 526.549 195.254 634.026 240.596L749.454 186.994C728.657 171.88 702.007 155.623 671.424 144.2C533.19 86.9942 367.693 115.465 255.323 228.382C147.234 337.081 113.244 504.215 171.613 646.833C215.216 753.423 143.739 828.818 71.7385 904.916C46.2237 931.893 20.6216 958.87 0 987.429L325.139 695.339"/>\n</svg>\n',
hoplite:
'<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 -41.5 168 168" fill="none">\n<path d="M165.642 84.8565H158.118C157.544 84.8565 157.078 84.3907 157.078 83.8162V80.7201C157.078 80.3359 156.866 79.983 156.527 79.8022L143.081 72.6307C142.37 72.252 142.341 71.2449 143.028 70.8253L150.104 66.5006C150.53 66.2408 151.079 66.3189 151.415 66.6869L166.41 83.115C167.02 83.7827 166.546 84.8565 165.642 84.8565Z" fill="currentColor"/>\n<path d="M138.319 59.226L127.839 58.9642H53.804C53.6196 58.9642 53.4385 59.0132 53.2793 59.1063L20.2869 78.3834L14.7776 81.3261C14.439 81.507 14.2275 81.8597 14.2275 82.2436V83.808C14.2275 84.3857 13.7568 84.8528 13.1791 84.8482L2.28806 84.7626C1.39507 84.7556 0.925459 83.7007 1.51785 83.0324L25.9364 55.4869C25.986 55.4309 26.0295 55.3697 26.066 55.3043L29.36 49.4108C29.8762 48.4872 28.8444 47.4724 27.9295 48.0038L19.6157 52.8328C13.2683 56.5196 5.13866 54.4694 1.29881 48.2133L0.153672 46.3476C0.0531892 46.1839 0 45.9956 0 45.8035V25.9642C0 24.8289 1.55934 24.5146 1.99917 25.5612L6.37353 35.97C8.79413 41.7298 15.7102 44.0714 21.1321 40.9668L32.2092 34.624C32.5305 34.44 32.7298 34.0991 32.7325 33.7289L32.7605 29.8871C32.7663 29.0864 31.9032 28.5796 31.2069 28.9748L18.5022 36.1854C15.8352 37.699 12.4443 36.5885 11.1894 33.7905L0.0910985 9.04488C0.031046 8.91098 4.11494e-06 8.76589 1.20745e-05 8.61915L0.000419757 1.10282C0.000449406 0.556184 0.44359 0.113067 0.990222 0.113067C9.75588 0.113067 18.4875 1.20395 26.9837 3.36057L38.7291 6.34193C39.3865 6.5088 40.0252 6.01197 40.0252 5.33369V0.872775C40.0252 0.4532 40.3653 0.113067 40.7849 0.113067C48.1954 0.113067 55.4203 2.43158 61.447 6.74371L74.9799 16.4265C75.1564 16.5529 75.3681 16.6208 75.5852 16.6208H88.3801C88.9546 16.6208 89.4203 16.1551 89.4203 15.5806V13.9863C89.4203 13.4118 88.9546 12.9461 88.3801 12.9461H75.7621C74.7167 12.9461 74.3245 11.577 75.2114 11.0235L83.2179 6.02657C89.5285 2.08806 96.818 0 104.257 0C111.21 0 118.042 1.82471 124.07 5.29182L126.474 6.67485C127.148 7.06209 127.174 8.02376 126.524 8.44791L116.021 15.2954C115.726 15.4874 115.548 15.8152 115.548 16.1668V19.6916C115.548 20.0588 115.355 20.3989 115.039 20.5863L111.542 22.6598C110.613 23.2109 109.564 22.1556 110.12 21.2295L110.584 20.4579C111 19.7646 110.501 18.8821 109.692 18.8821H105.243C104.131 18.8821 103.795 20.393 104.803 20.8645L108.528 22.6076C109.275 22.9573 109.337 23.996 108.637 24.4324L101.859 28.6585C101.694 28.7615 101.503 28.8161 101.309 28.8161H98.2915C97.7251 28.8161 97.266 29.2752 97.266 29.8416C97.266 30.408 97.7251 30.8672 98.2915 30.8672H103.861C104.048 30.8672 104.232 30.8168 104.392 30.7213L146.474 5.72225C151.426 2.78084 157.761 3.71042 161.658 7.95031C161.737 8.03645 161.781 8.1492 161.781 8.26621V11.3862C161.781 12.2892 162.853 12.7633 163.521 12.1558L166.26 9.66601C166.928 9.05855 168 9.53265 168 10.4357V44.8083C168 45.3828 167.534 45.8485 166.96 45.8485H162.27C161.96 45.8485 161.667 45.7106 161.469 45.4723L151.582 33.5514C151.176 33.0612 150.428 33.0481 150.005 33.5237L141.76 42.7837C141.337 43.2597 141.437 44.0013 141.971 44.3481L158.788 55.2561C159.436 55.6767 159.416 56.6325 158.75 57.0249L132.549 72.4643C131.877 72.8607 131.024 72.4024 130.983 71.6228L130.61 64.5475C130.579 63.9524 131.053 63.4526 131.649 63.4526H135.878C136.133 63.4526 136.379 63.3591 136.569 63.1899L138.984 61.0433C139.69 60.4163 139.263 59.2495 138.319 59.226Z" fill="currentColor"/>\n<path d="M75.1697 62.1866H60.8352C60.6502 62.1866 60.4686 62.2359 60.3091 62.3295L43.8303 71.9906C43.1099 72.4129 43.1558 73.4693 43.9101 73.8275L58.7045 80.854C59.0673 81.0263 59.2984 81.3921 59.2984 81.7937V83.8162C59.2984 84.3907 59.7641 84.8565 60.3386 84.8565H69.0808C69.9832 84.8565 70.4575 83.7862 69.8515 83.1176L61.5235 73.9306C61.0809 73.4423 61.1982 72.6706 61.766 72.3359L75.698 64.1229C76.6105 63.585 76.229 62.1866 75.1697 62.1866Z" fill="currentColor"/>\n</svg>\n',
junie:
'<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 40 40" fill="none">\n <path d="M25 15H35V16.75C35 29 30.5001 35 16.5001 35H15V25H16.5001C22.6251 25 25 22.875 25 16.75V15Z" fill="currentColor"/>\n <rect x="5" y="15" width="10" height="10" fill="currentColor"/>\n <rect x="15" y="5" width="10" height="10" fill="currentColor"/>\n</svg>\n',
kilo: '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 40 40">\n <path fill="currentColor" d="M27.9998324,34.6666921h6.6666279v5.3333023h-8.3809037l-3.6190266-3.6190266v-8.3809037h5.3333023v6.6666279ZM39.9997627,26.2857884l-3.6190266-3.6190266h-8.3809037v5.3333023h6.6666279v6.6666279h5.3333023v-8.3809037ZM17.3332326,22.6667578h-5.3333023v5.3333023h5.3333023v-5.3333023ZM0,36.3809638l3.6190266,3.6190266h13.714206v-5.3333023H5.3333023v-11.9999302H0v13.714206ZM33.9600959,11.9999247V3.619021L30.3410693-.0000056h-7.6745392v5.3333023h5.9602634v6.6666279h-5.9602634v5.3333023h17.3332326v-5.3333023h-6.0396668ZM5.3333023,0H0v17.3332326h5.3333023v-5.9999651h6.6666279v5.9999651h5.3333023v-5.9999651l-5.3333023-5.3333023h-6.6666279V0ZM17.3332326,0h-5.3333023v5.9999651h5.3333023V0Z"/>\n</svg>\n',
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 -41.5 168 168" fill="none">
<path d="M165.642 84.8565H158.118C157.544 84.8565 157.078 84.3907 157.078 83.8162V80.7201C157.078 80.3359 156.866 79.983 156.527 79.8022L143.081 72.6307C142.37 72.252 142.341 71.2449 143.028 70.8253L150.104 66.5006C150.53 66.2408 151.079 66.3189 151.415 66.6869L166.41 83.115C167.02 83.7827 166.546 84.8565 165.642 84.8565Z" fill="currentColor"/>
<path d="M138.319 59.226L127.839 58.9642H53.804C53.6196 58.9642 53.4385 59.0132 53.2793 59.1063L20.2869 78.3834L14.7776 81.3261C14.439 81.507 14.2275 81.8597 14.2275 82.2436V83.808C14.2275 84.3857 13.7568 84.8528 13.1791 84.8482L2.28806 84.7626C1.39507 84.7556 0.925459 83.7007 1.51785 83.0324L25.9364 55.4869C25.986 55.4309 26.0295 55.3697 26.066 55.3043L29.36 49.4108C29.8762 48.4872 28.8444 47.4724 27.9295 48.0038L19.6157 52.8328C13.2683 56.5196 5.13866 54.4694 1.29881 48.2133L0.153672 46.3476C0.0531892 46.1839 0 45.9956 0 45.8035V25.9642C0 24.8289 1.55934 24.5146 1.99917 25.5612L6.37353 35.97C8.79413 41.7298 15.7102 44.0714 21.1321 40.9668L32.2092 34.624C32.5305 34.44 32.7298 34.0991 32.7325 33.7289L32.7605 29.8871C32.7663 29.0864 31.9032 28.5796 31.2069 28.9748L18.5022 36.1854C15.8352 37.699 12.4443 36.5885 11.1894 33.7905L0.0910985 9.04488C0.031046 8.91098 4.11494e-06 8.76589 1.20745e-05 8.61915L0.000419757 1.10282C0.000449406 0.556184 0.44359 0.113067 0.990222 0.113067C9.75588 0.113067 18.4875 1.20395 26.9837 3.36057L38.7291 6.34193C39.3865 6.5088 40.0252 6.01197 40.0252 5.33369V0.872775C40.0252 0.4532 40.3653 0.113067 40.7849 0.113067C48.1954 0.113067 55.4203 2.43158 61.447 6.74371L74.9799 16.4265C75.1564 16.5529 75.3681 16.6208 75.5852 16.6208H88.3801C88.9546 16.6208 89.4203 16.1551 89.4203 15.5806V13.9863C89.4203 13.4118 88.9546 12.9461 88.3801 12.9461H75.7621C74.7167 12.9461 74.3245 11.577 75.2114 11.0235L83.2179 6.02657C89.5285 2.08806 96.818 0 104.257 0C111.21 0 118.042 1.82471 124.07 5.29182L126.474 6.67485C127.148 7.06209 127.174 8.02376 126.524 8.44791L116.021 15.2954C115.726 15.4874 115.548 15.8152 115.548 16.1668V19.6916C115.548 20.0588 115.355 20.3989 115.039 20.5863L111.542 22.6598C110.613 23.2109 109.564 22.1556 110.12 21.2295L110.584 20.4579C111 19.7646 110.501 18.8821 109.692 18.8821H105.243C104.131 18.8821 103.795 20.393 104.803 20.8645L108.528 22.6076C109.275 22.9573 109.337 23.996 108.637 24.4324L101.859 28.6585C101.694 28.7615 101.503 28.8161 101.309 28.8161H98.2915C97.7251 28.8161 97.266 29.2752 97.266 29.8416C97.266 30.408 97.7251 30.8672 98.2915 30.8672H103.861C104.048 30.8672 104.232 30.8168 104.392 30.7213L146.474 5.72225C151.426 2.78084 157.761 3.71042 161.658 7.95031C161.737 8.03645 161.781 8.1492 161.781 8.26621V11.3862C161.781 12.2892 162.853 12.7633 163.521 12.1558L166.26 9.66601C166.928 9.05855 168 9.53265 168 10.4357V44.8083C168 45.3828 167.534 45.8485 166.96 45.8485H162.27C161.96 45.8485 161.667 45.7106 161.469 45.4723L151.582 33.5514C151.176 33.0612 150.428 33.0481 150.005 33.5237L141.76 42.7837C141.337 43.2597 141.437 44.0013 141.971 44.3481L158.788 55.2561C159.436 55.6767 159.416 56.6325 158.75 57.0249L132.549 72.4643C131.877 72.8607 131.024 72.4024 130.983 71.6228L130.61 64.5475C130.579 63.9524 131.053 63.4526 131.649 63.4526H135.878C136.133 63.4526 136.379 63.3591 136.569 63.1899L138.984 61.0433C139.69 60.4163 139.263 59.2495 138.319 59.226Z" fill="currentColor"/>
<path d="M75.1697 62.1866H60.8352C60.6502 62.1866 60.4686 62.2359 60.3091 62.3295L43.8303 71.9906C43.1099 72.4129 43.1558 73.4693 43.9101 73.8275L58.7045 80.854C59.0673 81.0263 59.2984 81.3921 59.2984 81.7937V83.8162C59.2984 84.3907 59.7641 84.8565 60.3386 84.8565H69.0808C69.9832 84.8565 70.4575 83.7862 69.8515 83.1176L61.5235 73.9306C61.0809 73.4423 61.1982 72.6706 61.766 72.3359L75.698 64.1229C76.6105 63.585 76.229 62.1866 75.1697 62.1866Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

@@ -238,6 +238,15 @@ const CATALOG_DATA = [
installLink: "https://hermes-agent.nousresearch.com/docs/user-guide/features/acp",
command: ["hermes", "acp"],
},
{
id: "hoplite",
title: "Hoplite",
description: "Hoplite's coding agent through the local hoplite acp bridge",
version: "manual",
iconId: "hoplite",
installLink: "https://hoplite.sh/docs/cli/acp",
command: ["hoplite", "acp"],
},
{
id: "junie",
title: "Junie",
@@ -44,6 +44,7 @@ describe("ACP provider catalog", () => {
expect(findProvider("codewhale").command).toEqual(["codewhale", "serve", "--acp"]);
expect(findProvider("devin").command).toEqual(["devin", "acp"]);
expect(findProvider("goose").command).toEqual(["goose", "acp"]);
expect(findProvider("hoplite").command).toEqual(["hoplite", "acp"]);
expect(findProvider("junie").command).toEqual(["junie", "--acp", "true"]);
expect(findProvider("kiro").command).toEqual(["kiro-cli", "acp"]);
expect(findProvider("poolside").command).toEqual(["pool", "acp"]);
@@ -59,6 +60,15 @@ describe("ACP provider catalog", () => {
expect(findProvider("minimax-code").iconSvg).toContain("<svg");
});
it("offers Hoplite through its local ACP bridge with the Hoplite mark", () => {
expect(findProvider("hoplite")).toMatchObject({
title: "Hoplite",
command: ["hoplite", "acp"],
installLink: "https://hoplite.sh/docs/cli/acp",
});
expect(findProvider("hoplite").iconSvg).toContain('fill="currentColor"');
});
it("maps a catalog entry to the daemon provider config patch", () => {
expect(buildAcpProviderConfigPatch(findProvider("amp-acp"))).toEqual({
providers: {
@@ -165,3 +165,52 @@ test("Antigravity creates an agent and answers a prompt with real agy", async ({
await rm(cwd, { recursive: true, force: true });
}
}, 120000);
// Hoplite selects its project from the GitHub repository of the session directory, so this test
// needs a checkout of a repository linked to a Hoplite project.
test("Hoplite creates an agent and answers a prompt with real hoplite acp", async ({ skip }) => {
const command = await findExecutable(process.env.HOPLITE_COMMAND ?? "hoplite");
const cwd = process.env.HOPLITE_E2E_CWD;
if (command === null || !cwd) {
skip("hoplite is not resolvable or HOPLITE_E2E_CWD is unset");
return;
}
const daemon = await createTestPaseoDaemon({
agentClients: {},
mcpEnabled: false,
builtinPlugins: new BuiltinPluginLoader(undefined, ["hoplite-provider"]),
providerOverrides: { hoplite: { command: [command, "acp"], paseoTools: { enabled: false } } },
});
const client = new DaemonClient({
url: `ws://127.0.0.1:${daemon.port}/ws`,
appVersion: "0.11.0",
});
try {
await client.connect();
await client.fetchAgents({ subscribe: {} });
await expect
.poll(
async () => {
const snapshot = await client.getProvidersSnapshot({ cwd });
return snapshot.entries.find((entry) => entry.provider === "hoplite")?.status;
},
{ timeout: 60000 },
)
.toBe("ready");
const agent = await client.createAgent({ provider: "hoplite", cwd, title: "Hoplite E2E" });
await client.sendMessage(agent.id, "Reply with exactly HOPLITE_E2E_OK. No tools.");
const result = await client.waitForFinish(agent.id, 180000);
expect(result.status).toBe("idle");
const items = (await client.fetchAgentTimeline(agent.id, { limit: 100 })).entries.map(
(entry) => entry.item,
);
expect(
items.some(
(item) => item.type === "assistant_message" && item.text.includes("HOPLITE_E2E_OK"),
),
).toBe(true);
} finally {
await client.close();
await daemon.close();
}
}, 240000);
@@ -9,6 +9,7 @@ export const builtinPlugins = [
"copilot-usage-source",
"cursor-usage-source",
"grok-usage-source",
"hoplite-provider",
"kimi-usage-source",
"minimax-usage-source",
"muse-provider",
+5
View File
@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -41.5 168 168" fill="none">
<path d="M165.642 84.8565H158.118C157.544 84.8565 157.078 84.3907 157.078 83.8162V80.7201C157.078 80.3359 156.866 79.983 156.527 79.8022L143.081 72.6307C142.37 72.252 142.341 71.2449 143.028 70.8253L150.104 66.5006C150.53 66.2408 151.079 66.3189 151.415 66.6869L166.41 83.115C167.02 83.7827 166.546 84.8565 165.642 84.8565Z" fill="currentColor"/>
<path d="M138.319 59.226L127.839 58.9642H53.804C53.6196 58.9642 53.4385 59.0132 53.2793 59.1063L20.2869 78.3834L14.7776 81.3261C14.439 81.507 14.2275 81.8597 14.2275 82.2436V83.808C14.2275 84.3857 13.7568 84.8528 13.1791 84.8482L2.28806 84.7626C1.39507 84.7556 0.925459 83.7007 1.51785 83.0324L25.9364 55.4869C25.986 55.4309 26.0295 55.3697 26.066 55.3043L29.36 49.4108C29.8762 48.4872 28.8444 47.4724 27.9295 48.0038L19.6157 52.8328C13.2683 56.5196 5.13866 54.4694 1.29881 48.2133L0.153672 46.3476C0.0531892 46.1839 0 45.9956 0 45.8035V25.9642C0 24.8289 1.55934 24.5146 1.99917 25.5612L6.37353 35.97C8.79413 41.7298 15.7102 44.0714 21.1321 40.9668L32.2092 34.624C32.5305 34.44 32.7298 34.0991 32.7325 33.7289L32.7605 29.8871C32.7663 29.0864 31.9032 28.5796 31.2069 28.9748L18.5022 36.1854C15.8352 37.699 12.4443 36.5885 11.1894 33.7905L0.0910985 9.04488C0.031046 8.91098 4.11494e-06 8.76589 1.20745e-05 8.61915L0.000419757 1.10282C0.000449406 0.556184 0.44359 0.113067 0.990222 0.113067C9.75588 0.113067 18.4875 1.20395 26.9837 3.36057L38.7291 6.34193C39.3865 6.5088 40.0252 6.01197 40.0252 5.33369V0.872775C40.0252 0.4532 40.3653 0.113067 40.7849 0.113067C48.1954 0.113067 55.4203 2.43158 61.447 6.74371L74.9799 16.4265C75.1564 16.5529 75.3681 16.6208 75.5852 16.6208H88.3801C88.9546 16.6208 89.4203 16.1551 89.4203 15.5806V13.9863C89.4203 13.4118 88.9546 12.9461 88.3801 12.9461H75.7621C74.7167 12.9461 74.3245 11.577 75.2114 11.0235L83.2179 6.02657C89.5285 2.08806 96.818 0 104.257 0C111.21 0 118.042 1.82471 124.07 5.29182L126.474 6.67485C127.148 7.06209 127.174 8.02376 126.524 8.44791L116.021 15.2954C115.726 15.4874 115.548 15.8152 115.548 16.1668V19.6916C115.548 20.0588 115.355 20.3989 115.039 20.5863L111.542 22.6598C110.613 23.2109 109.564 22.1556 110.12 21.2295L110.584 20.4579C111 19.7646 110.501 18.8821 109.692 18.8821H105.243C104.131 18.8821 103.795 20.393 104.803 20.8645L108.528 22.6076C109.275 22.9573 109.337 23.996 108.637 24.4324L101.859 28.6585C101.694 28.7615 101.503 28.8161 101.309 28.8161H98.2915C97.7251 28.8161 97.266 29.2752 97.266 29.8416C97.266 30.408 97.7251 30.8672 98.2915 30.8672H103.861C104.048 30.8672 104.232 30.8168 104.392 30.7213L146.474 5.72225C151.426 2.78084 157.761 3.71042 161.658 7.95031C161.737 8.03645 161.781 8.1492 161.781 8.26621V11.3862C161.781 12.2892 162.853 12.7633 163.521 12.1558L166.26 9.66601C166.928 9.05855 168 9.53265 168 10.4357V44.8083C168 45.3828 167.534 45.8485 166.96 45.8485H162.27C161.96 45.8485 161.667 45.7106 161.469 45.4723L151.582 33.5514C151.176 33.0612 150.428 33.0481 150.005 33.5237L141.76 42.7837C141.337 43.2597 141.437 44.0013 141.971 44.3481L158.788 55.2561C159.436 55.6767 159.416 56.6325 158.75 57.0249L132.549 72.4643C131.877 72.8607 131.024 72.4024 130.983 71.6228L130.61 64.5475C130.579 63.9524 131.053 63.4526 131.649 63.4526H135.878C136.133 63.4526 136.379 63.3591 136.569 63.1899L138.984 61.0433C139.69 60.4163 139.263 59.2495 138.319 59.226Z" fill="currentColor"/>
<path d="M75.1697 62.1866H60.8352C60.6502 62.1866 60.4686 62.2359 60.3091 62.3295L43.8303 71.9906C43.1099 72.4129 43.1558 73.4693 43.9101 73.8275L58.7045 80.854C59.0673 81.0263 59.2984 81.3921 59.2984 81.7937V83.8162C59.2984 84.3907 59.7641 84.8565 60.3386 84.8565H69.0808C69.9832 84.8565 70.4575 83.7862 69.8515 83.1176L61.5235 73.9306C61.0809 73.4423 61.1982 72.6706 61.766 72.3359L75.698 64.1229C76.6105 63.585 76.229 62.1866 75.1697 62.1866Z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

+7
View File
@@ -0,0 +1,7 @@
import type { PluginServerContext } from "@getpaseo/plugin/server";
import { createHopliteProvider } from "./server/provider.js";
export default function contribute(server: PluginServerContext) {
server.registerProvider(createHopliteProvider());
return () => {};
}
@@ -0,0 +1 @@
{ "id": "hoplite-provider", "requirements": { "paseo": ">=0.11.0" } }
@@ -0,0 +1,14 @@
import { runAcpProvider } from "@getpaseo/plugin/server/acp";
import type { ProviderRegistration } from "@getpaseo/plugin/server/provider";
import { runPhaseTransformer } from "./run-phase.js";
export function createHopliteProvider(): ProviderRegistration {
return runAcpProvider({
id: "hoplite",
label: "Hoplite",
description: "Hoplite's coding agent through the local `hoplite acp` bridge",
icon: "icon.svg",
command: ["hoplite", "acp"],
transformers: [runPhaseTransformer],
});
}
@@ -0,0 +1,74 @@
import { describe, expect, it } from "vitest";
import { runPhaseTransformer } from "./run-phase.js";
const context = { sessionId: "session-1" };
// Frames captured from `hoplite acp` 3.0.0.
function runPhase(phase: string | null, label: string | null) {
return {
method: "_hoplite/run_phase",
params: {
sessionId: "thr_c75d39f7d7624256af918eeee2f4941b",
runId: "run_eb213b97bd3147afb2927fbc27f87180",
phase,
label,
startedAt: phase === null ? null : "2026-10-04T17:51:46.311Z",
},
};
}
describe("runPhaseTransformer", () => {
it("shows a provisioning phase as one running workspace item per run", () => {
const update = runPhaseTransformer.notification?.(
runPhase("fetching_repository", "Cloning repository"),
context,
);
expect(update).toEqual({
type: "timeline",
item: {
type: "tool_call",
id: "hoplite-run-phase:run_eb213b97bd3147afb2927fbc27f87180",
callId: "hoplite-run-phase:run_eb213b97bd3147afb2927fbc27f87180",
name: "Hoplite workspace",
detail: { type: "plain_text", label: "Cloning repository", icon: "wrench" },
status: "running",
error: null,
},
});
});
it("completes the same item when the run leaves provisioning", () => {
const update = runPhaseTransformer.notification?.(runPhase(null, null), context);
expect(update).toMatchObject({
type: "timeline",
item: {
id: "hoplite-run-phase:run_eb213b97bd3147afb2927fbc27f87180",
status: "completed",
detail: { label: "Workspace ready" },
},
});
});
it("falls back to the phase name when Hoplite sends no label", () => {
const update = runPhaseTransformer.notification?.(
runPhase("configuring_workspace", null),
context,
);
expect(update).toMatchObject({ item: { detail: { label: "configuring_workspace" } } });
});
it("ignores other vendor notifications and malformed phases", () => {
expect(
runPhaseTransformer.notification?.({ method: "_hoplite/other", params: {} }, context),
).toBeNull();
expect(
runPhaseTransformer.notification?.(
{ method: "_hoplite/run_phase", params: { phase: "x" } },
context,
),
).toBeNull();
});
});
@@ -0,0 +1,39 @@
import type { AcpTransformer } from "@getpaseo/plugin/server/acp";
import { z } from "zod";
// Hoplite provisions a cloud workspace before the first agent output of a run and reports each
// step as `_hoplite/run_phase`. A null phase ends provisioning for that run.
const runPhaseSchema = z.object({
runId: z.string().min(1),
phase: z.string().nullable(),
label: z.string().nullable(),
});
const RUN_PHASE_METHOD = "_hoplite/run_phase";
export const runPhaseTransformer: AcpTransformer = {
notification(notification) {
if (notification.method !== RUN_PHASE_METHOD) return null;
const params = runPhaseSchema.safeParse(notification.params);
if (!params.success) return null;
const { runId, phase, label } = params.data;
const id = `hoplite-run-phase:${runId}`;
const running = phase !== null;
return {
type: "timeline",
item: {
type: "tool_call",
id,
callId: id,
name: "Hoplite workspace",
detail: {
type: "plain_text",
label: running ? (label ?? phase) : "Workspace ready",
icon: "wrench",
},
status: running ? "running" : "completed",
error: null,
},
};
},
};
+2 -2
View File
@@ -8,7 +8,7 @@ category: Providers
# Providers
Paseo doesn't ship its own coding agent. It launches and supervises **existing CLIs you've already installed and authenticated**, Claude Code, Codex, OpenCode, Antigravity, Muse Code, Cursor, Gemini, and the rest. Your subscriptions, your config, your skills, your MCP servers all stay intact. Paseo just gives you a UI, a CLI, a relay, and orchestration on top.
Paseo doesn't ship its own coding agent. It launches and supervises **existing CLIs you've already installed and authenticated**, Claude Code, Codex, OpenCode, Antigravity, Muse Code, Hoplite, Cursor, Gemini, and the rest. Your subscriptions, your config, your skills, your MCP servers all stay intact. Paseo just gives you a UI, a CLI, a relay, and orchestration on top.
## Mental model
@@ -16,7 +16,7 @@ A provider is the contract between Paseo and one external agent CLI: how to laun
## Two tiers
- **Native support**, Paseo ships a bundled adapter for the major agents (Claude Code, Codex, OpenCode, Pi, [Antigravity](/docs/supported-providers#antigravity), [Muse Code](/docs/muse-code)). Auto-discovered when the underlying CLI is installed, with mode metadata and voice support where applicable.
- **Native support**, Paseo ships a bundled adapter for the major agents (Claude Code, Codex, OpenCode, Pi, [Antigravity](/docs/supported-providers#antigravity), [Muse Code](/docs/muse-code), [Hoplite](/docs/supported-providers#hoplite)). Auto-discovered when the underlying CLI is installed, with mode metadata and voice support where applicable.
- **ACP catalog**, any agent speaking the [Agent Client Protocol](https://agentclientprotocol.com) is supported through a generic adapter. Paseo ships a curated catalog of one-click installs (Cursor, Gemini, GitHub Copilot, Hermes, Kimi, Qwen Code, and 25+ more), and you can add any other ACP agent yourself.
Either way, **you install the underlying CLI**. Paseo runs it.
+32
View File
@@ -20,6 +20,7 @@ Work out of the box once the underlying CLI is installed and authenticated.
- [Pi](https://pi.dev). Minimal terminal-based coding agent with multi-provider LLM support.
- [Antigravity](#antigravity). Uses your installed `agy` CLI through a built-in provider plugin.
- [Muse Code](/docs/muse-code). Meta's terminal coding agent, bundled as a provider plugin.
- [Hoplite](#hoplite). Uses your installed `hoplite` CLI through a built-in provider plugin.
### Antigravity
@@ -58,6 +59,37 @@ for provider-specific environment variables:
See [Custom providers](/docs/custom-providers) for command and environment overrides.
### Hoplite
Install the Hoplite CLI on your daemon host with `brew install carboncopyinc/tap/hoplite`, then run
`hoplite login`. Pick **Hoplite** in Paseo. The provider ships with Paseo and talks to Hoplite
through `hoplite acp`; no separate plugin install is required.
Hoplite runs the agent in a cloud workspace for a Hoplite project. The project comes from the
GitHub repository of the agent's directory, so open a repository that is linked to a Hoplite
project. In any other directory Hoplite reports `No Hoplite project`, and the Hoplite row in
**Settings → Providers** shows that error for the daemon's own directory. To use one project
everywhere, set its ID:
```json
{
"agents": {
"providers": {
"hoplite": {
"env": { "HOPLITE_PROJECT_ID": "your-project-id" }
}
}
}
}
```
Models come from your Hoplite organization. While Hoplite prepares the workspace, the chat shows
one **Hoplite workspace** row with the current step. Conversations resume after a daemon restart.
Paseo MCP tools are unavailable because the agent runs in Hoplite's workspace, not on your host;
Hoplite's own tools, including its subagents, still work.
Override `command` if `hoplite` is outside your daemon's PATH. Keep `acp` in the arguments.
## ACP catalog
Pick any of these from the in-app provider catalog. Each entry is a one-click install of the underlying CLI.