@game_ryo/lsji 0.1.1 → 0.3.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.
@@ -0,0 +1,260 @@
1
+ :root {
2
+ --bg-primary: #0d1117;
3
+ --bg-secondary: #161b22;
4
+ --bg-tertiary: #21262d;
5
+ --border: #30363d;
6
+ --text-primary: #e6edf3;
7
+ --text-secondary: #8b949e;
8
+ --accent: #58a6ff;
9
+ --accent-hover: #79c0ff;
10
+ --success: #3fb950;
11
+ --warning: #d29922;
12
+ --danger: #f85149;
13
+ --purple: #a371f7;
14
+ }
15
+
16
+ * { box-sizing: border-box; }
17
+
18
+ body { margin: 0; background: var(--bg-primary); color: var(--text-primary); font-size: 14px; line-height: 1.5; }
19
+
20
+ #root { min-height: 100vh; display: flex; flex-direction: column; }
21
+
22
+ .app { display: flex; flex-direction: column; min-height: 100vh; }
23
+
24
+ .header {
25
+ background: var(--bg-secondary);
26
+ border-bottom: 1px solid var(--border);
27
+ padding: 12px 24px;
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: space-between;
31
+ position: sticky;
32
+ top: 0;
33
+ z-index: 100;
34
+ }
35
+
36
+ .header-left { display: flex; align-items: center; gap: 16px; }
37
+ .logo { font-size: 18px; font-weight: 600; color: var(--accent); }
38
+ .version { font-size: 12px; color: var(--text-secondary); background: var(--bg-tertiary); padding: 2px 8px; border-radius: 4px; }
39
+
40
+ .header-right { display: flex; align-items: center; gap: 16px; }
41
+ .connection-status { display: flex; align-items: center; gap: 8px; font-size: 12px; }
42
+ .status-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--success); }
43
+ .status-dot.disconnected { background: var(--danger); }
44
+
45
+ .main { display: flex; flex: 1; overflow: hidden; }
46
+
47
+ .sidebar {
48
+ width: 280px;
49
+ background: var(--bg-secondary);
50
+ border-right: 1px solid var(--border);
51
+ display: flex;
52
+ flex-direction: column;
53
+ overflow-y: auto;
54
+ }
55
+
56
+ .sidebar-section { padding: 16px; border-bottom: 1px solid var(--border); }
57
+ .sidebar-title { font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-secondary); margin-bottom: 12px; font-weight: 600; }
58
+
59
+ .run-list { display: flex; flex-direction: column; gap: 8px; }
60
+ .run-item {
61
+ background: var(--bg-tertiary);
62
+ border: 1px solid var(--border);
63
+ border-radius: 6px;
64
+ padding: 12px;
65
+ cursor: pointer;
66
+ transition: all 0.15s;
67
+ }
68
+ .run-item:hover { border-color: var(--accent); }
69
+ .run-item.active { border-color: var(--accent); background: rgba(88, 166, 255, 0.1); }
70
+ .run-item-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px; }
71
+ .run-id { font-family: monospace; font-size: 12px; color: var(--accent); }
72
+ .run-status { font-size: 11px; padding: 2px 8px; border-radius: 12px; font-weight: 500; }
73
+ .run-status.running { background: rgba(88, 166, 255, 0.2); color: var(--accent); }
74
+ .run-status.completed { background: rgba(63, 185, 80, 0.2); color: var(--success); }
75
+ .run-status.failed { background: rgba(248, 81, 73, 0.2); color: var(--danger); }
76
+ .run-status.stopped { background: rgba(210, 153, 34, 0.2); color: var(--warning); }
77
+ .run-task { font-size: 12px; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
78
+ .run-meta { font-size: 11px; color: var(--text-secondary); margin-top: 8px; display: flex; gap: 16px; }
79
+
80
+ .content { flex: 1; display: flex; flex-direction: column; overflow: hidden; }
81
+
82
+ .content-header {
83
+ background: var(--bg-secondary);
84
+ border-bottom: 1px solid var(--border);
85
+ padding: 16px 24px;
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: space-between;
89
+ }
90
+
91
+ .content-title { font-size: 16px; font-weight: 600; }
92
+ .content-actions { display: flex; gap: 8px; }
93
+
94
+ .btn {
95
+ padding: 8px 16px;
96
+ border-radius: 6px;
97
+ border: 1px solid var(--border);
98
+ background: var(--bg-tertiary);
99
+ color: var(--text-primary);
100
+ font-size: 13px;
101
+ cursor: pointer;
102
+ transition: all 0.15s;
103
+ display: inline-flex;
104
+ align-items: center;
105
+ gap: 6px;
106
+ }
107
+ .btn:hover { background: var(--border); }
108
+ .btn.primary { background: var(--accent); border-color: var(--accent); color: #0d1117; }
109
+ .btn.primary:hover { background: var(--accent-hover); }
110
+ .btn.danger { background: var(--danger); border-color: var(--danger); color: white; }
111
+ .btn.success { background: var(--success); border-color: var(--success); color: white; }
112
+ .btn:disabled { opacity: 0.5; cursor: not-allowed; }
113
+
114
+ .panels { display: flex; flex: 1; overflow: hidden; }
115
+
116
+ .panel {
117
+ flex: 1;
118
+ display: flex;
119
+ flex-direction: column;
120
+ min-width: 0;
121
+ }
122
+
123
+ .panel-header {
124
+ padding: 12px 16px;
125
+ background: var(--bg-secondary);
126
+ border-bottom: 1px solid var(--border);
127
+ display: flex;
128
+ align-items: center;
129
+ justify-content: space-between;
130
+ }
131
+
132
+ .panel-title { font-size: 13px; font-weight: 600; }
133
+ .panel-content { flex: 1; overflow-y: auto; padding: 16px; }
134
+
135
+ /* Thought Log */
136
+ .thought-log { display: flex; flex-direction: column; gap: 8px; }
137
+ .thought-entry {
138
+ background: var(--bg-tertiary);
139
+ border: 1px solid var(--border);
140
+ border-radius: 6px;
141
+ padding: 12px;
142
+ animation: slideIn 0.2s ease;
143
+ }
144
+ @keyframes slideIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } }
145
+ .thought-header { display: flex; justify-content: space-between; margin-bottom: 8px; font-size: 11px; color: var(--text-secondary); }
146
+ .thought-type { font-weight: 600; text-transform: uppercase; }
147
+ .thought-type.thought { color: var(--purple); }
148
+ .thought-type.action { color: var(--accent); }
149
+ .thought-type.observation { color: var(--success); }
150
+ .thought-type.error { color: var(--danger); }
151
+ .thought-content { font-family: monospace; font-size: 12px; white-space: pre-wrap; word-break: break-word; }
152
+ .thought-tool { background: rgba(88, 166, 255, 0.1); padding: 8px; border-radius: 4px; margin-top: 8px; font-size: 11px; }
153
+
154
+ /* Approval Queue */
155
+ .approval-list { display: flex; flex-direction: column; gap: 12px; }
156
+ .approval-card {
157
+ background: var(--bg-tertiary);
158
+ border: 1px solid var(--border);
159
+ border-radius: 8px;
160
+ padding: 16px;
161
+ }
162
+ .approval-header { display: flex; justify-content: space-between; margin-bottom: 12px; }
163
+ .approval-action { font-weight: 600; color: var(--accent); font-family: monospace; font-size: 13px; }
164
+ .approval-badge { font-size: 11px; padding: 2px 8px; border-radius: 12px; font-weight: 500; }
165
+ .approval-badge.pending { background: rgba(210, 153, 34, 0.2); color: var(--warning); }
166
+ .approval-context { font-size: 12px; color: var(--text-secondary); margin-bottom: 12px; }
167
+ .approval-context pre { background: var(--bg-primary); padding: 8px; border-radius: 4px; overflow-x: auto; font-size: 11px; }
168
+ .approval-actions { display: flex; gap: 8px; justify-content: flex-end; }
169
+
170
+ /* Budget Panel */
171
+ .budget-overview { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; margin-bottom: 24px; }
172
+ .budget-card {
173
+ background: var(--bg-tertiary);
174
+ border: 1px solid var(--border);
175
+ border-radius: 8px;
176
+ padding: 16px;
177
+ }
178
+ .budget-card.warning { border-color: var(--warning); }
179
+ .budget-card.danger { border-color: var(--danger); }
180
+ .budget-label { font-size: 11px; color: var(--text-secondary); text-transform: uppercase; margin-bottom: 4px; }
181
+ .budget-value { font-size: 24px; font-weight: 600; font-family: monospace; }
182
+ .budget-value.warning { color: var(--warning); }
183
+ .budget-value.danger { color: var(--danger); }
184
+ .budget-details { font-size: 11px; color: var(--text-secondary); margin-top: 8px; display: flex; justify-content: space-between; }
185
+
186
+ /* Plugins Panel */
187
+ .plugin-list { display: flex; flex-direction: column; gap: 8px; }
188
+ .plugin-card {
189
+ background: var(--bg-tertiary);
190
+ border: 1px solid var(--border);
191
+ border-radius: 6px;
192
+ padding: 12px;
193
+ display: flex;
194
+ justify-content: space-between;
195
+ align-items: center;
196
+ }
197
+ .plugin-info { display: flex; flex-direction: column; gap: 2px; }
198
+ .plugin-name { font-weight: 500; }
199
+ .plugin-version { font-size: 11px; color: var(--text-secondary); }
200
+ .plugin-tools { font-size: 11px; color: var(--accent); }
201
+
202
+ /* New Run Modal */
203
+ .modal-overlay {
204
+ position: fixed;
205
+ inset: 0;
206
+ background: rgba(0, 0, 0, 0.8);
207
+ display: flex;
208
+ align-items: center;
209
+ justify-content: center;
210
+ z-index: 1000;
211
+ }
212
+ .modal {
213
+ background: var(--bg-secondary);
214
+ border: 1px solid var(--border);
215
+ border-radius: 12px;
216
+ padding: 24px;
217
+ width: 100%;
218
+ max-width: 500px;
219
+ max-height: 90vh;
220
+ overflow-y: auto;
221
+ }
222
+ .modal-title { font-size: 18px; font-weight: 600; margin-bottom: 20px; }
223
+ .form-group { margin-bottom: 16px; }
224
+ .form-label { display: block; font-size: 12px; font-weight: 500; margin-bottom: 6px; }
225
+ .form-input, .form-textarea, .form-select {
226
+ width: 100%;
227
+ padding: 10px 12px;
228
+ background: var(--bg-primary);
229
+ border: 1px solid var(--border);
230
+ border-radius: 6px;
231
+ color: var(--text-primary);
232
+ font-size: 13px;
233
+ font-family: inherit;
234
+ }
235
+ .form-input:focus, .form-textarea:focus, .form-select:focus {
236
+ outline: none;
237
+ border-color: var(--accent);
238
+ }
239
+ .form-textarea { min-height: 100px; resize: vertical; font-family: monospace; }
240
+ .form-row { display: flex; gap: 12px; }
241
+ .form-row .form-group { flex: 1; }
242
+ .modal-actions { display: flex; justify-content: flex-end; gap: 12px; margin-top: 24px; }
243
+
244
+ .empty-state {
245
+ display: flex;
246
+ flex-direction: column;
247
+ align-items: center;
248
+ justify-content: center;
249
+ height: 100%;
250
+ color: var(--text-secondary);
251
+ text-align: center;
252
+ gap: 12px;
253
+ }
254
+ .empty-state svg { width: 48px; height: 48px; opacity: 0.5; }
255
+
256
+ /* Scrollbar */
257
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
258
+ ::-webkit-scrollbar-track { background: var(--bg-primary); }
259
+ ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; }
260
+ ::-webkit-scrollbar-thumb:hover { background: var(--text-secondary); }
@@ -0,0 +1,27 @@
1
+ import { defineConfig } from 'vite';
2
+ import react from '@vitejs/plugin-react';
3
+ import { resolve } from 'path';
4
+
5
+ export default defineConfig({
6
+ plugins: [react()],
7
+ root: '.',
8
+ build: {
9
+ outDir: 'dist',
10
+ emptyOutDir: true,
11
+ rollupOptions: {
12
+ input: {
13
+ main: resolve(__dirname, 'index.html'),
14
+ },
15
+ },
16
+ },
17
+ server: {
18
+ port: 5173,
19
+ proxy: {
20
+ '/api': 'http://localhost:3456',
21
+ '/socket.io': {
22
+ target: 'http://localhost:3456',
23
+ ws: true,
24
+ },
25
+ },
26
+ },
27
+ });