+21
-13
docs/git-history.json
+21
-13
docs/git-history.json
···
1
1
[
2
2
{
3
-
"hash": "581ed00fec3c0c5f472c6ff92e00bf4ed5b27e9a",
4
-
"short_hash": "581ed00",
3
+
"hash": "6ced3f0b015af1c9126559a393996576402cfd03",
4
+
"short_hash": "6ced3f0",
5
5
"author": "Ariel M. Lighty",
6
-
"date": "2025-12-26T13:47:37-05:00",
7
-
"message": "fix extension import: use bulkCreate and handle uploadId param\n\nBackend fixes:\n- Use SourceAccountRepository.bulkCreate() instead of non-existent upsertSourceAccount()\n- Change redirectUrl from /results?uploadId= to /?uploadId=\n- More efficient bulk insert instead of loop\n\nFrontend fixes:\n- Add useEffect to load results when uploadId param present\n- Calls loadUploadResults(uploadId) automatically on page load\n- Cleans up URL param after loading\n\nResolves:\n- \"sourceAccountRepo.upsertSourceAccount is not a function\" error\n- \"No routes matched location /results?uploadId=...\" routing error",
8
-
"files_changed": 4
6
+
"date": "2025-12-26T14:12:46-05:00",
7
+
"message": "fix extension flow: create user_source_follows, auto-search, time display\n\nBackend (extension-import.ts):\n- Now creates user_source_follows entries linking upload to source accounts\n- Without these, get-upload-details returned empty (queries FROM user_source_follows)\n- Uses bulkCreate return value (Map<username, id>) to create links\n\nFrontend (App.tsx):\n- handleLoadUpload now detects if upload has no matches yet\n- Sets isSearching: true for new uploads\n- Automatically triggers searchAllUsers for new uploads\n- Saves results after search completes\n- Changed platform from hardcoded \"tiktok\" to \"twitter\"\n\nFrontend (HistoryTab.tsx):\n- Fixed time display: removed \"Uploaded\" prefix\n- Now shows \"about 5 hours ago\" instead of \"Uploaded in about 5 hours\"\n- formatRelativeTime with addSuffix already provides complete sentence\n\nResolves:\n- Empty results on page load\n- No automatic searching\n- History navigation not working (will work after search)\n- Grammatically incorrect time display",
8
+
"files_changed": 5
9
+
},
10
+
{
11
+
"hash": "b6b8c3968bbe1d71e38d2acbea3f31c77f08656a",
12
+
"short_hash": "b6b8c39",
13
+
"author": "Ariel M. Lighty",
14
+
"date": "2025-12-26T13:52:59-05:00",
15
+
"message": "fix: correct function name to handleLoadUpload in uploadId useEffect",
16
+
"files_changed": 3
9
17
},
10
18
{
11
19
"hash": "581ed00fec3c0c5f472c6ff92e00bf4ed5b27e9a",
···
32
40
"files_changed": 2
33
41
},
34
42
{
43
+
"hash": "a203bc343b1768cd51e08b51ed296eddb51d21b7",
44
+
"short_hash": "a203bc3",
45
+
"author": "Ariel M. Lighty",
46
+
"date": "2025-12-26T00:50:44-05:00",
47
+
"message": "update documentation with current debugging status\n\nPLAN.md updates:\n- Added current status section with recent fixes and active work\n- Marked Phase 0 as complete\n- Marked Phase 1 as in progress (debugging)\n- Updated changelog with 2025-12-26 progress\n- Updated decision graph count to 288 nodes\n\nEXTENSION_STATUS.md updates:\n- Changed state from READY FOR TESTING to DEBUGGING\n- Added fixed issues section (NaN bug, database init)\n- Added active debugging section\n- Updated decision graph summary to 288 nodes\n- Added node references for recent fixes (#287-288)\n\nDecision graph:\n- Synced with latest nodes (288 total, 276 edges)\n- Tracked database initialization outcome",
48
+
"files_changed": 4
49
+
},
50
+
{
35
51
"hash": "34bd9dcd1237971a87627b148c0452b8484e4871",
36
52
"short_hash": "34bd9dc",
37
53
"author": "Ariel M. Lighty",
···
46
62
"date": "2025-12-26T00:33:21-05:00",
47
63
"message": "fix extension-import: add missing matchedUsers parameter to createUpload\n\nThe createUpload method expects 5 parameters but we were only passing 4,\ncausing NaN to be inserted for unmatched_users calculation. Now passing 0\nfor matchedUsers (will be updated after search is performed).",
48
64
"files_changed": 1
49
-
},
50
-
{
51
-
"hash": "a8a4b0a819297dec7b92d02036699cc86b2523ce",
52
-
"short_hash": "a8a4b0a",
53
-
"author": "Ariel M. Lighty",
54
-
"date": "2025-12-26T00:33:21-05:00",
55
-
"message": "fix extension-import: add missing matchedUsers parameter to createUpload\n\nThe createUpload method expects 5 parameters but we were only passing 4,\ncausing NaN to be inserted for unmatched_users calculation. Now passing 0\nfor matchedUsers (will be updated after search is performed).",
56
-
"files_changed": 3
57
65
},
58
66
{
59
67
"hash": "d0bcf337b6d223a86443f6f67767e87b74e4dd7d",
+99
docs/graph-data.json
+99
docs/graph-data.json
···
3398
3398
"created_at": "2025-12-26T14:11:09.055850200-05:00",
3399
3399
"updated_at": "2025-12-26T14:11:09.055850200-05:00",
3400
3400
"metadata_json": "{\"branch\":\"master\",\"confidence\":95}"
3401
+
},
3402
+
{
3403
+
"id": 310,
3404
+
"change_id": "51369a2c-17ec-4be3-ba4f-240b770d7211",
3405
+
"node_type": "outcome",
3406
+
"title": "Committed all extension flow fixes",
3407
+
"description": null,
3408
+
"status": "pending",
3409
+
"created_at": "2025-12-26T14:16:08.387214900-05:00",
3410
+
"updated_at": "2025-12-26T14:16:08.387214900-05:00",
3411
+
"metadata_json": "{\"branch\":\"master\",\"commit\":\"6ced3f0\",\"confidence\":95}"
3412
+
},
3413
+
{
3414
+
"id": 311,
3415
+
"change_id": "91d7bad2-a8a3-47c3-8fad-558919b207b0",
3416
+
"node_type": "observation",
3417
+
"title": "searchAllUsers called with wrong parameters - missing onProgressUpdate callback",
3418
+
"description": null,
3419
+
"status": "pending",
3420
+
"created_at": "2025-12-26T16:07:21.838974100-05:00",
3421
+
"updated_at": "2025-12-26T16:07:21.838974100-05:00",
3422
+
"metadata_json": "{\"branch\":\"master\",\"confidence\":90}"
3423
+
},
3424
+
{
3425
+
"id": 312,
3426
+
"change_id": "9a95c7e6-6339-475f-9b20-5fa3057e0a9f",
3427
+
"node_type": "action",
3428
+
"title": "Fix searchAllUsers call with correct parameters and callbacks",
3429
+
"description": null,
3430
+
"status": "pending",
3431
+
"created_at": "2025-12-26T16:08:18.523845400-05:00",
3432
+
"updated_at": "2025-12-26T16:08:18.523845400-05:00",
3433
+
"metadata_json": "{\"branch\":\"master\",\"confidence\":95}"
3434
+
},
3435
+
{
3436
+
"id": 313,
3437
+
"change_id": "5fae9da8-2a31-4f99-9686-7bfb28c443e8",
3438
+
"node_type": "outcome",
3439
+
"title": "Fixed searchAllUsers call - now passes onProgressUpdate and onComplete callbacks",
3440
+
"description": null,
3441
+
"status": "pending",
3442
+
"created_at": "2025-12-26T16:08:24.248208800-05:00",
3443
+
"updated_at": "2025-12-26T16:08:24.248208800-05:00",
3444
+
"metadata_json": "{\"branch\":\"master\",\"confidence\":95}"
3401
3445
}
3402
3446
],
3403
3447
"edges": [
···
6678
6722
"weight": 1.0,
6679
6723
"rationale": "Implementation complete",
6680
6724
"created_at": "2025-12-26T14:11:11.543447500-05:00"
6725
+
},
6726
+
{
6727
+
"id": 299,
6728
+
"from_node_id": 309,
6729
+
"to_node_id": 310,
6730
+
"from_change_id": "cd9b88e7-fe8d-4ee0-a187-e99eef0b7e64",
6731
+
"to_change_id": "51369a2c-17ec-4be3-ba4f-240b770d7211",
6732
+
"edge_type": "leads_to",
6733
+
"weight": 1.0,
6734
+
"rationale": "Committed to repository",
6735
+
"created_at": "2025-12-26T14:16:10.702697200-05:00"
6736
+
},
6737
+
{
6738
+
"id": 300,
6739
+
"from_node_id": 305,
6740
+
"to_node_id": 310,
6741
+
"from_change_id": "8ad6ef53-29a2-442e-b88f-9e0541634950",
6742
+
"to_change_id": "51369a2c-17ec-4be3-ba4f-240b770d7211",
6743
+
"edge_type": "leads_to",
6744
+
"weight": 1.0,
6745
+
"rationale": "All goals achieved",
6746
+
"created_at": "2025-12-26T14:16:12.935280500-05:00"
6747
+
},
6748
+
{
6749
+
"id": 301,
6750
+
"from_node_id": 310,
6751
+
"to_node_id": 311,
6752
+
"from_change_id": "51369a2c-17ec-4be3-ba4f-240b770d7211",
6753
+
"to_change_id": "91d7bad2-a8a3-47c3-8fad-558919b207b0",
6754
+
"edge_type": "leads_to",
6755
+
"weight": 1.0,
6756
+
"rationale": "New error found",
6757
+
"created_at": "2025-12-26T16:07:24.117669300-05:00"
6758
+
},
6759
+
{
6760
+
"id": 302,
6761
+
"from_node_id": 311,
6762
+
"to_node_id": 312,
6763
+
"from_change_id": "91d7bad2-a8a3-47c3-8fad-558919b207b0",
6764
+
"to_change_id": "9a95c7e6-6339-475f-9b20-5fa3057e0a9f",
6765
+
"edge_type": "leads_to",
6766
+
"weight": 1.0,
6767
+
"rationale": "Fix applied",
6768
+
"created_at": "2025-12-26T16:08:21.431326200-05:00"
6769
+
},
6770
+
{
6771
+
"id": 303,
6772
+
"from_node_id": 312,
6773
+
"to_node_id": 313,
6774
+
"from_change_id": "9a95c7e6-6339-475f-9b20-5fa3057e0a9f",
6775
+
"to_change_id": "5fae9da8-2a31-4f99-9686-7bfb28c443e8",
6776
+
"edge_type": "leads_to",
6777
+
"weight": 1.0,
6778
+
"rationale": "Implementation complete",
6779
+
"created_at": "2025-12-26T16:08:26.942822600-05:00"
6681
6780
}
6682
6781
]
6683
6782
}
+14
-8
packages/web/src/App.tsx
+14
-8
packages/web/src/App.tsx
···
206
206
207
207
// If no matches yet, trigger search
208
208
if (!hasMatches) {
209
-
setStatusMessage("Starting search for matches...");
210
209
const followLexicon = ATPROTO_APPS[currentDestinationAppId]?.followLexicon;
211
-
await searchAllUsers(loadedResults, followLexicon);
212
210
213
-
// Save results after search completes
214
-
const updatedResults = loadedResults.filter(r => !r.isSearching);
215
-
if (updatedResults.length > 0) {
216
-
await saveResults(uploadId, platform, updatedResults);
217
-
}
211
+
await searchAllUsers(
212
+
loadedResults,
213
+
(message) => setStatusMessage(message),
214
+
async () => {
215
+
// Search complete - save results
216
+
// Use current searchResults state which has been updated by searchAllUsers
217
+
const currentResults = searchResults.filter(r => !r.isSearching);
218
+
if (currentResults.length > 0) {
219
+
await saveResults(uploadId, platform, currentResults);
220
+
}
221
+
},
222
+
followLexicon
223
+
);
218
224
}
219
225
220
226
// Announce to screen readers only - visual feedback is navigation to results page
···
227
233
setCurrentStep("home");
228
234
}
229
235
},
230
-
[setStatusMessage, setCurrentStep, setSearchResults, setAriaAnnouncement, error, currentDestinationAppId, searchAllUsers, saveResults],
236
+
[setStatusMessage, setCurrentStep, setSearchResults, setAriaAnnouncement, error, currentDestinationAppId, searchAllUsers, saveResults, searchResults],
231
237
);
232
238
233
239
// Login handler