birdclaw 0.9.5 → 0.11.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 (106) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +28 -9
  3. package/dist/cli/birdclaw.js +12422 -10181
  4. package/dist/client/assets/FeedState-DhMv4zXD.js +1 -0
  5. package/dist/client/assets/ProfileAnalysisStream-B8zyyye-.js +1 -0
  6. package/dist/client/assets/SavedTimelineView-CFgHR6di.js +1 -0
  7. package/dist/client/assets/SyncNowButton-DDYT2jQT.js +1 -0
  8. package/dist/client/assets/TimelineRouteFrame-DcipwBqo.js +1 -0
  9. package/dist/client/assets/TweetRichText-D-amgcEl.js +1 -0
  10. package/dist/client/assets/account-selection-h7m9xmzU.js +1 -0
  11. package/dist/client/assets/blocks-GWWj1dXr.js +1 -0
  12. package/dist/client/assets/blocks-qrevFiNI.js +2 -0
  13. package/dist/client/assets/{bookmarks-f8mrhE5v.js → bookmarks-BMf6Ytua.js} +1 -1
  14. package/dist/client/assets/chevron-down-e-c5H12y.js +1 -0
  15. package/dist/client/assets/circle-DiJUdlek.js +1 -0
  16. package/dist/client/assets/data-sources-CqxgDfE3.js +1 -0
  17. package/dist/client/assets/database-Dl3XWRaa.js +1 -0
  18. package/dist/client/assets/discuss-BeFPn8mN.js +2 -0
  19. package/dist/client/assets/discuss-ZvGdSAmA.js +1 -0
  20. package/dist/client/assets/dms-CMp6bAR_.js +1 -0
  21. package/dist/client/assets/dms-DBexFtGg.js +2 -0
  22. package/dist/client/assets/external-link-CfdTAkvn.js +1 -0
  23. package/dist/client/assets/gauge-DP2ku9zz.js +1 -0
  24. package/dist/client/assets/heart-D-ERjZPN.js +1 -0
  25. package/dist/client/assets/inbox-CeGwsGo_.js +1 -0
  26. package/dist/client/assets/inbox-DvSRkOiH.js +2 -0
  27. package/dist/client/assets/index-Bz8aYylW.js +31 -0
  28. package/dist/client/assets/lazyRouteComponent-CLLbUvMd.js +1 -0
  29. package/dist/client/assets/{likes-bYLP-Iur.js → likes-BaljrAHC.js} +1 -1
  30. package/dist/client/assets/links-CbC-fX7T.js +2 -0
  31. package/dist/client/assets/links-DMGuDd-B.js +1 -0
  32. package/dist/client/assets/mapbox-DfIoNJn2.js +2 -0
  33. package/dist/client/assets/mapbox-gl-BdaHQI9U.js +3220 -0
  34. package/dist/client/assets/{mentions-CceV_r9w.js → mentions-TFNyR9F4.js} +1 -1
  35. package/dist/client/assets/message-circle-79LZr2oN.js +1 -0
  36. package/dist/client/assets/network-map-1fXIqI3Y.js +2 -0
  37. package/dist/client/assets/network-map-CKiXfloJ.js +2 -0
  38. package/dist/client/assets/network-map-CrXvY--k.css +1 -0
  39. package/dist/client/assets/preload-helper-MpqUbZCn.js +1 -0
  40. package/dist/client/assets/profile-analyze-B5Rr41WP.js +2 -0
  41. package/dist/client/assets/profile-analyze-BqvM9hSa.js +1 -0
  42. package/dist/client/assets/{profile-hydration-client-kffyMcqf.js → profile-hydration-client-DoFW3yKH.js} +1 -1
  43. package/dist/client/assets/profiles._handle-DWyWAGG8.js +1 -0
  44. package/dist/client/assets/profiles._handle-DdZ9wAT-.js +2 -0
  45. package/dist/client/assets/query-client-CA-do_IS.js +17 -0
  46. package/dist/client/assets/rate-limits-DyRTb_U4.js +1 -0
  47. package/dist/client/assets/refresh-cw-IUfM9D_1.js +1 -0
  48. package/dist/client/assets/route-search-CmZT7pGD.js +1 -0
  49. package/dist/client/assets/{routes-DYUCTi0s.js → routes-P7NzOusD.js} +1 -1
  50. package/dist/client/assets/styles-CjeA43Ci.css +2 -0
  51. package/dist/client/assets/today-DOUIqDPa.js +2 -0
  52. package/dist/client/assets/today-Dq8qoGhX.js +1 -0
  53. package/dist/client/assets/useDebouncedValue-BJLRInUq.js +1 -0
  54. package/dist/client/assets/useQuery-CL_NXLnc.js +1 -0
  55. package/dist/client/assets/useTimelineRouteData-2v9TVG9L.js +1 -0
  56. package/dist/client/assets/user-search-DL5_6EZd.js +1 -0
  57. package/dist/server/assets/{SavedTimelineView-BGZvQIYS.js → SavedTimelineView-lVz_ZZnh.js} +2 -2
  58. package/dist/server/assets/{SyncNowButton-CsgOFaO_.js → SyncNowButton-C3OQghU4.js} +5 -3
  59. package/dist/server/assets/{TimelineRouteFrame-BWWFisJF.js → TimelineRouteFrame-Dj1TeYrD.js} +2 -2
  60. package/dist/server/assets/_tanstack-start-manifest_v-DQT-Q-zz.js +221 -0
  61. package/dist/server/assets/{blocks-VXmcBqKD.js → blocks-BSvPOa_E.js} +2 -2
  62. package/dist/server/assets/{blocks-DWZAKPAX.js → blocks-Cv7I4iVs.js} +2 -2
  63. package/dist/server/assets/{bookmarks-B-I4ELcA.js → bookmarks-BcFpV8qD.js} +1 -1
  64. package/dist/server/assets/{discuss-4b2z14mT.js → discuss-BuLhalye.js} +2 -2
  65. package/dist/server/assets/{discuss-CJ_vThu8.js → discuss-D1q_L77A.js} +2 -2
  66. package/dist/server/assets/{dms-BAKB1Mia.js → dms-C-s5l0cs.js} +4 -4
  67. package/dist/server/assets/{dms-BCI8W9u2.js → dms-OtbAd5nR.js} +3 -3
  68. package/dist/server/assets/{empty-plugin-adapters-D9UWiqvJ.js → empty-plugin-adapters-YdH6Vqte.js} +1 -1
  69. package/dist/server/assets/{inbox-D607zrwZ.js → inbox-Wf8xGIjq.js} +2 -2
  70. package/dist/server/assets/{inbox-BJzEE8Aa.js → inbox-wLir608r.js} +1 -1
  71. package/dist/server/assets/{likes-CMQGc5bh.js → likes-BfFIyEbU.js} +1 -1
  72. package/dist/server/assets/{links-BU_FRxcz.js → links-BWt4ORY4.js} +2 -2
  73. package/dist/server/assets/{links-Dz-6bmkg.js → links-_ePW92kI.js} +2 -2
  74. package/dist/server/assets/{mentions-B2K8tGvx.js → mentions-oO4uv0Ju.js} +1 -1
  75. package/dist/server/assets/{network-map-BLqLL8CR.js → network-map-S3bgKEDj.js} +1 -1
  76. package/dist/server/assets/{network-map-DvfpJQy1.js → network-map-rmU1NSHD.js} +1 -1
  77. package/dist/server/assets/{router-DeGdUXyx.js → router-DY-ahyjD.js} +14730 -14056
  78. package/dist/server/assets/{routes-C4caR_ZX.js → routes-CYJ-dTi6.js} +1 -1
  79. package/dist/server/assets/start-CHdfdlfD.js +4 -0
  80. package/dist/server/assets/{today-CRa6Y-Tg.js → today-BLDqhLvT.js} +2 -2
  81. package/dist/server/assets/{today-CScZDxQx.js → today-D8zExFWH.js} +2 -2
  82. package/dist/server/server.js +3515 -51
  83. package/package.json +89 -91
  84. package/dist/client/assets/SavedTimelineView-HNbc1InN.js +0 -1
  85. package/dist/client/assets/TimelineRouteFrame-DUF8ETx2.js +0 -1
  86. package/dist/client/assets/blocks-CLV8UyL1.js +0 -1
  87. package/dist/client/assets/data-sources-obqEq3vx.js +0 -1
  88. package/dist/client/assets/discuss-IVQmzPlf.js +0 -1
  89. package/dist/client/assets/dms-Dz53c2A8.js +0 -1
  90. package/dist/client/assets/inbox-OtMwyDqg.js +0 -1
  91. package/dist/client/assets/index-bpFrQ5yG.css +0 -1
  92. package/dist/client/assets/index-gdLl886E.js +0 -31
  93. package/dist/client/assets/links-Calv868h.js +0 -1
  94. package/dist/client/assets/mapbox-D8DIktls.js +0 -2
  95. package/dist/client/assets/mapbox-gl-CL_i4VMi.js +0 -3215
  96. package/dist/client/assets/network-map-7r9If3kD.js +0 -2
  97. package/dist/client/assets/profile-analyze-BeyDxO7C.js +0 -1
  98. package/dist/client/assets/profiles._handle-BH11vR7-.js +0 -1
  99. package/dist/client/assets/query-client-CD880OPj.js +0 -17
  100. package/dist/client/assets/rate-limits-pf5ibAYx.js +0 -1
  101. package/dist/client/assets/styles-DAoXpgpq.css +0 -2
  102. package/dist/client/assets/today-CwzttriK.js +0 -1
  103. package/dist/client/assets/useTimelineRouteData-BE84vgO5.js +0 -1
  104. package/dist/server/assets/_tanstack-start-manifest_v-AFEKQ2i-.js +0 -148
  105. package/dist/server/assets/start-5Z2QO8AU.js +0 -4
  106. package/dist/server/assets/{useTimelineRouteData-BWxx9yQl.js → useTimelineRouteData-wthflgOe.js} +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,50 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.11.0 - 2026-07-18
4
+
5
+ ### Highlights
6
+
7
+ - Choose an existing account independently for each live operation without changing the database's persistent account identity.
8
+ - Start a fully local sample archive with `init --demo` for immediate zero-auth exploration.
9
+
10
+ ### Added
11
+
12
+ - Select existing accounts per live operation with `--account <username>` or `accounts.default`, including sync, profile hydration, DMs, compose, moderation, and scheduled jobs, without changing persistent database identity. (idea from #97 - thanks @ivankuznetsov)
13
+ - Add explicit `init --demo` sample data for zero-auth offline exploration while keeping normal initialization empty.
14
+
15
+ ### Fixed
16
+
17
+ - Keep `birdclaw db stats` local-only so it does not block on unrelated macOS archive discovery.
18
+
19
+ ### Dependencies and maintenance
20
+
21
+ - Update `lucide-react` to 1.25.0, `@tanstack/react-start` to 1.168.30, and the pnpm 10 release pin to 10.34.5.
22
+
23
+ ## 0.10.0 - 2026-07-17
24
+
25
+ ### Highlights
26
+
27
+ - Connect agents to account-scoped cached tweet search and thread research through a disabled-by-default, bearer-authenticated read-only MCP endpoint.
28
+ - Import named public tweets without X credentials through an explicit read-only FxTwitter opt-in, with durable provenance and third-party disclosure guidance.
29
+ - Run Bird-backed live workflows on Windows through trusted Git Bash discovery, portable-install overrides, and preserved subprocess diagnostics.
30
+ - Move to Node 26.5.0, current direct dependencies, and xurl-first live-transport onboarding while retaining existing private Bird compatibility.
31
+
32
+ ### Added
33
+
34
+ - Add a disabled-by-default, bearer-authenticated read-only MCP endpoint with strict account, storage, virtual-host, origin, path, request-size, concurrency, and result-size isolation; expose only cached tweet search and thread tools, excluding DMs, live X, OpenAI, filesystem access, and writes. (#95)
35
+ - Add explicit public-tweet import through the fixed read-only FxTwitter endpoint, reject redirects and custom origins, persist `fxtwitter` source rows through backup schema v5, and document the requested-ID and network-metadata disclosure. (#103; proposal #99 - thanks @0xdevalias)
36
+
37
+ ### Transport and platform
38
+
39
+ - Run Bird subprocesses through trusted Git Bash discovery on Windows, preserve slash-prefixed arguments and diagnostics, and support a documented `BIRDCLAW_BASH_COMMAND` override for portable Git installations. (#94 - thanks @kristofer-atlas)
40
+ - Recommend xurl for new live-transport setups, remove deprecated public Bird installation/repository guidance, preserve existing private Bird compatibility, and report unavailable xurl states as local/archive mode. (#100; issue #93 - thanks @TheAngryPit)
41
+ - Move the supported runtime from EOL Node 25.8.1 to Node 26.5.0, adopt TypeScript 7, and refresh all compatible direct runtime and development dependencies. (#102)
42
+
43
+ ### Testing and maintenance
44
+
45
+ - Stabilize filtered mention rendering coverage by waiting for the refetched card before exercising reply behavior. (#101)
46
+ - Refresh compatible transitive lockfile resolutions after verifying every direct runtime and development dependency is current. (#104)
47
+
3
48
  ## 0.9.5 - 2026-07-06
4
49
 
5
50
  ### Fixed
package/README.md CHANGED
@@ -23,6 +23,7 @@ Status: WIP. Real and usable. Not done. Expect schema churn, transport gaps, and
23
23
  - archive import for tweets, likes, followers/following, profiles, and full DMs
24
24
  - selective archive re-imports for one stale slice without wiping the rest of the local store
25
25
  - archive import for bookmark exports when present
26
+ - explicit, disabled-by-default import of named public tweets through the fixed read-only FxTwitter endpoint, with durable source provenance
26
27
  - archive import streams bundled media files into the local originals cache and extracts `video_info.variants[]` for video and animated-GIF rows
27
28
  - live authored sync through `xurl`, plus likes and bookmarks through `xurl` or `bird`
28
29
  - cache-first followers/following sync through `bird` or `xurl`
@@ -76,9 +77,11 @@ Status: WIP. Real and usable. Not done. Expect schema churn, transport gaps, and
76
77
  ### Safety
77
78
 
78
79
  - local-first by default
80
+ - public FxTwitter import never runs automatically and requires a per-invocation flag that discloses the third-party request tradeoff
79
81
  - tests disable live writes
80
82
  - CI disables live writes
81
- - app has no auth layer because it is a local-only tool
83
+ - local web access has no default auth layer; the optional MCP endpoint uses a
84
+ separate bearer token and still requires a loopback origin connection
82
85
 
83
86
  ### Runtime Architecture
84
87
 
@@ -177,11 +180,11 @@ Notes:
177
180
 
178
181
  ## Requirements
179
182
 
180
- - Node `25.8.1` or Node 26.x
183
+ - Node `26.5.0`
181
184
  - `pnpm`
182
185
  - macOS recommended for Spotlight archive discovery
183
- - `xurl` optional for live reads / writes
184
- - `bird` optional for cookie-backed likes, bookmarks, mentions, DMs, and write fallback
186
+ - `xurl` recommended for live reads / writes
187
+ - an existing private `bird` installation is optional for cookie-backed likes, bookmarks, mentions, DMs, and write fallback
185
188
  - OpenAI API key optional for inbox scoring
186
189
 
187
190
  ## Install
@@ -221,7 +224,9 @@ birdclaw auth status --json
221
224
  birdclaw db stats --json
222
225
  ```
223
226
 
224
- `auth status` reports Birdclaw's coarse xurl status. Verify xurl with `xurl whoami` and bird with `bird whoami`. For setup and transport selection, see [Sign in](docs/auth.md).
227
+ Want to explore before importing an archive or signing in? `birdclaw init --demo` fills the local database with sample tweets, DMs, profiles, and links. It makes no network requests; run `birdclaw serve` afterward to browse the demo.
228
+
229
+ `auth status` reports Birdclaw's coarse xurl status. Verify xurl with `xurl whoami`. If you already have a private bird installation, verify it with `bird whoami`. For setup and transport selection, see [Sign in](docs/auth.md).
225
230
 
226
231
  Find and import an archive:
227
232
 
@@ -231,14 +236,16 @@ birdclaw import archive --json
231
236
  birdclaw import archive ~/Downloads/twitter-archive-2025.zip --json
232
237
  ```
233
238
 
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).
239
+ 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 or demo Birdclaw database needs the archive import to establish real account identity before live sync. See [Archive Import → Get an archive](docs/archive.md#get-an-archive).
235
240
 
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:
241
+ 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. With an existing private bird installation, the command can instead correct the seeded local account identity from `bird whoami` without bulk-hydrating imported profiles:
237
242
 
238
243
  ```bash
239
- birdclaw import hydrate-profiles --json
244
+ birdclaw import hydrate-profiles --account steipete --json
240
245
  ```
241
246
 
247
+ Every command that touches live account auth accepts `--account <username>` (stored IDs also work). To reuse one selection without changing the database identity, set `{"accounts":{"default":"steipete"}}` in `~/.birdclaw/config.json`; an explicit flag overrides it for one operation.
248
+
242
249
  `import archive` is idempotent. Re-running parses follower/following edges into the local follow graph, streams bundled media files under `data/tweets_media/`, `data/direct_messages_media/`, and the other archive media folders into `~/.birdclaw/media/originals/archive/<kind>/<id>/`, and pulls `video_info.variants[]` so archive video and animated-GIF rows carry mp4 URLs for the live media fetcher. Already-extracted files are skipped when size matches.
243
250
 
244
251
  Re-import only one part of a newer archive when you already have live or local data you want to keep:
@@ -276,6 +283,18 @@ private proxy requires `BIRDCLAW_ALLOW_REMOTE_WEB=1`. To require an app-level
276
283
  token too, set `BIRDCLAW_WEB_TOKEN` and send it as `x-birdclaw-token` or a
277
284
  `birdclaw_token` cookie.
278
285
 
286
+ The same process can expose a separate, read-only Streamable HTTP MCP endpoint
287
+ at `/mcp`. It stays disabled until `BIRDCLAW_MCP_TOKEN` and the exact
288
+ `BIRDCLAW_MCP_PUBLIC_URL` are configured. MCP can search cached tweets and read
289
+ cached threads; it cannot access DMs, sync X, call OpenAI, write files, or invoke
290
+ any compose/moderation API. The token must differ from `BIRDCLAW_WEB_TOKEN`.
291
+ MCP reads the default account unless `BIRDCLAW_MCP_ACCOUNT` selects one account
292
+ by id or handle. The origin remains loopback-only; external access requires a
293
+ dedicated HTTPS hostname whose proxy and Cloudflare Access policy admit exactly
294
+ `/mcp` and deny every other path. See the
295
+ [MCP server guide](https://birdclaw.sh/mcp.html) for client and private-proxy
296
+ configuration.
297
+
279
298
  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.
280
299
 
281
300
  `BIRDCLAW_ALLOWED_HOSTS` applies only to the source `pnpm dev` server, not the
@@ -687,7 +706,7 @@ tail -n 1 ~/.birdclaw/audit/bookmarks-sync.jsonl | jq .
687
706
  Current preference:
688
707
 
689
708
  - `xurl` first
690
- - `bird` fallback for surfaces where cookie-backed reads work better
709
+ - existing private `bird` installations as a compatibility fallback for surfaces where cookie-backed reads work better
691
710
 
692
711
  Without `xurl` or `bird`, `birdclaw` still works in local/archive mode.
693
712