jfl 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/clawdbot-plugin/clawdbot.plugin.json +12 -1
  2. package/clawdbot-plugin/index.js +5 -5
  3. package/clawdbot-plugin/index.ts +5 -5
  4. package/dist/commands/context-hub.d.ts +4 -0
  5. package/dist/commands/context-hub.d.ts.map +1 -1
  6. package/dist/commands/context-hub.js +570 -81
  7. package/dist/commands/context-hub.js.map +1 -1
  8. package/dist/commands/init.d.ts.map +1 -1
  9. package/dist/commands/init.js +42 -11
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/peter.d.ts +15 -0
  12. package/dist/commands/peter.d.ts.map +1 -0
  13. package/dist/commands/peter.js +198 -0
  14. package/dist/commands/peter.js.map +1 -0
  15. package/dist/commands/ralph.d.ts +3 -1
  16. package/dist/commands/ralph.d.ts.map +1 -1
  17. package/dist/commands/ralph.js +40 -5
  18. package/dist/commands/ralph.js.map +1 -1
  19. package/dist/commands/session.d.ts +2 -1
  20. package/dist/commands/session.d.ts.map +1 -1
  21. package/dist/commands/session.js +496 -49
  22. package/dist/commands/session.js.map +1 -1
  23. package/dist/commands/update.d.ts.map +1 -1
  24. package/dist/commands/update.js +25 -6
  25. package/dist/commands/update.js.map +1 -1
  26. package/dist/dashboard/components.d.ts +7 -0
  27. package/dist/dashboard/components.d.ts.map +1 -0
  28. package/dist/dashboard/components.js +163 -0
  29. package/dist/dashboard/components.js.map +1 -0
  30. package/dist/dashboard/index.d.ts +12 -0
  31. package/dist/dashboard/index.d.ts.map +1 -0
  32. package/dist/dashboard/index.js +132 -0
  33. package/dist/dashboard/index.js.map +1 -0
  34. package/dist/dashboard/pages.d.ts +7 -0
  35. package/dist/dashboard/pages.d.ts.map +1 -0
  36. package/dist/dashboard/pages.js +742 -0
  37. package/dist/dashboard/pages.js.map +1 -0
  38. package/dist/dashboard/styles.d.ts +7 -0
  39. package/dist/dashboard/styles.d.ts.map +1 -0
  40. package/dist/dashboard/styles.js +497 -0
  41. package/dist/dashboard/styles.js.map +1 -0
  42. package/dist/index.js +30 -3
  43. package/dist/index.js.map +1 -1
  44. package/dist/lib/map-event-bus.d.ts +48 -0
  45. package/dist/lib/map-event-bus.d.ts.map +1 -0
  46. package/dist/lib/map-event-bus.js +326 -0
  47. package/dist/lib/map-event-bus.js.map +1 -0
  48. package/dist/lib/peter-parker-bridge.d.ts +33 -0
  49. package/dist/lib/peter-parker-bridge.d.ts.map +1 -0
  50. package/dist/lib/peter-parker-bridge.js +116 -0
  51. package/dist/lib/peter-parker-bridge.js.map +1 -0
  52. package/dist/lib/peter-parker-config.d.ts +13 -0
  53. package/dist/lib/peter-parker-config.d.ts.map +1 -0
  54. package/dist/lib/peter-parker-config.js +86 -0
  55. package/dist/lib/peter-parker-config.js.map +1 -0
  56. package/dist/lib/service-utils.d.ts.map +1 -1
  57. package/dist/lib/service-utils.js +33 -17
  58. package/dist/lib/service-utils.js.map +1 -1
  59. package/dist/mcp/context-hub-mcp.js +122 -22
  60. package/dist/mcp/context-hub-mcp.js.map +1 -1
  61. package/dist/types/map.d.ts +33 -0
  62. package/dist/types/map.d.ts.map +1 -0
  63. package/dist/types/map.js +39 -0
  64. package/dist/types/map.js.map +1 -0
  65. package/dist/ui/event-dashboard.d.ts +12 -0
  66. package/dist/ui/event-dashboard.d.ts.map +1 -0
  67. package/dist/ui/event-dashboard.js +342 -0
  68. package/dist/ui/event-dashboard.js.map +1 -0
  69. package/package.json +1 -1
  70. package/scripts/test-map-eventbus.sh +357 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/dashboard/pages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,UAAU;IACxB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6tBN,CAAA;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Dashboard CSS styles
3
+ *
4
+ * @purpose CSS string with brand colors from theme.ts for the web dashboard
5
+ */
6
+ export declare function getDashboardStyles(): string;
7
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/dashboard/styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,kBAAkB,IAAI,MAAM,CA0e3C"}
@@ -0,0 +1,497 @@
1
+ /**
2
+ * Dashboard CSS styles
3
+ *
4
+ * @purpose CSS string with brand colors from theme.ts for the web dashboard
5
+ */
6
+ export function getDashboardStyles() {
7
+ return `
8
+ :root {
9
+ --accent: #FFD700;
10
+ --accent-soft: #FFA500;
11
+ --accent-dim: #B8860B;
12
+ --success: #00FF88;
13
+ --error: #FF4444;
14
+ --warning: #FFAA00;
15
+ --info: #4FC3F7;
16
+ --bg: #0f172a;
17
+ --bg-card: #1e293b;
18
+ --bg-card-hover: #334155;
19
+ --text: #f8fafc;
20
+ --text-soft: #94a3b8;
21
+ --text-dim: #64748b;
22
+ --border: #334155;
23
+ }
24
+
25
+ * { box-sizing: border-box; margin: 0; padding: 0; }
26
+
27
+ body {
28
+ background: var(--bg);
29
+ color: var(--text);
30
+ font-family: 'Inter', system-ui, -apple-system, sans-serif;
31
+ min-height: 100vh;
32
+ }
33
+
34
+ #app { display: flex; min-height: 100vh; }
35
+
36
+ .sidebar {
37
+ width: 220px;
38
+ background: var(--bg-card);
39
+ border-right: 1px solid var(--border);
40
+ padding: 1.5rem 0;
41
+ display: flex;
42
+ flex-direction: column;
43
+ position: fixed;
44
+ top: 0;
45
+ left: 0;
46
+ bottom: 0;
47
+ z-index: 10;
48
+ }
49
+
50
+ .sidebar-brand {
51
+ padding: 0 1.25rem 1.5rem;
52
+ border-bottom: 1px solid var(--border);
53
+ margin-bottom: 1rem;
54
+ }
55
+
56
+ .sidebar-brand h1 {
57
+ font-size: 1.125rem;
58
+ font-weight: 700;
59
+ color: var(--accent);
60
+ letter-spacing: -0.02em;
61
+ }
62
+
63
+ .sidebar-brand .port-badge {
64
+ font-size: 0.75rem;
65
+ color: var(--text-soft);
66
+ margin-top: 0.25rem;
67
+ }
68
+
69
+ .nav-items { list-style: none; }
70
+
71
+ .nav-item {
72
+ display: block;
73
+ padding: 0.625rem 1.25rem;
74
+ color: var(--text-soft);
75
+ text-decoration: none;
76
+ cursor: pointer;
77
+ font-size: 0.875rem;
78
+ transition: all 0.15s;
79
+ border-left: 3px solid transparent;
80
+ }
81
+
82
+ .nav-item:hover {
83
+ color: var(--text);
84
+ background: rgba(255, 255, 255, 0.04);
85
+ }
86
+
87
+ .nav-item.active {
88
+ color: var(--accent);
89
+ background: rgba(255, 215, 0, 0.06);
90
+ border-left-color: var(--accent);
91
+ font-weight: 600;
92
+ }
93
+
94
+ .main-content {
95
+ flex: 1;
96
+ margin-left: 220px;
97
+ padding: 2rem;
98
+ max-width: 1200px;
99
+ }
100
+
101
+ .page-title {
102
+ font-size: 1.5rem;
103
+ font-weight: 700;
104
+ margin-bottom: 1.5rem;
105
+ letter-spacing: -0.02em;
106
+ }
107
+
108
+ .card {
109
+ background: var(--bg-card);
110
+ border: 1px solid var(--border);
111
+ border-radius: 0.75rem;
112
+ padding: 1.25rem;
113
+ margin-bottom: 1rem;
114
+ }
115
+
116
+ .card-title {
117
+ font-size: 0.875rem;
118
+ font-weight: 600;
119
+ color: var(--text-soft);
120
+ text-transform: uppercase;
121
+ letter-spacing: 0.05em;
122
+ margin-bottom: 0.75rem;
123
+ }
124
+
125
+ .card-value {
126
+ font-size: 2rem;
127
+ font-weight: 700;
128
+ letter-spacing: -0.02em;
129
+ }
130
+
131
+ .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
132
+ .grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 1rem; }
133
+ .grid-4 { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; gap: 1rem; }
134
+
135
+ .badge {
136
+ display: inline-block;
137
+ padding: 0.125rem 0.5rem;
138
+ border-radius: 9999px;
139
+ font-size: 0.75rem;
140
+ font-weight: 600;
141
+ text-transform: uppercase;
142
+ letter-spacing: 0.05em;
143
+ }
144
+
145
+ .badge-ok { background: rgba(0, 255, 136, 0.15); color: var(--success); }
146
+ .badge-down { background: rgba(255, 68, 68, 0.15); color: var(--error); }
147
+ .badge-zombie { background: rgba(255, 68, 68, 0.15); color: var(--error); }
148
+ .badge-stale { background: rgba(255, 170, 0, 0.15); color: var(--warning); }
149
+ .badge-unknown { background: rgba(148, 163, 184, 0.15); color: var(--text-soft); }
150
+
151
+ .badge-feature { background: rgba(79, 195, 247, 0.15); color: var(--info); }
152
+ .badge-fix { background: rgba(255, 68, 68, 0.15); color: var(--error); }
153
+ .badge-decision { background: rgba(255, 215, 0, 0.15); color: var(--accent); }
154
+ .badge-discovery { background: rgba(0, 255, 136, 0.15); color: var(--success); }
155
+ .badge-milestone { background: rgba(255, 170, 0, 0.15); color: var(--warning); }
156
+
157
+ .badge-peter { background: rgba(79, 195, 247, 0.15); color: var(--info); }
158
+ .badge-task { background: rgba(0, 255, 136, 0.15); color: var(--success); }
159
+ .badge-session { background: rgba(255, 215, 0, 0.15); color: var(--accent); }
160
+ .badge-system { background: rgba(148, 163, 184, 0.15); color: var(--text-soft); }
161
+
162
+ table {
163
+ width: 100%;
164
+ border-collapse: collapse;
165
+ font-size: 0.875rem;
166
+ }
167
+
168
+ th {
169
+ text-align: left;
170
+ padding: 0.625rem 0.75rem;
171
+ color: var(--text-soft);
172
+ font-weight: 600;
173
+ border-bottom: 1px solid var(--border);
174
+ font-size: 0.75rem;
175
+ text-transform: uppercase;
176
+ letter-spacing: 0.05em;
177
+ }
178
+
179
+ td {
180
+ padding: 0.625rem 0.75rem;
181
+ border-bottom: 1px solid rgba(51, 65, 85, 0.5);
182
+ color: var(--text);
183
+ }
184
+
185
+ tr:hover td { background: rgba(255, 255, 255, 0.02); }
186
+
187
+ .search-input {
188
+ width: 100%;
189
+ padding: 0.625rem 0.875rem;
190
+ background: var(--bg);
191
+ border: 1px solid var(--border);
192
+ border-radius: 0.5rem;
193
+ color: var(--text);
194
+ font-size: 0.875rem;
195
+ outline: none;
196
+ transition: border-color 0.15s;
197
+ }
198
+
199
+ .search-input:focus { border-color: var(--accent); }
200
+
201
+ .search-input::placeholder { color: var(--text-dim); }
202
+
203
+ .live-dot {
204
+ display: inline-block;
205
+ width: 8px;
206
+ height: 8px;
207
+ border-radius: 50%;
208
+ background: var(--success);
209
+ animation: pulse 2s infinite;
210
+ margin-right: 0.5rem;
211
+ }
212
+
213
+ @keyframes pulse {
214
+ 0%, 100% { opacity: 1; }
215
+ 50% { opacity: 0.4; }
216
+ }
217
+
218
+ .event-row {
219
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
220
+ font-size: 0.8rem;
221
+ }
222
+
223
+ .event-time { color: var(--text-dim); white-space: nowrap; }
224
+
225
+ .event-payload {
226
+ color: var(--text-soft);
227
+ max-width: 400px;
228
+ overflow: hidden;
229
+ text-overflow: ellipsis;
230
+ white-space: nowrap;
231
+ }
232
+
233
+ .stat-row {
234
+ display: flex;
235
+ justify-content: space-between;
236
+ padding: 0.375rem 0;
237
+ font-size: 0.875rem;
238
+ }
239
+
240
+ .stat-label { color: var(--text-soft); }
241
+ .stat-value { color: var(--text); font-weight: 600; }
242
+
243
+ /* Agent status dots */
244
+ .agent-dot {
245
+ width: 10px;
246
+ height: 10px;
247
+ border-radius: 50%;
248
+ display: inline-block;
249
+ flex-shrink: 0;
250
+ }
251
+
252
+ .agent-dot-active {
253
+ background: var(--success);
254
+ box-shadow: 0 0 6px var(--success);
255
+ animation: pulse 2s infinite;
256
+ }
257
+
258
+ .agent-dot-idle {
259
+ background: var(--text-dim);
260
+ }
261
+
262
+ .agent-dot-error {
263
+ background: var(--error);
264
+ box-shadow: 0 0 6px var(--error);
265
+ }
266
+
267
+ /* Model tier badges */
268
+ .model-badge {
269
+ font-size: 0.65rem;
270
+ font-weight: 700;
271
+ padding: 0.1rem 0.375rem;
272
+ border-radius: 4px;
273
+ text-transform: uppercase;
274
+ letter-spacing: 0.05em;
275
+ background: rgba(255, 215, 0, 0.12);
276
+ color: var(--accent);
277
+ }
278
+
279
+ /* Runtime badges (fly, local) */
280
+ .runtime-badge {
281
+ font-size: 0.6rem;
282
+ font-weight: 600;
283
+ padding: 0.1rem 0.375rem;
284
+ border-radius: 4px;
285
+ background: rgba(79, 195, 247, 0.12);
286
+ color: var(--info);
287
+ text-transform: lowercase;
288
+ }
289
+
290
+ .empty-state {
291
+ text-align: center;
292
+ padding: 3rem 1rem;
293
+ color: var(--text-dim);
294
+ }
295
+
296
+ .empty-state-icon { font-size: 2rem; margin-bottom: 0.75rem; }
297
+
298
+ .btn {
299
+ padding: 0.5rem 1rem;
300
+ border-radius: 0.5rem;
301
+ font-size: 0.875rem;
302
+ font-weight: 600;
303
+ border: none;
304
+ cursor: pointer;
305
+ transition: all 0.15s;
306
+ }
307
+
308
+ .btn-primary {
309
+ background: var(--accent);
310
+ color: var(--bg);
311
+ }
312
+
313
+ .btn-primary:hover { background: var(--accent-soft); }
314
+
315
+ .btn-secondary {
316
+ background: var(--bg-card);
317
+ color: var(--text);
318
+ border: 1px solid var(--border);
319
+ }
320
+
321
+ .btn-secondary:hover { background: var(--bg-card-hover); }
322
+
323
+ .form-group { margin-bottom: 0.75rem; }
324
+
325
+ .form-label {
326
+ display: block;
327
+ font-size: 0.75rem;
328
+ font-weight: 600;
329
+ color: var(--text-soft);
330
+ margin-bottom: 0.375rem;
331
+ }
332
+
333
+ textarea.search-input {
334
+ min-height: 80px;
335
+ resize: vertical;
336
+ }
337
+
338
+ .tag-input {
339
+ display: flex;
340
+ gap: 0.375rem;
341
+ flex-wrap: wrap;
342
+ }
343
+
344
+ .relevance-bar {
345
+ height: 4px;
346
+ border-radius: 2px;
347
+ background: var(--border);
348
+ overflow: hidden;
349
+ }
350
+
351
+ .relevance-fill {
352
+ height: 100%;
353
+ border-radius: 2px;
354
+ background: var(--accent);
355
+ transition: width 0.3s;
356
+ }
357
+
358
+ .loading {
359
+ display: flex;
360
+ align-items: center;
361
+ justify-content: center;
362
+ padding: 2rem;
363
+ color: var(--text-dim);
364
+ }
365
+
366
+ .loading::after {
367
+ content: '';
368
+ width: 20px;
369
+ height: 20px;
370
+ border: 2px solid var(--border);
371
+ border-top-color: var(--accent);
372
+ border-radius: 50%;
373
+ animation: spin 0.8s linear infinite;
374
+ margin-left: 0.5rem;
375
+ }
376
+
377
+ @keyframes spin {
378
+ to { transform: rotate(360deg); }
379
+ }
380
+
381
+ /* Journal entries */
382
+ .journal-entry {
383
+ padding: 0.625rem 0;
384
+ border-bottom: 1px solid rgba(51, 65, 85, 0.4);
385
+ }
386
+
387
+ .journal-entry:last-child { border-bottom: none; }
388
+
389
+ .journal-entry-header {
390
+ display: flex;
391
+ align-items: center;
392
+ gap: 0.5rem;
393
+ }
394
+
395
+ .journal-entry-title {
396
+ font-size: 0.85rem;
397
+ font-weight: 600;
398
+ color: var(--text);
399
+ flex: 1;
400
+ overflow: hidden;
401
+ text-overflow: ellipsis;
402
+ white-space: nowrap;
403
+ }
404
+
405
+ .journal-entry-time {
406
+ font-size: 0.7rem;
407
+ color: var(--text-dim);
408
+ white-space: nowrap;
409
+ flex-shrink: 0;
410
+ }
411
+
412
+ .journal-entry-content {
413
+ font-size: 0.75rem;
414
+ color: var(--text-soft);
415
+ margin-top: 0.25rem;
416
+ padding-left: calc(0.5rem + 60px);
417
+ line-height: 1.5;
418
+ }
419
+
420
+ /* Knowledge status rows */
421
+ .knowledge-row {
422
+ display: flex;
423
+ align-items: center;
424
+ gap: 0.5rem;
425
+ padding: 0.375rem 0;
426
+ border-bottom: 1px solid rgba(51, 65, 85, 0.3);
427
+ }
428
+
429
+ .knowledge-row:last-child { border-bottom: none; }
430
+
431
+ .knowledge-indicator {
432
+ font-size: 0.85rem;
433
+ width: 1.25rem;
434
+ text-align: center;
435
+ flex-shrink: 0;
436
+ }
437
+
438
+ .knowledge-name {
439
+ font-size: 0.8rem;
440
+ font-weight: 500;
441
+ color: var(--text);
442
+ flex: 1;
443
+ }
444
+
445
+ .knowledge-words {
446
+ font-size: 0.7rem;
447
+ color: var(--text-dim);
448
+ font-family: monospace;
449
+ }
450
+
451
+ /* Decision rows */
452
+ .decision-row {
453
+ padding: 0.5rem 0;
454
+ border-bottom: 1px solid rgba(51, 65, 85, 0.3);
455
+ }
456
+
457
+ .decision-row:last-child { border-bottom: none; }
458
+
459
+ .decision-title {
460
+ font-size: 0.8rem;
461
+ font-weight: 600;
462
+ color: var(--accent);
463
+ }
464
+
465
+ .decision-meta {
466
+ font-size: 0.65rem;
467
+ color: var(--text-dim);
468
+ margin-top: 0.125rem;
469
+ }
470
+
471
+ .decision-summary {
472
+ font-size: 0.7rem;
473
+ color: var(--text-soft);
474
+ margin-top: 0.25rem;
475
+ line-height: 1.4;
476
+ }
477
+
478
+ /* Memory search results */
479
+ .memory-result {
480
+ padding: 0.5rem 0;
481
+ border-bottom: 1px solid rgba(51, 65, 85, 0.3);
482
+ }
483
+
484
+ .memory-result:last-child { border-bottom: none; }
485
+
486
+ @media (max-width: 768px) {
487
+ .sidebar { width: 60px; padding: 1rem 0; }
488
+ .sidebar-brand h1 { display: none; }
489
+ .sidebar-brand .port-badge { display: none; }
490
+ .nav-item { padding: 0.625rem; text-align: center; font-size: 0; }
491
+ .nav-item::before { font-size: 1rem; }
492
+ .main-content { margin-left: 60px; padding: 1rem; }
493
+ .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; }
494
+ }
495
+ `;
496
+ }
497
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/dashboard/styles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAweN,CAAA;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -31,6 +31,7 @@ import { migrateServices } from "./commands/migrate-services.js";
31
31
  import { memoryInitCommand, memoryStatusCommand, memorySearchCommand, memoryIndexCommand } from "./commands/memory.js";
32
32
  import { listSkillsCommand, installSkillCommand, removeSkillCommand, updateSkillsCommand, searchSkillsCommand, } from "./commands/skills.js";
33
33
  import { ralphCommand, showRalphHelp } from "./commands/ralph.js";
34
+ import { peterCommand } from "./commands/peter.js";
34
35
  import { clawdbotSetupCommand, clawdbotStatusCommand } from "./commands/clawdbot.js";
35
36
  import { showDayPassStatus, hasWallet, getWalletAddress, } from "./utils/auth-guard.js";
36
37
  import { checkAndMigrate } from "./utils/jfl-migration.js";
@@ -41,7 +42,7 @@ const program = new Command();
41
42
  program
42
43
  .name("jfl")
43
44
  .description("Just Fucking Launch - AI gateway for GTM")
44
- .version("0.1.1")
45
+ .version("0.2.2")
45
46
  .option("--no-update", "Skip automatic update check")
46
47
  .action(async (options) => {
47
48
  // Always update on session start (unless --no-update flag)
@@ -81,13 +82,18 @@ program
81
82
  program
82
83
  .command("context-hub")
83
84
  .description("Manage Context Hub daemon (unified context for AI agents)")
84
- .argument("[action]", "start, stop, restart, status, ensure, query, serve")
85
+ .argument("[action]", "start, stop, restart, status, ensure, ensure-all, doctor, dashboard, install-daemon, uninstall-daemon, query, serve")
85
86
  .option("-p, --port <port>", "Port to run on (default: per-project)")
86
87
  .option("-g, --global", "Run in global mode (serve all GTM projects)")
88
+ .option("-q, --quiet", "Suppress output (for daemon use)")
89
+ .option("--clean", "Remove stale entries (for doctor)")
90
+ .option("--purge", "Also delete token file (for stop)")
91
+ .allowUnknownOption()
87
92
  .action(async (action, options) => {
88
93
  await contextHubCommand(action, {
89
94
  port: options.port ? parseInt(options.port, 10) : undefined,
90
95
  global: options.global || false,
96
+ quiet: options.quiet || false,
91
97
  });
92
98
  });
93
99
  program
@@ -570,6 +576,25 @@ program
570
576
  }
571
577
  await ralphCommand(args);
572
578
  });
579
+ program
580
+ .command("events")
581
+ .description("Live MAP event bus dashboard")
582
+ .option("-p, --pattern <pattern>", "Filter pattern (default: *)")
583
+ .action(async (options) => {
584
+ const { startEventDashboard } = await import("./ui/event-dashboard.js");
585
+ await startEventDashboard({ pattern: options.pattern });
586
+ });
587
+ program
588
+ .command("peter")
589
+ .description("Peter Parker - model-routed agent orchestrator")
590
+ .argument("[action]", "setup, run, or status")
591
+ .option("--cost", "Cost-optimized model routing (haiku-heavy)")
592
+ .option("--balanced", "Balanced model routing (default)")
593
+ .option("--quality", "Quality-first model routing (opus-heavy)")
594
+ .option("-t, --task <task>", "Task to run (for run action)")
595
+ .action(async (action, options) => {
596
+ await peterCommand(action, options);
597
+ });
573
598
  // ============================================================================
574
599
  // TEST MODE (for development)
575
600
  // ============================================================================
@@ -746,7 +771,9 @@ program
746
771
  console.log(" jfl content Content creator");
747
772
  console.log(" jfl voice Voice input commands");
748
773
  console.log(" jfl ralph AI agent loop (ralph-tui)");
749
- console.log(" jfl context-hub Context Hub (unified AI context)");
774
+ console.log(" jfl peter Peter Parker orchestrator (model routing)");
775
+ console.log(" jfl events Live event bus dashboard");
776
+ console.log(" jfl context-hub Context Hub (unified AI context + MAP event bus)");
750
777
  console.log(" jfl openclaw OpenClaw agent protocol");
751
778
  console.log(" jfl test Test onboarding (isolated)");
752
779
  console.log(chalk.cyan("\n Platform (requires login):"));