opencode-mem 2.3.7 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +15 -19
  2. package/dist/config.d.ts +4 -1
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +33 -39
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +40 -82
  7. package/dist/services/ai/validators/user-profile-validator.d.ts +0 -1
  8. package/dist/services/ai/validators/user-profile-validator.d.ts.map +1 -1
  9. package/dist/services/ai/validators/user-profile-validator.js +0 -17
  10. package/dist/services/api-handlers.d.ts +32 -3
  11. package/dist/services/api-handlers.d.ts.map +1 -1
  12. package/dist/services/api-handlers.js +89 -13
  13. package/dist/services/auto-capture.d.ts.map +1 -1
  14. package/dist/services/auto-capture.js +34 -34
  15. package/dist/services/language-detector.d.ts +3 -0
  16. package/dist/services/language-detector.d.ts.map +1 -0
  17. package/dist/services/language-detector.js +16 -0
  18. package/dist/services/secret-resolver.d.ts +2 -0
  19. package/dist/services/secret-resolver.d.ts.map +1 -0
  20. package/dist/services/secret-resolver.js +55 -0
  21. package/dist/services/user-memory-learning.d.ts.map +1 -1
  22. package/dist/services/user-memory-learning.js +27 -33
  23. package/dist/services/user-profile/types.d.ts +0 -5
  24. package/dist/services/user-profile/types.d.ts.map +1 -1
  25. package/dist/services/user-profile/user-profile-manager.d.ts.map +1 -1
  26. package/dist/services/user-profile/user-profile-manager.js +0 -7
  27. package/dist/services/user-prompt/user-prompt-manager.d.ts +2 -0
  28. package/dist/services/user-prompt/user-prompt-manager.d.ts.map +1 -1
  29. package/dist/services/user-prompt/user-prompt-manager.js +21 -0
  30. package/dist/web/app.js +191 -112
  31. package/dist/web/styles.css +202 -122
  32. package/package.json +3 -1
@@ -314,6 +314,55 @@ button:disabled {
314
314
  height: 16px;
315
315
  }
316
316
 
317
+ .combined-card {
318
+ border: 1px solid #333;
319
+ margin-bottom: 20px;
320
+ background: #0a0a0a;
321
+ }
322
+
323
+ .combined-card.selected {
324
+ border-color: #00ff00;
325
+ }
326
+
327
+ .combined-prompt-section {
328
+ padding: 15px;
329
+ background: rgba(0, 204, 255, 0.05);
330
+ border-bottom: 1px dashed #333;
331
+ }
332
+
333
+ .combined-header {
334
+ display: flex;
335
+ justify-content: space-between;
336
+ margin-bottom: 10px;
337
+ }
338
+
339
+ .combined-divider {
340
+ display: flex;
341
+ justify-content: center;
342
+ align-items: center;
343
+ height: 20px;
344
+ background: #111;
345
+ border-top: 1px solid #222;
346
+ border-bottom: 1px solid #222;
347
+ }
348
+
349
+ .divider-icon {
350
+ width: 14px;
351
+ height: 14px;
352
+ color: #666;
353
+ }
354
+
355
+ .combined-memory-section {
356
+ padding: 15px;
357
+ background: rgba(0, 255, 0, 0.02);
358
+ }
359
+
360
+ .badge-memory {
361
+ color: #00ff00;
362
+ border-color: #00ff00;
363
+ font-weight: bold;
364
+ }
365
+
317
366
  .memories-section {
318
367
  border: 1px solid #333;
319
368
  padding: 20px;
@@ -1189,194 +1238,225 @@ textarea:focus-visible {
1189
1238
  .profile-header {
1190
1239
  display: flex;
1191
1240
  justify-content: space-between;
1192
- align-items: flex-start;
1193
- padding: 20px;
1241
+ align-items: center;
1242
+ padding: 15px;
1194
1243
  margin-bottom: 20px;
1195
- border: 1px solid #00ccff;
1196
- background: rgba(0, 204, 255, 0.05);
1244
+ border: 1px solid #333;
1245
+ background: #111;
1246
+ border-left: 3px solid #00ccff;
1197
1247
  }
1198
1248
 
1199
1249
  .profile-info h3 {
1200
1250
  color: #00ccff;
1201
- font-size: 18px;
1202
- margin-bottom: 8px;
1251
+ font-size: 16px;
1252
+ margin: 0 0 10px 0;
1253
+ letter-spacing: 0.5px;
1203
1254
  }
1204
1255
 
1205
- .profile-meta {
1206
- color: #888;
1256
+ .profile-stats {
1257
+ display: flex;
1258
+ gap: 15px;
1259
+ }
1260
+
1261
+ .stat-pill {
1262
+ display: flex;
1263
+ flex-direction: column;
1264
+ }
1265
+
1266
+ .stat-pill .label {
1267
+ font-size: 9px;
1268
+ color: #666;
1269
+ text-transform: uppercase;
1270
+ }
1271
+
1272
+ .stat-pill .value {
1207
1273
  font-size: 12px;
1274
+ color: #ccc;
1275
+ font-family: monospace;
1208
1276
  }
1209
1277
 
1210
- .profile-meta span {
1211
- margin-right: 8px;
1278
+ .dashboard-grid {
1279
+ display: grid;
1280
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1281
+ gap: 20px;
1212
1282
  }
1213
1283
 
1214
- .profile-section h4 {
1215
- color: #00ccff;
1216
- font-size: 14px;
1284
+ .dashboard-section {
1285
+ background: #111;
1286
+ border: 1px solid #333;
1287
+ padding: 15px;
1288
+ display: flex;
1289
+ flex-direction: column;
1290
+ }
1291
+
1292
+ .dashboard-section.full-width {
1293
+ grid-column: 1 / -1;
1294
+ }
1295
+
1296
+ .dashboard-section h4 {
1297
+ color: #888;
1298
+ font-size: 11px;
1217
1299
  margin-bottom: 15px;
1218
1300
  padding-bottom: 8px;
1219
- border-bottom: 1px solid #333;
1301
+ border-bottom: 1px solid #222;
1220
1302
  display: flex;
1221
1303
  align-items: center;
1222
- gap: 8px;
1304
+ gap: 6px;
1305
+ letter-spacing: 1px;
1223
1306
  }
1224
1307
 
1225
- .empty-text {
1226
- color: #666;
1227
- font-style: italic;
1228
- padding: 20px;
1229
- text-align: center;
1308
+ .dashboard-section h4 .count {
1309
+ background: #222;
1310
+ color: #ccc;
1311
+ padding: 1px 6px;
1312
+ border-radius: 10px;
1313
+ font-size: 9px;
1314
+ margin-left: auto;
1315
+ }
1316
+
1317
+ .cards-grid {
1318
+ display: grid;
1319
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
1320
+ gap: 10px;
1230
1321
  }
1231
1322
 
1232
- .preferences-list,
1233
- .patterns-list,
1234
- .workflows-list {
1323
+ .compact-card {
1324
+ background: #0a0a0a;
1325
+ border: 1px solid #2a2a2a;
1326
+ padding: 10px;
1327
+ transition: all 0.2s ease;
1235
1328
  display: flex;
1236
1329
  flex-direction: column;
1237
- gap: 12px;
1238
- margin-bottom: 20px;
1330
+ justify-content: space-between;
1239
1331
  }
1240
1332
 
1241
- .preference-item,
1242
- .pattern-item,
1243
- .workflow-item {
1244
- border: 1px solid #333;
1245
- padding: 15px;
1246
- background: #0a0a0a;
1247
- transition: border-color 0.2s;
1333
+ .compact-card:hover {
1334
+ border-color: #444;
1335
+ transform: translateY(-1px);
1248
1336
  }
1249
1337
 
1250
- .preference-item:hover,
1251
- .pattern-item:hover,
1252
- .workflow-item:hover {
1253
- border-color: #00ccff;
1338
+ .preference-card {
1339
+ border-top: 2px solid #00ccff;
1254
1340
  }
1255
1341
 
1256
- .preference-header,
1257
- .pattern-header,
1258
- .workflow-header {
1342
+ .pattern-card {
1343
+ border-top: 2px solid #ffaa00;
1344
+ }
1345
+
1346
+ .card-top {
1259
1347
  display: flex;
1260
1348
  justify-content: space-between;
1261
- align-items: center;
1262
- margin-bottom: 10px;
1349
+ align-items: flex-start;
1350
+ margin-bottom: 8px;
1263
1351
  }
1264
1352
 
1265
- .preference-name,
1266
- .pattern-name,
1267
- .workflow-name {
1268
- color: #e0e0e0;
1269
- font-weight: bold;
1270
- flex: 1;
1353
+ .category-tag {
1354
+ font-size: 9px;
1355
+ text-transform: uppercase;
1356
+ color: #666;
1357
+ background: #161616;
1358
+ padding: 2px 6px;
1359
+ border-radius: 2px;
1360
+ border: 1px solid #222;
1271
1361
  }
1272
1362
 
1273
- .confidence-badge,
1274
- .frequency-badge {
1275
- background: #00ccff;
1276
- color: #0a0a0a;
1277
- padding: 4px 10px;
1278
- border-radius: 3px;
1279
- font-size: 11px;
1363
+ .confidence-ring {
1364
+ font-size: 9px;
1365
+ color: #00ccff;
1280
1366
  font-weight: bold;
1281
1367
  }
1282
1368
 
1283
- .confidence-bar,
1284
- .frequency-bar {
1285
- height: 6px;
1286
- background: #222;
1287
- border-radius: 3px;
1288
- overflow: hidden;
1289
- margin-bottom: 10px;
1369
+ .card-body {
1370
+ margin-bottom: 8px;
1290
1371
  }
1291
1372
 
1292
- .confidence-fill {
1293
- height: 100%;
1294
- background: #00ccff;
1295
- transition: width 0.3s;
1373
+ .card-text {
1374
+ font-size: 12px;
1375
+ color: #d0d0d0;
1376
+ line-height: 1.4;
1296
1377
  }
1297
1378
 
1298
- .frequency-fill {
1299
- height: 100%;
1300
- background: #00ccff;
1301
- transition: width 0.3s;
1379
+ .card-footer {
1380
+ border-top: 1px solid #1a1a1a;
1381
+ padding-top: 6px;
1382
+ margin-top: auto;
1302
1383
  }
1303
1384
 
1304
- .preference-evidence {
1305
- color: #888;
1306
- font-size: 12px;
1307
- font-style: italic;
1308
- margin-bottom: 5px;
1385
+ .evidence-toggle {
1386
+ font-size: 10px;
1387
+ color: #555;
1388
+ cursor: help;
1389
+ display: flex;
1390
+ align-items: center;
1391
+ gap: 4px;
1309
1392
  }
1310
1393
 
1311
- .preference-meta,
1312
- .pattern-meta {
1313
- color: #666;
1314
- font-size: 11px;
1394
+ .evidence-toggle:hover {
1395
+ color: #888;
1315
1396
  }
1316
1397
 
1317
- .workflow-steps {
1398
+ .workflows-grid {
1318
1399
  display: flex;
1319
1400
  flex-direction: column;
1320
- gap: 8px;
1321
- margin-top: 10px;
1322
- }
1323
-
1324
- .workflow-step {
1325
- display: flex;
1326
- align-items: center;
1327
1401
  gap: 10px;
1328
- padding: 8px;
1329
- background: #111;
1330
- border-left: 2px solid #00ccff;
1331
1402
  }
1332
- .step-number {
1333
- background: #00ccff;
1334
- color: #0a0a0a;
1335
- width: 24px;
1336
- height: 24px;
1337
- border-radius: 50%;
1338
- display: flex;
1339
- align-items: center;
1340
- justify-content: center;
1341
- font-size: 11px;
1342
- font-weight: bold;
1343
- flex-shrink: 0;
1403
+
1404
+ .workflow-row {
1405
+ background: #0a0a0a;
1406
+ border: 1px solid #2a2a2a;
1407
+ padding: 12px;
1344
1408
  }
1345
1409
 
1346
- .step-text {
1347
- color: #ccc;
1410
+ .workflow-title {
1348
1411
  font-size: 12px;
1412
+ color: #ffcc00;
1413
+ font-weight: bold;
1414
+ margin-bottom: 10px;
1349
1415
  }
1350
1416
 
1351
- .skill-level {
1352
- display: grid;
1353
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1354
- gap: 15px;
1355
- padding: 15px;
1356
- background: #0a0a0a;
1357
- border: 1px solid #333;
1417
+ .workflow-steps-horizontal {
1418
+ display: flex;
1419
+ flex-wrap: wrap;
1420
+ align-items: center;
1421
+ gap: 8px;
1358
1422
  }
1359
1423
 
1360
- .skill-item {
1424
+ .step-node {
1361
1425
  display: flex;
1362
- justify-content: space-between;
1363
1426
  align-items: center;
1364
- padding: 10px;
1365
- border-left: 3px solid #00ccff;
1366
1427
  background: #111;
1428
+ border: 1px solid #333;
1429
+ border-radius: 4px;
1430
+ padding: 4px 8px;
1431
+ gap: 6px;
1367
1432
  }
1368
1433
 
1369
- .skill-label {
1434
+ .step-idx {
1435
+ font-size: 9px;
1436
+ background: #222;
1370
1437
  color: #888;
1371
- font-size: 12px;
1372
- text-transform: capitalize;
1438
+ width: 16px;
1439
+ height: 16px;
1440
+ display: flex;
1441
+ align-items: center;
1442
+ justify-content: center;
1443
+ border-radius: 50%;
1373
1444
  }
1374
1445
 
1375
- .skill-value {
1376
- color: #00ccff;
1377
- font-weight: bold;
1378
- font-size: 13px;
1379
- text-transform: uppercase;
1446
+ .step-content {
1447
+ font-size: 11px;
1448
+ color: #bbb;
1449
+ }
1450
+
1451
+ .step-arrow {
1452
+ width: 12px;
1453
+ height: 12px;
1454
+ color: #444;
1455
+ }
1456
+
1457
+ .icon-xs {
1458
+ width: 10px;
1459
+ height: 10px;
1380
1460
  }
1381
1461
 
1382
1462
  .changelog-list {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-mem",
3
- "version": "2.3.7",
3
+ "version": "2.5.0",
4
4
  "description": "OpenCode plugin that gives coding agents persistent memory using local vector database",
5
5
  "type": "module",
6
6
  "main": "dist/plugin.js",
@@ -34,6 +34,8 @@
34
34
  "dependencies": {
35
35
  "@opencode-ai/plugin": "^1.0.162",
36
36
  "@xenova/transformers": "^2.17.2",
37
+ "franc-min": "^6.2.0",
38
+ "iso-639-3": "^3.0.1",
37
39
  "sqlite-vec": "^0.1.7-alpha.2"
38
40
  },
39
41
  "devDependencies": {