sunpeak 0.17.1 → 0.17.3

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.
@@ -1,88 +1,3 @@
1
- @import "tailwindcss";
2
-
3
- /* Scan simulator source files for Tailwind classes */
4
- @source "./**/*.{ts,tsx}";
5
-
6
- /* Also scan host-specific shell components */
7
- @source "../chatgpt/**/*.{ts,tsx}";
8
- @source "../claude/**/*.{ts,tsx}";
9
-
10
- /* Configure dark mode to use data-theme attribute */
11
- @custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *));
12
-
13
- /* Sidebar utility — host-overridable via --sim-bg-sidebar */
14
- @utility bg-sidebar {
15
- background-color: var(--sim-bg-sidebar, var(--color-background-secondary));
16
- }
17
-
18
- /* Sidebar form elements — match SDK look */
19
- .sunpeak-simulator-root select,
20
- .sunpeak-simulator-root input:not([type="checkbox"]),
21
- .sunpeak-simulator-root textarea {
22
- border: 0;
23
- box-shadow: inset 0 0 0 1px var(--color-border-primary);
24
- transition: box-shadow 150ms ease, color 150ms ease, background-color 150ms ease;
25
- }
26
- .sunpeak-simulator-root select:hover,
27
- .sunpeak-simulator-root input:not([type="checkbox"]):hover,
28
- .sunpeak-simulator-root textarea:hover {
29
- box-shadow: inset 0 0 0 1px var(--color-border-secondary);
30
- }
31
- .sunpeak-simulator-root select:focus-visible,
32
- .sunpeak-simulator-root input:not([type="checkbox"]):focus-visible,
33
- .sunpeak-simulator-root textarea:focus-visible {
34
- box-shadow: inset 0 0 0 1px var(--color-border-secondary);
35
- outline: 2px solid var(--color-ring-primary);
36
- outline-offset: -1px;
37
- }
38
- .sunpeak-simulator-root button:focus-visible {
39
- outline: 2px solid var(--color-ring-primary);
40
- outline-offset: -1px;
41
- }
42
-
43
- /* Custom checkbox */
44
- .sunpeak-simulator-root input[type="checkbox"] {
45
- appearance: none;
46
- -webkit-appearance: none;
47
- width: 16px;
48
- height: 16px;
49
- border-radius: 4px;
50
- border: 1px solid var(--color-border-secondary);
51
- background-color: transparent;
52
- background-size: 10px;
53
- background-position: center;
54
- background-repeat: no-repeat;
55
- cursor: pointer;
56
- flex-shrink: 0;
57
- transition: border-color 150ms ease, background-color 150ms ease;
58
- }
59
- .sunpeak-simulator-root input[type="checkbox"]:hover {
60
- border-color: var(--color-text-tertiary);
61
- }
62
- .sunpeak-simulator-root input[type="checkbox"]:checked {
63
- border-color: var(--color-background-inverse);
64
- background-color: var(--color-background-inverse);
65
- background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 10 10' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M2 5L4.25 7L8 3' stroke='white' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e");
66
- }
67
- [data-theme="dark"] .sunpeak-simulator-root input[type="checkbox"]:checked {
68
- background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 10 10' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M2 5L4.25 7L8 3' stroke='%23111' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e");
69
- }
70
- .sunpeak-simulator-root input[type="checkbox"]:focus-visible {
71
- outline: 2px solid var(--color-ring-primary);
72
- outline-offset: 2px;
73
- }
74
-
75
- /* Hide native number input spinners */
76
- .sunpeak-simulator-root input[type="number"]::-webkit-inner-spin-button,
77
- .sunpeak-simulator-root input[type="number"]::-webkit-outer-spin-button {
78
- -webkit-appearance: none;
79
- margin: 0;
80
- }
81
- .sunpeak-simulator-root input[type="number"] {
82
- -moz-appearance: textfield;
83
- }
84
-
85
- /* Bundled component styles */
86
1
  /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
87
2
  @layer properties {
88
3
  @supports (((-webkit-hyphens: none)) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color: rgb(from red r g b)))) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sunpeak",
3
- "version": "0.17.1",
3
+ "version": "0.17.3",
4
4
  "description": "Local-first MCP Apps framework. Quickstart, build, test, and ship your Claude Connector or ChatGPT App!",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -138,9 +138,11 @@
138
138
  "@clack/prompts": "^1.1.0",
139
139
  "@modelcontextprotocol/ext-apps": "^1.2.2",
140
140
  "@modelcontextprotocol/sdk": "^1.27.1",
141
+ "@vitejs/plugin-react": "^6.0.1",
141
142
  "clsx": "^2.1.1",
142
143
  "esbuild": "^0.27.4",
143
144
  "tailwind-merge": "^3.5.0",
145
+ "vite": "^8.0.1",
144
146
  "zod": "^4.3.6"
145
147
  },
146
148
  "devDependencies": {
@@ -153,7 +155,6 @@
153
155
  "@types/react-dom": "^19.2.3",
154
156
  "@typescript-eslint/eslint-plugin": "^8.57.1",
155
157
  "@typescript-eslint/parser": "^8.57.1",
156
- "@vitejs/plugin-react": "^6.0.1",
157
158
  "eslint": "^9.39.4",
158
159
  "eslint-config-prettier": "^10.1.8",
159
160
  "eslint-plugin-react": "^7.37.5",
@@ -166,7 +167,6 @@
166
167
  "ts-node": "^10.9.2",
167
168
  "tsx": "^4.21.0",
168
169
  "typescript": "^5.9.3",
169
- "vite": "^8.0.1",
170
170
  "vite-plugin-dts": "^4.5.4",
171
171
  "@playwright/test": "^1.52.0",
172
172
  "vitest": "^4.1.0"
@@ -12,5 +12,5 @@
12
12
  }
13
13
  },
14
14
  "name": "albums",
15
- "uri": "ui://albums-mn3d6pat"
15
+ "uri": "ui://albums-mn3hdmxc"
16
16
  }
@@ -12,5 +12,5 @@
12
12
  }
13
13
  },
14
14
  "name": "carousel",
15
- "uri": "ui://carousel-mn3d6pat"
15
+ "uri": "ui://carousel-mn3hdmxc"
16
16
  }
@@ -18,5 +18,5 @@
18
18
  }
19
19
  },
20
20
  "name": "map",
21
- "uri": "ui://map-mn3d6pat"
21
+ "uri": "ui://map-mn3hdmxc"
22
22
  }
@@ -12,5 +12,5 @@
12
12
  }
13
13
  },
14
14
  "name": "review",
15
- "uri": "ui://review-mn3d6pat"
15
+ "uri": "ui://review-mn3hdmxc"
16
16
  }
@@ -1,8 +1,8 @@
1
1
  {
2
- "hash": "94c29524",
2
+ "hash": "1ce9cdb5",
3
3
  "configHash": "6bb870ac",
4
- "lockfileHash": "79024c29",
5
- "browserHash": "017999f0",
4
+ "lockfileHash": "a41e63ba",
5
+ "browserHash": "33b5a01f",
6
6
  "optimized": {},
7
7
  "chunks": {}
8
8
  }
@@ -1,103 +1,103 @@
1
1
  {
2
- "hash": "0b87d214",
2
+ "hash": "ea2e52c1",
3
3
  "configHash": "276d46b2",
4
- "lockfileHash": "79024c29",
5
- "browserHash": "98225b94",
4
+ "lockfileHash": "a41e63ba",
5
+ "browserHash": "9b1eab7b",
6
6
  "optimized": {
7
7
  "@modelcontextprotocol/ext-apps": {
8
8
  "src": "../../../../../../node_modules/.pnpm/@modelcontextprotocol+ext-apps@1.2.2_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__react-_e9bf7657371391a829fe8b4e289b253c/node_modules/@modelcontextprotocol/ext-apps/dist/src/app.js",
9
9
  "file": "@modelcontextprotocol_ext-apps.js",
10
- "fileHash": "5cf9cba0",
10
+ "fileHash": "c55a9218",
11
11
  "needsInterop": false
12
12
  },
13
13
  "@modelcontextprotocol/ext-apps/app-bridge": {
14
14
  "src": "../../../../../../node_modules/.pnpm/@modelcontextprotocol+ext-apps@1.2.2_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__react-_e9bf7657371391a829fe8b4e289b253c/node_modules/@modelcontextprotocol/ext-apps/dist/src/app-bridge.js",
15
15
  "file": "@modelcontextprotocol_ext-apps_app-bridge.js",
16
- "fileHash": "788b66d7",
16
+ "fileHash": "0846f57f",
17
17
  "needsInterop": false
18
18
  },
19
19
  "@modelcontextprotocol/ext-apps/react": {
20
20
  "src": "../../../../../../node_modules/.pnpm/@modelcontextprotocol+ext-apps@1.2.2_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__react-_e9bf7657371391a829fe8b4e289b253c/node_modules/@modelcontextprotocol/ext-apps/dist/src/react/index.js",
21
21
  "file": "@modelcontextprotocol_ext-apps_react.js",
22
- "fileHash": "e24dc457",
22
+ "fileHash": "4117a8f1",
23
23
  "needsInterop": false
24
24
  },
25
25
  "@testing-library/react": {
26
26
  "src": "../../../../../../node_modules/.pnpm/@testing-library+react@16.3.2_@testing-library+dom@10.4.1_@types+react-dom@19.2.3_@type_893f466751a7d66081fd06e9edb9241a/node_modules/@testing-library/react/dist/@testing-library/react.esm.js",
27
27
  "file": "@testing-library_react.js",
28
- "fileHash": "54861a90",
28
+ "fileHash": "7da1596d",
29
29
  "needsInterop": false
30
30
  },
31
31
  "clsx": {
32
32
  "src": "../../../../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs",
33
33
  "file": "clsx.js",
34
- "fileHash": "1c439706",
34
+ "fileHash": "0aaf372b",
35
35
  "needsInterop": false
36
36
  },
37
37
  "embla-carousel-react": {
38
38
  "src": "../../../../../../node_modules/.pnpm/embla-carousel-react@8.6.0_react@19.2.4/node_modules/embla-carousel-react/esm/embla-carousel-react.esm.js",
39
39
  "file": "embla-carousel-react.js",
40
- "fileHash": "695b3971",
40
+ "fileHash": "3c5a7c5c",
41
41
  "needsInterop": false
42
42
  },
43
43
  "embla-carousel-wheel-gestures": {
44
44
  "src": "../../../../../../node_modules/.pnpm/embla-carousel-wheel-gestures@8.1.0_embla-carousel@8.6.0/node_modules/embla-carousel-wheel-gestures/dist/embla-carousel-wheel-gestures.esm.js",
45
45
  "file": "embla-carousel-wheel-gestures.js",
46
- "fileHash": "d07fc67f",
46
+ "fileHash": "ccbdf054",
47
47
  "needsInterop": false
48
48
  },
49
49
  "mapbox-gl": {
50
50
  "src": "../../../../../../node_modules/.pnpm/mapbox-gl@3.20.0/node_modules/mapbox-gl/dist/mapbox-gl.js",
51
51
  "file": "mapbox-gl.js",
52
- "fileHash": "8559179b",
52
+ "fileHash": "4ffe4afe",
53
53
  "needsInterop": true
54
54
  },
55
55
  "react-dom": {
56
56
  "src": "../../../../../../node_modules/.pnpm/react-dom@19.2.4_react@19.2.4/node_modules/react-dom/index.js",
57
57
  "file": "react-dom.js",
58
- "fileHash": "9eb38a9b",
58
+ "fileHash": "4d49f264",
59
59
  "needsInterop": true
60
60
  },
61
61
  "react-dom/client": {
62
62
  "src": "../../../../../../node_modules/.pnpm/react-dom@19.2.4_react@19.2.4/node_modules/react-dom/client.js",
63
63
  "file": "react-dom_client.js",
64
- "fileHash": "0ee455b5",
64
+ "fileHash": "80eaedf6",
65
65
  "needsInterop": true
66
66
  },
67
67
  "react": {
68
68
  "src": "../../../../../../node_modules/.pnpm/react@19.2.4/node_modules/react/index.js",
69
69
  "file": "react.js",
70
- "fileHash": "3fb02cc0",
70
+ "fileHash": "7e139e48",
71
71
  "needsInterop": true
72
72
  },
73
73
  "react/jsx-dev-runtime": {
74
74
  "src": "../../../../../../node_modules/.pnpm/react@19.2.4/node_modules/react/jsx-dev-runtime.js",
75
75
  "file": "react_jsx-dev-runtime.js",
76
- "fileHash": "591bceaf",
76
+ "fileHash": "8fe1fa8e",
77
77
  "needsInterop": true
78
78
  },
79
79
  "react/jsx-runtime": {
80
80
  "src": "../../../../../../node_modules/.pnpm/react@19.2.4/node_modules/react/jsx-runtime.js",
81
81
  "file": "react_jsx-runtime.js",
82
- "fileHash": "6e1d7148",
82
+ "fileHash": "ba719946",
83
83
  "needsInterop": true
84
84
  },
85
85
  "tailwind-merge": {
86
86
  "src": "../../../../../../node_modules/.pnpm/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.mjs",
87
87
  "file": "tailwind-merge.js",
88
- "fileHash": "64deb91e",
88
+ "fileHash": "47ba3d6b",
89
89
  "needsInterop": false
90
90
  },
91
91
  "vitest": {
92
92
  "src": "../../../../../../node_modules/.pnpm/vitest@4.1.0_@types+node@25.5.0_jsdom@29.0.1_vite@8.0.1_@types+node@25.5.0_esbuild@0.27.4_jiti@2.6.1_tsx@4.21.0_/node_modules/vitest/dist/index.js",
93
93
  "file": "vitest.js",
94
- "fileHash": "4daaba14",
94
+ "fileHash": "258cddf8",
95
95
  "needsInterop": false
96
96
  },
97
97
  "zod": {
98
98
  "src": "../../../../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/index.js",
99
99
  "file": "zod.js",
100
- "fileHash": "3671ff4b",
100
+ "fileHash": "d8049871",
101
101
  "needsInterop": false
102
102
  }
103
103
  },
@@ -1,30 +1,9 @@
1
1
  import { defineConfig, devices } from '@playwright/test';
2
- import { execSync } from 'child_process';
3
2
 
4
- /**
5
- * Find an available port synchronously.
6
- * Spawns a tiny Node script that binds, prints the port, and exits.
7
- */
8
- function getPortSync(preferred: number): number {
9
- const script = `
10
- const s = require("net").createServer();
11
- s.listen(${preferred}, () => {
12
- process.stdout.write(String(s.address().port));
13
- s.close();
14
- });
15
- s.on("error", () => {
16
- const f = require("net").createServer();
17
- f.listen(0, () => {
18
- process.stdout.write(String(f.address().port));
19
- f.close();
20
- });
21
- });
22
- `;
23
- return Number(execSync(`node -e '${script}'`, { encoding: 'utf-8' }).trim());
24
- }
25
-
26
- const port = Number(process.env.SUNPEAK_TEST_PORT) || getPortSync(6776);
27
- const sandboxPort = Number(process.env.SUNPEAK_SANDBOX_PORT) || getPortSync(24680);
3
+ // Use fixed preferred ports. If in use, `reuseExistingServer` (local) reuses
4
+ // the running server. In CI, validate.mjs assigns unique ports via env vars.
5
+ const port = Number(process.env.SUNPEAK_TEST_PORT) || 6776;
6
+ const sandboxPort = Number(process.env.SUNPEAK_SANDBOX_PORT) || 24680;
28
7
 
29
8
  export default defineConfig({
30
9
  globalSetup: './tests/e2e/global-setup.ts',