@pixelbyte-software/pixcode 1.35.4 → 1.36.0

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 (55) hide show
  1. package/README.de.md +116 -198
  2. package/README.ja.md +116 -192
  3. package/README.ko.md +116 -192
  4. package/README.md +201 -223
  5. package/README.ru.md +116 -198
  6. package/README.tr.md +205 -175
  7. package/README.zh-CN.md +116 -192
  8. package/dist/api-automation.html +110 -0
  9. package/dist/api-docs.html +18 -18
  10. package/dist/assets/index-BzRaZegN.css +32 -0
  11. package/dist/assets/{index-CyxRiNt0.js → index-OkHfhUMk.js} +176 -175
  12. package/dist/docs.html +294 -0
  13. package/dist/features.html +112 -0
  14. package/dist/humans.txt +15 -0
  15. package/dist/index.html +2 -2
  16. package/dist/landing.html +217 -0
  17. package/dist/llms-full.txt +117 -0
  18. package/dist/llms.txt +53 -0
  19. package/dist/openapi.yaml +12 -9
  20. package/dist/orchestration.html +125 -0
  21. package/dist/robots.txt +4 -0
  22. package/dist/site.css +536 -0
  23. package/dist/sitemap.xml +51 -0
  24. package/dist-server/server/cli.js +51 -2
  25. package/dist-server/server/cli.js.map +1 -1
  26. package/dist-server/server/daemon/manager.js +0 -1
  27. package/dist-server/server/daemon/manager.js.map +1 -1
  28. package/dist-server/server/database/db.js +3 -2
  29. package/dist-server/server/database/db.js.map +1 -1
  30. package/dist-server/server/middleware/auth.js +9 -8
  31. package/dist-server/server/middleware/auth.js.map +1 -1
  32. package/dist-server/server/modules/orchestration/workflows/workflow-runner.js +156 -32
  33. package/dist-server/server/modules/orchestration/workflows/workflow-runner.js.map +1 -1
  34. package/dist-server/server/modules/providers/provider.routes.js +8 -1
  35. package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
  36. package/dist-server/server/routes/agent.js +72 -11
  37. package/dist-server/server/routes/agent.js.map +1 -1
  38. package/dist-server/server/services/notification-orchestrator.js +11 -2
  39. package/dist-server/server/services/notification-orchestrator.js.map +1 -1
  40. package/dist-server/server/services/provider-cli-versions.js +142 -0
  41. package/dist-server/server/services/provider-cli-versions.js.map +1 -0
  42. package/dist-server/server/services/startup-update.js +208 -0
  43. package/dist-server/server/services/startup-update.js.map +1 -0
  44. package/package.json +35 -10
  45. package/server/cli.js +58 -3
  46. package/server/daemon/manager.js +0 -1
  47. package/server/database/db.js +3 -2
  48. package/server/middleware/auth.js +9 -8
  49. package/server/modules/orchestration/workflows/workflow-runner.ts +172 -32
  50. package/server/modules/providers/provider.routes.ts +8 -1
  51. package/server/routes/agent.js +75 -10
  52. package/server/services/notification-orchestrator.js +11 -2
  53. package/server/services/provider-cli-versions.js +149 -0
  54. package/server/services/startup-update.js +234 -0
  55. package/dist/assets/index-BwmhA_le.css +0 -32
package/dist/site.css ADDED
@@ -0,0 +1,536 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --bg: #080a0c;
4
+ --bg-soft: #101316;
5
+ --bg-warm: #15120d;
6
+ --panel: rgba(18, 22, 25, 0.92);
7
+ --panel-strong: #151a1d;
8
+ --ink: #f3f7f4;
9
+ --muted: #b9c3bd;
10
+ --soft: #87938d;
11
+ --line: rgba(190, 203, 194, 0.2);
12
+ --line-strong: rgba(190, 203, 194, 0.34);
13
+ --green: #20d17d;
14
+ --green-soft: rgba(32, 209, 125, 0.16);
15
+ --cyan: #40c9d8;
16
+ --amber: #f0b84f;
17
+ --rose: #ef6f75;
18
+ --code: #b8f7cf;
19
+ --shadow: 0 22px 70px rgba(0, 0, 0, 0.42);
20
+ }
21
+
22
+ * {
23
+ box-sizing: border-box;
24
+ }
25
+
26
+ html {
27
+ scroll-behavior: smooth;
28
+ }
29
+
30
+ body {
31
+ margin: 0;
32
+ background:
33
+ linear-gradient(180deg, rgba(32, 209, 125, 0.08), rgba(8, 10, 12, 0) 360px),
34
+ var(--bg);
35
+ color: var(--ink);
36
+ font-family:
37
+ Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
38
+ sans-serif;
39
+ line-height: 1.6;
40
+ }
41
+
42
+ a {
43
+ color: inherit;
44
+ }
45
+
46
+ code,
47
+ pre {
48
+ font-family:
49
+ "SFMono-Regular", "Cascadia Code", "Liberation Mono", Menlo, Consolas, monospace;
50
+ }
51
+
52
+ img {
53
+ max-width: 100%;
54
+ }
55
+
56
+ .site-nav {
57
+ position: sticky;
58
+ top: 0;
59
+ z-index: 20;
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: space-between;
63
+ gap: 18px;
64
+ min-height: 64px;
65
+ padding: 12px clamp(18px, 5vw, 72px);
66
+ border-bottom: 1px solid var(--line);
67
+ background: rgba(8, 10, 12, 0.84);
68
+ backdrop-filter: blur(18px);
69
+ }
70
+
71
+ .brand {
72
+ display: inline-flex;
73
+ align-items: center;
74
+ gap: 10px;
75
+ color: var(--ink);
76
+ font-weight: 900;
77
+ text-decoration: none;
78
+ }
79
+
80
+ .brand img {
81
+ width: 32px;
82
+ height: 32px;
83
+ }
84
+
85
+ .nav-links {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 18px;
89
+ color: #d9e3dd;
90
+ font-size: 14px;
91
+ }
92
+
93
+ .nav-links a {
94
+ text-decoration: none;
95
+ }
96
+
97
+ .nav-links a:hover,
98
+ .brand:hover {
99
+ color: var(--green);
100
+ }
101
+
102
+ .hero {
103
+ display: grid;
104
+ grid-template-columns: minmax(0, 1.05fr) minmax(320px, 0.95fr);
105
+ gap: clamp(28px, 5vw, 72px);
106
+ align-items: center;
107
+ min-height: calc(100vh - 64px);
108
+ padding: clamp(52px, 8vw, 96px) clamp(18px, 5vw, 72px);
109
+ border-bottom: 1px solid var(--line);
110
+ }
111
+
112
+ .hero.docs-hero {
113
+ min-height: auto;
114
+ grid-template-columns: minmax(0, 1fr) minmax(300px, 0.72fr);
115
+ padding-top: 62px;
116
+ padding-bottom: 46px;
117
+ }
118
+
119
+ .eyebrow {
120
+ color: var(--green);
121
+ font-size: 13px;
122
+ font-weight: 900;
123
+ letter-spacing: 0.08em;
124
+ text-transform: uppercase;
125
+ }
126
+
127
+ h1,
128
+ h2,
129
+ h3 {
130
+ letter-spacing: 0;
131
+ }
132
+
133
+ h1 {
134
+ margin: 12px 0 18px;
135
+ max-width: 880px;
136
+ font-size: clamp(50px, 8vw, 104px);
137
+ line-height: 0.94;
138
+ }
139
+
140
+ .docs-hero h1 {
141
+ font-size: clamp(40px, 6vw, 76px);
142
+ }
143
+
144
+ h2 {
145
+ margin: 0 0 14px;
146
+ font-size: clamp(30px, 4.4vw, 56px);
147
+ line-height: 1.03;
148
+ }
149
+
150
+ h3 {
151
+ margin: 0 0 10px;
152
+ font-size: 20px;
153
+ }
154
+
155
+ .lead {
156
+ max-width: 820px;
157
+ margin: 0;
158
+ color: #dce7df;
159
+ font-size: clamp(18px, 2.1vw, 24px);
160
+ }
161
+
162
+ .sublead {
163
+ max-width: 860px;
164
+ margin: 0 0 30px;
165
+ color: var(--muted);
166
+ font-size: 18px;
167
+ }
168
+
169
+ .actions {
170
+ display: flex;
171
+ flex-wrap: wrap;
172
+ gap: 12px;
173
+ margin-top: 28px;
174
+ }
175
+
176
+ .button {
177
+ display: inline-flex;
178
+ min-height: 44px;
179
+ align-items: center;
180
+ justify-content: center;
181
+ padding: 0 18px;
182
+ border: 1px solid var(--line-strong);
183
+ border-radius: 8px;
184
+ background: #151a1d;
185
+ color: var(--ink);
186
+ font-weight: 850;
187
+ text-decoration: none;
188
+ transition:
189
+ transform 160ms ease,
190
+ border-color 160ms ease,
191
+ background 160ms ease;
192
+ }
193
+
194
+ .button:hover {
195
+ transform: translateY(-1px);
196
+ border-color: var(--green);
197
+ background: #18211d;
198
+ }
199
+
200
+ .button.primary {
201
+ border-color: rgba(32, 209, 125, 0.8);
202
+ background: #0f7c50;
203
+ }
204
+
205
+ .button.primary:hover {
206
+ background: #11935d;
207
+ }
208
+
209
+ .hero-panel,
210
+ .panel,
211
+ .card,
212
+ .code-panel,
213
+ .image-slot {
214
+ border: 1px solid var(--line);
215
+ border-radius: 8px;
216
+ background: var(--panel);
217
+ box-shadow: var(--shadow);
218
+ }
219
+
220
+ .hero-panel {
221
+ overflow: hidden;
222
+ }
223
+
224
+ .hero-panel img {
225
+ display: block;
226
+ width: 100%;
227
+ border-bottom: 1px solid var(--line);
228
+ }
229
+
230
+ .terminal-strip {
231
+ display: grid;
232
+ gap: 8px;
233
+ padding: 16px;
234
+ color: var(--code);
235
+ font-size: 13px;
236
+ }
237
+
238
+ .prompt-line {
239
+ display: flex;
240
+ gap: 10px;
241
+ }
242
+
243
+ .prompt-line span:first-child {
244
+ color: var(--green);
245
+ }
246
+
247
+ .section {
248
+ padding: 78px clamp(18px, 5vw, 72px);
249
+ border-bottom: 1px solid var(--line);
250
+ }
251
+
252
+ .section.alt {
253
+ background: var(--bg-soft);
254
+ }
255
+
256
+ .section.warm {
257
+ background: var(--bg-warm);
258
+ }
259
+
260
+ .grid {
261
+ display: grid;
262
+ gap: 16px;
263
+ }
264
+
265
+ .grid.three {
266
+ grid-template-columns: repeat(3, minmax(0, 1fr));
267
+ }
268
+
269
+ .grid.two {
270
+ grid-template-columns: repeat(2, minmax(0, 1fr));
271
+ }
272
+
273
+ .grid.sidebar {
274
+ grid-template-columns: minmax(240px, 0.34fr) minmax(0, 1fr);
275
+ align-items: start;
276
+ }
277
+
278
+ .card,
279
+ .panel,
280
+ .code-panel {
281
+ padding: 22px;
282
+ }
283
+
284
+ .card strong {
285
+ display: block;
286
+ margin-bottom: 8px;
287
+ color: #ffffff;
288
+ font-size: 18px;
289
+ }
290
+
291
+ .card p,
292
+ .panel p {
293
+ margin: 0;
294
+ color: var(--muted);
295
+ }
296
+
297
+ .feature-list {
298
+ display: grid;
299
+ gap: 10px;
300
+ margin: 18px 0 0;
301
+ padding: 0;
302
+ list-style: none;
303
+ }
304
+
305
+ .feature-list li {
306
+ position: relative;
307
+ padding-left: 18px;
308
+ color: #d7e1db;
309
+ }
310
+
311
+ .feature-list li::before {
312
+ position: absolute;
313
+ left: 0;
314
+ color: var(--green);
315
+ content: ">";
316
+ }
317
+
318
+ .toc {
319
+ position: sticky;
320
+ top: 88px;
321
+ display: grid;
322
+ gap: 8px;
323
+ }
324
+
325
+ .toc a {
326
+ display: block;
327
+ padding: 9px 10px;
328
+ border: 1px solid var(--line);
329
+ border-radius: 8px;
330
+ color: #dce7df;
331
+ text-decoration: none;
332
+ }
333
+
334
+ .toc a:hover {
335
+ border-color: var(--green);
336
+ color: var(--green);
337
+ }
338
+
339
+ .doc-content {
340
+ display: grid;
341
+ gap: 46px;
342
+ }
343
+
344
+ .doc-section {
345
+ scroll-margin-top: 94px;
346
+ }
347
+
348
+ .doc-section p {
349
+ max-width: 940px;
350
+ color: var(--muted);
351
+ }
352
+
353
+ .doc-section h2 {
354
+ max-width: 960px;
355
+ }
356
+
357
+ .doc-section h3 {
358
+ margin-top: 24px;
359
+ }
360
+
361
+ .image-slot {
362
+ display: grid;
363
+ min-height: 280px;
364
+ place-items: center;
365
+ padding: 24px;
366
+ color: #c3cec7;
367
+ text-align: center;
368
+ background:
369
+ linear-gradient(135deg, rgba(32, 209, 125, 0.12), rgba(64, 201, 216, 0.08)),
370
+ repeating-linear-gradient(
371
+ 45deg,
372
+ rgba(255, 255, 255, 0.04),
373
+ rgba(255, 255, 255, 0.04) 10px,
374
+ rgba(255, 255, 255, 0.01) 10px,
375
+ rgba(255, 255, 255, 0.01) 20px
376
+ ),
377
+ #101316;
378
+ }
379
+
380
+ .image-slot.tall {
381
+ min-height: 520px;
382
+ }
383
+
384
+ .image-slot.wide {
385
+ min-height: 360px;
386
+ }
387
+
388
+ .image-slot span {
389
+ display: block;
390
+ max-width: 520px;
391
+ }
392
+
393
+ .image-slot strong {
394
+ display: block;
395
+ margin-bottom: 8px;
396
+ color: var(--ink);
397
+ font-size: 18px;
398
+ }
399
+
400
+ .screen-grid {
401
+ display: grid;
402
+ grid-template-columns: 1.35fr 0.7fr;
403
+ gap: 16px;
404
+ align-items: start;
405
+ }
406
+
407
+ .screen-grid img {
408
+ width: 100%;
409
+ border: 1px solid var(--line);
410
+ border-radius: 8px;
411
+ background: #050607;
412
+ box-shadow: var(--shadow);
413
+ }
414
+
415
+ pre {
416
+ overflow: auto;
417
+ margin: 0;
418
+ color: var(--code);
419
+ font-size: 14px;
420
+ line-height: 1.55;
421
+ }
422
+
423
+ .code-panel {
424
+ background: #070908;
425
+ }
426
+
427
+ .chips {
428
+ display: flex;
429
+ flex-wrap: wrap;
430
+ gap: 10px;
431
+ margin-top: 22px;
432
+ }
433
+
434
+ .chip {
435
+ border: 1px solid var(--line);
436
+ border-radius: 999px;
437
+ padding: 8px 12px;
438
+ color: #e0e8e2;
439
+ background: rgba(18, 22, 25, 0.75);
440
+ font-size: 14px;
441
+ }
442
+
443
+ .kpi-row {
444
+ display: grid;
445
+ grid-template-columns: repeat(4, minmax(0, 1fr));
446
+ gap: 14px;
447
+ margin-top: 30px;
448
+ }
449
+
450
+ .kpi {
451
+ border: 1px solid var(--line);
452
+ border-radius: 8px;
453
+ padding: 18px;
454
+ background: rgba(18, 22, 25, 0.82);
455
+ }
456
+
457
+ .kpi strong {
458
+ display: block;
459
+ color: var(--green);
460
+ font-size: 24px;
461
+ }
462
+
463
+ .kpi span {
464
+ color: var(--muted);
465
+ font-size: 13px;
466
+ }
467
+
468
+ .accent-green {
469
+ color: var(--green);
470
+ }
471
+
472
+ .accent-cyan {
473
+ color: var(--cyan);
474
+ }
475
+
476
+ .accent-amber {
477
+ color: var(--amber);
478
+ }
479
+
480
+ .accent-rose {
481
+ color: var(--rose);
482
+ }
483
+
484
+ .disclaimer {
485
+ color: var(--soft);
486
+ font-size: 13px;
487
+ }
488
+
489
+ .footer {
490
+ padding: 36px clamp(18px, 5vw, 72px);
491
+ color: var(--soft);
492
+ background: #050607;
493
+ }
494
+
495
+ .footer a {
496
+ color: #dce7df;
497
+ }
498
+
499
+ @media (max-width: 980px) {
500
+ .hero,
501
+ .hero.docs-hero,
502
+ .grid.sidebar,
503
+ .screen-grid {
504
+ grid-template-columns: 1fr;
505
+ }
506
+
507
+ .grid.three,
508
+ .grid.two,
509
+ .kpi-row {
510
+ grid-template-columns: 1fr;
511
+ }
512
+
513
+ .toc {
514
+ position: static;
515
+ }
516
+ }
517
+
518
+ @media (max-width: 720px) {
519
+ .site-nav {
520
+ align-items: flex-start;
521
+ flex-direction: column;
522
+ }
523
+
524
+ .nav-links {
525
+ flex-wrap: wrap;
526
+ gap: 12px;
527
+ }
528
+
529
+ .hero {
530
+ min-height: auto;
531
+ }
532
+
533
+ h1 {
534
+ font-size: clamp(42px, 15vw, 70px);
535
+ }
536
+ }
@@ -0,0 +1,51 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url>
4
+ <loc>https://alicomert.github.io/pixcode/landing.html</loc>
5
+ <lastmod>2026-05-08</lastmod>
6
+ <changefreq>weekly</changefreq>
7
+ <priority>1.0</priority>
8
+ </url>
9
+ <url>
10
+ <loc>https://alicomert.github.io/pixcode/docs.html</loc>
11
+ <lastmod>2026-05-08</lastmod>
12
+ <changefreq>weekly</changefreq>
13
+ <priority>0.95</priority>
14
+ </url>
15
+ <url>
16
+ <loc>https://alicomert.github.io/pixcode/features.html</loc>
17
+ <lastmod>2026-05-08</lastmod>
18
+ <changefreq>weekly</changefreq>
19
+ <priority>0.9</priority>
20
+ </url>
21
+ <url>
22
+ <loc>https://alicomert.github.io/pixcode/orchestration.html</loc>
23
+ <lastmod>2026-05-08</lastmod>
24
+ <changefreq>weekly</changefreq>
25
+ <priority>0.9</priority>
26
+ </url>
27
+ <url>
28
+ <loc>https://alicomert.github.io/pixcode/api-automation.html</loc>
29
+ <lastmod>2026-05-08</lastmod>
30
+ <changefreq>weekly</changefreq>
31
+ <priority>0.85</priority>
32
+ </url>
33
+ <url>
34
+ <loc>https://alicomert.github.io/pixcode/llms.txt</loc>
35
+ <lastmod>2026-05-08</lastmod>
36
+ <changefreq>weekly</changefreq>
37
+ <priority>0.7</priority>
38
+ </url>
39
+ <url>
40
+ <loc>https://alicomert.github.io/pixcode/llms-full.txt</loc>
41
+ <lastmod>2026-05-08</lastmod>
42
+ <changefreq>weekly</changefreq>
43
+ <priority>0.7</priority>
44
+ </url>
45
+ <url>
46
+ <loc>https://alicomert.github.io/pixcode/openapi.yaml</loc>
47
+ <lastmod>2026-05-08</lastmod>
48
+ <changefreq>weekly</changefreq>
49
+ <priority>0.75</priority>
50
+ </url>
51
+ </urlset>
@@ -17,8 +17,10 @@ import fs from 'fs';
17
17
  import path from 'path';
18
18
  import os from 'os';
19
19
  import net from 'node:net';
20
+ import { spawn } from 'node:child_process';
20
21
  import { findAppRoot, getModuleDir } from './utils/runtime-paths.js';
21
22
  import { buildDaemonCliCommand, handleDaemonCommand, hasInstalledDaemonUnit } from './daemon-manager.js';
23
+ import { runStartupAutoUpdate, startupUpdateReexecEnv } from './services/startup-update.js';
22
24
  const __dirname = getModuleDir(import.meta.url);
23
25
  // The CLI is compiled into dist-server/server, but it still needs to read the top-level
24
26
  // package.json and .env file. Resolving the app root once keeps those lookups stable.
@@ -55,6 +57,7 @@ const c = {
55
57
  // Load package.json for version info
56
58
  const packageJsonPath = path.join(APP_ROOT, 'package.json');
57
59
  const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
60
+ const installMode = fs.existsSync(path.join(APP_ROOT, '.git')) ? 'git' : 'npm';
58
61
  // Match the runtime fallback in load-env.js so "pixcode status" reports the same default
59
62
  // database location that the backend will actually use when no DATABASE_PATH is configured.
60
63
  const DEFAULT_DATABASE_PATH = path.join(os.homedir(), '.pixcode', 'auth.db');
@@ -591,11 +594,54 @@ async function sandboxCommand(args) {
591
594
  // ── Server ──────────────────────────────────────────────────
592
595
  // Start the server
593
596
  async function startServer() {
594
- // Check for updates silently on startup
595
- checkForUpdates(true);
596
597
  // Import and run the server
597
598
  await import('./index.js');
598
599
  }
600
+ async function reexecAfterStartupUpdate() {
601
+ await new Promise((resolve, reject) => {
602
+ const child = spawn(process.execPath, process.argv.slice(1), {
603
+ cwd: process.cwd(),
604
+ env: startupUpdateReexecEnv(),
605
+ stdio: 'inherit',
606
+ windowsHide: false,
607
+ });
608
+ child.on('error', reject);
609
+ child.on('close', (code, signal) => {
610
+ if (signal) {
611
+ process.kill(process.pid, signal);
612
+ return;
613
+ }
614
+ process.exit(code ?? 0);
615
+ });
616
+ });
617
+ }
618
+ async function runStartupUpdateGate() {
619
+ const result = await runStartupAutoUpdate({
620
+ appRoot: APP_ROOT,
621
+ currentVersion: packageJson.version,
622
+ installMode,
623
+ color: c,
624
+ });
625
+ if (result.failed) {
626
+ console.log(`${c.warn('[WARN]')} Startup update check failed: ${result.error}`);
627
+ console.log(`${c.tip('[TIP]')} Continuing with the current version (${packageJson.version}).`);
628
+ return false;
629
+ }
630
+ if (result.skipped && result.reason && process.env.PIXCODE_DEBUG_STARTUP_UPDATE === '1') {
631
+ console.log(`${c.dim('[INFO]')} Startup update skipped: ${result.reason}`);
632
+ }
633
+ if (!result.updated) {
634
+ return false;
635
+ }
636
+ console.log(`${c.ok('[OK]')} Startup update applied${result.version ? ` (${result.version})` : ''}.`);
637
+ if (result.restartMode === 'exit42') {
638
+ console.log(`${c.info('[INFO]')} Restarting through the desktop wrapper before opening the port...`);
639
+ process.exit(42);
640
+ }
641
+ console.log(`${c.info('[INFO]')} Restarting Pixcode on the updated code before opening the port...`);
642
+ await reexecAfterStartupUpdate();
643
+ return true;
644
+ }
599
645
  async function isPortOpen(port, timeoutMs = 800) {
600
646
  return await new Promise((resolve) => {
601
647
  const socket = net.createConnection({ host: '127.0.0.1', port: Number(port) });
@@ -804,6 +850,9 @@ async function main() {
804
850
  }
805
851
  switch (command) {
806
852
  case 'start':
853
+ if (await runStartupUpdateGate()) {
854
+ break;
855
+ }
807
856
  if (await maybeAutoDaemonStart(options)) {
808
857
  break;
809
858
  }