@pheem49/mint 1.8.2 → 1.10.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 (106) hide show
  1. package/Cargo.lock +55 -3
  2. package/Cargo.toml +2 -1
  3. package/Release_Note.md +297 -107
  4. package/bin/mint +0 -0
  5. package/crates/mint-cli/Cargo.toml +1 -0
  6. package/crates/mint-cli/src/actions.rs +233 -0
  7. package/crates/mint-cli/src/agent.rs +382 -127
  8. package/crates/mint-cli/src/gmail.rs +22 -2
  9. package/crates/mint-cli/src/image.rs +8 -8
  10. package/crates/mint-cli/src/interactive.rs +2888 -0
  11. package/crates/mint-cli/src/main.rs +391 -2506
  12. package/crates/mint-cli/src/markdown.rs +294 -0
  13. package/crates/mint-cli/src/onboard.rs +152 -109
  14. package/crates/mint-cli/src/setup.rs +143 -143
  15. package/crates/mint-cli/src/updater.rs +48 -6
  16. package/crates/mint-core/Cargo.toml +1 -0
  17. package/crates/mint-core/src/agent_loop.rs +1 -0
  18. package/crates/mint-core/src/api_server.rs +431 -65
  19. package/crates/mint-core/src/browser.rs +630 -102
  20. package/crates/mint-core/src/channels.rs +105 -6
  21. package/crates/mint-core/src/chat.rs +174 -11
  22. package/crates/mint-core/src/code_tools.rs +47 -31
  23. package/crates/mint-core/src/config.rs +302 -17
  24. package/crates/mint-core/src/image_gen.rs +299 -38
  25. package/crates/mint-core/src/lib.rs +10 -7
  26. package/crates/mint-core/src/mcp.rs +119 -6
  27. package/crates/mint-core/src/memory.rs +6 -1
  28. package/crates/mint-core/src/orchestration.rs +237 -96
  29. package/crates/mint-core/src/pictures.rs +67 -5
  30. package/crates/mint-core/src/semantic.rs +1 -1
  31. package/crates/mint-core/src/shell.rs +1 -1
  32. package/crates/mint-core/src/skills.rs +128 -25
  33. package/crates/mint-core/src/video_gen.rs +235 -0
  34. package/package.json +8 -2
  35. package/shared-modules/linux-audio/fluidsynth2-static.json +9 -3
  36. package/shared-modules/linux-audio/fluidsynth2.json +8 -2
  37. package/shared-modules/linux-audio/lilv.json +26 -19
  38. package/shared-modules/linux-audio/lv2.json +0 -1
  39. package/shared-modules/luajit/luajit.json +2 -2
  40. package/skills-lock.json +41 -0
  41. package/src/renderer/index-web.html +1 -1
  42. package/src/renderer/index.html +1 -1
  43. package/src/renderer/shared/components/AgentActivityTable.tsx +25 -6
  44. package/src/renderer/shared/constants/slashCommands.ts +27 -0
  45. package/src/renderer/shared/platform.ts +3 -0
  46. package/src/renderer/shared/types.ts +4 -0
  47. package/src/renderer/shared/utils/approval.tsx +86 -7
  48. package/src/renderer/shared/utils/fileIcons.ts +135 -0
  49. package/src/renderer/shared/utils/markdown.tsx +217 -88
  50. package/src/renderer/shared/utils/slashCommandProcessor.ts +239 -0
  51. package/src/renderer/src/components/ChatPanel.tsx +486 -69
  52. package/src/renderer/src/components/DashboardSidebar.tsx +11 -2
  53. package/src/renderer/src/components/ImageStudioPanel.tsx +87 -4
  54. package/src/renderer/src/components/MintDashboard.tsx +195 -7
  55. package/src/renderer/src/components/PicturesLibrary.tsx +156 -15
  56. package/src/renderer/src/components/Settings/AgentsTab.tsx +21 -2
  57. package/src/renderer/src/components/Settings/AutomationTab.tsx +316 -18
  58. package/src/renderer/src/components/Settings/GeneralTab.tsx +795 -413
  59. package/src/renderer/src/components/Settings/PluginsTab.tsx +304 -70
  60. package/src/renderer/src/components/Settings/ThemeTab.tsx +6 -1
  61. package/src/renderer/src/components/SettingsWindow.tsx +106 -3
  62. package/src/renderer/src/components/VeoStudioPanel.tsx +549 -0
  63. package/src/renderer/src/components/WorkspacePanel.tsx +7 -125
  64. package/src/renderer/src/css/image-studio.css +106 -0
  65. package/src/renderer/src/css/settings.css +158 -0
  66. package/src/renderer/src/css/styles.css +368 -1
  67. package/src/renderer/src/css/veo-studio.css +626 -0
  68. package/src/renderer/src/index.css +1 -0
  69. package/src/renderer/src/tauri.ts +144 -17
  70. package/src/renderer/src-web/components/ChatPanel.tsx +385 -93
  71. package/src/renderer/src-web/components/DashboardSidebar.tsx +16 -1
  72. package/src/renderer/src-web/components/ImageStudioPanel.tsx +87 -4
  73. package/src/renderer/src-web/components/MintDashboard.tsx +156 -5
  74. package/src/renderer/src-web/components/PicturesLibrary.tsx +155 -15
  75. package/src/renderer/src-web/components/Settings/AgentsTab.tsx +21 -2
  76. package/src/renderer/src-web/components/Settings/AutomationTab.tsx +316 -18
  77. package/src/renderer/src-web/components/Settings/GeneralTab.tsx +795 -411
  78. package/src/renderer/src-web/components/Settings/PluginsTab.tsx +304 -70
  79. package/src/renderer/src-web/components/Settings/ThemeTab.tsx +6 -1
  80. package/src/renderer/src-web/components/SettingsWindow.tsx +110 -3
  81. package/src/renderer/src-web/components/VeoStudioPanel.tsx +549 -0
  82. package/src/renderer/src-web/css/image-studio.css +106 -0
  83. package/src/renderer/src-web/css/settings.css +158 -0
  84. package/src/renderer/src-web/css/styles.css +369 -1
  85. package/src/renderer/src-web/css/veo-studio.css +650 -0
  86. package/src/renderer/src-web/index.css +1 -0
  87. package/src/renderer/src-web/tauri.ts +135 -16
  88. package/src-tauri/src/desktop.rs +18 -16
  89. package/src-tauri/src/discord_rpc.rs +1 -1
  90. package/src-tauri/src/lib.rs +155 -25
  91. package/src-tauri/src/webhooks.rs +45 -31
  92. package/src-tauri/src/workflows.rs +1 -0
  93. package/src-tauri/tauri.conf.json +1 -1
  94. package/temp_gridgeist/AGENTS.md +8 -0
  95. package/temp_gridgeist/CHANGELOG.md +130 -0
  96. package/temp_gridgeist/LICENSE +21 -0
  97. package/temp_gridgeist/README.md +323 -0
  98. package/temp_gridgeist/README.th.md +325 -0
  99. package/temp_gridgeist/skills/gridgeist/SKILL.md +88 -0
  100. package/temp_gridgeist/skills/gridgeist/agents/openai.yaml +9 -0
  101. package/temp_gridgeist/skills/gridgeist/assets/gridgeist-small.svg +10 -0
  102. package/temp_gridgeist/skills/gridgeist/assets/gridgeist.png +0 -0
  103. package/temp_gridgeist/skills/gridgeist/assets/gridgeist.svg +18 -0
  104. package/temp_gridgeist/skills/gridgeist/references/design-language.md +88 -0
  105. package/temp_gridgeist/skills/gridgeist/references/review-checklist.md +128 -0
  106. package/temp_gridgeist/skills/gridgeist/references/system-contract.md +109 -0
@@ -175,66 +175,66 @@ pub async fn run() -> Result<Option<String>> {
175
175
  loop {
176
176
  match event::poll(std::time::Duration::from_millis(100)) {
177
177
  Ok(true) => {
178
- if let Event::Key(key_event) = event::read()? {
179
- if key_event.kind == event::KeyEventKind::Press {
180
- let is_ctrl_c = matches!(key_event.code, KeyCode::Char('c'))
181
- && key_event
182
- .modifiers
183
- .contains(crossterm::event::KeyModifiers::CONTROL);
184
- if is_ctrl_c {
185
- disable_raw_mode()?;
186
- println!("\n\x1b[31mSetup cancelled.\x1b[0m");
187
- return Ok(None);
188
- }
178
+ if let Event::Key(key_event) = event::read()?
179
+ && key_event.kind == event::KeyEventKind::Press
180
+ {
181
+ let is_ctrl_c = matches!(key_event.code, KeyCode::Char('c'))
182
+ && key_event
183
+ .modifiers
184
+ .contains(crossterm::event::KeyModifiers::CONTROL);
185
+ if is_ctrl_c {
186
+ disable_raw_mode()?;
187
+ println!("\n\x1b[31mSetup cancelled.\x1b[0m");
188
+ return Ok(None);
189
+ }
189
190
 
190
- match key_event.code {
191
- KeyCode::Up => {
192
- if cursor > 0 {
193
- cursor -= 1;
194
- } else {
195
- cursor = options.len() - 1;
196
- }
197
- disable_raw_mode()?;
198
- redraw_phase_1(&options, cursor);
199
- enable_raw_mode()?;
200
- }
201
- KeyCode::Down => {
202
- if cursor < options.len() - 1 {
203
- cursor += 1;
204
- } else {
205
- cursor = 0;
206
- }
207
- disable_raw_mode()?;
208
- redraw_phase_1(&options, cursor);
209
- enable_raw_mode()?;
210
- }
211
- KeyCode::Char(' ') => {
212
- options[cursor].enabled = !options[cursor].enabled;
213
- disable_raw_mode()?;
214
- redraw_phase_1(&options, cursor);
215
- enable_raw_mode()?;
191
+ match key_event.code {
192
+ KeyCode::Up => {
193
+ if cursor > 0 {
194
+ cursor -= 1;
195
+ } else {
196
+ cursor = options.len() - 1;
216
197
  }
217
- KeyCode::Char('a') => {
218
- for opt in &mut options {
219
- opt.enabled = true;
220
- }
221
- disable_raw_mode()?;
222
- redraw_phase_1(&options, cursor);
223
- enable_raw_mode()?;
198
+ disable_raw_mode()?;
199
+ redraw_phase_1(&options, cursor);
200
+ enable_raw_mode()?;
201
+ }
202
+ KeyCode::Down => {
203
+ if cursor < options.len() - 1 {
204
+ cursor += 1;
205
+ } else {
206
+ cursor = 0;
224
207
  }
225
- KeyCode::Char('i') => {
226
- for opt in &mut options {
227
- opt.enabled = !opt.enabled;
228
- }
229
- disable_raw_mode()?;
230
- redraw_phase_1(&options, cursor);
231
- enable_raw_mode()?;
208
+ disable_raw_mode()?;
209
+ redraw_phase_1(&options, cursor);
210
+ enable_raw_mode()?;
211
+ }
212
+ KeyCode::Char(' ') => {
213
+ options[cursor].enabled = !options[cursor].enabled;
214
+ disable_raw_mode()?;
215
+ redraw_phase_1(&options, cursor);
216
+ enable_raw_mode()?;
217
+ }
218
+ KeyCode::Char('a') => {
219
+ for opt in &mut options {
220
+ opt.enabled = true;
232
221
  }
233
- KeyCode::Enter => {
234
- break;
222
+ disable_raw_mode()?;
223
+ redraw_phase_1(&options, cursor);
224
+ enable_raw_mode()?;
225
+ }
226
+ KeyCode::Char('i') => {
227
+ for opt in &mut options {
228
+ opt.enabled = !opt.enabled;
235
229
  }
236
- _ => {}
230
+ disable_raw_mode()?;
231
+ redraw_phase_1(&options, cursor);
232
+ enable_raw_mode()?;
233
+ }
234
+ KeyCode::Enter => {
235
+ break;
237
236
  }
237
+ _ => {}
238
238
  }
239
239
  }
240
240
  }
@@ -298,67 +298,67 @@ pub async fn run() -> Result<Option<String>> {
298
298
  loop {
299
299
  match event::poll(std::time::Duration::from_millis(100)) {
300
300
  Ok(true) => {
301
- if let Event::Key(key_event) = event::read()? {
302
- if key_event.kind == event::KeyEventKind::Press {
303
- let is_ctrl_c = matches!(key_event.code, KeyCode::Char('c'))
304
- && key_event
305
- .modifiers
306
- .contains(crossterm::event::KeyModifiers::CONTROL);
307
- if is_ctrl_c {
308
- disable_raw_mode()?;
309
- println!("\n\x1b[31mSetup cancelled.\x1b[0m");
310
- return Ok(None);
311
- }
301
+ if let Event::Key(key_event) = event::read()?
302
+ && key_event.kind == event::KeyEventKind::Press
303
+ {
304
+ let is_ctrl_c = matches!(key_event.code, KeyCode::Char('c'))
305
+ && key_event
306
+ .modifiers
307
+ .contains(crossterm::event::KeyModifiers::CONTROL);
308
+ if is_ctrl_c {
309
+ disable_raw_mode()?;
310
+ println!("\n\x1b[31mSetup cancelled.\x1b[0m");
311
+ return Ok(None);
312
+ }
312
313
 
313
- match key_event.code {
314
- KeyCode::Up => {
315
- if native_cursor > 0 {
316
- native_cursor -= 1;
317
- } else {
318
- native_cursor = native_options.len() - 1;
319
- }
320
- disable_raw_mode()?;
321
- redraw_phase_2(&native_options, native_cursor);
322
- enable_raw_mode()?;
323
- }
324
- KeyCode::Down => {
325
- if native_cursor < native_options.len() - 1 {
326
- native_cursor += 1;
327
- } else {
328
- native_cursor = 0;
329
- }
330
- disable_raw_mode()?;
331
- redraw_phase_2(&native_options, native_cursor);
332
- enable_raw_mode()?;
314
+ match key_event.code {
315
+ KeyCode::Up => {
316
+ if native_cursor > 0 {
317
+ native_cursor -= 1;
318
+ } else {
319
+ native_cursor = native_options.len() - 1;
333
320
  }
334
- KeyCode::Char(' ') => {
335
- native_options[native_cursor].enabled =
336
- !native_options[native_cursor].enabled;
337
- disable_raw_mode()?;
338
- redraw_phase_2(&native_options, native_cursor);
339
- enable_raw_mode()?;
340
- }
341
- KeyCode::Char('a') => {
342
- for opt in &mut native_options {
343
- opt.enabled = true;
344
- }
345
- disable_raw_mode()?;
346
- redraw_phase_2(&native_options, native_cursor);
347
- enable_raw_mode()?;
321
+ disable_raw_mode()?;
322
+ redraw_phase_2(&native_options, native_cursor);
323
+ enable_raw_mode()?;
324
+ }
325
+ KeyCode::Down => {
326
+ if native_cursor < native_options.len() - 1 {
327
+ native_cursor += 1;
328
+ } else {
329
+ native_cursor = 0;
348
330
  }
349
- KeyCode::Char('i') => {
350
- for opt in &mut native_options {
351
- opt.enabled = !opt.enabled;
352
- }
353
- disable_raw_mode()?;
354
- redraw_phase_2(&native_options, native_cursor);
355
- enable_raw_mode()?;
331
+ disable_raw_mode()?;
332
+ redraw_phase_2(&native_options, native_cursor);
333
+ enable_raw_mode()?;
334
+ }
335
+ KeyCode::Char(' ') => {
336
+ native_options[native_cursor].enabled =
337
+ !native_options[native_cursor].enabled;
338
+ disable_raw_mode()?;
339
+ redraw_phase_2(&native_options, native_cursor);
340
+ enable_raw_mode()?;
341
+ }
342
+ KeyCode::Char('a') => {
343
+ for opt in &mut native_options {
344
+ opt.enabled = true;
356
345
  }
357
- KeyCode::Enter => {
358
- break;
346
+ disable_raw_mode()?;
347
+ redraw_phase_2(&native_options, native_cursor);
348
+ enable_raw_mode()?;
349
+ }
350
+ KeyCode::Char('i') => {
351
+ for opt in &mut native_options {
352
+ opt.enabled = !opt.enabled;
359
353
  }
360
- _ => {}
354
+ disable_raw_mode()?;
355
+ redraw_phase_2(&native_options, native_cursor);
356
+ enable_raw_mode()?;
361
357
  }
358
+ KeyCode::Enter => {
359
+ break;
360
+ }
361
+ _ => {}
362
362
  }
363
363
  }
364
364
  }
@@ -410,44 +410,44 @@ pub async fn run() -> Result<Option<String>> {
410
410
  loop {
411
411
  match event::poll(std::time::Duration::from_millis(100)) {
412
412
  Ok(true) => {
413
- if let Event::Key(key_event) = event::read()? {
414
- if key_event.kind == event::KeyEventKind::Press {
415
- let is_ctrl_c = matches!(key_event.code, KeyCode::Char('c'))
416
- && key_event
417
- .modifiers
418
- .contains(crossterm::event::KeyModifiers::CONTROL);
419
- if is_ctrl_c {
420
- disable_raw_mode()?;
421
- println!("\n\x1b[31mRun selection cancelled.\x1b[0m");
422
- return Ok(None);
423
- }
413
+ if let Event::Key(key_event) = event::read()?
414
+ && key_event.kind == event::KeyEventKind::Press
415
+ {
416
+ let is_ctrl_c = matches!(key_event.code, KeyCode::Char('c'))
417
+ && key_event
418
+ .modifiers
419
+ .contains(crossterm::event::KeyModifiers::CONTROL);
420
+ if is_ctrl_c {
421
+ disable_raw_mode()?;
422
+ println!("\n\x1b[31mRun selection cancelled.\x1b[0m");
423
+ return Ok(None);
424
+ }
424
425
 
425
- match key_event.code {
426
- KeyCode::Up => {
427
- if run_cursor > 0 {
428
- run_cursor -= 1;
429
- } else {
430
- run_cursor = run_options.len() - 1;
431
- }
432
- disable_raw_mode()?;
433
- redraw_phase_3(&run_options, run_cursor);
434
- enable_raw_mode()?;
435
- }
436
- KeyCode::Down => {
437
- if run_cursor < run_options.len() - 1 {
438
- run_cursor += 1;
439
- } else {
440
- run_cursor = 0;
441
- }
442
- disable_raw_mode()?;
443
- redraw_phase_3(&run_options, run_cursor);
444
- enable_raw_mode()?;
426
+ match key_event.code {
427
+ KeyCode::Up => {
428
+ if run_cursor > 0 {
429
+ run_cursor -= 1;
430
+ } else {
431
+ run_cursor = run_options.len() - 1;
445
432
  }
446
- KeyCode::Enter => {
447
- break;
433
+ disable_raw_mode()?;
434
+ redraw_phase_3(&run_options, run_cursor);
435
+ enable_raw_mode()?;
436
+ }
437
+ KeyCode::Down => {
438
+ if run_cursor < run_options.len() - 1 {
439
+ run_cursor += 1;
440
+ } else {
441
+ run_cursor = 0;
448
442
  }
449
- _ => {}
443
+ disable_raw_mode()?;
444
+ redraw_phase_3(&run_options, run_cursor);
445
+ enable_raw_mode()?;
446
+ }
447
+ KeyCode::Enter => {
448
+ break;
450
449
  }
450
+ _ => {}
451
451
  }
452
452
  }
453
453
  }
@@ -2,16 +2,41 @@ use std::path::PathBuf;
2
2
  use std::process::Command;
3
3
  use std::time::{SystemTime, UNIX_EPOCH};
4
4
 
5
- use anyhow::{Context, Result, bail};
5
+ use anyhow::{Result, bail};
6
6
 
7
7
  const PACKAGE: &str = "@pheem49/mint";
8
8
 
9
9
  pub fn run(check_only: bool, dry_run: bool, approved: bool) -> Result<()> {
10
10
  let current = env!("CARGO_PKG_VERSION");
11
+
12
+ use indicatif::{ProgressBar, ProgressStyle};
13
+ use std::time::Duration;
14
+
15
+ let spinner = ProgressBar::new_spinner();
16
+ spinner.set_style(
17
+ ProgressStyle::default_spinner()
18
+ .tick_chars("⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏")
19
+ .template("{spinner:.green} {msg}")
20
+ .unwrap(),
21
+ );
22
+ spinner.set_message("Checking for updates...");
23
+ spinner.enable_steady_tick(Duration::from_millis(80));
24
+
11
25
  let output = Command::new(npm())
12
26
  .args(["view", PACKAGE, "version", "--json"])
13
- .output()
14
- .context("unable to run npm update check")?;
27
+ .output();
28
+
29
+ let output = match output {
30
+ Ok(out) => {
31
+ spinner.finish_and_clear();
32
+ out
33
+ }
34
+ Err(e) => {
35
+ spinner.finish_and_clear();
36
+ bail!("unable to run npm update check: {}", e);
37
+ }
38
+ };
39
+
15
40
  if !output.status.success() {
16
41
  bail!(
17
42
  "npm update check failed: {}",
@@ -34,14 +59,31 @@ pub fn run(check_only: bool, dry_run: bool, approved: bool) -> Result<()> {
34
59
  if !approved {
35
60
  bail!("update installation requires --approve");
36
61
  }
62
+
63
+ let spinner = ProgressBar::new_spinner();
64
+ spinner.set_style(
65
+ ProgressStyle::default_spinner()
66
+ .tick_chars("⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏")
67
+ .template("{spinner:.green} {msg}")
68
+ .unwrap(),
69
+ );
70
+ spinner.set_message(format!("Updating to {latest} via npm..."));
71
+ spinner.enable_steady_tick(Duration::from_millis(80));
72
+
37
73
  let mut command = Command::new(npm());
38
74
  command.args(["install", "-g", &format!("{PACKAGE}@latest")]);
39
75
  if dry_run {
40
76
  command.arg("--dry-run");
41
77
  }
42
- let status = command
43
- .status()
44
- .context("unable to run npm global update")?;
78
+ let status = command.status();
79
+ spinner.finish_and_clear();
80
+
81
+ let status = match status {
82
+ Ok(s) => s,
83
+ Err(e) => {
84
+ bail!("unable to run npm global update: {}", e);
85
+ }
86
+ };
45
87
  if !status.success() {
46
88
  bail!("npm global update failed with status {status}");
47
89
  }
@@ -17,6 +17,7 @@ rusqlite.workspace = true
17
17
  serde.workspace = true
18
18
  serde_json.workspace = true
19
19
  sha2.workspace = true
20
+ similar.workspace = true
20
21
  thiserror.workspace = true
21
22
  tokio.workspace = true
22
23
  tokio-tungstenite.workspace = true
@@ -59,6 +59,7 @@ where
59
59
  chat_id: None,
60
60
  image_data_uri: None,
61
61
  audio_data_uri: None,
62
+ video_data_uri: None,
62
63
  document_attachment: None,
63
64
  workspace_path: None,
64
65
  agent_id: None,