@pheem49/mint 1.7.1 → 1.8.1

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 (66) hide show
  1. package/.github/workflows/release.yml +1 -1
  2. package/Cargo.lock +34 -3
  3. package/Cargo.toml +2 -2
  4. package/README.md +40 -0
  5. package/Release_Note.md +95 -0
  6. package/assets/Mint_CLI.png +0 -0
  7. package/crates/mint-cli/Cargo.toml +1 -0
  8. package/crates/mint-cli/src/agent.rs +142 -48
  9. package/crates/mint-cli/src/main.rs +231 -22
  10. package/crates/mint-core/src/api_server.rs +71 -4
  11. package/crates/mint-core/src/browser.rs +401 -0
  12. package/crates/mint-core/src/chat.rs +79 -0
  13. package/crates/mint-core/src/config.rs +69 -1
  14. package/crates/mint-core/src/lib.rs +6 -1
  15. package/crates/mint-core/src/orchestration.rs +137 -1
  16. package/crates/mint-core/src/skills.rs +113 -4
  17. package/crates/mint-core/src/workflows.rs +9 -22
  18. package/package.json +2 -1
  19. package/src/renderer/src/App.tsx +1 -1
  20. package/src/renderer/src/components/ChatPanel.tsx +197 -47
  21. package/src/renderer/src/components/DashboardSidebar.tsx +71 -12
  22. package/src/renderer/src/components/ImageStudioPanel.tsx +18 -4
  23. package/src/renderer/src/components/MintDashboard.tsx +239 -7
  24. package/src/renderer/src/components/PicturesLibrary.tsx +1 -3
  25. package/src/renderer/src/components/Settings/AudioTab.tsx +97 -0
  26. package/src/renderer/src/components/Settings/AutomationTab.tsx +195 -0
  27. package/src/renderer/src/components/Settings/GeneralTab.tsx +950 -0
  28. package/src/renderer/src/components/Settings/MemoryTab.tsx +60 -0
  29. package/src/renderer/src/components/Settings/PluginsTab.tsx +632 -0
  30. package/src/renderer/src/components/Settings/ShortcutsTab.tsx +30 -0
  31. package/src/renderer/src/components/Settings/ThemeTab.tsx +129 -0
  32. package/src/renderer/src/components/SettingsWindow.tsx +175 -970
  33. package/src/renderer/src/components/WorkflowBuilderPanel.tsx +536 -0
  34. package/src/renderer/src/components/WorkflowsWindow.tsx +46 -0
  35. package/src/renderer/src/components/WorkspacePanel.tsx +66 -9
  36. package/src/renderer/src/css/image-studio.css +15 -4
  37. package/src/renderer/src/css/settings.css +75 -6
  38. package/src/renderer/src/css/styles.css +419 -49
  39. package/src/renderer/src/css/workflows.css +542 -0
  40. package/src/renderer/src/env.d.ts +2 -0
  41. package/src/renderer/src/index.css +13 -1
  42. package/src/renderer/src/tauri.ts +140 -2
  43. package/src/renderer/src-web/components/ChatPanel.tsx +190 -46
  44. package/src/renderer/src-web/components/DashboardSidebar.tsx +17 -1
  45. package/src/renderer/src-web/components/ImageStudioPanel.tsx +18 -4
  46. package/src/renderer/src-web/components/MintDashboard.tsx +197 -3
  47. package/src/renderer/src-web/components/PicturesLibrary.tsx +1 -3
  48. package/src/renderer/src-web/components/Settings/AudioTab.tsx +97 -0
  49. package/src/renderer/src-web/components/Settings/AutomationTab.tsx +196 -0
  50. package/src/renderer/src-web/components/Settings/GeneralTab.tsx +948 -0
  51. package/src/renderer/src-web/components/Settings/MemoryTab.tsx +60 -0
  52. package/src/renderer/src-web/components/Settings/PluginsTab.tsx +632 -0
  53. package/src/renderer/src-web/components/Settings/ShortcutsTab.tsx +30 -0
  54. package/src/renderer/src-web/components/Settings/ThemeTab.tsx +129 -0
  55. package/src/renderer/src-web/components/SettingsWindow.tsx +187 -976
  56. package/src/renderer/src-web/css/image-studio.css +15 -4
  57. package/src/renderer/src-web/css/settings.css +75 -6
  58. package/src/renderer/src-web/css/styles.css +394 -50
  59. package/src/renderer/src-web/env.d.ts +2 -0
  60. package/src/renderer/src-web/index.css +12 -1
  61. package/src/renderer/src-web/tauri.ts +60 -2
  62. package/src-tauri/src/browser.rs +1 -141
  63. package/src-tauri/src/headless.rs +3 -2
  64. package/src-tauri/src/lib.rs +195 -111
  65. package/src-tauri/src/workflows.rs +56 -4
  66. package/src-tauri/tauri.conf.json +1 -1
@@ -0,0 +1,542 @@
1
+ /* CSS for Mint Workflow Builder Panel */
2
+
3
+ .workflows-builder-container {
4
+ position: absolute;
5
+ top: 0;
6
+ bottom: 0;
7
+ right: 0;
8
+ left: var(--sidebar-expanded-width, 264px);
9
+ z-index: 5;
10
+ display: grid;
11
+ grid-template-columns: 280px minmax(0, 1fr);
12
+ overflow: hidden;
13
+ background: var(--bg-gradient);
14
+ opacity: 0;
15
+ pointer-events: none;
16
+ transform: translateY(12px) scale(0.995);
17
+ transition: left 0.22s ease, opacity 0.22s cubic-bezier(0.4, 0, 0.2, 1), transform 0.22s cubic-bezier(0.4, 0, 0.2, 1);
18
+ }
19
+
20
+ .workflows-builder-container.is-visible {
21
+ opacity: 1;
22
+ pointer-events: auto;
23
+ transform: translateY(0) scale(1);
24
+ }
25
+
26
+ .app-body.sidebar-collapsed .workflows-builder-container {
27
+ left: calc(var(--sidebar-collapsed-width, 56px) + var(--sidebar-content-gap, 10px));
28
+ }
29
+
30
+ /* Master Sidebar List */
31
+ .workflows-sidebar {
32
+ display: flex;
33
+ flex-direction: column;
34
+ border-right: 1px solid rgba(148, 163, 184, 0.12);
35
+ background: var(--chrome-bg);
36
+ backdrop-filter: var(--glass-blur);
37
+ height: 100%;
38
+ overflow: hidden;
39
+ }
40
+
41
+ .workflows-sidebar-header {
42
+ padding: 16px;
43
+ border-bottom: 1px solid rgba(148, 163, 184, 0.1);
44
+ display: flex;
45
+ flex-direction: column;
46
+ gap: 10px;
47
+ }
48
+
49
+ .workflows-sidebar-header h3 {
50
+ margin: 0;
51
+ font-size: 1.1rem;
52
+ color: var(--accent);
53
+ font-weight: 600;
54
+ }
55
+
56
+ .workflows-list {
57
+ flex: 1;
58
+ overflow-y: auto;
59
+ padding: 12px;
60
+ display: flex;
61
+ flex-direction: column;
62
+ gap: 8px;
63
+ }
64
+
65
+ .workflow-list-item {
66
+ display: flex;
67
+ align-items: center;
68
+ justify-content: space-between;
69
+ padding: 10px 12px;
70
+ background: rgba(30, 41, 59, 0.4);
71
+ border: 1px solid rgba(148, 163, 184, 0.1);
72
+ border-radius: 8px;
73
+ cursor: pointer;
74
+ transition: all 0.2s ease;
75
+ }
76
+
77
+ .workflow-list-item:hover {
78
+ background: rgba(30, 41, 59, 0.7);
79
+ border-color: rgba(16, 185, 129, 0.3);
80
+ }
81
+
82
+ .workflow-list-item.active {
83
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
84
+ border-color: var(--accent);
85
+ }
86
+
87
+ .workflow-item-info {
88
+ display: flex;
89
+ flex-direction: column;
90
+ gap: 4px;
91
+ min-width: 0;
92
+ flex: 1;
93
+ }
94
+
95
+ .workflow-item-name {
96
+ font-size: 0.9rem;
97
+ font-weight: 500;
98
+ color: #f1f5f9;
99
+ white-space: nowrap;
100
+ overflow: hidden;
101
+ text-overflow: ellipsis;
102
+ }
103
+
104
+ .workflow-item-desc {
105
+ font-size: 0.75rem;
106
+ color: #94a3b8;
107
+ }
108
+
109
+ .workflow-delete-btn {
110
+ background: transparent;
111
+ border: none;
112
+ color: #ef4444;
113
+ opacity: 0.6;
114
+ padding: 4px;
115
+ cursor: pointer;
116
+ border-radius: 4px;
117
+ display: flex;
118
+ align-items: center;
119
+ justify-content: center;
120
+ transition: all 0.2s ease;
121
+ }
122
+
123
+ .workflow-delete-btn:hover {
124
+ opacity: 1;
125
+ background: rgba(239, 68, 68, 0.1);
126
+ }
127
+
128
+ /* Canvas Panel */
129
+ .workflows-canvas-panel {
130
+ display: flex;
131
+ flex-direction: column;
132
+ height: 100%;
133
+ position: relative;
134
+ overflow: hidden;
135
+ }
136
+
137
+ .workflows-canvas-header {
138
+ display: flex;
139
+ align-items: center;
140
+ justify-content: space-between;
141
+ padding: 14px 20px;
142
+ background: rgba(15, 23, 42, 0.6);
143
+ border-bottom: 1px solid rgba(148, 163, 184, 0.1);
144
+ backdrop-filter: blur(12px);
145
+ z-index: 10;
146
+ }
147
+
148
+ .workflows-canvas-title {
149
+ display: flex;
150
+ align-items: center;
151
+ gap: 12px;
152
+ flex: 1;
153
+ min-width: 0;
154
+ }
155
+
156
+ .workflow-name-input {
157
+ background: transparent;
158
+ border: 1px solid transparent;
159
+ border-radius: 6px;
160
+ color: #f8fafc;
161
+ font-size: 1.1rem;
162
+ font-weight: 600;
163
+ padding: 4px 8px;
164
+ width: 260px;
165
+ transition: all 0.2s;
166
+ }
167
+
168
+ .workflow-name-input:hover {
169
+ background: rgba(255, 255, 255, 0.05);
170
+ }
171
+
172
+ .workflow-name-input:focus {
173
+ background: rgba(15, 23, 42, 0.6);
174
+ border-color: var(--accent);
175
+ outline: none;
176
+ }
177
+
178
+ .workflows-canvas-actions {
179
+ display: flex;
180
+ align-items: center;
181
+ gap: 10px;
182
+ }
183
+
184
+ /* React Flow Custom Nodes Styling */
185
+ .custom-node {
186
+ background: var(--panel-bg);
187
+ border: 1px solid var(--border);
188
+ border-radius: 12px;
189
+ padding: 14px;
190
+ color: var(--text-main);
191
+ width: 280px;
192
+ box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37);
193
+ backdrop-filter: var(--glass-blur);
194
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
195
+ }
196
+
197
+ .custom-node:hover {
198
+ border-color: rgba(255, 255, 255, 0.4);
199
+ }
200
+
201
+ .custom-node.selected {
202
+ box-shadow: 0 0 15px color-mix(in srgb, var(--accent) 35%, transparent);
203
+ }
204
+
205
+ .custom-node.trigger-node {
206
+ border-left: 5px solid var(--accent);
207
+ }
208
+
209
+ .custom-node.action-node {
210
+ border-left: 5px solid #8b5cf6;
211
+ }
212
+
213
+ .node-header {
214
+ display: flex;
215
+ align-items: center;
216
+ gap: 8px;
217
+ margin-bottom: 12px;
218
+ border-bottom: 1px solid rgba(148, 163, 184, 0.1);
219
+ padding-bottom: 8px;
220
+ }
221
+
222
+ .node-header svg {
223
+ color: var(--accent);
224
+ }
225
+
226
+ .action-node .node-header svg {
227
+ color: #8b5cf6;
228
+ }
229
+
230
+ .node-title {
231
+ font-size: 0.95rem;
232
+ font-weight: 600;
233
+ color: #f8fafc;
234
+ }
235
+
236
+ .node-body {
237
+ display: flex;
238
+ flex-direction: column;
239
+ gap: 10px;
240
+ }
241
+
242
+ .node-body label {
243
+ font-size: 0.75rem;
244
+ color: #94a3b8;
245
+ font-weight: 500;
246
+ text-transform: uppercase;
247
+ letter-spacing: 0.05em;
248
+ }
249
+
250
+ .node-input,
251
+ .node-select {
252
+ background: var(--input-bg);
253
+ border: 1px solid var(--border);
254
+ border-radius: 6px;
255
+ padding: 8px 10px;
256
+ color: #f1f5f9;
257
+ font-size: 0.85rem;
258
+ width: 100%;
259
+ transition: border-color 0.2s;
260
+ }
261
+
262
+ .node-input:focus,
263
+ .node-select:focus {
264
+ border-color: var(--accent);
265
+ outline: none;
266
+ }
267
+
268
+ .action-node .node-input:focus,
269
+ .action-node .node-select:focus {
270
+ border-color: #8b5cf6;
271
+ }
272
+
273
+ .node-description {
274
+ font-size: 0.75rem;
275
+ color: #64748b;
276
+ line-height: 1.4;
277
+ }
278
+
279
+ /* React Flow Handles */
280
+ .react-flow__handle {
281
+ width: 10px !important;
282
+ height: 10px !important;
283
+ background: var(--accent) !important;
284
+ border: 2px solid var(--bg-color) !important;
285
+ }
286
+
287
+ .action-node .react-flow__handle {
288
+ background: #8b5cf6 !important;
289
+ }
290
+
291
+ .react-flow__edge-path {
292
+ stroke: var(--accent) !important;
293
+ stroke-width: 3px !important;
294
+ opacity: 0.8;
295
+ }
296
+
297
+ /* Empty Canvas State */
298
+ .workflows-empty-canvas {
299
+ display: flex;
300
+ flex-direction: column;
301
+ align-items: center;
302
+ justify-content: center;
303
+ height: 100%;
304
+ color: #64748b;
305
+ gap: 16px;
306
+ padding: 40px;
307
+ text-align: center;
308
+ }
309
+
310
+ .workflows-empty-canvas svg {
311
+ opacity: 0.2;
312
+ }
313
+
314
+ .workflows-empty-canvas h4 {
315
+ margin: 0;
316
+ color: #94a3b8;
317
+ font-size: 1.1rem;
318
+ }
319
+
320
+ .workflows-empty-canvas p {
321
+ margin: 0;
322
+ font-size: 0.85rem;
323
+ max-width: 320px;
324
+ line-height: 1.5;
325
+ }
326
+
327
+ /* Buttons style matching dashboard */
328
+ .btn-workflows-add {
329
+ display: flex;
330
+ align-items: center;
331
+ justify-content: center;
332
+ gap: 6px;
333
+ width: 100%;
334
+ padding: 10px;
335
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
336
+ border: 1px dashed color-mix(in srgb, var(--accent) 40%, transparent);
337
+ border-radius: 8px;
338
+ color: var(--accent);
339
+ font-size: 0.85rem;
340
+ font-weight: 500;
341
+ cursor: pointer;
342
+ transition: all 0.2s;
343
+ }
344
+
345
+ .btn-workflows-add:hover {
346
+ background: color-mix(in srgb, var(--accent) 20%, transparent);
347
+ border-color: var(--accent);
348
+ }
349
+
350
+ .btn-save-workflows {
351
+ background: var(--accent);
352
+ color: white;
353
+ border: none;
354
+ border-radius: 6px;
355
+ padding: 8px 16px;
356
+ font-size: 0.85rem;
357
+ font-weight: 500;
358
+ cursor: pointer;
359
+ transition: background 0.2s;
360
+ }
361
+
362
+ .btn-save-workflows:hover {
363
+ background: var(--accent-hover);
364
+ }
365
+
366
+ .btn-reload-rules {
367
+ background: rgba(30, 41, 59, 0.6);
368
+ border: 1px solid rgba(148, 163, 184, 0.2);
369
+ color: #cbd5e1;
370
+ border-radius: 6px;
371
+ padding: 8px 16px;
372
+ font-size: 0.85rem;
373
+ font-weight: 500;
374
+ cursor: pointer;
375
+ transition: all 0.2s;
376
+ }
377
+
378
+ .btn-reload-rules:hover {
379
+ background: color-mix(in srgb, var(--accent) 10%, transparent);
380
+ border-color: var(--accent);
381
+ color: #f8fafc;
382
+ }
383
+
384
+ /* Node field hints */
385
+ .field-hint {
386
+ font-size: 0.72rem;
387
+ color: #94a3b8;
388
+ opacity: 0.85;
389
+ margin-top: 4px;
390
+ line-height: 1.4;
391
+ }
392
+
393
+ .field-hint code {
394
+ background: rgba(15, 23, 42, 0.6);
395
+ padding: 1px 4px;
396
+ border-radius: 4px;
397
+ font-family: monospace;
398
+ color: var(--accent);
399
+ }
400
+
401
+ /* Help Panel toggle */
402
+ .btn-help-toggle {
403
+ background: rgba(30, 41, 59, 0.6);
404
+ border: 1px solid rgba(148, 163, 184, 0.2);
405
+ color: #cbd5e1;
406
+ border-radius: 6px;
407
+ padding: 8px 12px;
408
+ font-size: 0.85rem;
409
+ font-weight: 500;
410
+ cursor: pointer;
411
+ display: flex;
412
+ align-items: center;
413
+ gap: 6px;
414
+ transition: all 0.2s;
415
+ }
416
+
417
+ .btn-help-toggle:hover {
418
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
419
+ border-color: var(--accent);
420
+ color: var(--accent);
421
+ }
422
+
423
+ /* Side by Side layout wrapper */
424
+ .workflows-canvas-wrapper {
425
+ display: flex;
426
+ flex: 1;
427
+ height: 100%;
428
+ position: relative;
429
+ overflow: hidden;
430
+ }
431
+
432
+ /* Sliding Help/Guide Panel */
433
+ .workflow-help-panel {
434
+ width: 320px;
435
+ background: var(--panel-bg);
436
+ border-left: 1px solid rgba(148, 163, 184, 0.12);
437
+ display: flex;
438
+ flex-direction: column;
439
+ height: 100%;
440
+ backdrop-filter: var(--glass-blur);
441
+ z-index: 10;
442
+ box-shadow: -8px 0 32px rgba(0, 0, 0, 0.5);
443
+ animation: slideIn 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards;
444
+ }
445
+
446
+ @keyframes slideIn {
447
+ from {
448
+ transform: translateX(100%);
449
+ }
450
+ to {
451
+ transform: translateX(0);
452
+ }
453
+ }
454
+
455
+ .workflow-help-header {
456
+ padding: 16px 20px;
457
+ border-bottom: 1px solid rgba(148, 163, 184, 0.1);
458
+ display: flex;
459
+ align-items: center;
460
+ justify-content: space-between;
461
+ }
462
+
463
+ .workflow-help-header h3 {
464
+ margin: 0;
465
+ font-size: 1rem;
466
+ color: var(--accent);
467
+ display: flex;
468
+ align-items: center;
469
+ gap: 8px;
470
+ }
471
+
472
+ .workflow-help-close-btn {
473
+ background: transparent;
474
+ border: none;
475
+ color: #94a3b8;
476
+ cursor: pointer;
477
+ padding: 4px;
478
+ display: flex;
479
+ align-items: center;
480
+ border-radius: 4px;
481
+ }
482
+
483
+ .workflow-help-close-btn:hover {
484
+ background: rgba(255, 255, 255, 0.05);
485
+ color: #f1f5f9;
486
+ }
487
+
488
+ .workflow-help-body {
489
+ flex: 1;
490
+ overflow-y: auto;
491
+ padding: 20px;
492
+ display: flex;
493
+ flex-direction: column;
494
+ gap: 16px;
495
+ }
496
+
497
+ .help-section {
498
+ display: flex;
499
+ flex-direction: column;
500
+ gap: 8px;
501
+ }
502
+
503
+ .help-section h4 {
504
+ margin: 0;
505
+ font-size: 0.88rem;
506
+ color: #f1f5f9;
507
+ font-weight: 600;
508
+ border-left: 3px solid var(--accent);
509
+ padding-left: 8px;
510
+ }
511
+
512
+ .help-section p {
513
+ margin: 0;
514
+ font-size: 0.8rem;
515
+ color: #94a3b8;
516
+ line-height: 1.5;
517
+ }
518
+
519
+ .help-steps {
520
+ margin: 0;
521
+ padding-left: 20px;
522
+ font-size: 0.8rem;
523
+ color: #94a3b8;
524
+ display: flex;
525
+ flex-direction: column;
526
+ gap: 8px;
527
+ }
528
+
529
+ .help-steps li {
530
+ line-height: 1.5;
531
+ }
532
+
533
+ .help-steps strong {
534
+ color: #f1f5f9;
535
+ }
536
+
537
+ .help-steps code {
538
+ background: rgba(255, 255, 255, 0.06);
539
+ padding: 1px 4px;
540
+ border-radius: 4px;
541
+ color: var(--accent);
542
+ }
@@ -16,6 +16,7 @@ interface Window {
16
16
  getChatHistory: () => Promise<any>;
17
17
  listSavedPictures: () => Promise<any>;
18
18
  openSettings: () => Promise<any>;
19
+ openWorkflows: () => Promise<any>;
19
20
  readClipboard: () => Promise<string>;
20
21
  writeClipboard: (text: string) => Promise<void>;
21
22
  getSystemInfo: () => Promise<any>;
@@ -51,6 +52,7 @@ interface Window {
51
52
  openFolder: (path: string) => Promise<void>;
52
53
  openCustomWorkflows: () => Promise<any>;
53
54
  reloadCustomWorkflows: () => Promise<any>;
55
+ saveCustomWorkflows: (workflows: any[]) => Promise<any>;
54
56
  };
55
57
  spotlightAPI: {
56
58
  submit: (query: string) => void;
@@ -3,6 +3,7 @@
3
3
  @import './css/spotlight.css';
4
4
  @import './css/widget.css';
5
5
  @import './css/image-studio.css';
6
+ @import './css/workflows.css';
6
7
 
7
8
  * {
8
9
  box-sizing: border-box;
@@ -379,7 +380,6 @@ button {
379
380
  }
380
381
  }
381
382
 
382
- /* Premium Markdown Styles for Chat Messages */
383
383
  .chat-inline-code {
384
384
  background: rgba(16, 185, 129, 0.15);
385
385
  border: 1px solid rgba(16, 185, 129, 0.25);
@@ -390,6 +390,18 @@ button {
390
390
  font-size: 0.88em;
391
391
  }
392
392
 
393
+ .chat-mention {
394
+ background: color-mix(in srgb, var(--accent, #10b981) 12%, transparent);
395
+ border: 1px solid color-mix(in srgb, var(--accent, #10b981) 25%, transparent);
396
+ color: var(--accent, #34d399);
397
+ padding: 2px 6px;
398
+ border-radius: 6px;
399
+ font-weight: 500;
400
+ font-size: 0.9em;
401
+ display: inline-block;
402
+ margin: 0 2px;
403
+ }
404
+
393
405
  .chat-code-block-container {
394
406
  display: flex;
395
407
  flex-direction: column;