ltcai 0.6.0 → 1.0.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.
@@ -0,0 +1,515 @@
1
+ :root {
2
+ color-scheme: light;
3
+ --bg: #f6f7f9;
4
+ --surface: #ffffff;
5
+ --surface-2: #f0f4f8;
6
+ --ink: #101828;
7
+ --muted: #667085;
8
+ --line: #d9e0e8;
9
+ --blue: #2563eb;
10
+ --green: #12805c;
11
+ --amber: #b45309;
12
+ --pink: #be185d;
13
+ --red: #c2410c;
14
+ --radius: 8px;
15
+ --shadow: 0 12px 34px rgba(16, 24, 40, 0.08);
16
+ font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
17
+ }
18
+
19
+ * { box-sizing: border-box; }
20
+
21
+ html { scroll-behavior: smooth; }
22
+
23
+ body {
24
+ margin: 0;
25
+ background: var(--bg);
26
+ color: var(--ink);
27
+ min-width: 320px;
28
+ }
29
+
30
+ button, input, select, textarea {
31
+ font: inherit;
32
+ }
33
+
34
+ button {
35
+ border: 0;
36
+ cursor: pointer;
37
+ }
38
+
39
+ .workspace-shell {
40
+ display: grid;
41
+ grid-template-columns: 248px minmax(0, 1fr);
42
+ min-height: 100vh;
43
+ }
44
+
45
+ .workspace-rail {
46
+ position: sticky;
47
+ top: 0;
48
+ height: 100vh;
49
+ background: #111827;
50
+ color: #e5e7eb;
51
+ padding: 18px 14px;
52
+ display: flex;
53
+ flex-direction: column;
54
+ gap: 18px;
55
+ }
56
+
57
+ .rail-brand {
58
+ display: flex;
59
+ align-items: center;
60
+ gap: 10px;
61
+ color: #fff;
62
+ text-decoration: none;
63
+ font-weight: 800;
64
+ padding: 8px;
65
+ }
66
+
67
+ .rail-brand img {
68
+ width: 32px;
69
+ height: 32px;
70
+ border-radius: 8px;
71
+ }
72
+
73
+ .workspace-rail nav,
74
+ .rail-links {
75
+ display: grid;
76
+ gap: 4px;
77
+ }
78
+
79
+ .workspace-rail a {
80
+ color: #b8c0cc;
81
+ text-decoration: none;
82
+ }
83
+
84
+ .workspace-rail nav a,
85
+ .rail-links a {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: 10px;
89
+ padding: 10px 12px;
90
+ border-radius: 8px;
91
+ font-size: 14px;
92
+ }
93
+
94
+ .workspace-rail nav a.active,
95
+ .workspace-rail nav a:hover,
96
+ .rail-links a:hover {
97
+ background: rgba(255,255,255,0.08);
98
+ color: #fff;
99
+ }
100
+
101
+ .rail-links {
102
+ border-top: 1px solid rgba(255,255,255,0.12);
103
+ padding-top: 12px;
104
+ margin-top: auto;
105
+ }
106
+
107
+ main {
108
+ padding: 24px;
109
+ display: grid;
110
+ gap: 18px;
111
+ }
112
+
113
+ .workspace-topbar {
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: space-between;
117
+ gap: 16px;
118
+ padding: 6px 0 2px;
119
+ }
120
+
121
+ .eyebrow {
122
+ color: var(--blue);
123
+ font-size: 11px;
124
+ font-weight: 800;
125
+ text-transform: uppercase;
126
+ letter-spacing: .08em;
127
+ }
128
+
129
+ h1, h2 {
130
+ margin: 0;
131
+ letter-spacing: 0;
132
+ }
133
+
134
+ h1 {
135
+ font-size: 30px;
136
+ line-height: 1.15;
137
+ }
138
+
139
+ h2 {
140
+ font-size: 17px;
141
+ line-height: 1.25;
142
+ }
143
+
144
+ .top-actions,
145
+ .section-head,
146
+ .inline-form,
147
+ .item-actions {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: 10px;
151
+ }
152
+
153
+ .section-head {
154
+ justify-content: space-between;
155
+ margin-bottom: 14px;
156
+ }
157
+
158
+ .primary-action,
159
+ .secondary-action,
160
+ .icon-action,
161
+ .small-action {
162
+ border-radius: 8px;
163
+ min-height: 36px;
164
+ display: inline-flex;
165
+ align-items: center;
166
+ justify-content: center;
167
+ gap: 8px;
168
+ white-space: nowrap;
169
+ }
170
+
171
+ .primary-action {
172
+ background: var(--blue);
173
+ color: white;
174
+ padding: 0 14px;
175
+ font-weight: 700;
176
+ }
177
+
178
+ .secondary-action {
179
+ background: #e6efff;
180
+ color: #174ea6;
181
+ padding: 0 12px;
182
+ font-weight: 700;
183
+ }
184
+
185
+ .icon-action {
186
+ width: 38px;
187
+ background: var(--surface);
188
+ color: var(--ink);
189
+ border: 1px solid var(--line);
190
+ }
191
+
192
+ .small-action {
193
+ min-height: 30px;
194
+ padding: 0 10px;
195
+ color: var(--ink);
196
+ background: var(--surface-2);
197
+ border: 1px solid var(--line);
198
+ font-size: 12px;
199
+ font-weight: 700;
200
+ }
201
+
202
+ .danger-action {
203
+ color: #fff;
204
+ background: var(--red);
205
+ border-color: var(--red);
206
+ }
207
+
208
+ .metric-grid {
209
+ display: grid;
210
+ grid-template-columns: repeat(4, minmax(0, 1fr));
211
+ gap: 12px;
212
+ }
213
+
214
+ .metric-card,
215
+ .workspace-panel,
216
+ .workspace-band {
217
+ background: var(--surface);
218
+ border: 1px solid var(--line);
219
+ border-radius: 8px;
220
+ box-shadow: var(--shadow);
221
+ }
222
+
223
+ .metric-card {
224
+ padding: 16px;
225
+ display: grid;
226
+ gap: 8px;
227
+ }
228
+
229
+ .metric-card span {
230
+ color: var(--muted);
231
+ font-size: 12px;
232
+ font-weight: 700;
233
+ }
234
+
235
+ .metric-card strong {
236
+ font-size: 28px;
237
+ line-height: 1;
238
+ }
239
+
240
+ .metric-card i {
241
+ color: var(--green);
242
+ font-size: 22px;
243
+ }
244
+
245
+ .workspace-band,
246
+ .workspace-panel {
247
+ padding: 18px;
248
+ }
249
+
250
+ .workspace-grid {
251
+ display: grid;
252
+ gap: 18px;
253
+ }
254
+
255
+ .two-col {
256
+ grid-template-columns: repeat(2, minmax(0, 1fr));
257
+ }
258
+
259
+ .step-grid {
260
+ display: grid;
261
+ grid-template-columns: repeat(3, minmax(0, 1fr));
262
+ gap: 10px;
263
+ }
264
+
265
+ .step-chip {
266
+ display: flex;
267
+ align-items: center;
268
+ justify-content: space-between;
269
+ gap: 10px;
270
+ min-height: 44px;
271
+ padding: 10px 12px;
272
+ background: var(--surface-2);
273
+ border: 1px solid var(--line);
274
+ border-radius: 8px;
275
+ }
276
+
277
+ .status-pill {
278
+ padding: 3px 8px;
279
+ border-radius: 999px;
280
+ font-size: 11px;
281
+ font-weight: 800;
282
+ background: #eef2ff;
283
+ color: var(--blue);
284
+ }
285
+
286
+ .status-complete { background: #dcfce7; color: var(--green); }
287
+ .status-failed { background: #ffedd5; color: var(--red); }
288
+ .status-running { background: #fef3c7; color: var(--amber); }
289
+
290
+ .list-stack {
291
+ display: grid;
292
+ gap: 10px;
293
+ }
294
+
295
+ .list-item {
296
+ border: 1px solid var(--line);
297
+ background: #fbfcfe;
298
+ border-radius: 8px;
299
+ padding: 12px;
300
+ display: grid;
301
+ gap: 8px;
302
+ }
303
+
304
+ .list-title {
305
+ display: flex;
306
+ justify-content: space-between;
307
+ align-items: center;
308
+ gap: 10px;
309
+ font-weight: 800;
310
+ }
311
+
312
+ .list-title span {
313
+ min-width: 0;
314
+ overflow: hidden;
315
+ text-overflow: ellipsis;
316
+ white-space: nowrap;
317
+ }
318
+
319
+ .meta-line,
320
+ .mini-row {
321
+ color: var(--muted);
322
+ font-size: 12px;
323
+ }
324
+
325
+ .tag-row {
326
+ display: flex;
327
+ flex-wrap: wrap;
328
+ gap: 6px;
329
+ }
330
+
331
+ .tag {
332
+ font-size: 11px;
333
+ font-weight: 800;
334
+ color: #344054;
335
+ background: #edf2f7;
336
+ border-radius: 999px;
337
+ padding: 3px 8px;
338
+ }
339
+
340
+ .inline-form {
341
+ margin-bottom: 12px;
342
+ }
343
+
344
+ .inline-form.split {
345
+ align-items: stretch;
346
+ }
347
+
348
+ input, select, textarea {
349
+ width: 100%;
350
+ border: 1px solid var(--line);
351
+ border-radius: 8px;
352
+ color: var(--ink);
353
+ background: #fff;
354
+ min-height: 38px;
355
+ padding: 9px 10px;
356
+ }
357
+
358
+ textarea {
359
+ resize: vertical;
360
+ min-height: 96px;
361
+ }
362
+
363
+ .memory-form {
364
+ display: grid;
365
+ grid-template-columns: 180px minmax(0, 1fr);
366
+ gap: 10px;
367
+ margin-bottom: 12px;
368
+ }
369
+
370
+ .memory-form textarea {
371
+ grid-column: 1 / -1;
372
+ }
373
+
374
+ .memory-form button {
375
+ grid-column: 1 / -1;
376
+ }
377
+
378
+ .code-box,
379
+ .state-box {
380
+ min-height: 120px;
381
+ background: #111827;
382
+ color: #e5e7eb;
383
+ border-radius: 8px;
384
+ border: 1px solid #253043;
385
+ padding: 12px;
386
+ overflow: auto;
387
+ font-family: "SF Mono", Menlo, Consolas, monospace;
388
+ font-size: 12px;
389
+ line-height: 1.45;
390
+ }
391
+
392
+ .timeline-list {
393
+ display: grid;
394
+ gap: 0;
395
+ border-left: 2px solid var(--line);
396
+ margin-left: 7px;
397
+ }
398
+
399
+ .timeline-item {
400
+ position: relative;
401
+ padding: 0 0 14px 16px;
402
+ }
403
+
404
+ .timeline-item::before {
405
+ content: "";
406
+ position: absolute;
407
+ left: -6px;
408
+ top: 3px;
409
+ width: 10px;
410
+ height: 10px;
411
+ border-radius: 50%;
412
+ background: var(--pink);
413
+ }
414
+
415
+ .toggle-row {
416
+ display: inline-flex;
417
+ align-items: center;
418
+ gap: 8px;
419
+ }
420
+
421
+ .toggle-row input {
422
+ position: absolute;
423
+ opacity: 0;
424
+ pointer-events: none;
425
+ }
426
+
427
+ .toggle-row span {
428
+ width: 42px;
429
+ height: 24px;
430
+ background: #cbd5e1;
431
+ border-radius: 999px;
432
+ position: relative;
433
+ }
434
+
435
+ .toggle-row span::after {
436
+ content: "";
437
+ position: absolute;
438
+ width: 18px;
439
+ height: 18px;
440
+ top: 3px;
441
+ left: 3px;
442
+ border-radius: 50%;
443
+ background: white;
444
+ transition: transform 160ms ease;
445
+ }
446
+
447
+ .toggle-row input:checked + span {
448
+ background: var(--green);
449
+ }
450
+
451
+ .toggle-row input:checked + span::after {
452
+ transform: translateX(18px);
453
+ }
454
+
455
+ .toast {
456
+ position: fixed;
457
+ right: 18px;
458
+ bottom: 18px;
459
+ min-width: 220px;
460
+ max-width: 360px;
461
+ color: #fff;
462
+ background: #111827;
463
+ border-radius: 8px;
464
+ padding: 12px 14px;
465
+ opacity: 0;
466
+ transform: translateY(8px);
467
+ pointer-events: none;
468
+ transition: opacity 160ms ease, transform 160ms ease;
469
+ box-shadow: var(--shadow);
470
+ }
471
+
472
+ .toast.show {
473
+ opacity: 1;
474
+ transform: translateY(0);
475
+ }
476
+
477
+ @media (max-width: 1100px) {
478
+ .metric-grid,
479
+ .two-col {
480
+ grid-template-columns: repeat(2, minmax(0, 1fr));
481
+ }
482
+ .step-grid {
483
+ grid-template-columns: repeat(2, minmax(0, 1fr));
484
+ }
485
+ }
486
+
487
+ @media (max-width: 760px) {
488
+ .workspace-shell {
489
+ grid-template-columns: 1fr;
490
+ }
491
+ .workspace-rail {
492
+ position: relative;
493
+ height: auto;
494
+ }
495
+ .workspace-rail nav,
496
+ .rail-links {
497
+ grid-template-columns: repeat(2, minmax(0, 1fr));
498
+ }
499
+ main {
500
+ padding: 16px;
501
+ }
502
+ .workspace-topbar,
503
+ .section-head {
504
+ align-items: flex-start;
505
+ flex-direction: column;
506
+ }
507
+ .metric-grid,
508
+ .two-col,
509
+ .step-grid {
510
+ grid-template-columns: 1fr;
511
+ }
512
+ .memory-form {
513
+ grid-template-columns: 1fr;
514
+ }
515
+ }
@@ -0,0 +1,199 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Lattice AI Workspace OS</title>
7
+ <link rel="manifest" href="/manifest.json">
8
+ <link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32.png">
9
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap">
10
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css">
11
+ <link rel="stylesheet" href="/static/workspace.css?v=1.0.0">
12
+ </head>
13
+ <body>
14
+ <div class="workspace-shell">
15
+ <aside class="workspace-rail">
16
+ <a class="rail-brand" href="/workspace" aria-label="Lattice AI Workspace OS">
17
+ <img src="/static/icons/icon-192.png" alt="">
18
+ <span>Lattice AI</span>
19
+ </a>
20
+ <nav>
21
+ <a class="active" href="#overview"><i class="ti ti-layout-dashboard"></i><span>Overview</span></a>
22
+ <a href="#graph"><i class="ti ti-chart-dots-3"></i><span>Graph</span></a>
23
+ <a href="#snapshots"><i class="ti ti-stack-2"></i><span>Snapshots</span></a>
24
+ <a href="#memory"><i class="ti ti-book-2"></i><span>Memory</span></a>
25
+ <a href="#agents"><i class="ti ti-route-alt-left"></i><span>Agents</span></a>
26
+ <a href="#workflows"><i class="ti ti-git-branch"></i><span>Workflow</span></a>
27
+ <a href="#skills"><i class="ti ti-puzzle"></i><span>Skills</span></a>
28
+ <a href="#timeline"><i class="ti ti-timeline-event"></i><span>Timeline</span></a>
29
+ </nav>
30
+ <div class="rail-links">
31
+ <a href="/chat"><i class="ti ti-message-circle"></i><span>Chat</span></a>
32
+ <a href="/graph"><i class="ti ti-network"></i><span>Graph Canvas</span></a>
33
+ <a href="/admin"><i class="ti ti-shield-lock"></i><span>Admin</span></a>
34
+ </div>
35
+ </aside>
36
+
37
+ <main>
38
+ <header class="workspace-topbar" id="overview">
39
+ <div>
40
+ <div class="eyebrow">AI Workspace OS</div>
41
+ <h1>Workspace Command Center</h1>
42
+ </div>
43
+ <div class="top-actions">
44
+ <button class="icon-action" id="refresh-btn" title="Refresh"><i class="ti ti-refresh"></i></button>
45
+ <button class="primary-action" id="snapshot-now"><i class="ti ti-device-floppy"></i><span>Snapshot</span></button>
46
+ </div>
47
+ </header>
48
+
49
+ <section class="metric-grid" id="metric-grid"></section>
50
+
51
+ <section class="workspace-band onboarding-band" id="onboarding">
52
+ <div class="section-head">
53
+ <div>
54
+ <div class="eyebrow">First Run</div>
55
+ <h2>Onboarding Wizard</h2>
56
+ </div>
57
+ <button class="secondary-action" id="complete-onboarding"><i class="ti ti-circle-check"></i><span>Complete</span></button>
58
+ </div>
59
+ <div class="step-grid" id="onboarding-steps"></div>
60
+ </section>
61
+
62
+ <section class="workspace-grid two-col" id="graph">
63
+ <div class="workspace-panel">
64
+ <div class="section-head">
65
+ <div>
66
+ <div class="eyebrow">Graph RAG</div>
67
+ <h2>Answer Trace</h2>
68
+ </div>
69
+ <button class="icon-action" id="reload-traces" title="Reload traces"><i class="ti ti-refresh"></i></button>
70
+ </div>
71
+ <div id="trace-list" class="list-stack"></div>
72
+ </div>
73
+ <div class="workspace-panel">
74
+ <div class="section-head">
75
+ <div>
76
+ <div class="eyebrow">Local Index</div>
77
+ <h2>Indexing Dashboard</h2>
78
+ </div>
79
+ </div>
80
+ <div id="indexing-list" class="list-stack"></div>
81
+ </div>
82
+ </section>
83
+
84
+ <section class="workspace-grid two-col" id="snapshots">
85
+ <div class="workspace-panel">
86
+ <div class="section-head">
87
+ <div>
88
+ <div class="eyebrow">Snapshot</div>
89
+ <h2>Workspace Snapshots</h2>
90
+ </div>
91
+ </div>
92
+ <div class="inline-form">
93
+ <input id="snapshot-name" placeholder="Snapshot name" value="Workspace 1.0 checkpoint">
94
+ <button class="primary-action" id="create-snapshot"><i class="ti ti-device-floppy"></i><span>Save</span></button>
95
+ </div>
96
+ <div id="snapshot-list" class="list-stack"></div>
97
+ </div>
98
+ <div class="workspace-panel">
99
+ <div class="section-head">
100
+ <div>
101
+ <div class="eyebrow">Knowledge Diff</div>
102
+ <h2>Compare Snapshots</h2>
103
+ </div>
104
+ </div>
105
+ <div class="inline-form split">
106
+ <select id="snapshot-before"></select>
107
+ <select id="snapshot-after"></select>
108
+ <button class="secondary-action" id="compare-snapshots"><i class="ti ti-arrows-diff"></i><span>Compare</span></button>
109
+ </div>
110
+ <pre id="snapshot-diff" class="code-box"></pre>
111
+ </div>
112
+ </section>
113
+
114
+ <section class="workspace-grid two-col" id="memory">
115
+ <div class="workspace-panel">
116
+ <div class="section-head">
117
+ <div>
118
+ <div class="eyebrow">Personal</div>
119
+ <h2>Memory Layer</h2>
120
+ </div>
121
+ </div>
122
+ <div class="memory-form">
123
+ <select id="memory-kind">
124
+ <option value="preferences">Preferences</option>
125
+ <option value="decisions">Decisions</option>
126
+ <option value="working_style">Working Style</option>
127
+ <option value="frequently_used_tools">Frequent Tools</option>
128
+ <option value="long_term">Long-term</option>
129
+ </select>
130
+ <textarea id="memory-content" placeholder="Memory content"></textarea>
131
+ <button class="primary-action" id="save-memory"><i class="ti ti-plus"></i><span>Save Memory</span></button>
132
+ </div>
133
+ <div id="memory-list" class="list-stack"></div>
134
+ </div>
135
+ <div class="workspace-panel">
136
+ <div class="section-head">
137
+ <div>
138
+ <div class="eyebrow">Computer</div>
139
+ <h2>Local Computer Memory</h2>
140
+ </div>
141
+ <label class="toggle-row">
142
+ <input type="checkbox" id="computer-memory-toggle">
143
+ <span></span>
144
+ </label>
145
+ </div>
146
+ <div id="computer-memory-state" class="state-box"></div>
147
+ </div>
148
+ </section>
149
+
150
+ <section class="workspace-grid two-col" id="agents">
151
+ <div class="workspace-panel">
152
+ <div class="section-head">
153
+ <div>
154
+ <div class="eyebrow">Multi-Agent Graph</div>
155
+ <h2>Agents</h2>
156
+ </div>
157
+ </div>
158
+ <div id="agent-list" class="list-stack"></div>
159
+ </div>
160
+ <div class="workspace-panel" id="workflows">
161
+ <div class="section-head">
162
+ <div>
163
+ <div class="eyebrow">Workflow Graph</div>
164
+ <h2>Workflow Timeline</h2>
165
+ </div>
166
+ <button class="secondary-action" id="create-demo-workflow"><i class="ti ti-plus"></i><span>New</span></button>
167
+ </div>
168
+ <div id="workflow-list" class="list-stack"></div>
169
+ </div>
170
+ </section>
171
+
172
+ <section class="workspace-grid two-col" id="skills">
173
+ <div class="workspace-panel">
174
+ <div class="section-head">
175
+ <div>
176
+ <div class="eyebrow">Marketplace</div>
177
+ <h2>Skills</h2>
178
+ </div>
179
+ <button class="icon-action" id="reload-skills" title="Reload skills"><i class="ti ti-refresh"></i></button>
180
+ </div>
181
+ <div id="skill-list" class="list-stack"></div>
182
+ </div>
183
+ <div class="workspace-panel" id="timeline">
184
+ <div class="section-head">
185
+ <div>
186
+ <div class="eyebrow">Time Machine</div>
187
+ <h2>Timeline</h2>
188
+ </div>
189
+ </div>
190
+ <div id="timeline-list" class="timeline-list"></div>
191
+ </div>
192
+ </section>
193
+ </main>
194
+ </div>
195
+
196
+ <div class="toast" id="toast"></div>
197
+ <script src="/static/scripts/workspace.js?v=1.0.0"></script>
198
+ </body>
199
+ </html>