@components-kit/open-workbook 0.1.3 → 0.1.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.
@@ -1,47 +1,572 @@
1
+ :root {
2
+ color-scheme: light;
3
+ font-family: "Instrument Sans", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
4
+ --brand: oklch(62.31% 0.209 259.53);
5
+ --brand-ring: oklch(80.9% 0.105 251.81);
6
+ --neutral-0: oklch(100% 0 0);
7
+ --neutral-50: oklch(98.5% 0 0);
8
+ --neutral-100: oklch(96.5% 0 0);
9
+ --neutral-200: oklch(92.5% 0 0);
10
+ --neutral-300: oklch(87% 0 0);
11
+ --neutral-500: oklch(55.5% 0 0);
12
+ --neutral-600: oklch(44.5% 0 0);
13
+ --neutral-700: oklch(37% 0 0);
14
+ --neutral-950: oklch(14% 0 0);
15
+ --success: oklch(63% 0.18 145);
16
+ --warning: oklch(72% 0.17 78);
17
+ --error: oklch(61% 0.22 27);
18
+ }
19
+
20
+ @keyframes connection-border-race {
21
+ to {
22
+ transform: rotate(360deg);
23
+ }
24
+ }
25
+
26
+ @keyframes excel-hero-card-glow-a {
27
+ 0%,
28
+ 100% {
29
+ opacity: 0.58;
30
+ transform: translate3d(0, 0, 0) scale(1);
31
+ }
32
+
33
+ 45% {
34
+ opacity: 0.9;
35
+ transform: translate3d(-7%, 8%, 0) scale(1.14);
36
+ }
37
+
38
+ 72% {
39
+ opacity: 0.7;
40
+ transform: translate3d(4%, -4%, 0) scale(1.06);
41
+ }
42
+ }
43
+
44
+ @keyframes excel-hero-card-glow-b {
45
+ 0%,
46
+ 100% {
47
+ opacity: 0.46;
48
+ transform: translate3d(0, 0, 0) scale(1.08);
49
+ }
50
+
51
+ 38% {
52
+ opacity: 0.78;
53
+ transform: translate3d(6%, -7%, 0) scale(0.98);
54
+ }
55
+
56
+ 76% {
57
+ opacity: 0.62;
58
+ transform: translate3d(-4%, 5%, 0) scale(1.16);
59
+ }
60
+ }
61
+
62
+ * {
63
+ box-sizing: border-box;
64
+ }
65
+
1
66
  html,
67
+ body,
68
+ #root {
69
+ min-height: 100%;
70
+ }
71
+
2
72
  body {
3
73
  margin: 0;
4
- min-height: 100%;
5
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
6
- color: #1f2933;
7
- background: #f7f9fb;
74
+ background: var(--neutral-0);
75
+ color: var(--neutral-600);
76
+ font-family: inherit;
77
+ font-feature-settings: "ss01", "cv11", "kern";
78
+ font-weight: 450;
79
+ }
80
+
81
+ button,
82
+ input,
83
+ textarea,
84
+ select {
85
+ font: inherit;
86
+ }
87
+
88
+ .taskpane-shell {
89
+ min-height: 100vh;
90
+ padding: 18px;
91
+ background: var(--neutral-0);
92
+ }
93
+
94
+ .landing-view,
95
+ .status-view {
96
+ display: flex;
97
+ min-height: calc(100vh - 36px);
98
+ flex-direction: column;
99
+ }
100
+
101
+ .landing-view {
102
+ align-items: center;
103
+ justify-content: space-between;
104
+ gap: 16px;
105
+ text-align: center;
106
+ }
107
+
108
+ .status-view {
109
+ gap: 18px;
110
+ }
111
+
112
+ .landing-content {
113
+ display: flex;
114
+ width: 100%;
115
+ flex: 1 1 auto;
116
+ flex-direction: column;
117
+ align-items: center;
118
+ justify-content: center;
119
+ gap: 18px;
120
+ }
121
+
122
+ .brand-lockup {
123
+ display: inline-flex;
124
+ max-width: 100%;
125
+ align-items: center;
126
+ gap: 8px;
127
+ color: var(--neutral-950);
8
128
  }
9
129
 
10
- main {
11
- padding: 16px;
130
+ .brand-logo {
131
+ width: 28px;
132
+ height: 28px;
133
+ flex: 0 0 auto;
134
+ image-rendering: auto;
135
+ }
136
+
137
+ .brand-divider {
138
+ color: var(--neutral-300);
139
+ font-size: 15px;
140
+ }
141
+
142
+ .brand-product {
143
+ min-width: 0;
144
+ overflow: hidden;
145
+ color: var(--neutral-950);
146
+ font-size: 14px;
147
+ font-weight: 550;
148
+ text-overflow: ellipsis;
149
+ white-space: nowrap;
150
+ }
151
+
152
+ .landing-copy {
153
+ max-width: 318px;
12
154
  }
13
155
 
14
156
  h1 {
15
- margin: 0 0 12px;
16
- font-size: 18px;
17
- font-weight: 650;
157
+ margin: 0;
158
+ color: var(--neutral-950);
159
+ font-size: clamp(26px, 8.4vw, 32px);
160
+ font-weight: 500;
161
+ letter-spacing: 0;
162
+ line-height: 1.15;
18
163
  }
19
164
 
20
165
  p {
21
- margin: 0 0 16px;
22
- font-size: 13px;
23
- line-height: 1.5;
166
+ margin: 10px 0 0;
167
+ color: var(--neutral-600);
168
+ font-size: 14px;
169
+ font-weight: 400;
170
+ line-height: 1.48;
24
171
  }
25
172
 
26
- dl {
27
- margin: 0;
28
- border-top: 1px solid #d9e2ec;
173
+ .connection-badge {
174
+ position: relative;
175
+ isolation: isolate;
176
+ overflow: hidden;
177
+ display: inline-flex;
178
+ align-items: center;
179
+ justify-content: center;
180
+ min-height: 28px;
181
+ max-width: min(100%, 318px);
182
+ border: 1px solid transparent;
183
+ border-radius: 999px;
184
+ background: transparent;
185
+ padding: 6px 11px;
186
+ color: var(--connection-fg, var(--neutral-600));
187
+ font-size: 12px;
188
+ font-weight: 500;
189
+ line-height: 1.15;
190
+ text-align: center;
191
+ box-shadow:
192
+ 0 1px 2px var(--connection-shadow, oklch(42% 0 0 / 0.08)),
193
+ inset 0 0 0 1px var(--connection-inset, oklch(72% 0 0 / 0.16));
29
194
  }
30
195
 
31
- div {
32
- padding: 10px 0;
33
- border-bottom: 1px solid #d9e2ec;
196
+ .connection-badge::before {
197
+ position: absolute;
198
+ inset: -60%;
199
+ z-index: -2;
200
+ background: var(--connection-ring, oklch(74% 0 0 / 0.08));
201
+ animation: connection-border-race 4.2s linear infinite;
202
+ content: "";
34
203
  }
35
204
 
36
- dt {
37
- font-size: 11px;
38
- font-weight: 650;
39
- color: #52606d;
40
- text-transform: uppercase;
205
+ .connection-badge::after {
206
+ position: absolute;
207
+ inset: 1px;
208
+ z-index: -1;
209
+ border-radius: inherit;
210
+ background: var(--connection-bg, var(--neutral-50));
211
+ content: "";
212
+ }
213
+
214
+ .connection-neutral {
215
+ --connection-fg: var(--neutral-600);
216
+ --connection-bg: linear-gradient(180deg, var(--neutral-0), var(--neutral-100));
217
+ --connection-ring: conic-gradient(
218
+ from 0deg,
219
+ oklch(74% 0 0 / 0.04),
220
+ oklch(74% 0 0 / 0.04) 22%,
221
+ oklch(70% 0 0 / 0.34) 48%,
222
+ oklch(82% 0 0 / 0.18) 68%,
223
+ oklch(74% 0 0 / 0.04)
224
+ );
225
+ --connection-inset: oklch(72% 0 0 / 0.14);
226
+ --connection-shadow: oklch(42% 0 0 / 0.08);
227
+ }
228
+
229
+ .connection-success {
230
+ --connection-fg: oklch(36% 0.14 155);
231
+ --connection-bg: linear-gradient(180deg, oklch(98% 0.028 155), oklch(95.5% 0.038 158));
232
+ --connection-ring: conic-gradient(
233
+ from 0deg,
234
+ oklch(74% 0.11 160 / 0.05),
235
+ oklch(74% 0.11 160 / 0.05) 18%,
236
+ oklch(76% 0.12 165 / 0.22) 32%,
237
+ oklch(72% 0.16 155 / 0.74) 48%,
238
+ oklch(84% 0.12 180 / 0.56) 62%,
239
+ oklch(78% 0.11 165 / 0.2) 76%,
240
+ oklch(74% 0.11 160 / 0.05)
241
+ );
242
+ --connection-inset: oklch(72% 0.1 155 / 0.16);
243
+ --connection-shadow: oklch(42% 0.12 155 / 0.08);
244
+ }
245
+
246
+ .connection-warning {
247
+ --connection-fg: oklch(43% 0.13 78);
248
+ --connection-bg: linear-gradient(180deg, oklch(98% 0.028 82), oklch(95.5% 0.045 82));
249
+ --connection-ring: conic-gradient(
250
+ from 0deg,
251
+ oklch(80% 0.12 82 / 0.06),
252
+ oklch(80% 0.12 82 / 0.06) 18%,
253
+ oklch(78% 0.16 78 / 0.26) 34%,
254
+ oklch(74% 0.18 72 / 0.76) 50%,
255
+ oklch(86% 0.14 88 / 0.48) 66%,
256
+ oklch(80% 0.12 82 / 0.06)
257
+ );
258
+ --connection-inset: oklch(72% 0.13 78 / 0.2);
259
+ --connection-shadow: oklch(48% 0.12 78 / 0.1);
260
+ }
261
+
262
+ .connection-error {
263
+ --connection-fg: oklch(42% 0.18 27);
264
+ --connection-bg: linear-gradient(180deg, oklch(98% 0.028 27), oklch(95.5% 0.04 27));
265
+ --connection-ring: conic-gradient(
266
+ from 0deg,
267
+ oklch(76% 0.14 27 / 0.06),
268
+ oklch(76% 0.14 27 / 0.06) 18%,
269
+ oklch(72% 0.18 27 / 0.28) 34%,
270
+ oklch(62% 0.22 27 / 0.8) 50%,
271
+ oklch(82% 0.14 42 / 0.48) 66%,
272
+ oklch(76% 0.14 27 / 0.06)
273
+ );
274
+ --connection-inset: oklch(70% 0.16 27 / 0.2);
275
+ --connection-shadow: oklch(44% 0.16 27 / 0.1);
276
+ }
277
+
278
+ .workbook-preview-card {
279
+ position: relative;
280
+ isolation: isolate;
281
+ overflow: hidden;
282
+ width: calc(100% + 36px);
283
+ min-height: 236px;
284
+ max-height: min(46vh, 320px);
285
+ flex: 0 1 320px;
286
+ margin-right: -18px;
287
+ margin-bottom: -18px;
288
+ margin-left: -18px;
289
+ border-radius: 0;
290
+ background: linear-gradient(
291
+ 135deg,
292
+ oklch(94% 0.032 155) 0%,
293
+ oklch(90% 0.048 205) 48%,
294
+ oklch(86% 0.062 245) 100%
295
+ );
296
+ }
297
+
298
+ .workbook-preview-card::before,
299
+ .workbook-preview-card::after {
300
+ position: absolute;
301
+ z-index: 0;
302
+ border-radius: 9999px;
303
+ content: "";
304
+ filter: blur(42px);
305
+ pointer-events: none;
306
+ }
307
+
308
+ .workbook-preview-card::before {
309
+ top: -58px;
310
+ right: -62px;
311
+ width: 168px;
312
+ height: 168px;
313
+ animation: excel-hero-card-glow-a 4.6s ease-in-out infinite;
314
+ background: oklch(78% 0.13 245 / 0.56);
315
+ }
316
+
317
+ .workbook-preview-card::after {
318
+ bottom: -72px;
319
+ left: -62px;
320
+ width: 190px;
321
+ height: 190px;
322
+ animation: excel-hero-card-glow-b 5.8s ease-in-out infinite;
323
+ background: oklch(84% 0.11 155 / 0.52);
324
+ }
325
+
326
+ .workbook-preview-window {
327
+ position: absolute;
328
+ top: 24px;
329
+ right: -72px;
330
+ bottom: -36px;
331
+ left: 16px;
332
+ z-index: 1;
333
+ overflow: hidden;
334
+ border: 1px solid oklch(86% 0 0 / 0.76);
335
+ border-radius: 0;
336
+ background: oklch(100% 0 0 / 0.94);
337
+ box-shadow: 0 20px 42px oklch(18% 0.04 245 / 0.22);
338
+ backdrop-filter: blur(14px);
339
+ text-align: left;
340
+ }
341
+
342
+ .workbook-preview-titlebar {
343
+ display: flex;
344
+ height: 32px;
345
+ align-items: center;
346
+ gap: 8px;
347
+ border-bottom: 1px solid var(--neutral-200);
348
+ background: oklch(98.5% 0 0 / 0.86);
349
+ padding: 0 10px;
350
+ color: var(--neutral-500);
351
+ font-size: 10px;
352
+ font-weight: 500;
353
+ }
354
+
355
+ .window-dots {
356
+ display: flex;
357
+ gap: 5px;
41
358
  }
42
359
 
43
- dd {
44
- margin: 4px 0 0;
360
+ .window-dots span {
361
+ width: 8px;
362
+ height: 8px;
363
+ border-radius: 999px;
364
+ }
365
+
366
+ .dot-red {
367
+ background: #ff5f57;
368
+ }
369
+
370
+ .dot-yellow {
371
+ background: #ffbd2e;
372
+ }
373
+
374
+ .dot-green {
375
+ background: #28c840;
376
+ }
377
+
378
+ .autosave-label {
379
+ margin-left: 3px;
380
+ }
381
+
382
+ .autosave-toggle {
383
+ width: 23px;
384
+ height: 11px;
385
+ border-radius: 999px;
386
+ background: var(--neutral-300);
387
+ }
388
+
389
+ .preview-tool {
390
+ color: var(--neutral-700);
391
+ }
392
+
393
+ .preview-tool.muted {
394
+ color: var(--neutral-500);
395
+ }
396
+
397
+ .workbook-preview-ribbon {
398
+ display: flex;
399
+ height: 34px;
400
+ align-items: center;
401
+ gap: 8px;
402
+ overflow: hidden;
403
+ border-bottom: 1px solid var(--neutral-200);
404
+ background: var(--neutral-0);
405
+ padding: 0 10px;
406
+ }
407
+
408
+ .ribbon-button {
409
+ width: 42px;
410
+ height: 18px;
411
+ border: 1px solid var(--neutral-200);
412
+ border-radius: 4px;
413
+ background: var(--neutral-50);
414
+ }
415
+
416
+ .ribbon-button.wide {
417
+ width: 56px;
418
+ }
419
+
420
+ .ribbon-button.short {
421
+ width: 30px;
422
+ }
423
+
424
+ .ribbon-divider {
425
+ width: 1px;
426
+ height: 18px;
427
+ background: var(--neutral-200);
428
+ }
429
+
430
+ .ribbon-pill {
431
+ border-radius: 4px;
432
+ background: var(--neutral-200);
433
+ padding: 4px 8px;
434
+ color: var(--neutral-700);
435
+ font-size: 10px;
436
+ white-space: nowrap;
437
+ }
438
+
439
+ .workbook-preview-formula {
440
+ display: flex;
441
+ height: 32px;
442
+ align-items: center;
443
+ gap: 8px;
444
+ border-bottom: 1px solid var(--neutral-200);
445
+ background: var(--neutral-0);
446
+ padding: 0 8px;
447
+ color: var(--neutral-600);
448
+ font-size: 10px;
449
+ }
450
+
451
+ .name-box,
452
+ .formula-box {
453
+ height: 18px;
454
+ border: 1px solid var(--neutral-200);
455
+ border-radius: 4px;
456
+ background: var(--neutral-0);
457
+ line-height: 16px;
458
+ }
459
+
460
+ .name-box {
461
+ width: 42px;
462
+ text-align: center;
463
+ }
464
+
465
+ .formula-mark {
466
+ color: var(--neutral-500);
467
+ font-family: Georgia, serif;
45
468
  font-size: 12px;
46
- overflow-wrap: anywhere;
469
+ }
470
+
471
+ .formula-box {
472
+ min-width: 172px;
473
+ flex: 1;
474
+ padding: 0 7px;
475
+ color: var(--neutral-700);
476
+ }
477
+
478
+ .workbook-preview-sheet {
479
+ overflow: hidden;
480
+ background: var(--neutral-0);
481
+ }
482
+
483
+ .sheet-grid {
484
+ display: grid;
485
+ min-width: 560px;
486
+ grid-template-columns: 30px 104px 84px 88px 178px;
487
+ color: var(--neutral-700);
488
+ font-size: 11px;
489
+ }
490
+
491
+ .sheet-corner,
492
+ .sheet-column,
493
+ .sheet-row-number,
494
+ .sheet-cell {
495
+ border-right: 1px solid var(--neutral-200);
496
+ border-bottom: 1px solid var(--neutral-200);
497
+ }
498
+
499
+ .sheet-corner,
500
+ .sheet-column,
501
+ .sheet-row-number {
502
+ background: var(--neutral-100);
503
+ color: var(--neutral-500);
504
+ font-weight: 500;
505
+ text-align: center;
506
+ }
507
+
508
+ .sheet-corner,
509
+ .sheet-column {
510
+ height: 26px;
511
+ line-height: 25px;
512
+ }
513
+
514
+ .sheet-row-number {
515
+ height: 42px;
516
+ line-height: 41px;
517
+ }
518
+
519
+ .sheet-cell {
520
+ height: 42px;
521
+ overflow: hidden;
522
+ background: var(--neutral-0);
523
+ padding: 12px 9px;
524
+ }
525
+
526
+ .sheet-cell span {
527
+ display: block;
528
+ overflow: hidden;
529
+ text-overflow: ellipsis;
530
+ white-space: nowrap;
531
+ }
532
+
533
+ .sheet-header {
534
+ background: oklch(45% 0.14 158);
535
+ color: white;
536
+ font-weight: 600;
537
+ }
538
+
539
+ .sheet-selected {
540
+ position: relative;
541
+ z-index: 1;
542
+ box-shadow: inset 0 0 0 2px oklch(45% 0.14 158);
543
+ }
544
+
545
+ .sheet-agent-cell span {
546
+ color: oklch(37% 0.12 155);
547
+ }
548
+
549
+ @media (max-width: 320px) {
550
+ .taskpane-shell {
551
+ padding: 14px;
552
+ }
553
+
554
+ .landing-view {
555
+ gap: 14px;
556
+ }
557
+
558
+ .workbook-preview-card {
559
+ width: calc(100% + 28px);
560
+ min-height: 218px;
561
+ margin-right: -14px;
562
+ margin-bottom: -14px;
563
+ margin-left: -14px;
564
+ }
565
+
566
+ .workbook-preview-window {
567
+ top: 20px;
568
+ right: -118px;
569
+ bottom: -42px;
570
+ left: 12px;
571
+ }
47
572
  }
@@ -3,8 +3,14 @@
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Open Workbook</title>
7
- <link rel="stylesheet" href="/taskpane.css" />
6
+ <title>OpenWorkbook</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
+ <link
10
+ href="https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&display=swap"
11
+ rel="stylesheet"
12
+ />
13
+ <link rel="stylesheet" href="/taskpane.css?v=20260613-2" />
8
14
  <script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>
9
15
  <script type="importmap">
10
16
  {
@@ -16,20 +22,7 @@
16
22
  </script>
17
23
  </head>
18
24
  <body>
19
- <main>
20
- <h1>Open Workbook</h1>
21
- <p id="status">Connecting to local MCP runtime...</p>
22
- <dl>
23
- <div>
24
- <dt>Backend</dt>
25
- <dd id="backend-url">ws://127.0.0.1:37845/addin</dd>
26
- </div>
27
- <div>
28
- <dt>Mode</dt>
29
- <dd>Local sideload</dd>
30
- </div>
31
- </dl>
32
- </main>
33
- <script type="module" src="/dist/taskpane.js?v=20260613-2"></script>
25
+ <div id="root"></div>
26
+ <script type="module" src="/dist/taskpane.bundle.js?v=20260613-1"></script>
34
27
  </body>
35
28
  </html>
@@ -1,5 +1,4 @@
1
1
  import { createServer as createHttpServer } from "node:http";
2
- import { createServer as createHttpsServer } from "node:https";
3
2
  import { existsSync, readFileSync } from "node:fs";
4
3
  import { extname, join, normalize } from "node:path";
5
4
  import { fileURLToPath } from "node:url";
@@ -23,9 +22,8 @@ const workspaceModuleDirs = new Map([
23
22
  ])]
24
23
  ]);
25
24
  const port = Number(process.env.OPEN_WORKBOOK_ADDIN_PORT ?? 37846);
26
- const host = process.env.OPEN_WORKBOOK_ADDIN_HOST ?? "127.0.0.1";
27
- const httpsEnabled = process.env.OPEN_WORKBOOK_ADDIN_HTTPS === "1" || process.env.OPEN_WORKBOOK_ADDIN_PROTOCOL === "https";
28
- const protocol = httpsEnabled ? "https" : "http";
25
+ const host = process.env.OPEN_WORKBOOK_ADDIN_HOST ?? "localhost";
26
+ const protocol = "http";
29
27
  const runtimeVersion = process.env.OPEN_WORKBOOK_VERSION ?? readPackageVersion() ?? "0.1.1";
30
28
 
31
29
  const contentTypes = new Map([
@@ -33,6 +31,7 @@ const contentTypes = new Map([
33
31
  [".css", "text/css; charset=utf-8"],
34
32
  [".js", "text/javascript; charset=utf-8"],
35
33
  [".png", "image/png"],
34
+ [".svg", "image/svg+xml; charset=utf-8"],
36
35
  [".xml", "application/xml; charset=utf-8"]
37
36
  ]);
38
37
 
@@ -46,14 +45,6 @@ const requestHandler = (request, response) => {
46
45
  response.end(JSON.stringify(getStatus()));
47
46
  return;
48
47
  }
49
- if (url.pathname.startsWith("/assets/icon-") && url.pathname.endsWith(".png")) {
50
- response.writeHead(200, {
51
- "content-type": "image/png",
52
- "cache-control": "no-store"
53
- });
54
- response.end(Buffer.from(ICON_PNG_BASE64, "base64"));
55
- return;
56
- }
57
48
  if (url.pathname === "/manifest.xml") {
58
49
  response.writeHead(200, {
59
50
  "content-type": "application/xml; charset=utf-8",
@@ -82,7 +73,7 @@ const requestHandler = (request, response) => {
82
73
  response.end(extname(normalized) === ".js" ? rewriteBrowserImports(body.toString("utf8")) : body);
83
74
  };
84
75
 
85
- const server = httpsEnabled ? createHttpsServer(readHttpsOptions(), requestHandler) : createHttpServer(requestHandler);
76
+ const server = createHttpServer(requestHandler);
86
77
 
87
78
  server.listen(port, host, () => {
88
79
  console.log(`Open Workbook add-in server listening on ${protocol}://${host}:${port}`);
@@ -147,23 +138,6 @@ function generateManifest() {
147
138
  .replaceAll("http://localhost:37846", addinUrl);
148
139
  }
149
140
 
150
- function readHttpsOptions() {
151
- const keyPath = process.env.OPEN_WORKBOOK_ADDIN_TLS_KEY;
152
- const certPath = process.env.OPEN_WORKBOOK_ADDIN_TLS_CERT;
153
- if (!keyPath || !certPath) {
154
- console.error("OPEN_WORKBOOK_ADDIN_TLS_KEY and OPEN_WORKBOOK_ADDIN_TLS_CERT are required when HTTPS add-in serving is enabled.");
155
- process.exit(1);
156
- }
157
- if (!existsSync(keyPath) || !existsSync(certPath)) {
158
- console.error(`Missing HTTPS certificate files: key=${keyPath} cert=${certPath}`);
159
- process.exit(1);
160
- }
161
- return {
162
- key: readFileSync(keyPath),
163
- cert: readFileSync(certPath)
164
- };
165
- }
166
-
167
141
  function trimTrailingSlash(value) {
168
142
  return value.endsWith("/") ? value.slice(0, -1) : value;
169
143
  }
@@ -184,6 +158,3 @@ function readPackageVersion() {
184
158
  }
185
159
  return undefined;
186
160
  }
187
-
188
- const ICON_PNG_BASE64 =
189
- "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC+aJAAAAFUlEQVR4nO3BAQEAAACCIP+vbkhAAQAAAO8GEABAAAGl9n6SAAAAAElFTkSuQmCC";
@@ -45,7 +45,7 @@ const STYLE_COPY_TOOL_DIMENSIONS = {
45
45
  "excel.style.copy_hidden_rows_columns": "hiddenRowsColumns"
46
46
  };
47
47
  const runtime = await createRuntimeFacade();
48
- const runtimeVersion = process.env.OPEN_WORKBOOK_VERSION ?? "0.1.3";
48
+ const runtimeVersion = process.env.OPEN_WORKBOOK_VERSION ?? "0.1.4";
49
49
  const server = new McpServer({
50
50
  name: "open-workbook",
51
51
  version: runtimeVersion