@yemi33/minions 0.1.2419 → 0.1.2421
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/dashboard.js +5 -1
- package/docs/demo/memory-system.html +1431 -0
- package/docs/demo/memory-system.js +208 -0
- package/docs/index.html +5 -2
- package/docs/managed-spawn.md +10 -9
- package/engine/managed-spawn-launcher.js +51 -0
- package/engine/managed-spawn.js +112 -19
- package/engine/process-utils.js +33 -0
- package/engine.js +20 -8
- package/package.json +1 -1
|
@@ -0,0 +1,1431 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" class="no-js">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<meta name="description" content="An interactive, code-verified tour of how Minions captures, consolidates, retrieves, bounds, and protects long-term memory.">
|
|
7
|
+
<title>How Minions Remembers | Interactive Memory System</title>
|
|
8
|
+
<style>
|
|
9
|
+
:root {
|
|
10
|
+
color-scheme: dark;
|
|
11
|
+
--bg: #0d1117;
|
|
12
|
+
--surface: #161b22;
|
|
13
|
+
--surface-strong: #21262d;
|
|
14
|
+
--surface-soft: #0d1117;
|
|
15
|
+
--border: #30363d;
|
|
16
|
+
--text: #e6edf3;
|
|
17
|
+
--muted: #8b949e;
|
|
18
|
+
--blue: #58a6ff;
|
|
19
|
+
--green: #3fb950;
|
|
20
|
+
--yellow: #d29922;
|
|
21
|
+
--purple: #bc8cff;
|
|
22
|
+
--red: #f85149;
|
|
23
|
+
--orange: #e3b341;
|
|
24
|
+
--shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
|
|
25
|
+
--radius-sm: 4px;
|
|
26
|
+
--radius-md: 6px;
|
|
27
|
+
--radius-lg: 8px;
|
|
28
|
+
--radius-xl: 10px;
|
|
29
|
+
--radius-pill: 999px;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
* { box-sizing: border-box; }
|
|
33
|
+
html { scroll-behavior: smooth; }
|
|
34
|
+
body {
|
|
35
|
+
margin: 0;
|
|
36
|
+
min-width: 280px;
|
|
37
|
+
overflow-x: hidden;
|
|
38
|
+
background:
|
|
39
|
+
radial-gradient(circle at 16% 5%, rgba(88, 166, 255, 0.1), transparent 30rem),
|
|
40
|
+
radial-gradient(circle at 88% 22%, rgba(188, 140, 255, 0.07), transparent 28rem),
|
|
41
|
+
var(--bg);
|
|
42
|
+
color: var(--text);
|
|
43
|
+
font-family: "Segoe UI", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
|
|
44
|
+
line-height: 1.6;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
a { color: var(--blue); }
|
|
48
|
+
a:hover { color: #79c0ff; }
|
|
49
|
+
button, a { -webkit-tap-highlight-color: transparent; }
|
|
50
|
+
button { font: inherit; }
|
|
51
|
+
.sr-only {
|
|
52
|
+
position: absolute;
|
|
53
|
+
width: 1px;
|
|
54
|
+
height: 1px;
|
|
55
|
+
padding: 0;
|
|
56
|
+
overflow: hidden;
|
|
57
|
+
clip: rect(0, 0, 0, 0);
|
|
58
|
+
white-space: nowrap;
|
|
59
|
+
border: 0;
|
|
60
|
+
}
|
|
61
|
+
:focus-visible {
|
|
62
|
+
outline: 3px solid var(--yellow);
|
|
63
|
+
outline-offset: 4px;
|
|
64
|
+
border-radius: var(--radius-md);
|
|
65
|
+
}
|
|
66
|
+
.skip-link {
|
|
67
|
+
position: fixed;
|
|
68
|
+
top: 10px;
|
|
69
|
+
left: 10px;
|
|
70
|
+
z-index: 100;
|
|
71
|
+
padding: 10px 14px;
|
|
72
|
+
transform: translateY(-150%);
|
|
73
|
+
border-radius: var(--radius-md);
|
|
74
|
+
background: var(--yellow);
|
|
75
|
+
color: var(--bg);
|
|
76
|
+
font-weight: 800;
|
|
77
|
+
}
|
|
78
|
+
.skip-link:focus { transform: translateY(0); }
|
|
79
|
+
|
|
80
|
+
.site-header {
|
|
81
|
+
position: sticky;
|
|
82
|
+
top: 0;
|
|
83
|
+
z-index: 50;
|
|
84
|
+
border-bottom: 1px solid var(--border);
|
|
85
|
+
background: rgba(13, 17, 23, 0.94);
|
|
86
|
+
backdrop-filter: blur(12px);
|
|
87
|
+
}
|
|
88
|
+
.site-nav {
|
|
89
|
+
display: flex;
|
|
90
|
+
align-items: center;
|
|
91
|
+
justify-content: space-between;
|
|
92
|
+
gap: 24px;
|
|
93
|
+
width: min(1180px, calc(100% - 32px));
|
|
94
|
+
min-height: 64px;
|
|
95
|
+
margin: 0 auto;
|
|
96
|
+
}
|
|
97
|
+
.brand {
|
|
98
|
+
display: inline-flex;
|
|
99
|
+
align-items: center;
|
|
100
|
+
gap: 10px;
|
|
101
|
+
flex: 0 0 auto;
|
|
102
|
+
color: var(--text);
|
|
103
|
+
font-weight: 850;
|
|
104
|
+
letter-spacing: -0.02em;
|
|
105
|
+
text-decoration: none;
|
|
106
|
+
}
|
|
107
|
+
.brand-mark {
|
|
108
|
+
display: grid;
|
|
109
|
+
width: 32px;
|
|
110
|
+
height: 32px;
|
|
111
|
+
place-items: center;
|
|
112
|
+
border: 1px solid rgba(88, 166, 255, 0.45);
|
|
113
|
+
border-radius: var(--radius-lg);
|
|
114
|
+
background: var(--surface-strong);
|
|
115
|
+
color: var(--blue);
|
|
116
|
+
}
|
|
117
|
+
.nav-links {
|
|
118
|
+
display: flex;
|
|
119
|
+
align-items: center;
|
|
120
|
+
gap: 8px;
|
|
121
|
+
overflow-x: auto;
|
|
122
|
+
scrollbar-width: none;
|
|
123
|
+
}
|
|
124
|
+
.nav-links::-webkit-scrollbar { display: none; }
|
|
125
|
+
.nav-links a {
|
|
126
|
+
flex: 0 0 auto;
|
|
127
|
+
padding: 7px 10px;
|
|
128
|
+
border-radius: var(--radius-md);
|
|
129
|
+
color: var(--muted);
|
|
130
|
+
font-size: 0.84rem;
|
|
131
|
+
font-weight: 700;
|
|
132
|
+
text-decoration: none;
|
|
133
|
+
}
|
|
134
|
+
.nav-links a:hover {
|
|
135
|
+
background: var(--surface-strong);
|
|
136
|
+
color: var(--text);
|
|
137
|
+
}
|
|
138
|
+
.nav-links .guide-link {
|
|
139
|
+
border: 1px solid var(--border);
|
|
140
|
+
color: var(--blue);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
main { overflow: clip; }
|
|
144
|
+
.section {
|
|
145
|
+
width: min(1120px, calc(100% - 40px));
|
|
146
|
+
margin: 0 auto;
|
|
147
|
+
padding: 96px 0;
|
|
148
|
+
scroll-margin-top: 70px;
|
|
149
|
+
}
|
|
150
|
+
.section + .section { border-top: 1px solid rgba(48, 54, 61, 0.7); }
|
|
151
|
+
.section-heading {
|
|
152
|
+
max-width: 760px;
|
|
153
|
+
margin-bottom: 38px;
|
|
154
|
+
}
|
|
155
|
+
.eyebrow {
|
|
156
|
+
margin: 0 0 10px;
|
|
157
|
+
color: var(--blue);
|
|
158
|
+
font-size: 0.78rem;
|
|
159
|
+
font-weight: 850;
|
|
160
|
+
letter-spacing: 0.14em;
|
|
161
|
+
text-transform: uppercase;
|
|
162
|
+
}
|
|
163
|
+
h1, h2, h3, p { margin-top: 0; }
|
|
164
|
+
h1, h2, h3 { line-height: 1.15; }
|
|
165
|
+
h2 {
|
|
166
|
+
margin-bottom: 14px;
|
|
167
|
+
font-size: clamp(1.9rem, 4vw, 2.8rem);
|
|
168
|
+
letter-spacing: -0.035em;
|
|
169
|
+
}
|
|
170
|
+
.section-heading > p {
|
|
171
|
+
max-width: 690px;
|
|
172
|
+
margin-bottom: 0;
|
|
173
|
+
color: var(--muted);
|
|
174
|
+
font-size: 1.04rem;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.hero {
|
|
178
|
+
position: relative;
|
|
179
|
+
display: grid;
|
|
180
|
+
grid-template-columns: minmax(0, 1.2fr) minmax(330px, 0.8fr);
|
|
181
|
+
gap: 62px;
|
|
182
|
+
align-items: center;
|
|
183
|
+
width: min(1180px, calc(100% - 40px));
|
|
184
|
+
min-height: min(820px, calc(100vh - 64px));
|
|
185
|
+
margin: 0 auto;
|
|
186
|
+
padding: 86px 0 76px;
|
|
187
|
+
}
|
|
188
|
+
.hero-copy { position: relative; z-index: 2; }
|
|
189
|
+
.hero h1 {
|
|
190
|
+
max-width: 800px;
|
|
191
|
+
margin-bottom: 24px;
|
|
192
|
+
font-size: clamp(3.1rem, 7vw, 5.8rem);
|
|
193
|
+
letter-spacing: -0.055em;
|
|
194
|
+
}
|
|
195
|
+
.hero h1 span {
|
|
196
|
+
background: linear-gradient(100deg, var(--blue), var(--green) 52%, var(--purple));
|
|
197
|
+
-webkit-background-clip: text;
|
|
198
|
+
background-clip: text;
|
|
199
|
+
color: transparent;
|
|
200
|
+
}
|
|
201
|
+
.hero-lede {
|
|
202
|
+
max-width: 690px;
|
|
203
|
+
margin-bottom: 30px;
|
|
204
|
+
color: var(--muted);
|
|
205
|
+
font-size: clamp(1.08rem, 2vw, 1.35rem);
|
|
206
|
+
}
|
|
207
|
+
.hero-actions {
|
|
208
|
+
display: flex;
|
|
209
|
+
flex-wrap: wrap;
|
|
210
|
+
gap: 12px;
|
|
211
|
+
}
|
|
212
|
+
.button-link,
|
|
213
|
+
.journey-play {
|
|
214
|
+
display: inline-flex;
|
|
215
|
+
align-items: center;
|
|
216
|
+
justify-content: center;
|
|
217
|
+
gap: 8px;
|
|
218
|
+
min-height: 46px;
|
|
219
|
+
padding: 11px 18px;
|
|
220
|
+
border: 1px solid var(--border);
|
|
221
|
+
border-radius: var(--radius-md);
|
|
222
|
+
background: var(--surface);
|
|
223
|
+
color: var(--text);
|
|
224
|
+
font-weight: 800;
|
|
225
|
+
text-decoration: none;
|
|
226
|
+
cursor: pointer;
|
|
227
|
+
}
|
|
228
|
+
.button-link.primary {
|
|
229
|
+
border-color: transparent;
|
|
230
|
+
background: var(--blue);
|
|
231
|
+
color: var(--bg);
|
|
232
|
+
}
|
|
233
|
+
.button-link:hover,
|
|
234
|
+
.journey-play:hover {
|
|
235
|
+
border-color: var(--blue);
|
|
236
|
+
color: var(--text);
|
|
237
|
+
transform: translateY(-1px);
|
|
238
|
+
}
|
|
239
|
+
.button-link.primary:hover {
|
|
240
|
+
background: #79c0ff;
|
|
241
|
+
color: var(--bg);
|
|
242
|
+
}
|
|
243
|
+
.hero-note {
|
|
244
|
+
display: flex;
|
|
245
|
+
align-items: center;
|
|
246
|
+
gap: 10px;
|
|
247
|
+
margin-top: 22px;
|
|
248
|
+
color: var(--muted);
|
|
249
|
+
font-size: 0.86rem;
|
|
250
|
+
}
|
|
251
|
+
.verified-dot {
|
|
252
|
+
width: 9px;
|
|
253
|
+
height: 9px;
|
|
254
|
+
flex: 0 0 auto;
|
|
255
|
+
border-radius: 50%;
|
|
256
|
+
background: var(--green);
|
|
257
|
+
box-shadow: 0 0 0 5px rgba(63, 185, 80, 0.12);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.memory-orbit {
|
|
261
|
+
position: relative;
|
|
262
|
+
aspect-ratio: 1;
|
|
263
|
+
min-height: 390px;
|
|
264
|
+
border: 1px solid var(--border);
|
|
265
|
+
border-radius: 50%;
|
|
266
|
+
background:
|
|
267
|
+
radial-gradient(circle, rgba(88, 166, 255, 0.14) 0 12%, transparent 12.5%),
|
|
268
|
+
radial-gradient(circle, transparent 0 36%, rgba(63, 185, 80, 0.09) 36.5% 37%, transparent 37.5%),
|
|
269
|
+
radial-gradient(circle, transparent 0 60%, rgba(188, 140, 255, 0.09) 60.5% 61%, transparent 61.5%),
|
|
270
|
+
rgba(22, 27, 34, 0.7);
|
|
271
|
+
box-shadow: inset 0 0 70px rgba(88, 166, 255, 0.06), var(--shadow);
|
|
272
|
+
}
|
|
273
|
+
.orbit-core {
|
|
274
|
+
position: absolute;
|
|
275
|
+
inset: 50% auto auto 50%;
|
|
276
|
+
display: grid;
|
|
277
|
+
width: 120px;
|
|
278
|
+
height: 120px;
|
|
279
|
+
place-items: center;
|
|
280
|
+
transform: translate(-50%, -50%);
|
|
281
|
+
border: 1px solid var(--blue);
|
|
282
|
+
border-radius: 50%;
|
|
283
|
+
background: var(--surface);
|
|
284
|
+
box-shadow: 0 0 40px rgba(88, 166, 255, 0.16);
|
|
285
|
+
color: var(--blue);
|
|
286
|
+
font-weight: 900;
|
|
287
|
+
text-align: center;
|
|
288
|
+
}
|
|
289
|
+
.orbit-item {
|
|
290
|
+
position: absolute;
|
|
291
|
+
display: grid;
|
|
292
|
+
min-width: 92px;
|
|
293
|
+
min-height: 48px;
|
|
294
|
+
place-items: center;
|
|
295
|
+
padding: 8px 12px;
|
|
296
|
+
border: 1px solid var(--border);
|
|
297
|
+
border-radius: var(--radius-lg);
|
|
298
|
+
background: rgba(33, 38, 45, 0.96);
|
|
299
|
+
color: var(--text);
|
|
300
|
+
font-size: 0.78rem;
|
|
301
|
+
font-weight: 800;
|
|
302
|
+
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.25);
|
|
303
|
+
animation: orbit-float 4s ease-in-out infinite;
|
|
304
|
+
}
|
|
305
|
+
.orbit-item small {
|
|
306
|
+
display: block;
|
|
307
|
+
color: var(--muted);
|
|
308
|
+
font-size: 0.65rem;
|
|
309
|
+
font-weight: 650;
|
|
310
|
+
}
|
|
311
|
+
.orbit-pinned { top: 5%; left: 36%; color: var(--yellow); }
|
|
312
|
+
.orbit-inbox { top: 29%; right: -3%; color: var(--orange); animation-delay: -1s; }
|
|
313
|
+
.orbit-sql { right: 8%; bottom: 16%; color: var(--purple); animation-delay: -2s; }
|
|
314
|
+
.orbit-prompt { bottom: 2%; left: 34%; color: var(--blue); animation-delay: -0.5s; }
|
|
315
|
+
.orbit-files { bottom: 18%; left: -2%; color: var(--green); animation-delay: -2.5s; }
|
|
316
|
+
.orbit-episode { top: 26%; left: -4%; color: var(--purple); animation-delay: -1.5s; }
|
|
317
|
+
@keyframes orbit-float {
|
|
318
|
+
0%, 100% { transform: translateY(0); }
|
|
319
|
+
50% { transform: translateY(-8px); }
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
.plain-language-grid {
|
|
323
|
+
display: grid;
|
|
324
|
+
grid-template-columns: repeat(3, 1fr);
|
|
325
|
+
gap: 18px;
|
|
326
|
+
}
|
|
327
|
+
.plain-card {
|
|
328
|
+
min-height: 220px;
|
|
329
|
+
padding: 26px;
|
|
330
|
+
border: 1px solid var(--border);
|
|
331
|
+
border-radius: var(--radius-lg);
|
|
332
|
+
background: var(--surface-strong);
|
|
333
|
+
}
|
|
334
|
+
.plain-card .card-index {
|
|
335
|
+
display: inline-grid;
|
|
336
|
+
width: 34px;
|
|
337
|
+
height: 34px;
|
|
338
|
+
margin-bottom: 24px;
|
|
339
|
+
place-items: center;
|
|
340
|
+
border-radius: var(--radius-md);
|
|
341
|
+
background: rgba(88, 166, 255, 0.12);
|
|
342
|
+
color: var(--blue);
|
|
343
|
+
font-weight: 900;
|
|
344
|
+
}
|
|
345
|
+
.plain-card h3 { margin-bottom: 9px; font-size: 1.18rem; }
|
|
346
|
+
.plain-card p { margin-bottom: 0; color: var(--muted); font-size: 0.94rem; }
|
|
347
|
+
.plain-card strong { color: var(--text); }
|
|
348
|
+
.thesis {
|
|
349
|
+
display: grid;
|
|
350
|
+
grid-template-columns: auto 1fr;
|
|
351
|
+
gap: 18px;
|
|
352
|
+
align-items: start;
|
|
353
|
+
margin-top: 20px;
|
|
354
|
+
padding: 20px 22px;
|
|
355
|
+
border: 1px solid rgba(63, 185, 80, 0.32);
|
|
356
|
+
border-radius: var(--radius-lg);
|
|
357
|
+
background: rgba(63, 185, 80, 0.07);
|
|
358
|
+
}
|
|
359
|
+
.thesis-mark {
|
|
360
|
+
display: grid;
|
|
361
|
+
width: 34px;
|
|
362
|
+
height: 34px;
|
|
363
|
+
place-items: center;
|
|
364
|
+
border-radius: 50%;
|
|
365
|
+
background: var(--green);
|
|
366
|
+
color: var(--bg);
|
|
367
|
+
font-weight: 950;
|
|
368
|
+
}
|
|
369
|
+
.thesis p { margin: 0; color: var(--muted); }
|
|
370
|
+
.thesis strong { color: var(--text); }
|
|
371
|
+
|
|
372
|
+
.journey-shell {
|
|
373
|
+
--journey-progress: 0%;
|
|
374
|
+
position: relative;
|
|
375
|
+
padding: 24px;
|
|
376
|
+
border: 1px solid var(--border);
|
|
377
|
+
border-radius: var(--radius-xl);
|
|
378
|
+
background: var(--surface);
|
|
379
|
+
box-shadow: var(--shadow);
|
|
380
|
+
}
|
|
381
|
+
.journey-topbar {
|
|
382
|
+
display: flex;
|
|
383
|
+
align-items: center;
|
|
384
|
+
justify-content: space-between;
|
|
385
|
+
gap: 20px;
|
|
386
|
+
margin-bottom: 20px;
|
|
387
|
+
}
|
|
388
|
+
.journey-track {
|
|
389
|
+
position: relative;
|
|
390
|
+
flex: 1;
|
|
391
|
+
height: 5px;
|
|
392
|
+
overflow: hidden;
|
|
393
|
+
border-radius: 999px;
|
|
394
|
+
background: var(--surface-strong);
|
|
395
|
+
}
|
|
396
|
+
.journey-track::before {
|
|
397
|
+
content: "";
|
|
398
|
+
position: absolute;
|
|
399
|
+
inset: 0 auto 0 0;
|
|
400
|
+
width: calc(var(--journey-progress) + 1px);
|
|
401
|
+
border-radius: inherit;
|
|
402
|
+
background: linear-gradient(90deg, var(--blue), var(--green), var(--purple));
|
|
403
|
+
transition: width 450ms ease;
|
|
404
|
+
}
|
|
405
|
+
.journey-packet {
|
|
406
|
+
position: absolute;
|
|
407
|
+
top: 50%;
|
|
408
|
+
left: var(--journey-progress);
|
|
409
|
+
width: 15px;
|
|
410
|
+
height: 15px;
|
|
411
|
+
transform: translate(-50%, -50%);
|
|
412
|
+
border: 3px solid var(--bg);
|
|
413
|
+
border-radius: 50%;
|
|
414
|
+
background: var(--blue);
|
|
415
|
+
box-shadow: 0 0 20px rgba(88, 166, 255, 0.65);
|
|
416
|
+
animation: packet-pulse 1.8s ease-in-out infinite;
|
|
417
|
+
transition: left 450ms ease;
|
|
418
|
+
}
|
|
419
|
+
.is-playing .journey-packet { animation-duration: 800ms; }
|
|
420
|
+
@keyframes packet-pulse {
|
|
421
|
+
0%, 100% { box-shadow: 0 0 0 0 rgba(88, 166, 255, 0.4), 0 0 18px rgba(88, 166, 255, 0.5); }
|
|
422
|
+
50% { box-shadow: 0 0 0 8px rgba(88, 166, 255, 0), 0 0 28px rgba(88, 166, 255, 0.72); }
|
|
423
|
+
}
|
|
424
|
+
.journey-play {
|
|
425
|
+
min-width: 138px;
|
|
426
|
+
background: var(--surface-strong);
|
|
427
|
+
}
|
|
428
|
+
.journey-play::before { content: "\25B6"; color: var(--blue); font-size: 0.72rem; }
|
|
429
|
+
.journey-play[aria-pressed="true"]::before { content: "\23F8"; }
|
|
430
|
+
.journey-rail {
|
|
431
|
+
display: grid;
|
|
432
|
+
grid-template-columns: repeat(7, minmax(94px, 1fr));
|
|
433
|
+
gap: 9px;
|
|
434
|
+
margin-bottom: 20px;
|
|
435
|
+
overflow-x: auto;
|
|
436
|
+
padding: 5px 3px 10px;
|
|
437
|
+
}
|
|
438
|
+
.journey-step {
|
|
439
|
+
min-width: 94px;
|
|
440
|
+
padding: 12px 9px;
|
|
441
|
+
border: 1px solid transparent;
|
|
442
|
+
border-radius: var(--radius-lg);
|
|
443
|
+
background: transparent;
|
|
444
|
+
color: var(--muted);
|
|
445
|
+
cursor: pointer;
|
|
446
|
+
text-align: left;
|
|
447
|
+
}
|
|
448
|
+
.journey-step:hover { background: var(--surface-strong); color: var(--text); }
|
|
449
|
+
.journey-step.is-active,
|
|
450
|
+
.journey-step[aria-selected="true"] {
|
|
451
|
+
border-color: var(--blue);
|
|
452
|
+
background: rgba(88, 166, 255, 0.1);
|
|
453
|
+
color: var(--text);
|
|
454
|
+
}
|
|
455
|
+
.step-number {
|
|
456
|
+
display: block;
|
|
457
|
+
margin-bottom: 5px;
|
|
458
|
+
color: var(--blue);
|
|
459
|
+
font-size: 0.68rem;
|
|
460
|
+
font-weight: 900;
|
|
461
|
+
letter-spacing: 0.1em;
|
|
462
|
+
}
|
|
463
|
+
.step-label { display: block; font-size: 0.82rem; font-weight: 800; }
|
|
464
|
+
.journey-stage {
|
|
465
|
+
border: 1px solid var(--border);
|
|
466
|
+
border-radius: var(--radius-lg);
|
|
467
|
+
background: var(--surface-strong);
|
|
468
|
+
}
|
|
469
|
+
.journey-panel {
|
|
470
|
+
display: grid;
|
|
471
|
+
grid-template-columns: 1.1fr 0.9fr;
|
|
472
|
+
gap: 34px;
|
|
473
|
+
min-height: 355px;
|
|
474
|
+
padding: clamp(26px, 5vw, 48px);
|
|
475
|
+
}
|
|
476
|
+
.js .journey-panel { display: none; }
|
|
477
|
+
.js .journey-panel.is-active { display: grid; }
|
|
478
|
+
.panel-kicker {
|
|
479
|
+
margin-bottom: 12px;
|
|
480
|
+
color: var(--blue);
|
|
481
|
+
font-size: 0.72rem;
|
|
482
|
+
font-weight: 900;
|
|
483
|
+
letter-spacing: 0.13em;
|
|
484
|
+
text-transform: uppercase;
|
|
485
|
+
}
|
|
486
|
+
.journey-panel h3 {
|
|
487
|
+
max-width: 540px;
|
|
488
|
+
margin-bottom: 15px;
|
|
489
|
+
font-size: clamp(1.65rem, 3vw, 2.45rem);
|
|
490
|
+
letter-spacing: -0.035em;
|
|
491
|
+
}
|
|
492
|
+
.panel-lede { color: var(--muted); font-size: 1rem; }
|
|
493
|
+
.fact-list {
|
|
494
|
+
display: grid;
|
|
495
|
+
gap: 10px;
|
|
496
|
+
margin: 24px 0 0;
|
|
497
|
+
padding: 0;
|
|
498
|
+
list-style: none;
|
|
499
|
+
}
|
|
500
|
+
.fact-list li {
|
|
501
|
+
position: relative;
|
|
502
|
+
padding-left: 27px;
|
|
503
|
+
color: var(--muted);
|
|
504
|
+
font-size: 0.9rem;
|
|
505
|
+
}
|
|
506
|
+
.fact-list li::before {
|
|
507
|
+
position: absolute;
|
|
508
|
+
top: 0;
|
|
509
|
+
left: 0;
|
|
510
|
+
content: "\2713";
|
|
511
|
+
color: var(--green);
|
|
512
|
+
font-weight: 900;
|
|
513
|
+
}
|
|
514
|
+
.panel-visual {
|
|
515
|
+
display: grid;
|
|
516
|
+
align-content: center;
|
|
517
|
+
gap: 11px;
|
|
518
|
+
min-width: 0;
|
|
519
|
+
}
|
|
520
|
+
.mini-node {
|
|
521
|
+
position: relative;
|
|
522
|
+
padding: 14px 16px;
|
|
523
|
+
border: 1px solid var(--border);
|
|
524
|
+
border-radius: var(--radius-md);
|
|
525
|
+
background: var(--surface-soft);
|
|
526
|
+
color: var(--muted);
|
|
527
|
+
font-size: 0.83rem;
|
|
528
|
+
}
|
|
529
|
+
.mini-node strong { color: var(--text); }
|
|
530
|
+
.mini-node.accent { border-color: rgba(63, 185, 80, 0.38); background: rgba(63, 185, 80, 0.07); }
|
|
531
|
+
.mini-node.warning { border-color: rgba(210, 153, 34, 0.4); background: rgba(210, 153, 34, 0.08); }
|
|
532
|
+
.mini-node.security { border-color: rgba(188, 140, 255, 0.4); background: rgba(188, 140, 255, 0.08); }
|
|
533
|
+
.mini-arrow { color: var(--muted); font-size: 1.1rem; text-align: center; }
|
|
534
|
+
.code-chip {
|
|
535
|
+
display: inline-block;
|
|
536
|
+
max-width: 100%;
|
|
537
|
+
overflow-wrap: anywhere;
|
|
538
|
+
padding: 2px 7px;
|
|
539
|
+
border: 1px solid rgba(88, 166, 255, 0.3);
|
|
540
|
+
border-radius: var(--radius-sm);
|
|
541
|
+
background: rgba(88, 166, 255, 0.1);
|
|
542
|
+
color: var(--blue);
|
|
543
|
+
font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
|
|
544
|
+
font-size: 0.82em;
|
|
545
|
+
}
|
|
546
|
+
.noscript-note {
|
|
547
|
+
margin-top: 16px;
|
|
548
|
+
padding: 12px 14px;
|
|
549
|
+
border: 1px solid rgba(210, 153, 34, 0.4);
|
|
550
|
+
border-radius: var(--radius-md);
|
|
551
|
+
background: rgba(210, 153, 34, 0.08);
|
|
552
|
+
color: var(--muted);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
.map-shell {
|
|
556
|
+
display: grid;
|
|
557
|
+
grid-template-columns: minmax(0, 1.35fr) minmax(300px, 0.65fr);
|
|
558
|
+
gap: 22px;
|
|
559
|
+
align-items: stretch;
|
|
560
|
+
}
|
|
561
|
+
.system-map {
|
|
562
|
+
display: grid;
|
|
563
|
+
grid-template-columns: 1fr auto 1fr auto 1fr;
|
|
564
|
+
grid-template-areas:
|
|
565
|
+
"sources arrow1 files arrow2 sql"
|
|
566
|
+
". . down . down2"
|
|
567
|
+
"pinned arrow3 prompt arrow4 retrieval"
|
|
568
|
+
". . down3 . ."
|
|
569
|
+
". . episodes . .";
|
|
570
|
+
gap: 18px 12px;
|
|
571
|
+
align-items: center;
|
|
572
|
+
min-height: 520px;
|
|
573
|
+
padding: 34px;
|
|
574
|
+
border: 1px solid var(--border);
|
|
575
|
+
border-radius: var(--radius-xl);
|
|
576
|
+
background:
|
|
577
|
+
linear-gradient(rgba(88, 166, 255, 0.035) 1px, transparent 1px),
|
|
578
|
+
linear-gradient(90deg, rgba(88, 166, 255, 0.035) 1px, transparent 1px),
|
|
579
|
+
var(--surface);
|
|
580
|
+
background-size: 24px 24px;
|
|
581
|
+
box-shadow: var(--shadow);
|
|
582
|
+
}
|
|
583
|
+
.map-node {
|
|
584
|
+
width: 100%;
|
|
585
|
+
min-height: 92px;
|
|
586
|
+
padding: 14px;
|
|
587
|
+
border: 1px solid var(--border);
|
|
588
|
+
border-radius: var(--radius-lg);
|
|
589
|
+
background: var(--surface-strong);
|
|
590
|
+
color: var(--text);
|
|
591
|
+
cursor: pointer;
|
|
592
|
+
text-align: left;
|
|
593
|
+
}
|
|
594
|
+
.map-node:hover,
|
|
595
|
+
.map-node.is-active,
|
|
596
|
+
.map-node[aria-pressed="true"] {
|
|
597
|
+
border-color: var(--blue);
|
|
598
|
+
background: rgba(88, 166, 255, 0.1);
|
|
599
|
+
transform: translateY(-2px);
|
|
600
|
+
}
|
|
601
|
+
.map-node small {
|
|
602
|
+
display: block;
|
|
603
|
+
margin-bottom: 7px;
|
|
604
|
+
color: var(--blue);
|
|
605
|
+
font-size: 0.65rem;
|
|
606
|
+
font-weight: 900;
|
|
607
|
+
letter-spacing: 0.1em;
|
|
608
|
+
text-transform: uppercase;
|
|
609
|
+
}
|
|
610
|
+
.map-node span { display: block; color: var(--muted); font-size: 0.75rem; }
|
|
611
|
+
.map-sources { grid-area: sources; }
|
|
612
|
+
.map-files { grid-area: files; }
|
|
613
|
+
.map-sql { grid-area: sql; }
|
|
614
|
+
.map-pinned { grid-area: pinned; }
|
|
615
|
+
.map-prompt { grid-area: prompt; }
|
|
616
|
+
.map-retrieval { grid-area: retrieval; }
|
|
617
|
+
.map-episodes { grid-area: episodes; }
|
|
618
|
+
.map-arrow {
|
|
619
|
+
color: var(--blue);
|
|
620
|
+
font-size: 1.3rem;
|
|
621
|
+
text-align: center;
|
|
622
|
+
}
|
|
623
|
+
.map-arrow-1 { grid-area: arrow1; }
|
|
624
|
+
.map-arrow-2 { grid-area: arrow2; }
|
|
625
|
+
.map-arrow-3 { grid-area: arrow3; }
|
|
626
|
+
.map-arrow-4 { grid-area: arrow4; transform: rotate(180deg); }
|
|
627
|
+
.map-down { grid-area: down; }
|
|
628
|
+
.map-down-2 { grid-area: down2; }
|
|
629
|
+
.map-down-3 { grid-area: down3; }
|
|
630
|
+
.map-details {
|
|
631
|
+
min-height: 520px;
|
|
632
|
+
border: 1px solid var(--border);
|
|
633
|
+
border-radius: var(--radius-xl);
|
|
634
|
+
background: var(--surface-strong);
|
|
635
|
+
}
|
|
636
|
+
.map-detail { padding: 34px; }
|
|
637
|
+
.js .map-detail { display: none; }
|
|
638
|
+
.js .map-detail.is-active { display: block; }
|
|
639
|
+
.map-detail .detail-type {
|
|
640
|
+
color: var(--blue);
|
|
641
|
+
font-size: 0.7rem;
|
|
642
|
+
font-weight: 900;
|
|
643
|
+
letter-spacing: 0.12em;
|
|
644
|
+
text-transform: uppercase;
|
|
645
|
+
}
|
|
646
|
+
.map-detail h3 { margin: 13px 0; font-size: 1.65rem; }
|
|
647
|
+
.map-detail p { color: var(--muted); }
|
|
648
|
+
.detail-list {
|
|
649
|
+
display: grid;
|
|
650
|
+
gap: 10px;
|
|
651
|
+
margin: 24px 0 0;
|
|
652
|
+
padding: 0;
|
|
653
|
+
list-style: none;
|
|
654
|
+
}
|
|
655
|
+
.detail-list li {
|
|
656
|
+
padding-top: 10px;
|
|
657
|
+
border-top: 1px solid var(--border);
|
|
658
|
+
color: var(--muted);
|
|
659
|
+
font-size: 0.87rem;
|
|
660
|
+
}
|
|
661
|
+
.detail-list strong { display: block; color: var(--text); }
|
|
662
|
+
|
|
663
|
+
.prompt-layout {
|
|
664
|
+
display: grid;
|
|
665
|
+
grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
|
|
666
|
+
gap: 22px;
|
|
667
|
+
}
|
|
668
|
+
.prompt-stack,
|
|
669
|
+
.mode-card,
|
|
670
|
+
.security-card {
|
|
671
|
+
border: 1px solid var(--border);
|
|
672
|
+
border-radius: var(--radius-lg);
|
|
673
|
+
background: var(--surface-strong);
|
|
674
|
+
}
|
|
675
|
+
.prompt-stack { display: grid; gap: 12px; padding: 24px; }
|
|
676
|
+
.stack-layer {
|
|
677
|
+
padding: 19px;
|
|
678
|
+
border: 1px solid var(--border);
|
|
679
|
+
border-radius: var(--radius-md);
|
|
680
|
+
background: var(--surface-soft);
|
|
681
|
+
}
|
|
682
|
+
.stack-layer .stack-label {
|
|
683
|
+
display: flex;
|
|
684
|
+
align-items: center;
|
|
685
|
+
justify-content: space-between;
|
|
686
|
+
gap: 12px;
|
|
687
|
+
margin-bottom: 7px;
|
|
688
|
+
color: var(--text);
|
|
689
|
+
font-weight: 850;
|
|
690
|
+
}
|
|
691
|
+
.stack-layer p { margin: 0; color: var(--muted); font-size: 0.86rem; }
|
|
692
|
+
.stack-layer.pinned { border-color: rgba(210, 153, 34, 0.4); }
|
|
693
|
+
.stack-layer.memory { border-color: rgba(63, 185, 80, 0.4); }
|
|
694
|
+
.stack-layer.rules { border-color: rgba(188, 140, 255, 0.4); }
|
|
695
|
+
.always-badge,
|
|
696
|
+
.mode-badge {
|
|
697
|
+
padding: 3px 7px;
|
|
698
|
+
border-radius: var(--radius-pill);
|
|
699
|
+
background: rgba(210, 153, 34, 0.12);
|
|
700
|
+
color: var(--yellow);
|
|
701
|
+
font-size: 0.65rem;
|
|
702
|
+
font-weight: 900;
|
|
703
|
+
letter-spacing: 0.06em;
|
|
704
|
+
text-transform: uppercase;
|
|
705
|
+
}
|
|
706
|
+
.mode-badge { background: rgba(63, 185, 80, 0.12); color: var(--green); }
|
|
707
|
+
.mode-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
|
|
708
|
+
.mode-card { padding: 24px; }
|
|
709
|
+
.mode-card h3 { margin-bottom: 8px; font-size: 1.1rem; }
|
|
710
|
+
.mode-card p { color: var(--muted); font-size: 0.88rem; }
|
|
711
|
+
.mode-card ul { margin: 16px 0 0; padding-left: 18px; color: var(--muted); font-size: 0.84rem; }
|
|
712
|
+
.mode-card.active { border-color: rgba(63, 185, 80, 0.4); }
|
|
713
|
+
.mode-card.fallback { border-color: rgba(188, 140, 255, 0.4); }
|
|
714
|
+
.mode-note {
|
|
715
|
+
grid-column: 1 / -1;
|
|
716
|
+
margin: 0;
|
|
717
|
+
padding: 15px 17px;
|
|
718
|
+
border: 1px solid rgba(88, 166, 255, 0.3);
|
|
719
|
+
border-radius: var(--radius-md);
|
|
720
|
+
background: rgba(88, 166, 255, 0.07);
|
|
721
|
+
color: var(--muted);
|
|
722
|
+
font-size: 0.86rem;
|
|
723
|
+
}
|
|
724
|
+
.bounds-grid {
|
|
725
|
+
display: grid;
|
|
726
|
+
grid-template-columns: repeat(3, 1fr);
|
|
727
|
+
gap: 12px;
|
|
728
|
+
margin-top: 22px;
|
|
729
|
+
}
|
|
730
|
+
.bound {
|
|
731
|
+
padding: 17px;
|
|
732
|
+
border: 1px solid var(--border);
|
|
733
|
+
border-radius: var(--radius-lg);
|
|
734
|
+
background: var(--surface-strong);
|
|
735
|
+
}
|
|
736
|
+
.bound-value { color: var(--blue); font-size: 1.38rem; font-weight: 900; }
|
|
737
|
+
.bound-label { color: var(--muted); font-size: 0.78rem; }
|
|
738
|
+
.security-card {
|
|
739
|
+
display: grid;
|
|
740
|
+
grid-template-columns: 1fr 1fr;
|
|
741
|
+
gap: 24px;
|
|
742
|
+
margin-top: 22px;
|
|
743
|
+
padding: 28px;
|
|
744
|
+
border-color: rgba(188, 140, 255, 0.4);
|
|
745
|
+
background: linear-gradient(140deg, rgba(188, 140, 255, 0.08), var(--surface-strong));
|
|
746
|
+
}
|
|
747
|
+
.security-card h3 { margin-bottom: 10px; }
|
|
748
|
+
.security-card p { margin-bottom: 0; color: var(--muted); }
|
|
749
|
+
.fence-preview {
|
|
750
|
+
min-width: 0;
|
|
751
|
+
padding: 18px;
|
|
752
|
+
overflow-wrap: anywhere;
|
|
753
|
+
border: 1px solid rgba(188, 140, 255, 0.36);
|
|
754
|
+
border-radius: var(--radius-md);
|
|
755
|
+
background: var(--bg);
|
|
756
|
+
color: var(--purple);
|
|
757
|
+
font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
|
|
758
|
+
font-size: 0.76rem;
|
|
759
|
+
line-height: 1.7;
|
|
760
|
+
}
|
|
761
|
+
.fence-body { color: var(--muted); }
|
|
762
|
+
|
|
763
|
+
.controls-grid {
|
|
764
|
+
display: grid;
|
|
765
|
+
grid-template-columns: repeat(2, 1fr);
|
|
766
|
+
gap: 16px;
|
|
767
|
+
}
|
|
768
|
+
.control-card {
|
|
769
|
+
padding: 24px;
|
|
770
|
+
border: 1px solid var(--border);
|
|
771
|
+
border-radius: var(--radius-lg);
|
|
772
|
+
background: var(--surface-strong);
|
|
773
|
+
}
|
|
774
|
+
.control-card h3 { margin-bottom: 6px; font-size: 1rem; }
|
|
775
|
+
.control-card > p { margin-bottom: 18px; color: var(--muted); font-size: 0.86rem; }
|
|
776
|
+
.control-card dl { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 9px 16px; margin: 0; }
|
|
777
|
+
.control-card dt {
|
|
778
|
+
min-width: 0;
|
|
779
|
+
overflow-wrap: anywhere;
|
|
780
|
+
color: var(--blue);
|
|
781
|
+
font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
|
|
782
|
+
font-size: 0.76rem;
|
|
783
|
+
}
|
|
784
|
+
.control-card dd { margin: 0; color: var(--yellow); font-size: 0.78rem; font-weight: 850; }
|
|
785
|
+
.surface-strip {
|
|
786
|
+
display: grid;
|
|
787
|
+
grid-template-columns: repeat(3, 1fr);
|
|
788
|
+
gap: 14px;
|
|
789
|
+
margin-top: 18px;
|
|
790
|
+
}
|
|
791
|
+
.surface-item {
|
|
792
|
+
padding: 18px;
|
|
793
|
+
border: 1px solid rgba(88, 166, 255, 0.25);
|
|
794
|
+
border-radius: var(--radius-lg);
|
|
795
|
+
background: rgba(88, 166, 255, 0.06);
|
|
796
|
+
}
|
|
797
|
+
.surface-item strong { display: block; margin-bottom: 5px; }
|
|
798
|
+
.surface-item span { color: var(--muted); font-size: 0.82rem; }
|
|
799
|
+
|
|
800
|
+
.trouble-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
|
|
801
|
+
.trouble-grid details {
|
|
802
|
+
border: 1px solid var(--border);
|
|
803
|
+
border-radius: var(--radius-lg);
|
|
804
|
+
background: var(--surface-strong);
|
|
805
|
+
}
|
|
806
|
+
.trouble-grid details[open] { border-color: var(--blue); }
|
|
807
|
+
.trouble-grid summary {
|
|
808
|
+
padding: 19px 48px 19px 20px;
|
|
809
|
+
color: var(--text);
|
|
810
|
+
font-weight: 820;
|
|
811
|
+
cursor: pointer;
|
|
812
|
+
}
|
|
813
|
+
.trouble-grid details > div {
|
|
814
|
+
padding: 0 20px 20px;
|
|
815
|
+
color: var(--muted);
|
|
816
|
+
font-size: 0.9rem;
|
|
817
|
+
}
|
|
818
|
+
.trouble-grid details p:last-child { margin-bottom: 0; }
|
|
819
|
+
.limitation {
|
|
820
|
+
grid-column: 1 / -1;
|
|
821
|
+
border-color: rgba(210, 153, 34, 0.4) !important;
|
|
822
|
+
background: rgba(210, 153, 34, 0.07) !important;
|
|
823
|
+
}
|
|
824
|
+
.closing {
|
|
825
|
+
padding-top: 72px;
|
|
826
|
+
text-align: center;
|
|
827
|
+
}
|
|
828
|
+
.closing blockquote {
|
|
829
|
+
max-width: 840px;
|
|
830
|
+
margin: 0 auto 30px;
|
|
831
|
+
font-size: clamp(1.8rem, 4vw, 3.25rem);
|
|
832
|
+
font-weight: 850;
|
|
833
|
+
letter-spacing: -0.04em;
|
|
834
|
+
line-height: 1.22;
|
|
835
|
+
}
|
|
836
|
+
.closing blockquote span { color: var(--blue); }
|
|
837
|
+
.closing p { color: var(--muted); }
|
|
838
|
+
|
|
839
|
+
footer {
|
|
840
|
+
padding: 36px 20px 50px;
|
|
841
|
+
border-top: 1px solid var(--border);
|
|
842
|
+
color: var(--muted);
|
|
843
|
+
text-align: center;
|
|
844
|
+
font-size: 0.83rem;
|
|
845
|
+
}
|
|
846
|
+
footer nav { display: flex; flex-wrap: wrap; justify-content: center; gap: 16px; margin-bottom: 13px; }
|
|
847
|
+
|
|
848
|
+
@media (max-width: 920px) {
|
|
849
|
+
.hero { grid-template-columns: 1fr; min-height: auto; }
|
|
850
|
+
.hero-copy { max-width: 780px; }
|
|
851
|
+
.memory-orbit { width: min(520px, 88vw); margin: 0 auto; }
|
|
852
|
+
.plain-language-grid { grid-template-columns: 1fr; }
|
|
853
|
+
.plain-card { min-height: 0; }
|
|
854
|
+
.journey-panel { grid-template-columns: 1fr; }
|
|
855
|
+
.map-shell, .prompt-layout { grid-template-columns: 1fr; }
|
|
856
|
+
.map-details { min-height: 0; }
|
|
857
|
+
.controls-grid { grid-template-columns: 1fr; }
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
@media (max-width: 680px) {
|
|
861
|
+
.site-nav { display: block; padding: 10px 0 8px; }
|
|
862
|
+
.brand { margin-bottom: 8px; }
|
|
863
|
+
.nav-links { padding-bottom: 2px; }
|
|
864
|
+
.section { width: min(100% - 28px, 1120px); padding: 72px 0; }
|
|
865
|
+
.hero { width: min(100% - 28px, 1180px); padding-top: 64px; }
|
|
866
|
+
.hero h1 { font-size: clamp(2.85rem, 16vw, 4.4rem); }
|
|
867
|
+
.memory-orbit { min-height: 320px; }
|
|
868
|
+
.orbit-core { width: 96px; height: 96px; font-size: 0.82rem; }
|
|
869
|
+
.orbit-item { min-width: 76px; min-height: 42px; padding: 6px 8px; font-size: 0.67rem; }
|
|
870
|
+
.journey-shell { padding: 14px; border-radius: var(--radius-xl); }
|
|
871
|
+
.journey-topbar { align-items: stretch; flex-direction: column; }
|
|
872
|
+
.journey-play { width: 100%; }
|
|
873
|
+
.journey-panel { min-height: 0; padding: 24px 19px; }
|
|
874
|
+
.system-map {
|
|
875
|
+
grid-template-columns: 1fr;
|
|
876
|
+
grid-template-areas:
|
|
877
|
+
"sources"
|
|
878
|
+
"arrow1"
|
|
879
|
+
"files"
|
|
880
|
+
"arrow2"
|
|
881
|
+
"sql"
|
|
882
|
+
"down2"
|
|
883
|
+
"retrieval"
|
|
884
|
+
"arrow4"
|
|
885
|
+
"prompt"
|
|
886
|
+
"arrow3"
|
|
887
|
+
"pinned"
|
|
888
|
+
"down3"
|
|
889
|
+
"episodes";
|
|
890
|
+
min-height: 0;
|
|
891
|
+
padding: 20px;
|
|
892
|
+
}
|
|
893
|
+
.map-arrow { transform: rotate(90deg); }
|
|
894
|
+
.map-arrow-4 { transform: rotate(90deg); }
|
|
895
|
+
.map-down { display: none; }
|
|
896
|
+
.map-down-2, .map-down-3 { transform: none; }
|
|
897
|
+
.mode-grid, .security-card, .bounds-grid, .surface-strip, .trouble-grid { grid-template-columns: 1fr; }
|
|
898
|
+
.mode-note, .limitation { grid-column: auto; }
|
|
899
|
+
.control-card dl { grid-template-columns: 1fr; gap: 2px; }
|
|
900
|
+
.control-card dd { margin-bottom: 8px; }
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
@media (prefers-reduced-motion: reduce) {
|
|
904
|
+
html { scroll-behavior: auto; }
|
|
905
|
+
*, *::before, *::after {
|
|
906
|
+
animation: none !important;
|
|
907
|
+
transition-duration: 0.01ms !important;
|
|
908
|
+
transition-delay: 0ms !important;
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
</style>
|
|
912
|
+
</head>
|
|
913
|
+
<body>
|
|
914
|
+
<a class="skip-link" href="#main-content">Skip to the explainer</a>
|
|
915
|
+
|
|
916
|
+
<header class="site-header">
|
|
917
|
+
<nav class="site-nav" aria-label="Memory explainer">
|
|
918
|
+
<a class="brand" href="../index.html">
|
|
919
|
+
<span class="brand-mark" aria-hidden="true">M</span>
|
|
920
|
+
<span>Minions Memory</span>
|
|
921
|
+
</a>
|
|
922
|
+
<div class="nav-links">
|
|
923
|
+
<a href="#memory-journey">Journey</a>
|
|
924
|
+
<a href="#architecture-map">System map</a>
|
|
925
|
+
<a href="#prompt-assembly">Prompt</a>
|
|
926
|
+
<a href="#operational-controls">Controls</a>
|
|
927
|
+
<a href="#troubleshooting">Troubleshoot</a>
|
|
928
|
+
<a class="guide-link" href="https://unpkg.com/@yemi33/minions@latest/docs/team-memory.md">Written guide</a>
|
|
929
|
+
</div>
|
|
930
|
+
</nav>
|
|
931
|
+
</header>
|
|
932
|
+
|
|
933
|
+
<main id="main-content">
|
|
934
|
+
<section class="hero" aria-labelledby="hero-title">
|
|
935
|
+
<div class="hero-copy">
|
|
936
|
+
<p class="eyebrow">Interactive system tour</p>
|
|
937
|
+
<h1 id="hero-title">How Minions <span>remembers.</span></h1>
|
|
938
|
+
<p class="hero-lede">
|
|
939
|
+
A durable trail of human context, agent learnings, and task outcomes becomes
|
|
940
|
+
focused evidence for the next dispatch - without turning recalled text into
|
|
941
|
+
trusted instructions.
|
|
942
|
+
</p>
|
|
943
|
+
<div class="hero-actions">
|
|
944
|
+
<a class="button-link primary" href="#memory-journey">Take the 90-second tour <span aria-hidden="true">↓</span></a>
|
|
945
|
+
<a class="button-link" href="https://unpkg.com/@yemi33/minions@latest/docs/team-memory.md">Read the authoritative written guide</a>
|
|
946
|
+
</div>
|
|
947
|
+
<p class="hero-note"><span class="verified-dot" aria-hidden="true"></span>Editorial source verified against the current consolidation, retrieval, prompt, lifecycle, and fencing code.</p>
|
|
948
|
+
</div>
|
|
949
|
+
|
|
950
|
+
<div class="memory-orbit" aria-label="Minions memory surfaces orbiting a task-aware prompt">
|
|
951
|
+
<div class="orbit-core">Task-aware<br>context</div>
|
|
952
|
+
<div class="orbit-item orbit-pinned">Pinned<small>always first</small></div>
|
|
953
|
+
<div class="orbit-item orbit-inbox">Inbox<small>pending notes</small></div>
|
|
954
|
+
<div class="orbit-item orbit-sql">SQLite + FTS5<small>structured recall</small></div>
|
|
955
|
+
<div class="orbit-item orbit-prompt">Prompt<small>bounded evidence</small></div>
|
|
956
|
+
<div class="orbit-item orbit-files">Files<small>readable history</small></div>
|
|
957
|
+
<div class="orbit-item orbit-episode">Episodes<small>task outcomes</small></div>
|
|
958
|
+
</div>
|
|
959
|
+
</section>
|
|
960
|
+
|
|
961
|
+
<section class="section" aria-labelledby="hybrid-heading">
|
|
962
|
+
<div class="section-heading">
|
|
963
|
+
<p class="eyebrow">The idea in plain language</p>
|
|
964
|
+
<h2 id="hybrid-heading">One memory system, two durable layers.</h2>
|
|
965
|
+
<p>Markdown keeps the history inspectable. SQLite makes selected facts searchable and lifecycle-aware. Prompt assembly decides what is useful now.</p>
|
|
966
|
+
</div>
|
|
967
|
+
<div class="plain-language-grid">
|
|
968
|
+
<article class="plain-card">
|
|
969
|
+
<span class="card-index">01</span>
|
|
970
|
+
<h3>Files tell the readable story</h3>
|
|
971
|
+
<p><strong>Inbox notes, team notes, knowledge entries, personal notebooks, and pinned context</strong> stay easy for people and agents to inspect on disk.</p>
|
|
972
|
+
</article>
|
|
973
|
+
<article class="plain-card">
|
|
974
|
+
<span class="card-index">02</span>
|
|
975
|
+
<h3>SQLite powers focused recall</h3>
|
|
976
|
+
<p><strong>Structured records, lifecycle status, provenance, scope, and FTS5</strong> turn a large history into a bounded candidate set for a specific task.</p>
|
|
977
|
+
</article>
|
|
978
|
+
<article class="plain-card">
|
|
979
|
+
<span class="card-index">03</span>
|
|
980
|
+
<h3>The prompt is the selection gate</h3>
|
|
981
|
+
<p><strong>Pinned context comes first.</strong> Then active retrieval supplies relevant records, or Minions falls back to bounded team and personal files.</p>
|
|
982
|
+
</article>
|
|
983
|
+
</div>
|
|
984
|
+
<div class="thesis">
|
|
985
|
+
<span class="thesis-mark" aria-hidden="true">!</span>
|
|
986
|
+
<p><strong>Hybrid does not mean mirrored.</strong> Synchronization is directional, not a general two-way sync. SQL is authoritative for structured recall; the intentional file surfaces remain authoritative for their own content.</p>
|
|
987
|
+
</div>
|
|
988
|
+
</section>
|
|
989
|
+
|
|
990
|
+
<section class="section" id="memory-journey" aria-labelledby="journey-heading">
|
|
991
|
+
<div class="section-heading">
|
|
992
|
+
<p class="eyebrow">End-to-end data flow</p>
|
|
993
|
+
<h2 id="journey-heading">Follow one useful finding.</h2>
|
|
994
|
+
<p>Choose a step, use the left and right arrow keys, or play the flow. Every step remains visible as ordinary content when JavaScript is unavailable.</p>
|
|
995
|
+
</div>
|
|
996
|
+
|
|
997
|
+
<div class="journey-shell">
|
|
998
|
+
<div class="journey-topbar">
|
|
999
|
+
<div class="journey-track" aria-hidden="true"><span class="journey-packet"></span></div>
|
|
1000
|
+
<button class="journey-play" type="button" data-play-journey aria-pressed="false"><span>Play the flow</span></button>
|
|
1001
|
+
</div>
|
|
1002
|
+
<div class="journey-rail" role="tablist" aria-label="Memory data-flow steps">
|
|
1003
|
+
<button class="journey-step is-active" id="journey-tab-capture" type="button" role="tab" data-step-id="capture" aria-selected="true" aria-controls="journey-capture"><span class="step-number">STEP 01</span><span class="step-label">Capture</span></button>
|
|
1004
|
+
<button class="journey-step" id="journey-tab-queue" type="button" role="tab" data-step-id="queue" aria-selected="false" aria-controls="journey-queue"><span class="step-number">STEP 02</span><span class="step-label">Queue</span></button>
|
|
1005
|
+
<button class="journey-step" id="journey-tab-consolidate" type="button" role="tab" data-step-id="consolidate" aria-selected="false" aria-controls="journey-consolidate"><span class="step-number">STEP 03</span><span class="step-label">Consolidate</span></button>
|
|
1006
|
+
<button class="journey-step" id="journey-tab-store" type="button" role="tab" data-step-id="store" aria-selected="false" aria-controls="journey-store"><span class="step-number">STEP 04</span><span class="step-label">Store</span></button>
|
|
1007
|
+
<button class="journey-step" id="journey-tab-retrieve" type="button" role="tab" data-step-id="retrieve" aria-selected="false" aria-controls="journey-retrieve"><span class="step-number">STEP 05</span><span class="step-label">Retrieve</span></button>
|
|
1008
|
+
<button class="journey-step" id="journey-tab-assemble" type="button" role="tab" data-step-id="assemble" aria-selected="false" aria-controls="journey-assemble"><span class="step-number">STEP 06</span><span class="step-label">Assemble</span></button>
|
|
1009
|
+
<button class="journey-step" id="journey-tab-episode" type="button" role="tab" data-step-id="episode" aria-selected="false" aria-controls="journey-episode"><span class="step-number">STEP 07</span><span class="step-label">Learn</span></button>
|
|
1010
|
+
</div>
|
|
1011
|
+
<p class="sr-only" data-journey-status aria-live="polite"></p>
|
|
1012
|
+
|
|
1013
|
+
<div class="journey-stage">
|
|
1014
|
+
<article class="journey-panel" id="journey-capture" role="tabpanel" aria-labelledby="journey-tab-capture">
|
|
1015
|
+
<div>
|
|
1016
|
+
<p class="panel-kicker">Sources of memory</p>
|
|
1017
|
+
<h3>A useful signal enters through a deliberate surface.</h3>
|
|
1018
|
+
<p class="panel-lede">Humans, agents, and the engine all contribute - but not every source takes the same route.</p>
|
|
1019
|
+
<ul class="fact-list">
|
|
1020
|
+
<li>Quick Notes, successful agent findings, feedback, and engine alerts can create inbox files.</li>
|
|
1021
|
+
<li>Direct KB authoring writes a readable knowledge entry plus a human-trusted SQL record.</li>
|
|
1022
|
+
<li>Pinned context writes only <span class="code-chip">pinned.md</span>; episodic capture writes only SQL.</li>
|
|
1023
|
+
</ul>
|
|
1024
|
+
</div>
|
|
1025
|
+
<div class="panel-visual" aria-label="Capture sources">
|
|
1026
|
+
<div class="mini-node"><strong>Human</strong><br>Quick note · Pinned note · Knowledge entry</div>
|
|
1027
|
+
<div class="mini-node"><strong>Agent</strong><br>One success-only findings file with provenance</div>
|
|
1028
|
+
<div class="mini-node"><strong>Engine</strong><br>Alerts · Feedback · Optional task outcome</div>
|
|
1029
|
+
<div class="mini-arrow" aria-hidden="true">↓</div>
|
|
1030
|
+
<div class="mini-node accent"><strong>Three routes</strong><br>Inbox · Direct file + SQL · Direct SQL</div>
|
|
1031
|
+
</div>
|
|
1032
|
+
</article>
|
|
1033
|
+
|
|
1034
|
+
<article class="journey-panel" id="journey-queue" role="tabpanel" aria-labelledby="journey-tab-queue">
|
|
1035
|
+
<div>
|
|
1036
|
+
<p class="panel-kicker">Inbox staging</p>
|
|
1037
|
+
<h3>The inbox is a queue, not yet team memory.</h3>
|
|
1038
|
+
<p class="panel-lede">Eligible Markdown notes wait under <span class="code-chip">notes/inbox/</span> until the consolidation threshold is met.</p>
|
|
1039
|
+
<ul class="fact-list">
|
|
1040
|
+
<li>The default threshold is five eligible notes.</li>
|
|
1041
|
+
<li>Items pinned against consolidation and files already in flight are excluded.</li>
|
|
1042
|
+
<li>Successful tasks write exactly one assigned note; failed tasks do not.</li>
|
|
1043
|
+
</ul>
|
|
1044
|
+
</div>
|
|
1045
|
+
<div class="panel-visual">
|
|
1046
|
+
<div class="mini-node"><strong>1 note</strong><br>Waiting</div>
|
|
1047
|
+
<div class="mini-node"><strong>3 notes</strong><br>Still waiting</div>
|
|
1048
|
+
<div class="mini-node accent"><strong>5 eligible notes</strong><br>Consolidation can begin</div>
|
|
1049
|
+
<div class="mini-node warning"><strong>Pinned inbox item</strong><br>Held out of the batch</div>
|
|
1050
|
+
</div>
|
|
1051
|
+
</article>
|
|
1052
|
+
|
|
1053
|
+
<article class="journey-panel" id="journey-consolidate" role="tabpanel" aria-labelledby="journey-tab-consolidate">
|
|
1054
|
+
<div>
|
|
1055
|
+
<p class="panel-kicker">Inbox consolidation</p>
|
|
1056
|
+
<h3>Summarize, classify, route, then archive.</h3>
|
|
1057
|
+
<p class="panel-lede">The normal path uses a direct LLM for a concise digest and falls back to deterministic regex processing when that call fails.</p>
|
|
1058
|
+
<ul class="fact-list">
|
|
1059
|
+
<li>Team digest content appends to <span class="code-chip">notes.md</span> under a file lock.</li>
|
|
1060
|
+
<li>Each source is classified into a readable KB category and eligible authors receive personal memory.</li>
|
|
1061
|
+
<li>Corresponding semantic records are upserted into SQL before processed inbox files are archived.</li>
|
|
1062
|
+
</ul>
|
|
1063
|
+
</div>
|
|
1064
|
+
<div class="panel-visual">
|
|
1065
|
+
<div class="mini-node accent"><strong>Normal batch</strong><br>Digest → classify → team + KB + agent + SQL → archive</div>
|
|
1066
|
+
<div class="mini-node warning"><strong>Important exception</strong><br>If one content hash is more than 80% of the batch, Minions archives the entire batch and skips all normal writes.</div>
|
|
1067
|
+
<div class="mini-node"><strong>Why?</strong><br>A circuit breaker prevents duplicate storms from amplifying themselves.</div>
|
|
1068
|
+
</div>
|
|
1069
|
+
</article>
|
|
1070
|
+
|
|
1071
|
+
<article class="journey-panel" id="journey-store" role="tabpanel" aria-labelledby="journey-tab-store">
|
|
1072
|
+
<div>
|
|
1073
|
+
<p class="panel-kicker">Durable storage</p>
|
|
1074
|
+
<h3>Readable history and structured recall coexist.</h3>
|
|
1075
|
+
<p class="panel-lede">The layers overlap on normal ingestion paths, but each remains authoritative for a different job.</p>
|
|
1076
|
+
<ul class="fact-list">
|
|
1077
|
+
<li><span class="code-chip">notes.md</span> is the team digest and legacy team prompt input.</li>
|
|
1078
|
+
<li><span class="code-chip">knowledge/agents/<id>.md</span> is the consolidation-owned legacy personal notebook.</li>
|
|
1079
|
+
<li><span class="code-chip">memory_records</span> owns structured body, scope, trust, provenance, and lifecycle status.</li>
|
|
1080
|
+
</ul>
|
|
1081
|
+
</div>
|
|
1082
|
+
<div class="panel-visual">
|
|
1083
|
+
<div class="mini-node"><strong>Team notes</strong><br>Shared, recent operating context</div>
|
|
1084
|
+
<div class="mini-node"><strong>Per-agent memory</strong><br>Agent-specific learnings; temp agents excluded</div>
|
|
1085
|
+
<div class="mini-node"><strong>Knowledge base</strong><br>Categorized, browsable source material</div>
|
|
1086
|
+
<div class="mini-node accent"><strong>SQLite + FTS5</strong><br>Scoped, lifecycle-aware retrieval records</div>
|
|
1087
|
+
</div>
|
|
1088
|
+
</article>
|
|
1089
|
+
|
|
1090
|
+
<article class="journey-panel" id="journey-retrieve" role="tabpanel" aria-labelledby="journey-tab-retrieve">
|
|
1091
|
+
<div>
|
|
1092
|
+
<p class="panel-kicker">Active retrieval</p>
|
|
1093
|
+
<h3>A task becomes a lexical, scoped search.</h3>
|
|
1094
|
+
<p class="panel-lede">Minions builds the query from the work item, references, failure context, source plan, and PR metadata.</p>
|
|
1095
|
+
<ul class="fact-list">
|
|
1096
|
+
<li>FTS5 searches active global, current-project, and assigned-agent records.</li>
|
|
1097
|
+
<li>Agent/external procedural records are excluded unless trust is human or system.</li>
|
|
1098
|
+
<li>Deterministic reranking boosts scope, trust, paths, recency, importance, and confidence before deduplication.</li>
|
|
1099
|
+
</ul>
|
|
1100
|
+
</div>
|
|
1101
|
+
<div class="panel-visual">
|
|
1102
|
+
<div class="mini-node"><strong>Task query</strong><br>At most 32 unique non-stop-word terms</div>
|
|
1103
|
+
<div class="mini-arrow" aria-hidden="true">↓</div>
|
|
1104
|
+
<div class="mini-node"><strong>FTS5 candidates</strong><br>Default pool: 50</div>
|
|
1105
|
+
<div class="mini-arrow" aria-hidden="true">↓</div>
|
|
1106
|
+
<div class="mini-node accent"><strong>Rank + dedupe + pack</strong><br>Default top K: 8 · Default budget: 8,192 bytes</div>
|
|
1107
|
+
</div>
|
|
1108
|
+
</article>
|
|
1109
|
+
|
|
1110
|
+
<article class="journey-panel" id="journey-assemble" role="tabpanel" aria-labelledby="journey-tab-assemble">
|
|
1111
|
+
<div>
|
|
1112
|
+
<p class="panel-kicker">Prompt assembly</p>
|
|
1113
|
+
<h3>Always pinned; then relevant or fallback.</h3>
|
|
1114
|
+
<p class="panel-lede">Prompt assembly is single-choice for broad memory: a non-empty active pack suppresses the team and personal appendices.</p>
|
|
1115
|
+
<ul class="fact-list">
|
|
1116
|
+
<li>Pinned context is added first and remains independent of retrieval mode.</li>
|
|
1117
|
+
<li>Shadow mode records retrieval telemetry but still injects the legacy team/personal pair.</li>
|
|
1118
|
+
<li>Every memory appendix is wrapped as untrusted evidence with source provenance.</li>
|
|
1119
|
+
</ul>
|
|
1120
|
+
</div>
|
|
1121
|
+
<div class="panel-visual">
|
|
1122
|
+
<div class="mini-node warning"><strong>Pinned Context</strong><br>Always first · 4,096 JavaScript code units</div>
|
|
1123
|
+
<div class="mini-node accent"><strong>Relevant Memory</strong><br>Or Team Notes + Personal Memory</div>
|
|
1124
|
+
<div class="mini-node security"><strong><UNTRUSTED-INPUT></strong><br>Source attributed · closing tags escaped · UTF-8 bounded</div>
|
|
1125
|
+
</div>
|
|
1126
|
+
</article>
|
|
1127
|
+
|
|
1128
|
+
<article class="journey-panel" id="journey-episode" role="tabpanel" aria-labelledby="journey-tab-episode">
|
|
1129
|
+
<div>
|
|
1130
|
+
<p class="panel-kicker">Episodic capture</p>
|
|
1131
|
+
<h3>The outcome can become evidence for later work.</h3>
|
|
1132
|
+
<p class="panel-lede">When enabled, post-completion lifecycle stores a compact SQL episode for success, partial, and failed outcomes.</p>
|
|
1133
|
+
<ul class="fact-list">
|
|
1134
|
+
<li>Episodes include outcome, task, agent, project, PR, failure class, bounded files/tests, and summary.</li>
|
|
1135
|
+
<li>Secrets are redacted; injection-flagged and nonce-mismatched reports are excluded.</li>
|
|
1136
|
+
<li>Capture is best-effort and defaults off, so a write failure never changes task completion.</li>
|
|
1137
|
+
</ul>
|
|
1138
|
+
</div>
|
|
1139
|
+
<div class="panel-visual">
|
|
1140
|
+
<div class="mini-node"><strong>Preferred summary</strong><br>Parsed runtime or structured completion report</div>
|
|
1141
|
+
<div class="mini-node warning"><strong>Honest limitation</strong><br>If no summary exists and stdout has no <span class="code-chip">"type":</span> marker, redacted raw stdout can supply up to 4,000 characters.</div>
|
|
1142
|
+
<div class="mini-node accent"><strong>Structured episode</strong><br>System trust · project, agent, or global scope</div>
|
|
1143
|
+
</div>
|
|
1144
|
+
</article>
|
|
1145
|
+
</div>
|
|
1146
|
+
</div>
|
|
1147
|
+
<noscript><p class="noscript-note">JavaScript is off, so all seven steps are shown together instead of as a guided sequence.</p></noscript>
|
|
1148
|
+
</section>
|
|
1149
|
+
|
|
1150
|
+
<section class="section" id="architecture-map" aria-labelledby="map-heading">
|
|
1151
|
+
<div class="section-heading">
|
|
1152
|
+
<p class="eyebrow">Interactive architecture map</p>
|
|
1153
|
+
<h2 id="map-heading">Click a surface to see what it owns.</h2>
|
|
1154
|
+
<p>The system is intentionally not a single database. Follow the normal ingestion route, the pinned shortcut, and the outcome feedback loop.</p>
|
|
1155
|
+
</div>
|
|
1156
|
+
|
|
1157
|
+
<div class="map-shell">
|
|
1158
|
+
<div class="system-map" role="toolbar" aria-label="Memory architecture surfaces">
|
|
1159
|
+
<button class="map-node map-sources is-active" type="button" data-map-node="sources" aria-pressed="true" aria-controls="map-detail-sources"><small>Input</small>Sources<span>Humans · agents · engine</span></button>
|
|
1160
|
+
<span class="map-arrow map-arrow-1" aria-hidden="true">→</span>
|
|
1161
|
+
<button class="map-node map-files" type="button" data-map-node="files" aria-pressed="false" aria-controls="map-detail-files"><small>Readable layer</small>Markdown files<span>Inbox · team · KB · agent</span></button>
|
|
1162
|
+
<span class="map-arrow map-arrow-2" aria-hidden="true">→</span>
|
|
1163
|
+
<button class="map-node map-sql" type="button" data-map-node="sql" aria-pressed="false" aria-controls="map-detail-sql"><small>Structured layer</small>SQLite + FTS5<span>Records · lifecycle · telemetry</span></button>
|
|
1164
|
+
<span class="map-arrow map-down" aria-hidden="true">↓</span>
|
|
1165
|
+
<span class="map-arrow map-down-2" aria-hidden="true">↓</span>
|
|
1166
|
+
<button class="map-node map-pinned" type="button" data-map-node="pinned" aria-pressed="false" aria-controls="map-detail-pinned"><small>Operator shortcut</small>Pinned context<span>File-only, always first</span></button>
|
|
1167
|
+
<span class="map-arrow map-arrow-3" aria-hidden="true">→</span>
|
|
1168
|
+
<button class="map-node map-prompt" type="button" data-map-node="prompt" aria-pressed="false" aria-controls="map-detail-prompt"><small>Dispatch boundary</small>Prompt assembly<span>Bounded · fenced · attributed</span></button>
|
|
1169
|
+
<span class="map-arrow map-arrow-4" aria-hidden="true">→</span>
|
|
1170
|
+
<button class="map-node map-retrieval" type="button" data-map-node="retrieval" aria-pressed="false" aria-controls="map-detail-retrieval"><small>Selection</small>Task retrieval<span>Query · rank · dedupe · pack</span></button>
|
|
1171
|
+
<span class="map-arrow map-down-3" aria-hidden="true">↓</span>
|
|
1172
|
+
<button class="map-node map-episodes" type="button" data-map-node="episodes" aria-pressed="false" aria-controls="map-detail-episodes"><small>Feedback loop</small>Task episodes<span>Optional compact outcomes</span></button>
|
|
1173
|
+
</div>
|
|
1174
|
+
|
|
1175
|
+
<div class="map-details" aria-live="polite">
|
|
1176
|
+
<article class="map-detail is-active" id="map-detail-sources">
|
|
1177
|
+
<span class="detail-type">Input surface</span>
|
|
1178
|
+
<h3>Sources</h3>
|
|
1179
|
+
<p>Memory begins with bounded, attributable contributions rather than an automatic transcript of everything an agent sees.</p>
|
|
1180
|
+
<ul class="detail-list">
|
|
1181
|
+
<li><strong>Human-authored</strong>Quick Notes, pinned entries, and direct KB entries.</li>
|
|
1182
|
+
<li><strong>Agent-authored</strong>One assigned success note with required agent provenance.</li>
|
|
1183
|
+
<li><strong>System-authored</strong>Alerts, feedback, workflow findings, and optional completion episodes.</li>
|
|
1184
|
+
</ul>
|
|
1185
|
+
</article>
|
|
1186
|
+
<article class="map-detail" id="map-detail-files">
|
|
1187
|
+
<span class="detail-type">Readable layer</span>
|
|
1188
|
+
<h3>Markdown files</h3>
|
|
1189
|
+
<p>Files preserve coordination and human-readable history. They are not a disposable cache of SQL.</p>
|
|
1190
|
+
<ul class="detail-list">
|
|
1191
|
+
<li><strong>Pending</strong><span class="code-chip">notes/inbox/*.md</span></li>
|
|
1192
|
+
<li><strong>Shared and personal</strong><span class="code-chip">notes.md</span> and <span class="code-chip">knowledge/agents/*.md</span></li>
|
|
1193
|
+
<li><strong>Curated and pinned</strong><span class="code-chip">knowledge/</span> and <span class="code-chip">pinned.md</span></li>
|
|
1194
|
+
</ul>
|
|
1195
|
+
</article>
|
|
1196
|
+
<article class="map-detail" id="map-detail-sql">
|
|
1197
|
+
<span class="detail-type">Structured authority</span>
|
|
1198
|
+
<h3>SQLite + FTS5</h3>
|
|
1199
|
+
<p><span class="code-chip">memory_records</span> owns active structured content and metadata. FTS5 is a trigger-maintained derived index.</p>
|
|
1200
|
+
<ul class="detail-list">
|
|
1201
|
+
<li><strong>Types</strong>Semantic, episodic, procedural.</li>
|
|
1202
|
+
<li><strong>Scopes</strong>Global, project, agent.</li>
|
|
1203
|
+
<li><strong>Lifecycle</strong>Active, superseded, retracted, expired.</li>
|
|
1204
|
+
</ul>
|
|
1205
|
+
</article>
|
|
1206
|
+
<article class="map-detail" id="map-detail-pinned">
|
|
1207
|
+
<span class="detail-type">Operator shortcut</span>
|
|
1208
|
+
<h3>Pinned context</h3>
|
|
1209
|
+
<p><span class="code-chip">pinned.md</span> is read directly for every rendered agent prompt, before either retrieval mode.</p>
|
|
1210
|
+
<ul class="detail-list">
|
|
1211
|
+
<li><strong>Not structured pinning</strong>Pinning a SQL record changes trust and importance; it does not edit <span class="code-chip">pinned.md</span>.</li>
|
|
1212
|
+
<li><strong>Bound</strong>4,096 JavaScript UTF-16 code units plus a truncation notice.</li>
|
|
1213
|
+
</ul>
|
|
1214
|
+
</article>
|
|
1215
|
+
<article class="map-detail" id="map-detail-prompt">
|
|
1216
|
+
<span class="detail-type">Trust boundary</span>
|
|
1217
|
+
<h3>Prompt assembly</h3>
|
|
1218
|
+
<p>The prompt receives a small, ordered evidence pack - never an unbounded dump of the knowledge base.</p>
|
|
1219
|
+
<ul class="detail-list">
|
|
1220
|
+
<li><strong>Order</strong>Pinned first, then relevant memory or legacy team/personal memory.</li>
|
|
1221
|
+
<li><strong>Safety</strong>Memory is source-attributed and fenced as untrusted input.</li>
|
|
1222
|
+
</ul>
|
|
1223
|
+
</article>
|
|
1224
|
+
<article class="map-detail" id="map-detail-retrieval">
|
|
1225
|
+
<span class="detail-type">Selection path</span>
|
|
1226
|
+
<h3>Task-aware retrieval</h3>
|
|
1227
|
+
<p>Lexical FTS5 search produces candidates; deterministic code reranks and packs them to the configured byte budget.</p>
|
|
1228
|
+
<ul class="detail-list">
|
|
1229
|
+
<li><strong>Telemetry</strong>Query, candidate count, selected count, bytes, duration, and shadow state.</li>
|
|
1230
|
+
<li><strong>Provenance</strong>Every packed record includes id, type, scope, date, and source.</li>
|
|
1231
|
+
</ul>
|
|
1232
|
+
</article>
|
|
1233
|
+
<article class="map-detail" id="map-detail-episodes">
|
|
1234
|
+
<span class="detail-type">Optional feedback loop</span>
|
|
1235
|
+
<h3>Task episodes</h3>
|
|
1236
|
+
<p>Post-completion capture can turn a bounded outcome into a system-trusted record for later task-aware recall.</p>
|
|
1237
|
+
<ul class="detail-list">
|
|
1238
|
+
<li><strong>Default</strong>Off via <span class="code-chip">engine.memoryEpisodicCapture</span>.</li>
|
|
1239
|
+
<li><strong>Failure behavior</strong>Best effort; storage failure does not rewrite the completed task outcome.</li>
|
|
1240
|
+
</ul>
|
|
1241
|
+
</article>
|
|
1242
|
+
</div>
|
|
1243
|
+
</div>
|
|
1244
|
+
</section>
|
|
1245
|
+
|
|
1246
|
+
<section class="section" id="prompt-assembly" aria-labelledby="prompt-heading">
|
|
1247
|
+
<div class="section-heading">
|
|
1248
|
+
<p class="eyebrow">Prompt assembly and trust</p>
|
|
1249
|
+
<h2 id="prompt-heading">A bounded evidence pack, not a memory dump.</h2>
|
|
1250
|
+
<p>The final prompt preserves operator priority, selects one broad-memory mode, records provenance, and fences recalled content as data.</p>
|
|
1251
|
+
</div>
|
|
1252
|
+
|
|
1253
|
+
<div class="prompt-layout">
|
|
1254
|
+
<div class="prompt-stack" aria-label="Prompt memory order">
|
|
1255
|
+
<div class="stack-layer pinned">
|
|
1256
|
+
<div class="stack-label">Pinned Context <span class="always-badge">Always</span></div>
|
|
1257
|
+
<p>Direct from <span class="code-chip">pinned.md</span>, capped before fencing.</p>
|
|
1258
|
+
</div>
|
|
1259
|
+
<div class="stack-layer memory">
|
|
1260
|
+
<div class="stack-label">One memory mode <span class="mode-badge">Either / or</span></div>
|
|
1261
|
+
<p><strong>Relevant Memory</strong> when active retrieval returns a non-empty pack; otherwise <strong>Team Notes + Personal Memory</strong>.</p>
|
|
1262
|
+
</div>
|
|
1263
|
+
<div class="stack-layer rules">
|
|
1264
|
+
<div class="stack-label">Later appendices</div>
|
|
1265
|
+
<p>Project instructions and other non-memory context follow their own bounded assembly paths.</p>
|
|
1266
|
+
</div>
|
|
1267
|
+
</div>
|
|
1268
|
+
|
|
1269
|
+
<div class="mode-grid">
|
|
1270
|
+
<article class="mode-card active">
|
|
1271
|
+
<h3>Active retrieval</h3>
|
|
1272
|
+
<p>Feature on, shadow off, and at least one eligible result.</p>
|
|
1273
|
+
<ul>
|
|
1274
|
+
<li>Inject task-selected <strong>Relevant Memory</strong>.</li>
|
|
1275
|
+
<li>Suppress broad team and personal appendices.</li>
|
|
1276
|
+
<li>Persist retrieval telemetry.</li>
|
|
1277
|
+
</ul>
|
|
1278
|
+
</article>
|
|
1279
|
+
<article class="mode-card fallback">
|
|
1280
|
+
<h3>Legacy fallback</h3>
|
|
1281
|
+
<p>Feature off, shadow on, empty search, or retrieval/telemetry error.</p>
|
|
1282
|
+
<ul>
|
|
1283
|
+
<li>Inject bounded <strong>Team Notes</strong>.</li>
|
|
1284
|
+
<li>Add bounded <strong>Personal Memory</strong> for configured non-temp agents.</li>
|
|
1285
|
+
<li>Missing files are safely skipped.</li>
|
|
1286
|
+
</ul>
|
|
1287
|
+
</article>
|
|
1288
|
+
<p class="mode-note"><strong>Shadow mode is observational:</strong> Minions computes retrieval and stores telemetry, but the prompt still receives the legacy files.</p>
|
|
1289
|
+
</div>
|
|
1290
|
+
</div>
|
|
1291
|
+
|
|
1292
|
+
<div class="bounds-grid" aria-label="Default prompt bounds">
|
|
1293
|
+
<div class="bound"><div class="bound-value">4,096</div><div class="bound-label">Pinned code units</div></div>
|
|
1294
|
+
<div class="bound"><div class="bound-value">8,192 B</div><div class="bound-label">Retrieved pack</div></div>
|
|
1295
|
+
<div class="bound"><div class="bound-value">Top 8</div><div class="bound-label">Selected records</div></div>
|
|
1296
|
+
<div class="bound"><div class="bound-value">50</div><div class="bound-label">FTS candidates</div></div>
|
|
1297
|
+
<div class="bound"><div class="bound-value">8,192 B</div><div class="bound-label">Each legacy file</div></div>
|
|
1298
|
+
<div class="bound"><div class="bound-value">65,536 B</div><div class="bound-label">Any fence body</div></div>
|
|
1299
|
+
</div>
|
|
1300
|
+
|
|
1301
|
+
<div class="security-card">
|
|
1302
|
+
<div>
|
|
1303
|
+
<p class="eyebrow">Untrusted-input fencing</p>
|
|
1304
|
+
<h3>Memory is evidence, never a new instruction channel.</h3>
|
|
1305
|
+
<p>The wrapper sanitizes the source attribute, escapes attempted closing tags, and truncates inside the fence on a UTF-8 boundary. Agents are told to verify recalled claims against live code.</p>
|
|
1306
|
+
</div>
|
|
1307
|
+
<div class="fence-preview" aria-label="Example untrusted memory fence">
|
|
1308
|
+
<UNTRUSTED-INPUT<br>
|
|
1309
|
+
source="memory-retrieval:item=W-..."><br>
|
|
1310
|
+
<span class="fence-body">id=M-... | type=semantic<br>
|
|
1311
|
+
scope=project:minions | date=...<br><br>
|
|
1312
|
+
Recalled evidence, with provenance.</span><br>
|
|
1313
|
+
</UNTRUSTED-INPUT>
|
|
1314
|
+
</div>
|
|
1315
|
+
</div>
|
|
1316
|
+
</section>
|
|
1317
|
+
|
|
1318
|
+
<section class="section" id="operational-controls" aria-labelledby="controls-heading">
|
|
1319
|
+
<div class="section-heading">
|
|
1320
|
+
<p class="eyebrow">Operational controls</p>
|
|
1321
|
+
<h2 id="controls-heading">Tune selection, not the truth.</h2>
|
|
1322
|
+
<p>Settings change thresholds, budgets, rollout mode, and optional capture. They do not turn the file and SQL layers into a two-way mirror.</p>
|
|
1323
|
+
</div>
|
|
1324
|
+
|
|
1325
|
+
<div class="controls-grid">
|
|
1326
|
+
<article class="control-card">
|
|
1327
|
+
<h3>Retrieval rollout</h3>
|
|
1328
|
+
<p>Feature, observation mode, and selected-pack bounds.</p>
|
|
1329
|
+
<dl>
|
|
1330
|
+
<dt>features.memoryRetrieval</dt><dd>true</dd>
|
|
1331
|
+
<dt>engine.memoryRetrievalShadowMode</dt><dd>false</dd>
|
|
1332
|
+
<dt>engine.memoryRetrievalTopK</dt><dd>8</dd>
|
|
1333
|
+
<dt>engine.memoryRetrievalMaxBytes</dt><dd>8,192</dd>
|
|
1334
|
+
<dt>engine.memoryRetrievalCandidateLimit</dt><dd>50</dd>
|
|
1335
|
+
</dl>
|
|
1336
|
+
</article>
|
|
1337
|
+
<article class="control-card">
|
|
1338
|
+
<h3>Capture and consolidation</h3>
|
|
1339
|
+
<p>When notes are processed and whether task outcomes become episodes.</p>
|
|
1340
|
+
<dl>
|
|
1341
|
+
<dt>engine.inboxConsolidateThreshold</dt><dd>5</dd>
|
|
1342
|
+
<dt>engine.memoryEpisodicCapture</dt><dd>false</dd>
|
|
1343
|
+
<dt>engine.autoConsolidateMemory</dt><dd>false</dd>
|
|
1344
|
+
</dl>
|
|
1345
|
+
</article>
|
|
1346
|
+
<article class="control-card">
|
|
1347
|
+
<h3>Personal-file retention</h3>
|
|
1348
|
+
<p>File-backed personal history has entry and byte windows; optional summarization is conservative.</p>
|
|
1349
|
+
<dl>
|
|
1350
|
+
<dt>engine.agentMemoryMaxEntries</dt><dd>300</dd>
|
|
1351
|
+
<dt>engine.agentMemorySummaryEnabled</dt><dd>false</dd>
|
|
1352
|
+
<dt>engine.agentMemorySummaryThreshold</dt><dd>30</dd>
|
|
1353
|
+
<dt>engine.agentMemorySummaryDays</dt><dd>30</dd>
|
|
1354
|
+
</dl>
|
|
1355
|
+
</article>
|
|
1356
|
+
<article class="control-card">
|
|
1357
|
+
<h3>Trust and feature overrides</h3>
|
|
1358
|
+
<p>The fence cap is an engine default; feature resolution supports a process-level override.</p>
|
|
1359
|
+
<dl>
|
|
1360
|
+
<dt>ENGINE_DEFAULTS.untrustedFenceMaxBytes</dt><dd>65,536</dd>
|
|
1361
|
+
<dt>MINIONS_FEATURE_MEMORYRETRIEVAL</dt><dd>1 | 0</dd>
|
|
1362
|
+
</dl>
|
|
1363
|
+
</article>
|
|
1364
|
+
</div>
|
|
1365
|
+
|
|
1366
|
+
<div class="surface-strip">
|
|
1367
|
+
<div class="surface-item"><strong>Dashboard Settings</strong><span>Feature toggle, shadow mode, episodes, retrieval bounds, inbox threshold, and automatic KB sweep.</span></div>
|
|
1368
|
+
<div class="surface-item"><strong>Inbox & Memory search</strong><span>Quick Notes, Team Notes, KB authoring, manual sweep, lifecycle-aware structured search, and provenance.</span></div>
|
|
1369
|
+
<div class="surface-item"><strong>Local API</strong><span><span class="code-chip">/api/pinned</span>, <span class="code-chip">/api/knowledge</span>, and <span class="code-chip">/api/memory-records/search</span>.</span></div>
|
|
1370
|
+
</div>
|
|
1371
|
+
</section>
|
|
1372
|
+
|
|
1373
|
+
<section class="section" id="troubleshooting" aria-labelledby="trouble-heading">
|
|
1374
|
+
<div class="section-heading">
|
|
1375
|
+
<p class="eyebrow">Troubleshooting and limitations</p>
|
|
1376
|
+
<h2 id="trouble-heading">Know what "working as designed" looks like.</h2>
|
|
1377
|
+
<p>Open a question for the short answer. The written guide has the full operating detail and API reference.</p>
|
|
1378
|
+
</div>
|
|
1379
|
+
|
|
1380
|
+
<div class="trouble-grid">
|
|
1381
|
+
<details>
|
|
1382
|
+
<summary>Why do I see Team Notes instead of Relevant Memory?</summary>
|
|
1383
|
+
<div><p>The feature may be off, shadow mode may be on, the task query may have no indexable terms, FTS5 may find no eligible rows, or retrieval/telemetry may have thrown. These all intentionally select the legacy fallback.</p></div>
|
|
1384
|
+
</details>
|
|
1385
|
+
<details>
|
|
1386
|
+
<summary>Why is a note still waiting in the inbox?</summary>
|
|
1387
|
+
<div><p>Check the eligible count, consolidation pin state, in-flight state, write access to <span class="code-chip">notes.md</span>, and whether a required personal-memory write failed. An LLM failure alone should not strand the batch because regex fallback exists.</p></div>
|
|
1388
|
+
</details>
|
|
1389
|
+
<details>
|
|
1390
|
+
<summary>Why did search miss text that exists in Markdown?</summary>
|
|
1391
|
+
<div><p>Active search is lexical FTS5, not embeddings. Out-of-band edits and file-only mutation paths do not trigger a general SQL reindex, so compare SQL provenance with the current source file.</p></div>
|
|
1392
|
+
</details>
|
|
1393
|
+
<details>
|
|
1394
|
+
<summary>Does pinning a search result make it global prompt context?</summary>
|
|
1395
|
+
<div><p>No. A structured-record pin raises trust, confidence, and importance and restores active status. It does not edit <span class="code-chip">pinned.md</span>, bypass lexical matching, or guarantee top-K selection.</p></div>
|
|
1396
|
+
</details>
|
|
1397
|
+
<details>
|
|
1398
|
+
<summary>Can a duplicate-heavy batch lose its minority note?</summary>
|
|
1399
|
+
<div><p>It can leave the normal pipeline. When one hash exceeds 80% of the eligible batch, the circuit breaker archives the entire batch, including minority notes, and skips team, KB/SQL, and personal writes.</p></div>
|
|
1400
|
+
</details>
|
|
1401
|
+
<details>
|
|
1402
|
+
<summary>Are episodes guaranteed to contain only clean summaries?</summary>
|
|
1403
|
+
<div><p>No. Structured or parsed summaries are preferred, but raw stdout can be the redacted, 4,000-character fallback when no summary exists and no <span class="code-chip">"type":</span> marker is present.</p></div>
|
|
1404
|
+
</details>
|
|
1405
|
+
<details class="limitation" open>
|
|
1406
|
+
<summary>Current boundaries to remember</summary>
|
|
1407
|
+
<div>
|
|
1408
|
+
<p>There is no general two-way file/SQL mirror, no full reindex command, and no scheduled SQL-record expiry. FTS5 is lexical rather than semantic embedding search. File TTL and SQL lifecycle are separate. Never repair divergence by editing <span class="code-chip">engine/state.db</span> directly.</p>
|
|
1409
|
+
</div>
|
|
1410
|
+
</details>
|
|
1411
|
+
</div>
|
|
1412
|
+
|
|
1413
|
+
<div class="closing">
|
|
1414
|
+
<blockquote>Minions memory is a <span>curated trail with provenance</span>, not a transcript and not a second command channel.</blockquote>
|
|
1415
|
+
<p><a class="button-link primary" href="https://unpkg.com/@yemi33/minions@latest/docs/team-memory.md">Go deeper in the authoritative written guide</a></p>
|
|
1416
|
+
</div>
|
|
1417
|
+
</section>
|
|
1418
|
+
</main>
|
|
1419
|
+
|
|
1420
|
+
<footer>
|
|
1421
|
+
<nav aria-label="Footer">
|
|
1422
|
+
<a href="../index.html">Minions overview</a>
|
|
1423
|
+
<a href="https://unpkg.com/@yemi33/minions@latest/docs/team-memory.md">Memory system guide</a>
|
|
1424
|
+
<a href="https://unpkg.com/browse/@yemi33/minions@latest/">Published package source</a>
|
|
1425
|
+
</nav>
|
|
1426
|
+
<p>Static, dependency-free, and safe to present without a running Minions dashboard.</p>
|
|
1427
|
+
</footer>
|
|
1428
|
+
|
|
1429
|
+
<script src="memory-system.js" defer></script>
|
|
1430
|
+
</body>
|
|
1431
|
+
</html>
|