@dollhousemcp/mcp-server 2.0.3 → 2.0.4

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/generated/version.d.ts +2 -2
  3. package/dist/generated/version.js +3 -3
  4. package/dist/seed-elements/memories/dollhousemcp-baseline-knowledge.yaml +149 -0
  5. package/dist/seed-elements/memories/how-to-create-custom-auto-load-memories.yaml +455 -0
  6. package/dist/seed-elements/memories/priority-best-practices-for-teams.yaml +542 -0
  7. package/dist/seed-elements/memories/token-estimation-guidelines.yaml +602 -0
  8. package/dist/web/public/fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1i8q131nj-o.woff2 +0 -0
  9. package/dist/web/public/fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1iAq131nj-otFQ.woff2 +0 -0
  10. package/dist/web/public/fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1iEq131nj-otFQ.woff2 +0 -0
  11. package/dist/web/public/fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1iIq131nj-otFQ.woff2 +0 -0
  12. package/dist/web/public/fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1isq131nj-otFQ.woff2 +0 -0
  13. package/dist/web/public/fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwl1FgsAXHNlYzg.woff2 +0 -0
  14. package/dist/web/public/fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwl5FgsAXHNlYzg.woff2 +0 -0
  15. package/dist/web/public/fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwl9FgsAXHNlYzg.woff2 +0 -0
  16. package/dist/web/public/fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwlBFgsAXHNk.woff2 +0 -0
  17. package/dist/web/public/fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwlRFgsAXHNlYzg.woff2 +0 -0
  18. package/dist/web/public/fonts/manrope-xn7gYHE41ni1AdIRggOxSvfedN62Zw.woff2 +0 -0
  19. package/dist/web/public/fonts/manrope-xn7gYHE41ni1AdIRggSxSvfedN62Zw.woff2 +0 -0
  20. package/dist/web/public/fonts/manrope-xn7gYHE41ni1AdIRggexSvfedN4.woff2 +0 -0
  21. package/dist/web/public/fonts/manrope-xn7gYHE41ni1AdIRggixSvfedN62Zw.woff2 +0 -0
  22. package/dist/web/public/fonts/manrope-xn7gYHE41ni1AdIRggmxSvfedN62Zw.woff2 +0 -0
  23. package/dist/web/public/fonts/manrope-xn7gYHE41ni1AdIRggqxSvfedN62Zw.woff2 +0 -0
  24. package/dist/web/public/fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko20yygg_vb.woff2 +0 -0
  25. package/dist/web/public/fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko40yygg_vbd-E.woff2 +0 -0
  26. package/dist/web/public/fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko50yygg_vbd-E.woff2 +0 -0
  27. package/dist/web/public/fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko70yygg_vbd-E.woff2 +0 -0
  28. package/dist/web/public/fonts.css +270 -0
  29. package/dist/web/public/index.html +365 -0
  30. package/dist/web/public/logs.css +472 -0
  31. package/dist/web/public/metrics.css +238 -0
  32. package/dist/web/public/permissions.css +364 -0
  33. package/dist/web/public/sessions.css +235 -0
  34. package/dist/web/public/setup.css +648 -0
  35. package/dist/web/public/styles.css +1717 -0
  36. package/package.json +3 -1
  37. package/server.json +2 -2
@@ -0,0 +1,270 @@
1
+ /* cyrillic-ext */
2
+ @font-face {
3
+ font-family: 'IBM Plex Mono';
4
+ font-style: normal;
5
+ font-weight: 400;
6
+ font-display: swap;
7
+ src: url(./fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1iIq131nj-otFQ.woff2) format('woff2');
8
+ unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
9
+ }
10
+ /* cyrillic */
11
+ @font-face {
12
+ font-family: 'IBM Plex Mono';
13
+ font-style: normal;
14
+ font-weight: 400;
15
+ font-display: swap;
16
+ src: url(./fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1isq131nj-otFQ.woff2) format('woff2');
17
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
18
+ }
19
+ /* vietnamese */
20
+ @font-face {
21
+ font-family: 'IBM Plex Mono';
22
+ font-style: normal;
23
+ font-weight: 400;
24
+ font-display: swap;
25
+ src: url(./fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1iAq131nj-otFQ.woff2) format('woff2');
26
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
27
+ }
28
+ /* latin-ext */
29
+ @font-face {
30
+ font-family: 'IBM Plex Mono';
31
+ font-style: normal;
32
+ font-weight: 400;
33
+ font-display: swap;
34
+ src: url(./fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1iEq131nj-otFQ.woff2) format('woff2');
35
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
36
+ }
37
+ /* latin */
38
+ @font-face {
39
+ font-family: 'IBM Plex Mono';
40
+ font-style: normal;
41
+ font-weight: 400;
42
+ font-display: swap;
43
+ src: url(./fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1i8q131nj-o.woff2) format('woff2');
44
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
45
+ }
46
+ /* cyrillic-ext */
47
+ @font-face {
48
+ font-family: 'IBM Plex Mono';
49
+ font-style: normal;
50
+ font-weight: 500;
51
+ font-display: swap;
52
+ src: url(./fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwl1FgsAXHNlYzg.woff2) format('woff2');
53
+ unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
54
+ }
55
+ /* cyrillic */
56
+ @font-face {
57
+ font-family: 'IBM Plex Mono';
58
+ font-style: normal;
59
+ font-weight: 500;
60
+ font-display: swap;
61
+ src: url(./fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwlRFgsAXHNlYzg.woff2) format('woff2');
62
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
63
+ }
64
+ /* vietnamese */
65
+ @font-face {
66
+ font-family: 'IBM Plex Mono';
67
+ font-style: normal;
68
+ font-weight: 500;
69
+ font-display: swap;
70
+ src: url(./fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwl9FgsAXHNlYzg.woff2) format('woff2');
71
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
72
+ }
73
+ /* latin-ext */
74
+ @font-face {
75
+ font-family: 'IBM Plex Mono';
76
+ font-style: normal;
77
+ font-weight: 500;
78
+ font-display: swap;
79
+ src: url(./fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwl5FgsAXHNlYzg.woff2) format('woff2');
80
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
81
+ }
82
+ /* latin */
83
+ @font-face {
84
+ font-family: 'IBM Plex Mono';
85
+ font-style: normal;
86
+ font-weight: 500;
87
+ font-display: swap;
88
+ src: url(./fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwlBFgsAXHNk.woff2) format('woff2');
89
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
90
+ }
91
+ /* cyrillic-ext */
92
+ @font-face {
93
+ font-family: 'Manrope';
94
+ font-style: normal;
95
+ font-weight: 400;
96
+ font-display: swap;
97
+ src: url(./fonts/manrope-xn7gYHE41ni1AdIRggqxSvfedN62Zw.woff2) format('woff2');
98
+ unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
99
+ }
100
+ /* cyrillic */
101
+ @font-face {
102
+ font-family: 'Manrope';
103
+ font-style: normal;
104
+ font-weight: 400;
105
+ font-display: swap;
106
+ src: url(./fonts/manrope-xn7gYHE41ni1AdIRggOxSvfedN62Zw.woff2) format('woff2');
107
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
108
+ }
109
+ /* greek */
110
+ @font-face {
111
+ font-family: 'Manrope';
112
+ font-style: normal;
113
+ font-weight: 400;
114
+ font-display: swap;
115
+ src: url(./fonts/manrope-xn7gYHE41ni1AdIRggSxSvfedN62Zw.woff2) format('woff2');
116
+ unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
117
+ }
118
+ /* vietnamese */
119
+ @font-face {
120
+ font-family: 'Manrope';
121
+ font-style: normal;
122
+ font-weight: 400;
123
+ font-display: swap;
124
+ src: url(./fonts/manrope-xn7gYHE41ni1AdIRggixSvfedN62Zw.woff2) format('woff2');
125
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
126
+ }
127
+ /* latin-ext */
128
+ @font-face {
129
+ font-family: 'Manrope';
130
+ font-style: normal;
131
+ font-weight: 400;
132
+ font-display: swap;
133
+ src: url(./fonts/manrope-xn7gYHE41ni1AdIRggmxSvfedN62Zw.woff2) format('woff2');
134
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
135
+ }
136
+ /* latin */
137
+ @font-face {
138
+ font-family: 'Manrope';
139
+ font-style: normal;
140
+ font-weight: 400;
141
+ font-display: swap;
142
+ src: url(./fonts/manrope-xn7gYHE41ni1AdIRggexSvfedN4.woff2) format('woff2');
143
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
144
+ }
145
+ /* cyrillic-ext */
146
+ @font-face {
147
+ font-family: 'Manrope';
148
+ font-style: normal;
149
+ font-weight: 700;
150
+ font-display: swap;
151
+ src: url(./fonts/manrope-xn7gYHE41ni1AdIRggqxSvfedN62Zw.woff2) format('woff2');
152
+ unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
153
+ }
154
+ /* cyrillic */
155
+ @font-face {
156
+ font-family: 'Manrope';
157
+ font-style: normal;
158
+ font-weight: 700;
159
+ font-display: swap;
160
+ src: url(./fonts/manrope-xn7gYHE41ni1AdIRggOxSvfedN62Zw.woff2) format('woff2');
161
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
162
+ }
163
+ /* greek */
164
+ @font-face {
165
+ font-family: 'Manrope';
166
+ font-style: normal;
167
+ font-weight: 700;
168
+ font-display: swap;
169
+ src: url(./fonts/manrope-xn7gYHE41ni1AdIRggSxSvfedN62Zw.woff2) format('woff2');
170
+ unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
171
+ }
172
+ /* vietnamese */
173
+ @font-face {
174
+ font-family: 'Manrope';
175
+ font-style: normal;
176
+ font-weight: 700;
177
+ font-display: swap;
178
+ src: url(./fonts/manrope-xn7gYHE41ni1AdIRggixSvfedN62Zw.woff2) format('woff2');
179
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
180
+ }
181
+ /* latin-ext */
182
+ @font-face {
183
+ font-family: 'Manrope';
184
+ font-style: normal;
185
+ font-weight: 700;
186
+ font-display: swap;
187
+ src: url(./fonts/manrope-xn7gYHE41ni1AdIRggmxSvfedN62Zw.woff2) format('woff2');
188
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
189
+ }
190
+ /* latin */
191
+ @font-face {
192
+ font-family: 'Manrope';
193
+ font-style: normal;
194
+ font-weight: 700;
195
+ font-display: swap;
196
+ src: url(./fonts/manrope-xn7gYHE41ni1AdIRggexSvfedN4.woff2) format('woff2');
197
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
198
+ }
199
+ /* cyrillic-ext */
200
+ @font-face {
201
+ font-family: 'Plus Jakarta Sans';
202
+ font-style: normal;
203
+ font-weight: 700;
204
+ font-display: swap;
205
+ src: url(./fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko70yygg_vbd-E.woff2) format('woff2');
206
+ unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
207
+ }
208
+ /* vietnamese */
209
+ @font-face {
210
+ font-family: 'Plus Jakarta Sans';
211
+ font-style: normal;
212
+ font-weight: 700;
213
+ font-display: swap;
214
+ src: url(./fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko50yygg_vbd-E.woff2) format('woff2');
215
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
216
+ }
217
+ /* latin-ext */
218
+ @font-face {
219
+ font-family: 'Plus Jakarta Sans';
220
+ font-style: normal;
221
+ font-weight: 700;
222
+ font-display: swap;
223
+ src: url(./fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko40yygg_vbd-E.woff2) format('woff2');
224
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
225
+ }
226
+ /* latin */
227
+ @font-face {
228
+ font-family: 'Plus Jakarta Sans';
229
+ font-style: normal;
230
+ font-weight: 700;
231
+ font-display: swap;
232
+ src: url(./fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko20yygg_vb.woff2) format('woff2');
233
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
234
+ }
235
+ /* cyrillic-ext */
236
+ @font-face {
237
+ font-family: 'Plus Jakarta Sans';
238
+ font-style: normal;
239
+ font-weight: 800;
240
+ font-display: swap;
241
+ src: url(./fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko70yygg_vbd-E.woff2) format('woff2');
242
+ unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
243
+ }
244
+ /* vietnamese */
245
+ @font-face {
246
+ font-family: 'Plus Jakarta Sans';
247
+ font-style: normal;
248
+ font-weight: 800;
249
+ font-display: swap;
250
+ src: url(./fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko50yygg_vbd-E.woff2) format('woff2');
251
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
252
+ }
253
+ /* latin-ext */
254
+ @font-face {
255
+ font-family: 'Plus Jakarta Sans';
256
+ font-style: normal;
257
+ font-weight: 800;
258
+ font-display: swap;
259
+ src: url(./fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko40yygg_vbd-E.woff2) format('woff2');
260
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
261
+ }
262
+ /* latin */
263
+ @font-face {
264
+ font-family: 'Plus Jakarta Sans';
265
+ font-style: normal;
266
+ font-weight: 800;
267
+ font-display: swap;
268
+ src: url(./fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko20yygg_vb.woff2) format('woff2');
269
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
270
+ }
@@ -0,0 +1,365 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" data-theme="light">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>DollhouseMCP Console</title>
7
+ <meta name="description" content="DollhouseMCP management console — portfolio, logs, metrics">
8
+ <meta http-equiv="X-Content-Type-Options" content="nosniff">
9
+ <meta http-equiv="X-Frame-Options" content="DENY">
10
+ <link rel="stylesheet" href="fonts.css">
11
+ <link rel="stylesheet" href="styles.css">
12
+ <link rel="stylesheet" href="logs.css">
13
+ <link rel="stylesheet" href="metrics.css">
14
+ <link rel="stylesheet" href="permissions.css">
15
+ <link rel="stylesheet" href="sessions.css">
16
+ <link rel="stylesheet" href="setup.css">
17
+ <!-- uPlot for metrics time-series charts -->
18
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/uplot@1.6.30/dist/uPlot.min.css" integrity="sha384-IfV0B7MIOYuO95kO9G5ySKPz/85zqFNOAs8iy4tkK5zd9izhJAB8b7lHrwYqqmYE" crossorigin="anonymous">
19
+ </head>
20
+ <body>
21
+
22
+ <div class="page-noise" aria-hidden="true"></div>
23
+
24
+ <header class="site-header">
25
+ <div class="header-brand">
26
+ <h1 class="site-title">DollhouseMCP Console</h1>
27
+ <p class="site-tagline">Management console</p>
28
+ </div>
29
+ <div class="header-right">
30
+ <nav class="console-tabs" id="console-tabs" aria-label="Console tabs">
31
+ <button class="console-tab" data-tab="setup">Setup</button>
32
+ <button class="console-tab active" data-tab="portfolio">Portfolio</button>
33
+ <button class="console-tab" data-tab="logs">Logs</button>
34
+ <button class="console-tab" data-tab="metrics">Metrics</button>
35
+ <button class="console-tab" data-tab="permissions">Permissions</button>
36
+ </nav>
37
+ <div class="session-indicator" id="session-indicator" title="Active sessions"></div>
38
+ <div class="site-stats" id="stats" aria-live="polite"></div>
39
+ <button class="theme-toggle" id="theme-toggle" type="button" aria-label="Switch to dark mode" title="Switch to dark mode">
40
+ <span class="theme-toggle-icon" id="theme-toggle-icon" aria-hidden="true">&#9790;</span>
41
+ <span class="sr-only" id="theme-toggle-label">Switch to dark mode</span>
42
+ </button>
43
+ </div>
44
+ </header>
45
+
46
+ <!-- Tab: Setup -->
47
+ <div id="tab-setup" class="tab-panel" hidden>
48
+ <div class="setup-page">
49
+ <div class="setup-hero">
50
+ <div class="setup-hero-status">
51
+ <span class="setup-status-dot"></span>
52
+ <span>DollhouseMCP is running on your machine</span>
53
+ </div>
54
+ <h2 class="setup-hero-title">Connect your AI client</h2>
55
+ <p class="setup-hero-sub">Pick your platform below. Click <strong>Install Now</strong> to auto-configure, or copy the config manually.</p>
56
+ </div>
57
+
58
+ <fieldset class="setup-method-toggle" id="setup-method-toggle">
59
+ <legend class="sr-only">Installation method</legend>
60
+ <button class="setup-method-btn is-active" data-method="npx" aria-pressed="true">
61
+ <strong>Auto-updating</strong>
62
+ <span>Always pulls the latest version on startup</span>
63
+ </button>
64
+ <button class="setup-method-btn" data-method="global" aria-pressed="false">
65
+ <strong>Pinned version</strong>
66
+ <span>Lock to a specific version, update when you choose</span>
67
+ </button>
68
+ </fieldset>
69
+
70
+ <!-- Pinned install prereq (hidden by default, shown when pinned selected) -->
71
+ <div class="setup-pinned-prereq" id="setup-pinned-prereq" hidden>
72
+ <div class="setup-method">
73
+ <h3>Pinned version: <code id="pinned-version-label">loading...</code></h3>
74
+ <p>The platform configs below will use this exact version. Choose how you want it installed:</p>
75
+
76
+ <h4>npx with pinned version <span class="setup-badge">no install needed</span></h4>
77
+ <p>Same as auto-updating but locked to a specific version. No extra install step.</p>
78
+ <p class="setup-hint">The platform configs below already use the pinned version &mdash; just copy and go.</p>
79
+
80
+ <h4>Global install</h4>
81
+ <p>Puts the <code>dollhousemcp</code> command on your PATH. Faster startup.</p>
82
+ <div class="setup-code-block">
83
+ <button class="setup-copy-btn" type="button" id="pinned-global-copy" data-copy-text="npm install -g @dollhousemcp/mcp-server" aria-label="Copy global install command">Copy</button>
84
+ <pre><code id="pinned-global-cmd">npm install -g @dollhousemcp/mcp-server</code></pre>
85
+ </div>
86
+ <p class="setup-hint">Update later by re-running with the new version number.</p>
87
+
88
+ <h4>Project-local install</h4>
89
+ <p>Installs into a directory you choose. Good for running multiple versions side by side.</p>
90
+ <div class="setup-code-block">
91
+ <button class="setup-copy-btn" type="button" id="pinned-local-copy" data-copy-text="mkdir -p ~/mcp-servers && cd ~/mcp-servers && npm install @dollhousemcp/mcp-server" aria-label="Copy local install command">Copy</button>
92
+ <pre><code id="pinned-local-cmd">mkdir -p ~/mcp-servers && cd ~/mcp-servers
93
+ npm install @dollhousemcp/mcp-server</code></pre>
94
+ </div>
95
+ <p class="setup-hint">Then point your client config at: <code>node ~/mcp-servers/node_modules/@dollhousemcp/mcp-server/dist/index.js</code></p>
96
+
97
+ </div>
98
+ </div>
99
+
100
+ <div class="setup-platforms" id="setup-platforms" role="tablist" aria-label="Platform install instructions">
101
+ <button class="setup-platform-tab is-active" role="tab" aria-selected="true" aria-controls="setup-panel-claude-desktop" id="setup-tab-claude-desktop">Claude Desktop</button>
102
+ <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-claude-code" id="setup-tab-claude-code">Claude Code</button>
103
+ <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-cursor" id="setup-tab-cursor">Cursor</button>
104
+ <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-vscode" id="setup-tab-vscode">VS Code</button>
105
+ <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-codex" id="setup-tab-codex">Codex</button>
106
+ <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-gemini" id="setup-tab-gemini">Gemini CLI</button>
107
+ <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-windsurf" id="setup-tab-windsurf">Windsurf</button>
108
+ <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-cline" id="setup-tab-cline">Cline</button>
109
+ <button class="setup-platform-tab" role="tab" aria-selected="false" aria-controls="setup-panel-lmstudio" id="setup-tab-lmstudio">LM Studio</button>
110
+ </div>
111
+
112
+ <!-- Claude Desktop -->
113
+ <section class="setup-panel is-active" role="tabpanel" id="setup-panel-claude-desktop" aria-labelledby="setup-tab-claude-desktop">
114
+ <div class="setup-method setup-method-primary">
115
+ <h3>Auto-install <span class="setup-method-badge setup-badge">auto-updating</span></h3>
116
+ <p class="setup-method-desc">Pulls the latest version of DollhouseMCP on every startup. Uses <code>npx @latest</code> under the hood. Restart Claude Desktop after.</p>
117
+ <div class="setup-install-row">
118
+ <button class="setup-btn setup-btn-primary setup-install-btn" type="button" data-install-client="claude">Install Now</button>
119
+ <span class="setup-install-status" data-install-status="claude"></span>
120
+ </div>
121
+ </div>
122
+ <div class="setup-method setup-mcpb-option" id="setup-mcpb-section" hidden>
123
+ <h3>Or install via Desktop Extension <span class="setup-badge">pinned version</span></h3>
124
+ <p>Download the <code>.mcpb</code> bundle and double-click it to install. Claude Desktop handles everything automatically &mdash; no terminal, no config editing. This installs a pinned copy that won't auto-update.</p>
125
+ <a class="setup-btn setup-btn-secondary" href="/api/setup/mcpb" id="pinned-mcpb-btn">Download .mcpb <span id="pinned-mcpb-version"></span></a>
126
+ </div>
127
+ <div class="setup-method">
128
+ <h3>Or add manually
129
+ <button class="setup-open-btn" type="button" data-open-client="claude">Open config file</button>
130
+ </h3>
131
+ <p>Add to your config file:</p>
132
+ <ul class="setup-paths" id="claude-desktop-paths">
133
+ <li><strong>macOS:</strong> <code>~/Library/Application Support/Claude/claude_desktop_config.json</code></li>
134
+ <li><strong>Windows:</strong> <code>%APPDATA%\Claude\claude_desktop_config.json</code></li>
135
+ <li><strong>Linux:</strong> <code>~/.config/Claude/claude_desktop_config.json</code></li>
136
+ </ul>
137
+ <div class="setup-code-block">
138
+ <button class="setup-copy-btn" type="button" data-copy-text='{"mcpServers":{"dollhousemcp":{"command":"npx","args":["-y","@dollhousemcp/mcp-server@latest"]}}}' aria-label="Copy config">Copy</button>
139
+ <pre><code>{
140
+ "mcpServers": {
141
+ "dollhousemcp": {
142
+ "command": "npx",
143
+ "args": ["-y", "@dollhousemcp/mcp-server@latest"]
144
+ }
145
+ }
146
+ }</code></pre>
147
+ </div>
148
+ <p class="setup-hint">Restart Claude Desktop after saving.</p>
149
+ </div>
150
+ </section>
151
+
152
+ <!-- Claude Code -->
153
+ <section class="setup-panel" role="tabpanel" id="setup-panel-claude-code" aria-labelledby="setup-tab-claude-code" hidden>
154
+ <div class="setup-method setup-method-primary">
155
+ <h3>Auto-install <span class="setup-method-badge setup-badge">auto-updating</span></h3>
156
+ <p class="setup-method-desc">Adds DollhouseMCP to Claude Code, pulling the latest version on every startup.</p>
157
+ <div class="setup-install-row">
158
+ <button class="setup-btn setup-btn-primary setup-install-btn" type="button" data-install-client="claude-code">Install Now</button>
159
+ <span class="setup-install-status" data-install-status="claude-code"></span>
160
+ </div>
161
+ </div>
162
+ <div class="setup-method">
163
+ <h3>Or run in your terminal</h3>
164
+ <p>Start a new conversation and you're ready.</p>
165
+ <div class="setup-code-block">
166
+ <button class="setup-copy-btn" type="button" data-copy-text="claude mcp add dollhousemcp -- npx -y @dollhousemcp/mcp-server@latest" aria-label="Copy command">Copy</button>
167
+ <pre><code>claude mcp add dollhousemcp -- npx -y @dollhousemcp/mcp-server@latest</code></pre>
168
+ </div>
169
+ </div>
170
+ <div class="setup-method">
171
+ <h3>Or add manually
172
+ <button class="setup-open-btn" type="button" data-open-client="claude-code">Open config file</button>
173
+ </h3>
174
+ <p>Add to <code>~/.claude.json</code>:</p>
175
+ <div class="setup-code-block">
176
+ <button class="setup-copy-btn" type="button" data-copy-text='{"mcpServers":{"dollhousemcp":{"command":"npx","args":["-y","@dollhousemcp/mcp-server@latest"]}}}' aria-label="Copy config">Copy</button>
177
+ <pre><code>{
178
+ "mcpServers": {
179
+ "dollhousemcp": {
180
+ "command": "npx",
181
+ "args": ["-y", "@dollhousemcp/mcp-server@latest"]
182
+ }
183
+ }
184
+ }</code></pre>
185
+ </div>
186
+ </div>
187
+ </section>
188
+
189
+ <!-- Panels for Cursor, VS Code, Codex, Gemini CLI, Windsurf, Cline, LM Studio -->
190
+ <!-- Generated by setup.js from PLATFORMS registry to eliminate HTML duplication -->
191
+ <div id="setup-generated-panels"></div>
192
+
193
+ <!-- Verify section -->
194
+ <div class="setup-verify">
195
+ <h3>Verify it's working</h3>
196
+ <p>After connecting, start a conversation and ask:</p>
197
+ <div class="setup-code-block setup-code-block-sm">
198
+ <button class="setup-copy-btn" type="button" data-copy-text="What DollhouseMCP tools do you have available?" aria-label="Copy prompt">Copy</button>
199
+ <pre><code>What DollhouseMCP tools do you have available?</code></pre>
200
+ </div>
201
+ <p>You should see MCP-AQL endpoints. Then try:</p>
202
+ <div class="setup-try-prompts">
203
+ <code>List all available Dollhouse personas</code>
204
+ <code>Activate the debug detective persona</code>
205
+ <code>Open the portfolio browser</code>
206
+ </div>
207
+ </div>
208
+
209
+ <div class="setup-footer">
210
+ <p>Full documentation for all platforms (Continue, Docker, local LLMs) in the
211
+ <a href="https://github.com/DollhouseMCP/mcp-server/blob/main/docs/guides/quick-start.md" target="_blank" rel="noopener">quick start guide</a>.
212
+ </p>
213
+ <p>Auto-install powered by <a href="https://github.com/supermemoryai/install-mcp" target="_blank" rel="noopener">install-mcp</a> by <a href="https://github.com/dhravyashah" target="_blank" rel="noopener">Dhravya Shah</a>.</p>
214
+ </div>
215
+ </div>
216
+ </div>
217
+
218
+ <!-- Tab: Portfolio -->
219
+ <div id="tab-portfolio" class="tab-panel active">
220
+ <main class="site-main">
221
+
222
+ <div class="browse-controls">
223
+ <div class="search-wrapper">
224
+ <label for="search-input" class="sr-only">Search elements</label>
225
+ <input
226
+ type="search"
227
+ id="search-input"
228
+ class="search-input"
229
+ placeholder="Search by name, description, author, or tag... (press / to focus)"
230
+ autocomplete="off"
231
+ spellcheck="false"
232
+ >
233
+ </div>
234
+ <div class="type-filter-row">
235
+ <fieldset class="type-filters" id="type-filters"><legend class="sr-only">Filter by element type</legend></fieldset>
236
+ <!-- Portfolio is the default view — no collection toggle needed -->
237
+ </div>
238
+ <fieldset class="topic-filters" id="topic-filters" hidden><legend class="sr-only">Filter by topic</legend></fieldset>
239
+ </div>
240
+
241
+ <div class="results-bar">
242
+ <span class="results-count" id="results-count" aria-live="polite"></span>
243
+ <output class="sr-only" id="results-announcer" aria-live="polite" aria-atomic="true"></output>
244
+ <fieldset class="source-toggle" id="source-toggle">
245
+ <legend class="sr-only">Filter by source</legend>
246
+ <button class="source-btn active" data-source="all" aria-pressed="true">All</button>
247
+ <button class="source-btn" data-source="collection" aria-pressed="false">Collection</button>
248
+ <button class="source-btn" data-source="portfolio" aria-pressed="false">Portfolio</button>
249
+ </fieldset>
250
+ <label for="sort-select" class="sr-only">Sort by</label>
251
+ <select id="sort-select" class="sort-select" aria-label="Sort elements">
252
+ <option value="name-asc">Name A-Z</option>
253
+ <option value="name-desc">Name Z-A</option>
254
+ <option value="date-desc" selected>Newest first</option>
255
+ <option value="date-asc">Oldest first</option>
256
+ <option value="type-asc">By type</option>
257
+ </select>
258
+ <fieldset class="view-toggle" id="view-toggle">
259
+ <legend class="sr-only">View mode</legend>
260
+ <button class="view-btn active" data-view="grid" aria-pressed="true">Cards</button>
261
+ <button class="view-btn" data-view="list" aria-pressed="false">List</button>
262
+ <button class="view-btn" data-view="detail" aria-pressed="false">Detail</button>
263
+ </fieldset>
264
+ </div>
265
+
266
+ <ul class="elements-grid" id="elements-grid"></ul>
267
+
268
+ <nav class="pagination" id="pagination" hidden aria-label="Page navigation">
269
+ <button class="pagination-btn" id="btn-prev-page">&#8249; Prev</button>
270
+ <span class="pagination-info" id="page-info"></span>
271
+ <button class="pagination-btn" id="btn-next-page">Next &#8250;</button>
272
+ </nav>
273
+
274
+ </main>
275
+ </div>
276
+
277
+ <!-- Tab: Logs -->
278
+ <div id="tab-logs" class="tab-panel" hidden>
279
+ <div id="log-viewer-root"></div>
280
+ </div>
281
+
282
+ <!-- Tab: Metrics -->
283
+ <div id="tab-metrics" class="tab-panel" hidden>
284
+ <div id="metrics-dashboard-root"></div>
285
+ </div>
286
+
287
+ <!-- Tab: Permissions -->
288
+ <div id="tab-permissions" class="tab-panel" hidden>
289
+ <div id="permissions-dashboard-root"></div>
290
+ </div>
291
+
292
+ <dialog id="element-modal" class="modal" aria-labelledby="modal-title">
293
+ <div class="modal-overlay" id="modal-overlay"></div>
294
+ <div class="modal-dialog">
295
+ <header class="modal-header">
296
+ <div class="modal-heading">
297
+ <h2 class="modal-title" id="modal-title">Loading...</h2>
298
+ <span class="modal-type"></span>
299
+ </div>
300
+ <div class="modal-meta">
301
+ <span class="modal-author"></span>
302
+ <span class="modal-version"></span>
303
+ <span class="modal-date"></span>
304
+ <span class="modal-source source-badge"></span>
305
+ </div>
306
+ <button class="modal-close" id="modal-close" aria-label="Close element detail">&#x2715;</button>
307
+ </header>
308
+ <div class="modal-toolbar" id="modal-toolbar">
309
+ <button class="modal-action-btn" id="btn-render">&#8644; Raw</button>
310
+ <button class="modal-action-btn" id="btn-copy">&#9112; Copy</button>
311
+ <button class="modal-action-btn" id="btn-download">&#10515; Download</button>
312
+ <a class="modal-action-btn" id="btn-github" target="_blank" rel="noopener noreferrer">&#8599; GitHub</a>
313
+ <a class="modal-action-btn modal-action-btn--submit" id="btn-submit" target="_blank" rel="noopener noreferrer" style="display:none">&#8593; Submit</a>
314
+ <div class="modal-nav" id="modal-nav">
315
+ <button class="modal-nav-btn" id="btn-prev-element">&#8249;<span class="sr-only"> Previous element</span></button>
316
+ <span class="modal-nav-count" id="modal-nav-count"></span>
317
+ <button class="modal-nav-btn" id="btn-next-element">&#8250;<span class="sr-only"> Next element</span></button>
318
+ </div>
319
+ </div>
320
+ <div class="modal-body" id="modal-body"></div>
321
+ </div>
322
+ </dialog>
323
+
324
+ <footer class="site-footer">
325
+ <div class="footer-inner">
326
+ <a href="https://github.com/DollhouseMCP/collection" class="footer-link">GitHub Repository</a>
327
+ <a href="./collection-index.json" class="footer-link">JSON API</a>
328
+ <a href="https://dollhousemcp.com" class="footer-link">DollhouseMCP</a>
329
+ <span class="footer-updated" id="footer-updated"></span>
330
+ </div>
331
+ </footer>
332
+
333
+ <!-- Markdown rendering (same libs as Merview) -->
334
+ <script src="https://cdn.jsdelivr.net/npm/marked@11.1.1/marked.min.js"
335
+ integrity="sha384-zbcZAIxlvJtNE3Dp5nxLXdXtXyxwOdnILY1TDPVmKFhl4r4nSUG1r8bcFXGVa4Te"
336
+ crossorigin="anonymous"></script>
337
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"
338
+ integrity="sha384-F/bZzf7p3Joyp5psL90p/p89AZJsndkSoGwRpXcZhleCWhd8SnRuoYo4d0yirjJp"
339
+ crossorigin="anonymous"></script>
340
+ <script src="https://cdn.jsdelivr.net/npm/js-yaml@4.1.0/dist/js-yaml.min.js"
341
+ integrity="sha384-+pxiN6T7yvpryuJmE1gM9PX7yQit15auDb+ZwwvJOd/4be2Cie5/IuVXgQb/S9du"
342
+ crossorigin="anonymous"></script>
343
+ <script src="https://cdn.jsdelivr.net/npm/dompurify@3.2.4/dist/purify.min.js"
344
+ integrity="sha384-eEu5CTj3qGvu9PdJuS+YlkNi7d2XxQROAFYOr59zgObtlcux1ae1Il3u7jvdCSWu"
345
+ crossorigin="anonymous"></script>
346
+ <link rel="stylesheet"
347
+ href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css"
348
+ integrity="sha512-0aPQyyeZrWj9sCA46UlmWgKOP0mUipLQ6OZXu8l4IcAmD2u31EPEy9VcIMvl7SoAaKe8bLXZhYoMaE/in+gcgA=="
349
+ crossorigin="anonymous"
350
+ id="hljs-theme-light">
351
+ <link rel="stylesheet"
352
+ href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css"
353
+ integrity="sha512-rO+olRTkcf304DQBxSWxln8JXCzTHlKnIdnMUwYvQa9/Jd4cQaNkItIUj6Z4nvW1dqK0SKXLbn9h4KwZTNtAyw=="
354
+ crossorigin="anonymous"
355
+ id="hljs-theme-dark" disabled>
356
+ <!-- uPlot for metrics charts -->
357
+ <script src="https://cdn.jsdelivr.net/npm/uplot@1.6.30/dist/uPlot.iife.min.js" integrity="sha384-1NEYi76CBpge3gahk4+X4M4JzdOV3WYq84RnByqYdAd5SdvJBTNCPFh/nsoHfN6i" crossorigin="anonymous"></script>
358
+ <script src="setup.js"></script>
359
+ <script src="app.js"></script>
360
+ <script src="logs.js"></script>
361
+ <script src="metrics.js"></script>
362
+ <script src="permissions.js"></script>
363
+ <script src="sessions.js"></script>
364
+ </body>
365
+ </html>