birdclaw 0.8.5 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +23 -3
  3. package/dist/cli/birdclaw.js +1344 -190
  4. package/dist/client/assets/{AvatarChip-DLoqM5xD.js → AvatarChip-BN3b4MhM.js} +1 -1
  5. package/dist/client/assets/{ProfilePreview-DQX6_xc3.js → ProfilePreview-CHbT0U9a.js} +1 -1
  6. package/dist/client/assets/{SavedTimelineView-BhSiVyR1.js → SavedTimelineView-mGXE9EYJ.js} +1 -1
  7. package/dist/client/assets/{SmartTimestamp-BR0-9se2.js → SmartTimestamp-DG8XJKUz.js} +1 -1
  8. package/dist/client/assets/TimelineRouteFrame-BmMC7qLj.js +1 -0
  9. package/dist/client/assets/blocks-CawnB0mN.js +1 -0
  10. package/dist/client/assets/{bookmarks-LbYOsoKf.js → bookmarks-DZIMTKEp.js} +1 -1
  11. package/dist/client/assets/client-stream-contracts-DcKcyZhg.js +5 -0
  12. package/dist/client/assets/{data-sources-euTr6T_L.js → data-sources-BJUT2qaO.js} +1 -1
  13. package/dist/client/assets/{discuss-BWKu_p7B.js → discuss-DMPJVaRk.js} +1 -1
  14. package/dist/client/assets/dms-BfPFG4Qr.js +1 -0
  15. package/dist/client/assets/{inbox-BybSI5Vf.js → inbox-DmeYJ7tt.js} +1 -1
  16. package/dist/client/assets/{index-DZVisyna.js → index-Bqmo4MbK.js} +6 -6
  17. package/dist/client/assets/likes-BxVL-j_C.js +1 -0
  18. package/dist/client/assets/{links-CIwqK_dX.js → links-BeA1Wt8F.js} +1 -1
  19. package/dist/client/assets/{mapbox-B4zqX7r0.js → mapbox-BTSMNSry.js} +2 -2
  20. package/dist/client/assets/{mapbox-gl-DYNcLcll.js → mapbox-gl-CPemBIlO.js} +1 -1
  21. package/dist/client/assets/{mentions-BoVVAIT7.js → mentions-DBrY-UPg.js} +1 -1
  22. package/dist/client/assets/{network-map-zRysIY_b.js → network-map-MqbE164r.js} +2 -2
  23. package/dist/client/assets/{profile-analyze-C_yDeX6-.js → profile-analyze-DEA75Reh.js} +1 -1
  24. package/dist/client/assets/{profile-hydration-client-YEtJsNTv.js → profile-hydration-client-BNe0sUmK.js} +1 -1
  25. package/dist/client/assets/{profiles._handle-DdIVPqU-.js → profiles._handle-K34ofz9U.js} +1 -1
  26. package/dist/client/assets/{query-client-fYu2rzRC.js → query-client-DUP1ZzP7.js} +1 -1
  27. package/dist/client/assets/{rate-limits-BWPmPOSh.js → rate-limits-B8Wmpt9r.js} +1 -1
  28. package/dist/client/assets/{routes-CiLuYpZr.js → routes-Bl-Lw2hN.js} +1 -1
  29. package/dist/client/assets/schemas-CaALBBpc.js +64 -0
  30. package/dist/client/assets/styles-zihNNCGg.css +2 -0
  31. package/dist/client/assets/today-DFvZ0Ys5.js +1 -0
  32. package/dist/client/assets/{useTimelineRouteData-BaO3Rna1.js → useTimelineRouteData-Cpf-Jqsx.js} +1 -1
  33. package/dist/server/assets/{AvatarChip-zUDAEmjL.js → AvatarChip-DWag3IzT.js} +1 -1
  34. package/dist/server/assets/{FeedState-ntW0Q2GB.js → FeedState-CwzcvP-p.js} +1 -1
  35. package/dist/server/assets/{ProfileAnalysisStream-L7bs6IHH.js → ProfileAnalysisStream-CLjrYzEx.js} +2 -2
  36. package/dist/server/assets/{ProfilePreview-Cg-AOHBE.js → ProfilePreview-Bq-DSUM2.js} +2 -2
  37. package/dist/server/assets/{SavedTimelineView-BtCq1dHk.js → SavedTimelineView-Bk9nfnb-.js} +2 -2
  38. package/dist/server/assets/{SmartTimestamp-DfwE1NGf.js → SmartTimestamp-C06w_f9J.js} +1 -1
  39. package/dist/server/assets/SyncNowButton-CKuXKYcd.js +259 -0
  40. package/dist/server/assets/{TimelineRouteFrame-CjMIh63G.js → TimelineRouteFrame-Bg3e7X_N.js} +5 -3
  41. package/dist/server/assets/{TweetRichText-DDywESRF.js → TweetRichText-wzUAtbPS.js} +2 -2
  42. package/dist/server/assets/{_tanstack-start-manifest_v-aLWUdbAc.js → _tanstack-start-manifest_v-CVfs07C8.js} +24 -24
  43. package/dist/server/assets/{blocks-DSgQghqP.js → blocks-CaP_u3mY.js} +3 -3
  44. package/dist/server/assets/{blocks-C1mgGTB3.js → blocks-DKy4yTF-.js} +3 -3
  45. package/dist/server/assets/{bookmarks-D_YkmCK3.js → bookmarks-CPFq3JVX.js} +1 -1
  46. package/dist/server/assets/{client-stream-contracts-Bq6kMmhh.js → client-stream-contracts-gtXEreFY.js} +72 -8
  47. package/dist/server/assets/{data-sources-BnA1Q94p.js → data-sources-DWwmQqcO.js} +1 -1
  48. package/dist/server/assets/{discuss-DAq6ehL9.js → discuss-BB8wFy4L.js} +3 -3
  49. package/dist/server/assets/{discuss-C1QMBBSk.js → discuss-CVGB4_I0.js} +3 -3
  50. package/dist/server/assets/{dms-DAyQrVM2.js → dms-7NzdyQZQ.js} +6 -6
  51. package/dist/server/assets/{dms-BuLj4bp8.js → dms-vbEumuuO.js} +4 -4
  52. package/dist/server/assets/{inbox-CkGOaW1q.js → inbox-CBeZctFd.js} +2 -2
  53. package/dist/server/assets/{inbox-DpWd1EzC.js → inbox-UpHhXODd.js} +4 -4
  54. package/dist/server/assets/{likes-BMm2JWYI.js → likes-CDAjYyTm.js} +1 -1
  55. package/dist/server/assets/{links-dqXb35YM.js → links-DU-TIHtg.js} +6 -6
  56. package/dist/server/assets/{links-Da4tjWtI.js → links-sQ3q2jvO.js} +6 -6
  57. package/dist/server/assets/{mentions-CEyEcOFw.js → mentions-DdndGSRw.js} +1 -1
  58. package/dist/server/assets/{network-map-D3CzRcC4.js → network-map-B9iOapuB.js} +2 -2
  59. package/dist/server/assets/{network-map-D5DoLOwR.js → network-map-CcOz-T9O.js} +2 -2
  60. package/dist/server/assets/{profile-analyze-DH1TSBkT.js → profile-analyze-BmDeTif5.js} +1 -1
  61. package/dist/server/assets/{profile-analyze-CGCj4VFd.js → profile-analyze-CUfXmXEH.js} +3 -3
  62. package/dist/server/assets/{profiles._handle-B5V-huoo.js → profiles._handle-8snagiR1.js} +4 -4
  63. package/dist/server/assets/{profiles._handle-CJ6rgzt8.js → profiles._handle-BAqnghwo.js} +5 -5
  64. package/dist/server/assets/{rate-limits-VAr2qzYD.js → rate-limits-BY2-aQPT.js} +1 -1
  65. package/dist/server/assets/{router-C4cz9ypd.js → router-CAvZOdfA.js} +437 -108
  66. package/dist/server/assets/{routes-B9aikOdB.js → routes-D9226vKz.js} +1 -1
  67. package/dist/server/assets/{today-JkxZXdBt.js → today-BmvIMJzI.js} +3 -3
  68. package/dist/server/assets/{today-B_TA16QG.js → today-DKWphGrC.js} +112 -57
  69. package/dist/server/assets/{ui-qbmcMSSX.js → ui-rDHeS-cc.js} +2 -1
  70. package/dist/server/assets/{useTimelineRouteData-BLXvMGb2.js → useTimelineRouteData-BmDbGvQ8.js} +7 -7
  71. package/dist/server/server.js +2 -2
  72. package/package.json +13 -13
  73. package/dist/client/assets/TimelineRouteFrame-9NDLnXzH.js +0 -1
  74. package/dist/client/assets/blocks-CFp_njvG.js +0 -1
  75. package/dist/client/assets/client-stream-contracts-sR4xMQxY.js +0 -5
  76. package/dist/client/assets/dms-SLXMtC4v.js +0 -1
  77. package/dist/client/assets/likes-dyh9p8y_.js +0 -1
  78. package/dist/client/assets/schemas-I9r6F6ya.js +0 -64
  79. package/dist/client/assets/styles-B8s3tt3r.css +0 -2
  80. package/dist/client/assets/today-BoO64YoY.js +0 -1
  81. package/dist/server/assets/SyncNowButton-BOn_IBXS.js +0 -76
package/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.9.1 - 2026-07-02
4
+
5
+ ### Added
6
+
7
+ - Route inbox scoring and Responses API requests through `BIRDCLAW_OPENAI_BASE_URL`, retain `OPENAI_BASE_URL` as a compatibility fallback, and add opt-in OpenAI transport diagnostics. (#89 - thanks @martintrojer)
8
+
9
+ ### Fixed
10
+
11
+ - Correct the seeded local account handle, display name, user ID, and stale avatar from the authenticated Bird identity during explicit profile hydration. (#88 - thanks @martintrojer)
12
+
13
+ ## 0.9.0 - 2026-07-02
14
+
15
+ ### Added
16
+
17
+ - Add explicit, rate-limited owned X List sync through Bird or xurl, durable List/member metadata with completeness state, deterministic backup shards, local List inspection, and `--list` / `--list-id` tweet search filters. (#65)
18
+ - Add opt-in, per-account Home and Mentions auto-sync with persisted intervals, overlap protection, hidden-page pauses, visible status, and failure backoff. (#73 - thanks @Gatsby1s)
19
+
20
+ ### Changed
21
+
22
+ - Refresh runtime and development dependencies to current supported releases, including Vite 8.1, Node 26 type definitions, and the July 1 TypeScript native preview.
23
+
24
+ ### Fixed
25
+
26
+ - Restore web Likes and Bookmarks sync when automatic transport selection falls back to Bird without all-pages mode. (#87 - thanks @zuyu)
27
+ - Bundle the TanStack Start H3 runtime into production server artifacts so installed npm packages can start without undeclared transitive dependencies.
28
+ - Add completed Today digest PDF export with route-scoped print styling, while excluding partial failed streams. (#77 - thanks @Gatsby1s)
29
+ - Make the Today digest's selected period visually distinct and expose its pressed state to assistive technology. (#72 - thanks @Gatsby1s)
30
+ - Keep backup Git commits inside the configured repository root and pin hashed backup text files to LF line endings. (#79 - thanks @rodriguez46p-ui)
31
+ - Persist profile avatars exposed by Bird's full live-sync payloads. (#75 - thanks @RajvardhanPatil07)
32
+ - Persist quoted tweet payloads returned by Bird-backed live syncs so quote cards render without a separate hydrate. (#76 - thanks @lukaskawerau)
33
+ - Keep included quote-only replies out of local replied/unreplied state during collection and thread-context syncs. (#76 - thanks @lukaskawerau)
34
+ - Show full tweet text in Today citation popovers instead of truncating long posts after six lines.
35
+ - Show inline tweet images in Today citation popovers instead of leaving media-only `t.co` links in the preview text.
36
+
3
37
  ## 0.8.5 - 2026-06-21
4
38
 
5
39
  ### Fixed
package/README.md CHANGED
@@ -26,6 +26,7 @@ Status: WIP. Real and usable. Not done. Expect schema churn, transport gaps, and
26
26
  - archive import streams bundled media files into the local originals cache and extracts `video_info.variants[]` for video and animated-GIF rows
27
27
  - live authored sync through `xurl`, plus likes and bookmarks through `xurl` or `bird`
28
28
  - cache-first followers/following sync through `bird` or `xurl`
29
+ - explicit owned X List and membership sync through `bird` or `xurl`, with durable completeness metadata
29
30
  - local follow graph queries for top followers, unfollows, mutuals, and non-mutual following
30
31
  - Git-friendly text backups with yearly tweet shards and per-conversation DM shards
31
32
  - profile hydration from live Twitter metadata
@@ -57,6 +58,7 @@ Status: WIP. Real and usable. Not done. Expect schema churn, transport gaps, and
57
58
  - OpenAI scoring hook for low-signal filtering
58
59
  - cached live mentions export in `xurl`-compatible JSON
59
60
  - liked/bookmarked tweet filters for archive and live-synced collections
61
+ - local tweet search scoped to cached X List membership by name or id
60
62
  - live profile-reply inspection for borderline AI/slop triage
61
63
  - one-shot blocklist import from a file for batch moderation passes
62
64
 
@@ -80,7 +82,7 @@ Status: WIP. Real and usable. Not done. Expect schema churn, transport gaps, and
80
82
 
81
83
  ### Runtime Architecture
82
84
 
83
- Birdclaw uses [Effect](https://effect.website/) for new and migrated I/O-heavy internals. The current Effect boundary covers browser API fetches, web sync orchestration, sync-job polling, `bird`/`xurl` subprocess helpers and public adapters, backup export/import/validation and Git orchestration, moderation action transport and target resolution, `bird` action/profile adapters, blocks/mutes write helpers, remote block sync, batch blocklist imports, authored/mentions/mention-thread sync including xurl recent-search and parent-walk fallback internals, conversation loading, home timeline, saved collection, DM live sync, profile hydration/resolution/affiliation/reply inspection, shared tweet lookup, research and whois report generation, follow graph live sync, link preview/index fetches, archive discovery/import subprocesses, avatar/URL caches, OpenAI/inbox scoring, scheduled bookmark sync locking/audit/launchd install, and the paced/concurrent `media fetch` archive-reuse and HTTP download pipeline.
85
+ Birdclaw uses [Effect](https://effect.website/) for new and migrated I/O-heavy internals. The current Effect boundary covers browser API fetches, web sync orchestration, sync-job polling, `bird`/`xurl` subprocess helpers and public adapters, backup export/import/validation and Git orchestration, moderation action transport and target resolution, `bird` action/profile adapters, blocks/mutes write helpers, remote block sync, batch blocklist imports, authored/mentions/mention-thread sync including xurl recent-search and parent-walk fallback internals, conversation loading, home timeline, saved collection, X List membership, DM live sync, profile hydration/resolution/affiliation/reply inspection, shared tweet lookup, research and whois report generation, follow graph live sync, link preview/index fetches, archive discovery/import subprocesses, avatar/URL caches, OpenAI/inbox scoring, scheduled bookmark sync locking/audit/launchd install, and the paced/concurrent `media fetch` archive-reuse and HTTP download pipeline.
84
86
 
85
87
  Public CLI and React call sites still expose plain `Promise` wrappers where that keeps the surrounding framework code simple. New core code should prefer `Effect` programs with typed error values, then add a Promise wrapper only at the outer CLI, route, or component boundary.
86
88
 
@@ -231,7 +233,7 @@ birdclaw import archive ~/Downloads/twitter-archive-2025.zip --json
231
233
 
232
234
  Don't have an archive yet? Request it from <https://x.com/settings/download_your_data>; X emails a download link when it is ready, which may take a few days. A fresh Birdclaw database needs the archive import to establish account identity before live sync. See [Archive Import → Get an archive](docs/archive.md#get-an-archive).
233
235
 
234
- Optional profile hydration can improve bios, follower counts, and avatars, but it performs live X profile reads and can spend API credits on large archives:
236
+ Optional profile hydration through xurl can improve bios, follower counts, and avatars, but it performs live X profile reads and can spend API credits on large archives. In Bird-only mode, the command corrects the seeded local account identity from `bird whoami` without bulk-hydrating imported profiles:
235
237
 
236
238
  ```bash
237
239
  birdclaw import hydrate-profiles --json
@@ -274,7 +276,7 @@ private proxy requires `BIRDCLAW_ALLOW_REMOTE_WEB=1`. To require an app-level
274
276
  token too, set `BIRDCLAW_WEB_TOKEN` and send it as `x-birdclaw-token` or a
275
277
  `birdclaw_token` cookie.
276
278
 
277
- Use the Sync button in Home, Mentions, Likes, Bookmarks, or DMs to run the matching live sync from the web UI and then reload the local view. These controls are explicit because live reads can be slow, auth-dependent, or rate-limited.
279
+ Use the Sync button in Home, Mentions, Likes, Bookmarks, or DMs to run the matching live sync from the web UI and then reload the local view. Manual sync remains the default because live reads can be slow, auth-dependent, or rate-limited. Home and Mentions also offer opt-in per-account auto-sync at 5m, 10m, 15m, 30m, or 1h intervals; the browser pauses hidden-page runs, prevents overlap, and backs off after failures.
278
280
 
279
281
  `BIRDCLAW_ALLOWED_HOSTS` applies only to the source `pnpm dev` server, not the
280
282
  built server started by `birdclaw serve`.
@@ -382,8 +384,24 @@ Notes:
382
384
  - `bird` mode uses your local `bird` CLI and caches its mentions output into birdclaw's canonical store
383
385
  - filters still work in `xurl` mode; filtered payloads are rebuilt from the local canonical store after sync
384
386
  - `sync authored`, `sync mentions`, `sync mention-threads`, `sync likes`, `sync bookmarks`, and `sync timeline` store live results in the canonical local store; per-account authored/home/mention/like/bookmark membership is kept as edges so shared tweets do not clobber account ownership
387
+ - `sync lists` explicitly reads owned Lists and a bounded number of membership pages; the safe default is 20 members per List, one page, and one second between Lists
385
388
  - the web UI has explicit Sync buttons for home timeline, mentions, likes, bookmarks, and DMs; they call the same sync paths and then reload the local DB-backed view
386
389
 
390
+ ### X Lists
391
+
392
+ List sync is explicit and read-only. It never creates, edits, or deletes a List:
393
+
394
+ ```bash
395
+ birdclaw sync lists --mode auto --json
396
+ birdclaw sync lists --mode bird --max-lists 20 --member-limit 100 --max-member-pages 3 --delay-ms 1500 --json
397
+ birdclaw lists list --json
398
+ birdclaw lists members Builders --json
399
+ birdclaw search tweets "sqlite" --list Builders --json
400
+ birdclaw search tweets "sqlite" --list-id 1234567890 --json
401
+ ```
402
+
403
+ Membership is stored as `complete`, `inferred`, `partial`, or `error`. Only a cursor-proven complete sync ends members that disappeared; inferred and partial runs preserve unseen edges. Search is offline and never triggers a live call.
404
+
387
405
  ### Research bookmarks and threads
388
406
 
389
407
  `birdclaw research` turns bookmarked tweets into a markdown brief with local thread expansion, live ancestor lookup when needed, and extracted links/handles:
@@ -574,6 +592,8 @@ data/timeline_edges/home.jsonl
574
592
  data/timeline_edges/mention.jsonl
575
593
  data/collections/likes.jsonl
576
594
  data/collections/bookmarks.jsonl
595
+ data/lists/lists.jsonl
596
+ data/lists/members.jsonl
577
597
  data/dms/conversations.jsonl
578
598
  data/dms/YYYY.jsonl
579
599
  data/moderation/blocks.jsonl