Skip to content

Commit f6d7512

Browse files
committed
fix: restore dark webview controls and mcp node lookup
1 parent e24d6a2 commit f6d7512

File tree

5 files changed

+12
-5
lines changed

5 files changed

+12
-5
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "copilot-cockpit",
33
"displayName": "Copilot Cockpit",
44
"description": "VS Code-native orchestration for AI agents with controlled workflows, scheduling, and human-in-the-loop execution",
5-
"version": "1.1.139",
5+
"version": "1.1.140",
66
"publisher": "local-dev",
77
"license": "MIT",
88
"icon": "images/icon.png",

src/cockpitWebviewSharedStyles.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
export function buildSchedulerWebviewSharedStyles(): string {
2-
return "";
2+
return `.form-group{margin-bottom:12px;} .form-group label{display:block;margin-bottom:4px;font-weight:500;font-size:12px;} .form-group label[for]{cursor:pointer;} input[type="text"],input[type="number"],textarea,select{width:100%;padding:6px 8px;border:1px solid var(--vscode-input-border);background-color:var(--vscode-input-background);color:var(--vscode-input-foreground);border-radius:4px;font-family:inherit;font-size:12px;} textarea{min-height:92px;resize:vertical;} select{appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23c5c5c5' d='M6 8.5L1 3.5h10z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 8px center;padding-right:28px;} input:focus,textarea:focus,select:focus{outline:none;border-color:var(--vscode-focusBorder);} .checkbox-group{display:flex;align-items:center;gap:6px;cursor:pointer;user-select:none;} .checkbox-group input[type="checkbox"]{width:auto;} .checkbox-group span{cursor:pointer;} .button-group{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap;} button{padding:6px 10px;border:none;border-radius:4px;cursor:pointer;font-size:12px;font-family:inherit;line-height:1.2;} .btn-primary{background-color:var(--vscode-button-background);color:var(--vscode-button-foreground);} .btn-primary:hover{background-color:var(--vscode-button-hoverBackground);} .btn-secondary{background-color:var(--vscode-button-secondaryBackground);color:var(--vscode-button-secondaryForeground);} .btn-secondary:hover{background-color:var(--vscode-button-secondaryHoverBackground);} .btn-danger{background-color:var(--vscode-inputValidation-errorBackground);color:var(--vscode-inputValidation-errorForeground);} .btn-icon{padding:4px 6px;background:transparent;color:var(--vscode-foreground);} .btn-icon:hover{background-color:var(--vscode-list-hoverBackground);} .task-list{display:block;font-size:12px;line-height:1.4;} .task-filter-bar{display:flex;gap:6px 8px;margin-bottom:12px;flex-wrap:wrap;align-items:center;padding:8px 10px;border:1px solid color-mix(in srgb,var(--vscode-panel-border) 88%,transparent);border-radius:12px;background:linear-gradient(180deg,color-mix(in srgb,var(--vscode-editorWidget-background) 94%,transparent) 0%,color-mix(in srgb,var(--vscode-editor-background) 97%,transparent) 100%);box-shadow:0 10px 20px color-mix(in srgb,var(--vscode-editor-background) 88%,transparent);} .task-filter-bar label{font-size:10px;font-weight:700;letter-spacing:0.06em;text-transform:uppercase;color:var(--vscode-descriptionForeground);} .task-filter-select{min-width:180px;max-width:240px;min-height:28px;} .task-filter-btn{padding:4px 10px;font-size:11px;font-weight:700;border-radius:999px;border:1px solid color-mix(in srgb,var(--vscode-panel-border) 76%,transparent);background:color-mix(in srgb,var(--vscode-button-secondaryBackground) 88%,transparent);color:var(--vscode-button-secondaryForeground);} .task-filter-btn.active{background-color:var(--vscode-button-background);color:var(--vscode-button-foreground);border-color:color-mix(in srgb,var(--vscode-button-background) 72%,var(--vscode-panel-border));box-shadow:0 0 0 1px color-mix(in srgb,var(--vscode-button-background) 14%,transparent);} .task-sections{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;align-items:start;} .task-sections-column{display:grid;gap:8px;align-content:start;min-width:0;} .task-sections.filtered{grid-template-columns:1fr;} .task-sections.filtered .task-sections-column{display:contents;} .task-section{border:1px solid color-mix(in srgb,var(--vscode-panel-border) 88%,transparent);border-radius:14px;padding:8px;background:linear-gradient(180deg,color-mix(in srgb,var(--vscode-editorWidget-background) 92%,transparent) 0%,color-mix(in srgb,var(--vscode-editor-background) 96%,transparent) 100%);min-width:0;box-shadow:0 12px 24px color-mix(in srgb,var(--vscode-editor-background) 84%,transparent);} .task-section-title{font-size:11px;font-weight:700;letter-spacing:0.08em;text-transform:uppercase;margin-bottom:6px;color:var(--vscode-descriptionForeground);display:flex;justify-content:space-between;align-items:center;gap:8px;cursor:pointer;user-select:none;} .task-section-toggle{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border:none;background:transparent;color:var(--vscode-foreground);cursor:pointer;border-radius:3px;padding:0;opacity:0.7;transition:opacity 0.12s ease,transform 0.2s ease;font-size:10px;line-height:1;} .task-section-toggle:hover{opacity:1;background:var(--vscode-list-hoverBackground);} .task-section.is-collapsed .task-section-toggle{transform:rotate(-90deg);} .task-section-body{display:grid;grid-template-rows:1fr;overflow:hidden;transition:grid-template-rows 0.2s ease,opacity 0.2s ease;} .task-section.is-collapsed .task-section-body{grid-template-rows:0fr;opacity:0.8;} .task-section-body-inner{min-height:0;overflow:hidden;} .task-subsection{border:1px solid color-mix(in srgb,var(--vscode-panel-border) 72%,transparent);border-radius:10px;padding:6px;margin-bottom:8px;background:linear-gradient(180deg,color-mix(in srgb,var(--vscode-editor-background) 94%,var(--vscode-editorWidget-background)) 0%,color-mix(in srgb,var(--vscode-editorWidget-background) 72%,transparent) 100%);min-width:0;} .task-subsection:last-child{margin-bottom:0;} .task-subsection-title{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:6px;color:var(--vscode-descriptionForeground);font-size:11px;font-weight:700;letter-spacing:0.05em;text-transform:uppercase;min-width:0;} .task-subsection-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} .task-subsection-count,.task-section-count{display:inline-flex;align-items:center;justify-content:center;min-width:22px;padding:0 7px;border-radius:999px;background:color-mix(in srgb,var(--vscode-badge-background) 88%,transparent);color:var(--vscode-badge-foreground);flex:0 0 auto;white-space:nowrap;} .task-subsection-body{min-width:0;} .task-card{display:grid;gap:8px;padding:9px 10px;border:1px solid color-mix(in srgb,var(--vscode-panel-border) 88%,transparent);border-radius:12px;background:linear-gradient(180deg,color-mix(in srgb,var(--vscode-editor-background) 96%,transparent) 0%,color-mix(in srgb,var(--vscode-editorWidget-background) 84%,transparent) 100%);margin-bottom:6px;box-shadow:0 8px 18px color-mix(in srgb,var(--vscode-editor-background) 84%,transparent);} .task-card.other-workspace{border-left-width:4px;border-left-color:var(--vscode-inputValidation-warningBorder);} .task-card.disabled{opacity:0.72;} .todo-draft-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;} .todo-draft-grid .task-card.todo-draft-compact .task-prompt{display:none;} .todo-draft-grid .task-card.todo-draft-compact .task-info{display:none;} .todo-draft-grid .task-card.todo-draft-compact .task-card-footer{display:none;} .todo-draft-grid .task-card.todo-draft-compact{padding:7px 8px;gap:5px;} @media (max-width:640px){.todo-draft-grid{grid-template-columns:1fr;}} .task-card-top,.task-card-footer{display:grid;gap:6px;} .task-header{display:flex;justify-content:space-between;align-items:flex-start;gap:8px;} .task-header-main{display:grid;gap:4px;min-width:0;flex:1 1 auto;} .task-title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-width:0;} .task-name{font-weight:700;font-size:12px;line-height:1.3;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1 1 auto;} .task-name.clickable,.task-status,.task-badge.clickable{cursor:pointer;transition:opacity 0.2s;} .task-name.clickable:hover,.task-status:hover,.task-badge.clickable:hover{opacity:0.7;} .task-status{padding:2px 8px;border-radius:999px;font-size:10px;line-height:1.25;font-weight:700;letter-spacing:0.04em;text-transform:uppercase;flex:0 0 auto;} .task-status.enabled{background-color:var(--vscode-testing-iconPassed);color:var(--vscode-button-foreground);} .task-status.disabled{background-color:var(--vscode-disabledForeground);color:var(--vscode-button-foreground);} .task-meta-strip{display:flex;flex-wrap:wrap;gap:6px;align-items:center;font-size:11px;line-height:1.35;color:var(--vscode-descriptionForeground);} .task-meta-pill{display:inline-flex;align-items:center;gap:4px;min-height:20px;padding:0 8px;border-radius:999px;border:1px solid color-mix(in srgb,var(--vscode-panel-border) 78%,transparent);background:color-mix(in srgb,var(--vscode-editorWidget-background) 92%,transparent);white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;} .task-meta-pill-next-run{border-color:color-mix(in srgb,var(--vscode-focusBorder) 28%,var(--vscode-panel-border));} .task-meta-pill-scope{background:color-mix(in srgb,var(--vscode-sideBar-background) 80%,var(--vscode-editorWidget-background));} .task-info{display:flex;flex-wrap:wrap;gap:4px 8px;font-size:11px;line-height:1.4;color:var(--vscode-descriptionForeground);margin:0;} .task-info span{margin-right:0;} .task-info-compact{font-size:10px;letter-spacing:0.02em;text-transform:uppercase;} .task-badge{display:inline-block;padding:2px 7px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:0.03em;background-color:var(--vscode-badge-background);color:var(--vscode-badge-foreground);margin-right:0;} .task-badges{display:flex;flex-wrap:wrap;gap:4px;margin:0;} .task-badges-inline{align-items:center;} .task-badges-labels{margin-top:-1px;} .task-badge.label{background-color:var(--vscode-editorInfo-background);color:var(--vscode-editorInfo-foreground);} .task-prompt{padding:6px 7px;background-color:var(--vscode-textBlockQuote-background);border-radius:7px;font-size:11px;line-height:1.4;white-space:pre-wrap;max-height:34px;overflow:hidden;margin:0;} .task-config{display:flex;flex-wrap:wrap;gap:6px;align-items:center;} .task-inline-select{width:auto;min-width:112px;max-width:160px;display:inline-block;padding:3px 28px 3px 8px;margin:0;height:28px;font-size:11px;line-height:1.2;} .task-actions{display:flex;gap:4px;flex-wrap:wrap;align-items:center;} .task-actions button{padding:3px 6px;font-size:11px;line-height:1.2;} .empty-state{text-align:center;padding:10px;color:var(--vscode-descriptionForeground);font-size:12px;} @media (max-width:920px){.task-sections{grid-template-columns:1fr;} .task-sections-column{display:grid;} .task-inline-select{min-width:0;flex:1 1 140px;max-width:none;} .task-title-row{flex-wrap:wrap;} .task-filter-bar{padding:8px;} .task-filter-select{min-width:0;max-width:none;flex:1 1 180px;}} .radio-group{display:flex;gap:12px;flex-wrap:wrap;} .radio-group label{display:flex;align-items:center;gap:6px;font-weight:normal;cursor:pointer;user-select:none;min-height:28px;} .preset-select{margin-bottom:8px;} .section-title{font-size:12px;font-weight:600;margin-bottom:8px;color:var(--vscode-foreground);} .inline-group{display:flex;gap:12px;} .inline-group .form-group{flex:1;} .template-row{display:flex;gap:6px;align-items:center;} .template-row select{flex:1;min-width:0;} .friendly-cron{margin-top:8px;padding:8px;border:1px dashed var(--vscode-panel-border);border-radius:6px;background-color:var(--vscode-editorWidget-background);} .friendly-grid{display:flex;flex-wrap:wrap;gap:8px;} .friendly-grid .form-group{flex:1 1 160px;margin-bottom:6px;} .friendly-field{display:none;} .friendly-field.visible{display:block;} .friendly-actions{display:flex;gap:6px;align-items:center;margin-top:6px;} .task-editor-shell{display:grid;gap:12px;} .task-editor-header{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;padding:10px 12px;border:1px solid var(--vscode-panel-border);border-radius:8px;background:linear-gradient( 135deg,color-mix(in srgb,var(--vscode-editorWidget-background) 92%,transparent),color-mix(in srgb,var(--vscode-sideBar-background) 88%,transparent) );} .task-editor-header-copy{display:grid;gap:4px;min-width:0;} .task-editor-grid{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(340px,0.9fr);gap:12px;align-items:start;} .task-editor-card{display:grid;gap:10px;border:1px solid var(--vscode-panel-border);border-radius:8px;background-color:var(--vscode-editor-background);padding:12px;} .task-editor-card.is-wide{grid-column:1 / -1;} .task-editor-card .section-title{margin-bottom:0;} .task-editor-card .note{margin-top:-3px;} .task-editor-options-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 12px;align-items:start;} .task-editor-options-grid .form-group.wide{grid-column:1 / -1;} .cron-preview{margin-top:6px;display:flex;align-items:center;gap:6px;font-size:11px;color:var(--vscode-descriptionForeground);flex-wrap:wrap;} .cron-preview strong{color:var(--vscode-foreground);} .note{font-size:11px;color:var(--vscode-descriptionForeground);margin-top:3px;margin-bottom:0;}`;
33
}

src/mcpConfigManager.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,13 @@ export function buildNodeShellExecutionCommand(launcherPath: string): string {
191191
const escapedLauncherPath = shellEscapeDoubleQuoted(launcherPath);
192192
return [
193193
'NODE_BIN="$(command -v node 2>/dev/null || true)"',
194+
'if [ -z "$NODE_BIN" ] && [ -s "$HOME/.nvm/nvm.sh" ]; then . "$HOME/.nvm/nvm.sh" >/dev/null 2>&1; NODE_BIN="$(command -v node 2>/dev/null || true)"; fi',
194195
'if [ -z "$NODE_BIN" ] && [ -n "$NVM_BIN" ] && [ -x "$NVM_BIN/node" ]; then NODE_BIN="$NVM_BIN/node"; fi',
196+
'if [ -z "$NODE_BIN" ] && [ -s "$HOME/.asdf/asdf.sh" ]; then . "$HOME/.asdf/asdf.sh" >/dev/null 2>&1; NODE_BIN="$(command -v node 2>/dev/null || true)"; fi',
195197
'if [ -z "$NODE_BIN" ] && [ -d "$HOME/.nvm/versions/node" ]; then NODE_BIN="$(find "$HOME/.nvm/versions/node" -type f -path "*/bin/node" 2>/dev/null | sort | tail -n 1)"; fi',
196198
'if [ -z "$NODE_BIN" ] && [ -d "$HOME/.asdf/installs/nodejs" ]; then NODE_BIN="$(find "$HOME/.asdf/installs/nodejs" -type f -path "*/bin/node" 2>/dev/null | sort | tail -n 1)"; fi',
197-
'if [ -z "$NODE_BIN" ]; then for candidate in /opt/homebrew/bin/node /usr/local/bin/node /usr/bin/node; do if [ -x "$candidate" ]; then NODE_BIN="$candidate"; break; fi; done; fi',
199+
'if [ -z "$NODE_BIN" ] && [ -d "$HOME/.fnm/node-versions" ]; then NODE_BIN="$(find "$HOME/.fnm/node-versions" -type f -path "*/installation/bin/node" 2>/dev/null | sort | tail -n 1)"; fi',
200+
'if [ -z "$NODE_BIN" ]; then for candidate in "$HOME/.volta/bin/node" /opt/homebrew/bin/node /usr/local/bin/node /usr/bin/node; do if [ -x "$candidate" ]; then NODE_BIN="$candidate"; break; fi; done; fi',
198201
'if [ -z "$NODE_BIN" ]; then echo "Copilot Cockpit MCP launcher could not find node. Install Node.js or expose it in your shell startup." >&2; exit 127; fi',
199202
`exec "$NODE_BIN" "${escapedLauncherPath}"`,
200203
].join("; ");

src/test/suite/mcpConfigManager.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,13 @@ suite("MCP Config Manager Tests", () => {
273273
const command = buildNodeShellExecutionCommand("/workspace/.vscode/copilot-cockpit-support/mcp/launcher.js");
274274

275275
assert.ok(command.includes('command -v node'));
276+
assert.ok(command.includes('.nvm/nvm.sh'));
276277
assert.ok(command.includes('NVM_BIN'));
278+
assert.ok(command.includes('.asdf/asdf.sh'));
277279
assert.ok(command.includes('.nvm/versions/node'));
278280
assert.ok(command.includes('.asdf/installs/nodejs'));
281+
assert.ok(command.includes('.fnm/node-versions'));
282+
assert.ok(command.includes('.volta/bin/node'));
279283
assert.ok(command.includes('exec "$NODE_BIN" "/workspace/.vscode/copilot-cockpit-support/mcp/launcher.js"'));
280284
});
281285
});

0 commit comments

Comments
 (0)