feat(rpc): add validated desktop Pi RPC command palette

This commit is contained in:
2026-08-24 20:16:51 +02:00
parent 475f95ba70
commit 99084cc5a5
25 changed files with 2170 additions and 344 deletions
+247 -5
View File
@@ -448,8 +448,18 @@ select:focus-visible {
}
.message.assistant {
margin-right: 12px;
border-color: #505050;
background: #353535;
border-color: #496983;
background: #253544;
}
.message.tool,
.message.toolResult {
margin-right: 12px;
border-color: #2d8372;
background: #193936;
}
.message.error {
border-color: #bf6570;
background: #44282d;
}
.message strong {
display: block;
@@ -461,6 +471,16 @@ select:focus-visible {
.message.user strong {
color: #ffc170;
}
.message.assistant strong {
color: #b9d9ff;
}
.message.tool strong,
.message.toolResult strong {
color: #a9f2df;
}
.message.error strong {
color: #ffd7db;
}
.message pre {
margin: 0;
white-space: pre-wrap;
@@ -469,6 +489,30 @@ select:focus-visible {
font-size: 13px;
line-height: 1.32;
}
.tool-result summary {
display: flex;
align-items: center;
justify-content: space-between;
cursor: pointer;
list-style: none;
color: #a9f2df;
font-size: 10px;
font-weight: 700;
text-transform: uppercase;
}
.tool-result summary::-webkit-details-marker {
display: none;
}
.tool-result summary::after {
content: "▾";
font-size: 14px;
}
.tool-result[open] summary::after {
content: "▴";
}
.tool-result[open] summary {
margin-bottom: 6px;
}
.pending-message {
border-style: dashed;
}
@@ -529,6 +573,34 @@ select:focus-visible {
align-items: center;
font-size: 10px;
}
.pi-controls select {
min-width: 0;
appearance: none;
color-scheme: dark;
padding: 5px 25px 5px 6px;
border: 1px solid #70522f;
border-radius: 4px;
background: #2c2a27
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='m1 1 5 5 5-5' fill='none' stroke='%23f0a347' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'/%3E%3C/svg%3E")
no-repeat right 7px center;
color: #f2ece4;
}
.pi-controls select:hover {
border-color: #d88735;
background-color: #383129;
}
.pi-controls select:focus {
border-color: #f0a347;
box-shadow: 0 0 0 2px rgba(240, 163, 71, 0.22);
}
.pi-controls select option {
background: #2c2a27;
color: #f2ece4;
}
.pi-controls select option:checked {
background: #4b3420;
color: #fff2df;
}
.composer-progress {
display: flex;
align-items: center;
@@ -582,12 +654,94 @@ select:focus-visible {
display: flex;
gap: 7px;
}
.default-worktree-control {
display: grid;
gap: 4px;
margin: 8px 0;
color: #ddd8d0;
font-size: 11px;
font-weight: 700;
}
.default-worktree-control select {
min-width: 0;
appearance: none;
color-scheme: dark;
padding: 5px 28px 5px 7px;
border: 1px solid #70522f;
border-radius: 4px;
background: #2c2a27
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='m1 1 5 5 5-5' fill='none' stroke='%23f0a347' stroke-linecap='round' stroke-linejoin='round' stroke-width='2'/%3E%3C/svg%3E")
no-repeat right 8px center;
color: #f2ece4;
}
.default-worktree-control select:hover {
border-color: #d88735;
background-color: #383129;
}
.default-worktree-control select:focus {
border-color: #f0a347;
box-shadow: 0 0 0 2px rgba(240, 163, 71, 0.22);
}
.default-worktree-control option {
background: #2c2a27;
color: #f2ece4;
}
.default-worktree-control option:checked {
background: #4b3420;
color: #fff2df;
}
.default-worktree-control small {
color: #b9afa4;
font-weight: 400;
}
.extension-widget {
padding: 5px 8px;
border-left: 3px solid #f0a347;
background: #302a24;
font-size: 12px;
}
.startup-blocker {
position: absolute;
z-index: 20;
inset: 0;
display: grid;
place-items: center;
padding: 20px;
background: rgba(20, 18, 16, 0.82);
backdrop-filter: blur(3px);
outline: 0;
}
.startup-blocker-card {
display: flex;
align-items: center;
gap: 12px;
width: min(380px, 90vw);
padding: 16px;
border: 1px solid #f0a347;
border-radius: 8px;
background: #33271d;
box-shadow: 0 12px 36px rgba(0, 0, 0, 0.45);
color: #ffd9aa;
}
.startup-blocker-card > div {
display: grid;
gap: 3px;
}
.startup-blocker-card strong {
color: #fff2df;
font-size: 14px;
}
.startup-blocker-card p {
margin: 0;
font-weight: 700;
}
.startup-blocker-card small {
color: #d8b892;
}
.startup-bars {
flex: 0 0 auto;
transform: scale(1.35);
}
.modal-backdrop,
.extension-backdrop {
position: absolute;
@@ -611,6 +765,9 @@ select:focus-visible {
border-radius: 10px;
background: #2d2e31;
}
.session-picker {
overflow: hidden;
}
.picker-heading {
display: flex;
justify-content: space-between;
@@ -619,20 +776,105 @@ select:focus-visible {
.extension h2 {
margin: 0;
}
.session-search input {
box-sizing: border-box;
width: 100%;
padding: 8px 10px;
border: 1px solid #5f6570;
border-radius: 6px;
background: #202125;
color: #f1f3f4;
}
.session-result-count {
margin: 0;
color: #8d97a6;
font-size: 0.85rem;
}
.session-list {
display: grid;
gap: 5px;
gap: 6px;
max-height: min(44vh, 430px);
margin: 0;
padding: 0;
overflow-y: auto;
list-style: none;
}
.session-list button {
.session-row {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
gap: 12px;
padding: 10px;
border: 1px solid #474b54;
border-radius: 7px;
background: #25262a;
text-align: left;
}
.session-list small {
.session-row:hover {
border-color: #b76f26;
background: #303136;
}
.session-row-content {
display: grid;
min-width: 0;
gap: 3px;
}
.session-preview,
.session-metadata {
overflow: hidden;
color: #a7afbc;
text-overflow: ellipsis;
white-space: nowrap;
}
.session-metadata {
display: flex;
gap: 8px;
color: #8d97a6;
}
.session-open {
flex: 0 0 auto;
padding: 2px 6px;
border-radius: 999px;
background: #234a33;
color: #a5e3bc;
font-size: 0.75rem;
font-weight: 700;
}
.extension-eyebrow,
.extension-request-label,
.extension-request-action,
.extension-request-details {
margin: 0;
}
.extension-eyebrow,
.extension-request-label {
color: #b9afa4;
font-size: 0.75rem;
font-weight: 800;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.extension-request {
display: grid;
gap: 6px;
padding: 12px;
border-left: 3px solid #f0a347;
border-radius: 4px;
background: #25262a;
}
.extension-request-action {
color: #fff3df;
font-size: 1.05rem;
font-weight: 750;
}
.extension-request-details {
white-space: pre-wrap;
overflow-wrap: anywhere;
}
.extension-options {
display: flex;
flex-wrap: wrap;
gap: 7px;
}
.extension textarea {