@pheem49/mint 1.7.0 → 1.8.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.
- package/Cargo.lock +3 -3
- package/Cargo.toml +1 -1
- package/README.md +9 -0
- package/crates/mint-cli/src/agent.rs +1 -1
- package/crates/mint-cli/src/main.rs +47 -24
- package/crates/mint-cli/src/setup.rs +1 -1
- package/crates/mint-core/src/api_server.rs +64 -10
- package/crates/mint-core/src/chat.rs +79 -0
- package/crates/mint-core/src/lib.rs +1 -1
- package/crates/mint-core/src/plugins.rs +4 -1
- package/crates/mint-core/src/workflows.rs +8 -0
- package/package.json +13 -2
- package/src/renderer/src/App.tsx +1 -1
- package/src/renderer/src/components/ChatPanel.tsx +27 -14
- package/src/renderer/src/components/DashboardSidebar.tsx +71 -12
- package/src/renderer/src/components/ImageStudioPanel.tsx +7 -3
- package/src/renderer/src/components/MintDashboard.tsx +199 -5
- package/src/renderer/src/components/PicturesLibrary.tsx +1 -3
- package/src/renderer/src/components/Settings/AudioTab.tsx +97 -0
- package/src/renderer/src/components/Settings/AutomationTab.tsx +195 -0
- package/src/renderer/src/components/Settings/GeneralTab.tsx +950 -0
- package/src/renderer/src/components/Settings/MemoryTab.tsx +60 -0
- package/src/renderer/src/components/Settings/PluginsTab.tsx +452 -0
- package/src/renderer/src/components/Settings/ShortcutsTab.tsx +30 -0
- package/src/renderer/src/components/Settings/ThemeTab.tsx +129 -0
- package/src/renderer/src/components/SettingsWindow.tsx +175 -962
- package/src/renderer/src/components/WorkflowBuilderPanel.tsx +536 -0
- package/src/renderer/src/components/WorkflowsWindow.tsx +46 -0
- package/src/renderer/src/css/image-studio.css +9 -4
- package/src/renderer/src/css/settings.css +75 -6
- package/src/renderer/src/css/styles.css +355 -38
- package/src/renderer/src/css/workflows.css +542 -0
- package/src/renderer/src/env.d.ts +2 -0
- package/src/renderer/src/index.css +1 -0
- package/src/renderer/src/tauri.ts +97 -0
- package/src/renderer/src-web/components/ChatPanel.tsx +27 -14
- package/src/renderer/src-web/components/DashboardSidebar.tsx +17 -1
- package/src/renderer/src-web/components/ImageStudioPanel.tsx +7 -3
- package/src/renderer/src-web/components/MintDashboard.tsx +189 -0
- package/src/renderer/src-web/components/PicturesLibrary.tsx +1 -3
- package/src/renderer/src-web/components/Settings/AudioTab.tsx +97 -0
- package/src/renderer/src-web/components/Settings/AutomationTab.tsx +196 -0
- package/src/renderer/src-web/components/Settings/GeneralTab.tsx +948 -0
- package/src/renderer/src-web/components/Settings/MemoryTab.tsx +60 -0
- package/src/renderer/src-web/components/Settings/PluginsTab.tsx +452 -0
- package/src/renderer/src-web/components/Settings/ShortcutsTab.tsx +30 -0
- package/src/renderer/src-web/components/Settings/ThemeTab.tsx +129 -0
- package/src/renderer/src-web/components/SettingsWindow.tsx +187 -968
- package/src/renderer/src-web/css/image-studio.css +9 -4
- package/src/renderer/src-web/css/settings.css +75 -6
- package/src/renderer/src-web/css/styles.css +294 -38
- package/src/renderer/src-web/env.d.ts +2 -0
- package/src/renderer/src-web/tauri.ts +36 -0
- package/src-tauri/src/lib.rs +84 -92
- package/src-tauri/tauri.conf.json +1 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { DEFAULT_CONFIG } from '../SettingsWindow'
|
|
3
|
+
|
|
4
|
+
interface AutomationTabProps {
|
|
5
|
+
config: typeof DEFAULT_CONFIG
|
|
6
|
+
updateField: (field: keyof typeof DEFAULT_CONFIG, value: any) => void
|
|
7
|
+
handleOpenWorkflows: () => void
|
|
8
|
+
handleReloadWorkflows: () => void
|
|
9
|
+
isDesktopApp?: boolean
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default function AutomationTab({
|
|
13
|
+
config,
|
|
14
|
+
updateField,
|
|
15
|
+
handleOpenWorkflows,
|
|
16
|
+
handleReloadWorkflows,
|
|
17
|
+
isDesktopApp = true
|
|
18
|
+
}: AutomationTabProps) {
|
|
19
|
+
return (
|
|
20
|
+
<div className="tab-pane active">
|
|
21
|
+
<section className="setting-section">
|
|
22
|
+
<div className="section-heading">
|
|
23
|
+
<div>
|
|
24
|
+
<p className="section-kicker">Browser</p>
|
|
25
|
+
<h2 className="section-title">Automation Engine</h2>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
<div className="form-grid single">
|
|
29
|
+
<div className="setting-row">
|
|
30
|
+
<label>Browser Engine</label>
|
|
31
|
+
<select value={config.automationBrowser} onChange={(e) => updateField('automationBrowser', e.target.value)}>
|
|
32
|
+
<option value="chromium">Chromium (Bundled)</option>
|
|
33
|
+
<option value="/usr/bin/firefox">Firefox (System - Linux)</option>
|
|
34
|
+
</select>
|
|
35
|
+
</div>
|
|
36
|
+
<div className="setting-row">
|
|
37
|
+
<label>Chromium DevTools Endpoint</label>
|
|
38
|
+
<input type="text" value={config.browserDebugUrl} onChange={(e) => updateField('browserDebugUrl', e.target.value)} />
|
|
39
|
+
<p className="hint">Required for native tab reading and selector clicks.</p>
|
|
40
|
+
</div>
|
|
41
|
+
<div className="setting-row">
|
|
42
|
+
<label>Browser Extension Context Endpoint</label>
|
|
43
|
+
<input type="text" value={config.browserExtensionContextUrl} onChange={(e) => updateField('browserExtensionContextUrl', e.target.value)} />
|
|
44
|
+
<p className="hint">Fallback endpoint used when Chromium remote debugging is unavailable.</p>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</section>
|
|
48
|
+
|
|
49
|
+
<section className="setting-section">
|
|
50
|
+
<div className="section-heading">
|
|
51
|
+
<div>
|
|
52
|
+
<p className="section-kicker">Background tasks</p>
|
|
53
|
+
<h2 className="section-title">Native Headless Queue</h2>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
<div className="toggle-row">
|
|
57
|
+
<div>
|
|
58
|
+
<label>Process queued tasks automatically</label>
|
|
59
|
+
<p className="hint">Allow the bounded Rust worker to process pending tasks every 15 seconds.</p>
|
|
60
|
+
</div>
|
|
61
|
+
<label className="settings-toggle-switch">
|
|
62
|
+
<input
|
|
63
|
+
type="checkbox"
|
|
64
|
+
checked={config.enableHeadlessTaskQueue}
|
|
65
|
+
onChange={(e) => updateField('enableHeadlessTaskQueue', e.target.checked)}
|
|
66
|
+
/>
|
|
67
|
+
<span className="settings-toggle-slider"></span>
|
|
68
|
+
</label>
|
|
69
|
+
</div>
|
|
70
|
+
</section>
|
|
71
|
+
|
|
72
|
+
<section className="setting-section">
|
|
73
|
+
<div className="section-heading">
|
|
74
|
+
<div>
|
|
75
|
+
<p className="section-kicker">Awareness</p>
|
|
76
|
+
<h2 className="section-title">Proactive Assistant</h2>
|
|
77
|
+
</div>
|
|
78
|
+
<p className="section-description">Tune screen analysis frequency and suggestion timing.</p>
|
|
79
|
+
</div>
|
|
80
|
+
<div className="slider-stack">
|
|
81
|
+
<div className="setting-row">
|
|
82
|
+
<label>Screen Capture Frequency</label>
|
|
83
|
+
<div className="slider-group">
|
|
84
|
+
<input
|
|
85
|
+
type="range"
|
|
86
|
+
min="30"
|
|
87
|
+
max="300"
|
|
88
|
+
step="30"
|
|
89
|
+
value={config.proactiveInterval}
|
|
90
|
+
onChange={(e) => updateField('proactiveInterval', parseInt(e.target.value))}
|
|
91
|
+
className="range-slider"
|
|
92
|
+
/>
|
|
93
|
+
<span className="range-value">{config.proactiveInterval} sec</span>
|
|
94
|
+
</div>
|
|
95
|
+
<p className="hint">Lower values respond faster but use more API calls.</p>
|
|
96
|
+
</div>
|
|
97
|
+
<div className="setting-row">
|
|
98
|
+
<label>Suggestion Cooldown</label>
|
|
99
|
+
<div className="slider-group">
|
|
100
|
+
<input
|
|
101
|
+
type="range"
|
|
102
|
+
min="60"
|
|
103
|
+
max="600"
|
|
104
|
+
step="60"
|
|
105
|
+
value={config.proactiveCooldown}
|
|
106
|
+
onChange={(e) => updateField('proactiveCooldown', parseInt(e.target.value))}
|
|
107
|
+
className="range-slider"
|
|
108
|
+
/>
|
|
109
|
+
<span className="range-value">{Math.round(config.proactiveCooldown / 60)} min</span>
|
|
110
|
+
</div>
|
|
111
|
+
<p className="hint">Minimum time between repeat suggestions.</p>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
</section>
|
|
115
|
+
|
|
116
|
+
<section className="setting-section">
|
|
117
|
+
<div className="section-heading">
|
|
118
|
+
<div>
|
|
119
|
+
<p className="section-kicker">Messaging</p>
|
|
120
|
+
<h2 className="section-title">Native Channel Bridges</h2>
|
|
121
|
+
</div>
|
|
122
|
+
<p className="section-description">Configure credentials used directly by the Rust channel workers.</p>
|
|
123
|
+
</div>
|
|
124
|
+
<div className="form-grid">
|
|
125
|
+
<label className="toggle-row"><span>Telegram Bot API</span><input type="checkbox" checked={config.enableTelegramBridge} onChange={(e) => updateField('enableTelegramBridge', e.target.checked)} /></label>
|
|
126
|
+
<input type="password" placeholder="Telegram bot token" value={config.telegramBotToken} onChange={(e) => updateField('telegramBotToken', e.target.value)} />
|
|
127
|
+
<label className="toggle-row"><span>Discord Gateway</span><input type="checkbox" checked={config.enableDiscordBridge} onChange={(e) => updateField('enableDiscordBridge', e.target.checked)} /></label>
|
|
128
|
+
<input type="password" placeholder="Discord bot token" value={config.discordBotToken} onChange={(e) => updateField('discordBotToken', e.target.value)} />
|
|
129
|
+
<input type="text" placeholder="Discord application ID for Rich Presence" value={config.discordApplicationId} onChange={(e) => updateField('discordApplicationId', e.target.value)} />
|
|
130
|
+
<label className="toggle-row"><span>Slack Socket Mode</span><input type="checkbox" checked={config.enableSlackBridge} onChange={(e) => updateField('enableSlackBridge', e.target.checked)} /></label>
|
|
131
|
+
<input type="password" placeholder="Slack bot token (xoxb-...)" value={config.slackBotToken} onChange={(e) => updateField('slackBotToken', e.target.value)} />
|
|
132
|
+
<input type="password" placeholder="Slack app token (xapp-...)" value={config.slackAppToken} onChange={(e) => updateField('slackAppToken', e.target.value)} />
|
|
133
|
+
<label className="toggle-row"><span>LINE Webhook</span><input type="checkbox" checked={config.enableLineBridge} onChange={(e) => updateField('enableLineBridge', e.target.checked)} /></label>
|
|
134
|
+
<input type="password" placeholder="LINE channel access token" value={config.lineChannelAccessToken} onChange={(e) => updateField('lineChannelAccessToken', e.target.value)} />
|
|
135
|
+
<input type="password" placeholder="LINE channel secret" value={config.lineChannelSecret} onChange={(e) => updateField('lineChannelSecret', e.target.value)} />
|
|
136
|
+
<label className="toggle-row"><span>WhatsApp Cloud API</span><input type="checkbox" checked={config.enableWhatsappBridge} onChange={(e) => updateField('enableWhatsappBridge', e.target.checked)} /></label>
|
|
137
|
+
<input type="password" placeholder="WhatsApp Cloud access token" value={config.whatsappCloudAccessToken} onChange={(e) => updateField('whatsappCloudAccessToken', e.target.value)} />
|
|
138
|
+
<input type="text" placeholder="WhatsApp phone number ID" value={config.whatsappPhoneNumberId} onChange={(e) => updateField('whatsappPhoneNumberId', e.target.value)} />
|
|
139
|
+
<input type="password" placeholder="WhatsApp verify token" value={config.whatsappVerifyToken} onChange={(e) => updateField('whatsappVerifyToken', e.target.value)} />
|
|
140
|
+
<input type="password" placeholder="WhatsApp app secret (optional HMAC validation)" value={config.whatsappAppSecret} onChange={(e) => updateField('whatsappAppSecret', e.target.value)} />
|
|
141
|
+
</div>
|
|
142
|
+
</section>
|
|
143
|
+
|
|
144
|
+
<section className="setting-section">
|
|
145
|
+
<div className="section-heading">
|
|
146
|
+
<div>
|
|
147
|
+
<p className="section-kicker">Rules</p>
|
|
148
|
+
<h2 className="section-title">Custom Workflows</h2>
|
|
149
|
+
</div>
|
|
150
|
+
</div>
|
|
151
|
+
<div className="toggle-row">
|
|
152
|
+
<div>
|
|
153
|
+
<label>Enable Custom Workflows</label>
|
|
154
|
+
<p className="hint">Run "If This Then Mint" rules from the workflow JSON file.</p>
|
|
155
|
+
</div>
|
|
156
|
+
<label className="settings-toggle-switch">
|
|
157
|
+
<input
|
|
158
|
+
type="checkbox"
|
|
159
|
+
checked={config.enableCustomWorkflows}
|
|
160
|
+
onChange={(e) => updateField('enableCustomWorkflows', e.target.checked)}
|
|
161
|
+
/>
|
|
162
|
+
<span className="settings-toggle-slider"></span>
|
|
163
|
+
</label>
|
|
164
|
+
</div>
|
|
165
|
+
<div className="button-row" style={{ display: 'flex', gap: '10px', marginTop: '10px' }}>
|
|
166
|
+
<button className="btn btn-secondary" onClick={handleOpenWorkflows}>Open workflows.json</button>
|
|
167
|
+
<button className="btn btn-primary" onClick={handleReloadWorkflows}>Reload Rules</button>
|
|
168
|
+
</div>
|
|
169
|
+
</section>
|
|
170
|
+
|
|
171
|
+
<section className="setting-section">
|
|
172
|
+
<div className="section-heading">
|
|
173
|
+
<div>
|
|
174
|
+
<p className="section-kicker">Code mode</p>
|
|
175
|
+
<h2 className="section-title">Agent Collaboration</h2>
|
|
176
|
+
</div>
|
|
177
|
+
</div>
|
|
178
|
+
<div className="toggle-row">
|
|
179
|
+
<div>
|
|
180
|
+
<label>Enable Multi-Agent Review</label>
|
|
181
|
+
<p className="hint">Allow a secondary model to review code written by the primary model.</p>
|
|
182
|
+
</div>
|
|
183
|
+
<label className="settings-toggle-switch">
|
|
184
|
+
<input
|
|
185
|
+
type="checkbox"
|
|
186
|
+
checked={config.enableAgentCollaboration}
|
|
187
|
+
onChange={(e) => updateField('enableAgentCollaboration', e.target.checked)}
|
|
188
|
+
/>
|
|
189
|
+
<span className="settings-toggle-slider"></span>
|
|
190
|
+
</label>
|
|
191
|
+
</div>
|
|
192
|
+
</section>
|
|
193
|
+
</div>
|
|
194
|
+
)
|
|
195
|
+
}
|