birdclaw 0.10.0 → 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 (52) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +6 -2
  3. package/dist/cli/birdclaw.js +3267 -2991
  4. package/dist/client/assets/{SavedTimelineView-4QYaZ4CU.js → SavedTimelineView-CFgHR6di.js} +1 -1
  5. package/dist/client/assets/{TimelineRouteFrame-DJdUR7DX.js → TimelineRouteFrame-DcipwBqo.js} +1 -1
  6. package/dist/client/assets/{blocks-C84MpzHq.js → blocks-GWWj1dXr.js} +1 -1
  7. package/dist/client/assets/blocks-qrevFiNI.js +2 -0
  8. package/dist/client/assets/{bookmarks-Gy6MvAc9.js → bookmarks-BMf6Ytua.js} +1 -1
  9. package/dist/client/assets/{discuss-DKC6H1fN.js → discuss-BeFPn8mN.js} +2 -2
  10. package/dist/client/assets/{discuss-C0CUMn6v.js → discuss-ZvGdSAmA.js} +1 -1
  11. package/dist/client/assets/dms-CMp6bAR_.js +1 -0
  12. package/dist/client/assets/{dms-Q1a1kZ_P.js → dms-DBexFtGg.js} +2 -2
  13. package/dist/client/assets/{inbox-C9zFrQ76.js → inbox-CeGwsGo_.js} +1 -1
  14. package/dist/client/assets/{inbox-DjlVjj3K.js → inbox-DvSRkOiH.js} +2 -2
  15. package/dist/client/assets/{index-B8hO98gL.js → index-Bz8aYylW.js} +3 -3
  16. package/dist/client/assets/{likes-BXANVRCj.js → likes-BaljrAHC.js} +1 -1
  17. package/dist/client/assets/{links-6tWeHun_.js → links-CbC-fX7T.js} +2 -2
  18. package/dist/client/assets/{links-D3Ut-aUB.js → links-DMGuDd-B.js} +1 -1
  19. package/dist/client/assets/{mentions-BKO40XiK.js → mentions-TFNyR9F4.js} +1 -1
  20. package/dist/client/assets/{network-map-DUpppygD.js → network-map-1fXIqI3Y.js} +1 -1
  21. package/dist/client/assets/{network-map-2EPsbMIT.js → network-map-CKiXfloJ.js} +2 -2
  22. package/dist/client/assets/{routes-ARIEjgq-.js → routes-P7NzOusD.js} +1 -1
  23. package/dist/client/assets/{today-DNAg-wnA.js → today-DOUIqDPa.js} +2 -2
  24. package/dist/client/assets/{today-Q3xFx4cl.js → today-Dq8qoGhX.js} +1 -1
  25. package/dist/client/assets/{useTimelineRouteData-DYhYLZY4.js → useTimelineRouteData-2v9TVG9L.js} +1 -1
  26. package/dist/server/assets/{SavedTimelineView-Ern3q7LW.js → SavedTimelineView-lVz_ZZnh.js} +1 -1
  27. package/dist/server/assets/{TimelineRouteFrame-CYD-qMuy.js → TimelineRouteFrame-Dj1TeYrD.js} +1 -1
  28. package/dist/server/assets/{_tanstack-start-manifest_v-CHtuH75x.js → _tanstack-start-manifest_v-DQT-Q-zz.js} +28 -28
  29. package/dist/server/assets/{blocks-VXmcBqKD.js → blocks-BSvPOa_E.js} +2 -2
  30. package/dist/server/assets/{blocks-DWZAKPAX.js → blocks-Cv7I4iVs.js} +2 -2
  31. package/dist/server/assets/{bookmarks-DVCjWQPu.js → bookmarks-BcFpV8qD.js} +1 -1
  32. package/dist/server/assets/{discuss-4b2z14mT.js → discuss-BuLhalye.js} +2 -2
  33. package/dist/server/assets/{discuss-CJ_vThu8.js → discuss-D1q_L77A.js} +2 -2
  34. package/dist/server/assets/{dms-DbJk33XB.js → dms-C-s5l0cs.js} +3 -3
  35. package/dist/server/assets/{dms-Cr5heLhm.js → dms-OtbAd5nR.js} +2 -2
  36. package/dist/server/assets/{inbox-D607zrwZ.js → inbox-Wf8xGIjq.js} +2 -2
  37. package/dist/server/assets/{inbox-BJzEE8Aa.js → inbox-wLir608r.js} +1 -1
  38. package/dist/server/assets/{likes-C3EpsPbF.js → likes-BfFIyEbU.js} +1 -1
  39. package/dist/server/assets/{links-BU_FRxcz.js → links-BWt4ORY4.js} +2 -2
  40. package/dist/server/assets/{links-Dz-6bmkg.js → links-_ePW92kI.js} +2 -2
  41. package/dist/server/assets/{mentions-BHd6N_OL.js → mentions-oO4uv0Ju.js} +1 -1
  42. package/dist/server/assets/{router-BMfpBcBM.js → router-DY-ahyjD.js} +14588 -14521
  43. package/dist/server/assets/{routes-Cyokiwx1.js → routes-CYJ-dTi6.js} +1 -1
  44. package/dist/server/assets/start-CHdfdlfD.js +4 -0
  45. package/dist/server/assets/{today-CRa6Y-Tg.js → today-BLDqhLvT.js} +2 -2
  46. package/dist/server/assets/{today-CScZDxQx.js → today-D8zExFWH.js} +2 -2
  47. package/dist/server/server.js +4 -4
  48. package/package.json +89 -91
  49. package/dist/client/assets/blocks-BpjvGwYq.js +0 -2
  50. package/dist/client/assets/dms-DWA5tvJS.js +0 -1
  51. package/dist/server/assets/start-P4i55asu.js +0 -4
  52. package/dist/server/assets/{useTimelineRouteData-BWxx9yQl.js → useTimelineRouteData-wthflgOe.js} +1 -1
@@ -1,4 +1,4 @@
1
- import { t as TimelineRouteFrame } from "./TimelineRouteFrame-CYD-qMuy.js";
1
+ import { t as TimelineRouteFrame } from "./TimelineRouteFrame-Dj1TeYrD.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  //#region src/routes/index.tsx?tsr-split=component
4
4
  function homeSubtitle(meta) {
@@ -0,0 +1,4 @@
1
+ //#region node_modules/.pnpm/@tanstack+react-start@1.168.30_esbuild@0.28.1_react-dom@19.2.7_react@19.2.7__react@19.2_d1851e61953646bf8cb61f5961f308d5/node_modules/@tanstack/react-start/dist/plugin/default-entry/start.ts
2
+ var startInstance = void 0;
3
+ //#endregion
4
+ export { startInstance };
@@ -1,8 +1,8 @@
1
1
  import { Dt as pageSubtitleClass, Et as pageHeaderRowClass, Jt as segmentedClass, Ot as pageTitleClass, Tt as pageHeaderClass, Wt as secondaryButtonClass, m as cx, q as errorCopyClass, qt as segmentClass, wt as pageHeaderActionsClass } from "./ui-CL21-Ku0.js";
2
+ import { s as validateTodaySearch } from "./route-search-BUlQ5lGM.js";
2
3
  import { a as useNdjsonRun, n as periodDigestStreamEventSchema, o as MarkdownViewer, t as isTerminalStreamEvent } from "./client-stream-contracts-DVzk8DzM.js";
3
4
  import { n as normalizeProfileHydrationHandle, t as hydrateProfileHandles } from "./profile-hydration-client-GJ4kwJS8.js";
4
- import { s as validateTodaySearch } from "./route-search-BUlQ5lGM.js";
5
- import { t as Route$1 } from "./today-CScZDxQx.js";
5
+ import { t as Route$1 } from "./today-D8zExFWH.js";
6
6
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
7
7
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
8
  import { CheckCircle2, FileDown, Loader2, RefreshCw, Sparkles } from "lucide-react";
@@ -1,14 +1,14 @@
1
1
  import "./ui-CL21-Ku0.js";
2
+ import { s as validateTodaySearch } from "./route-search-BUlQ5lGM.js";
2
3
  import "./client-stream-contracts-DVzk8DzM.js";
3
4
  import "./profile-hydration-client-GJ4kwJS8.js";
4
- import { s as validateTodaySearch } from "./route-search-BUlQ5lGM.js";
5
5
  import "react";
6
6
  import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
7
7
  import "react/jsx-runtime";
8
8
  import "lucide-react";
9
9
  import "@tanstack/react-query";
10
10
  //#region src/routes/today.tsx
11
- var $$splitComponentImporter = () => import("./today-CRa6Y-Tg.js");
11
+ var $$splitComponentImporter = () => import("./today-BLDqhLvT.js");
12
12
  var Route$1 = createFileRoute("/today")({
13
13
  component: lazyRouteComponent($$splitComponentImporter, "component"),
14
14
  validateSearch: validateTodaySearch
@@ -3516,7 +3516,7 @@ var defaultSerovalPlugins = [
3516
3516
  * the dev styles URL for route-scoped CSS collection.
3517
3517
  */
3518
3518
  async function getStartManifest(matchedRoutes) {
3519
- const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-CHtuH75x.js");
3519
+ const { tsrStartManifest } = await import("./assets/_tanstack-start-manifest_v-DQT-Q-zz.js");
3520
3520
  const startManifest = tsrStartManifest();
3521
3521
  let routes = startManifest.routes;
3522
3522
  routes[rootRouteId];
@@ -5231,8 +5231,8 @@ var getBaseManifest = getProdBaseManifest;
5231
5231
  var createEarlyHintsForRequest = createEarlyHintsCollector;
5232
5232
  async function loadEntries() {
5233
5233
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
5234
- import("./assets/router-BMfpBcBM.js"),
5235
- import("./assets/start-P4i55asu.js"),
5234
+ import("./assets/router-DY-ahyjD.js"),
5235
+ import("./assets/start-CHdfdlfD.js"),
5236
5236
  import("./assets/empty-plugin-adapters-YdH6Vqte.js")
5237
5237
  ]);
5238
5238
  return {
@@ -5609,7 +5609,7 @@ async function handleServerRoutes({ getRouter, request, url, executeRouter, cont
5609
5609
  return normalizeSsrResponse(response);
5610
5610
  }
5611
5611
  //#endregion
5612
- //#region node_modules/.pnpm/@tanstack+react-start@1.168.28_esbuild@0.28.1_react-dom@19.2.7_react@19.2.7__react@19.2_60d34fa2ee9fd8798a68612b96b5f9e4/node_modules/@tanstack/react-start/dist/plugin/default-entry/server.ts
5612
+ //#region node_modules/.pnpm/@tanstack+react-start@1.168.30_esbuild@0.28.1_react-dom@19.2.7_react@19.2.7__react@19.2_d1851e61953646bf8cb61f5961f308d5/node_modules/@tanstack/react-start/dist/plugin/default-entry/server.ts
5613
5613
  var fetch$1 = createStartHandler(defaultStreamHandler);
5614
5614
  function createServerEntry(entry) {
5615
5615
  return { async fetch(...args) {
package/package.json CHANGED
@@ -1,92 +1,90 @@
1
1
  {
2
- "name": "birdclaw",
3
- "version": "0.10.0",
4
- "description": "Local Twitter memory in SQLite for archives, DMs, likes, bookmarks, and moderation",
5
- "homepage": "https://github.com/steipete/birdclaw#readme",
6
- "license": "MIT",
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://github.com/steipete/birdclaw.git"
10
- },
11
- "bin": {
12
- "birdclaw": "bin/birdclaw.mjs"
13
- },
14
- "files": [
15
- "bin/",
16
- "dist/cli/",
17
- "dist/client/",
18
- "dist/server/",
19
- "CHANGELOG.md",
20
- "LICENSE",
21
- "README.md",
22
- "package.json"
23
- ],
24
- "type": "module",
25
- "imports": {
26
- "#/*": "./src/*"
27
- },
28
- "publishConfig": {
29
- "access": "public"
30
- },
31
- "scripts": {
32
- "dev": "BIRDCLAW_LOCAL_WEB=1 vite dev --host 127.0.0.1 --port 3000",
33
- "build": "vite build && node scripts/build-cli.mjs",
34
- "preview": "node bin/birdclaw.mjs serve",
35
- "test": "node ./scripts/run-vitest.mjs run",
36
- "coverage": "node ./scripts/run-vitest.mjs run --coverage",
37
- "e2e": "playwright test",
38
- "typecheck": "tsc --noEmit",
39
- "format": "oxfmt --write bin src scripts playwright vite.config.ts vitest.config.ts playwright.config.ts",
40
- "format:check": "oxfmt --check bin src scripts playwright vite.config.ts vitest.config.ts playwright.config.ts",
41
- "lint": "oxlint --import-plugin --node-plugin --vitest-plugin --deny-warnings -A require-mock-type-parameters -A no-control-regex bin src scripts playwright vite.config.ts vitest.config.ts playwright.config.ts",
42
- "check": "pnpm run format:check && pnpm run lint && pnpm run typecheck",
43
- "prepack": "pnpm run build",
44
- "pack:smoke": "node scripts/package-smoke.mjs",
45
- "perf:browser": "node ./scripts/browser-perf.mjs",
46
- "cli": "tsx src/cli.ts",
47
- "docs:site": "node scripts/build-docs-site.mjs"
48
- },
49
- "dependencies": {
50
- "@modelcontextprotocol/sdk": "^1.29.0",
51
- "@tanstack/react-query": "^5.101.2",
52
- "@tanstack/react-router": "1.170.18",
53
- "commander": "^15.0.0",
54
- "effect": "^3.22.0",
55
- "lucide-react": "^1.24.0",
56
- "mapbox-gl": "^3.26.0",
57
- "react": "^19.2.7",
58
- "react-dom": "^19.2.7",
59
- "react-map-gl": "^8.1.1",
60
- "supercluster": "^8.0.1",
61
- "zod": "^4.4.3"
62
- },
63
- "devDependencies": {
64
- "@playwright/test": "^1.61.1",
65
- "@tailwindcss/typography": "^0.5.20",
66
- "@tailwindcss/vite": "^4.3.3",
67
- "@tanstack/react-start": "1.168.28",
68
- "@testing-library/dom": "^10.4.1",
69
- "@testing-library/jest-dom": "^6.9.1",
70
- "@testing-library/react": "^16.3.2",
71
- "@types/geojson": "^7946.0.16",
72
- "@types/node": "^26.1.1",
73
- "@types/react": "^19.2.17",
74
- "@types/react-dom": "^19.2.3",
75
- "@types/supercluster": "^7.1.3",
76
- "@vitejs/plugin-react": "^6.0.3",
77
- "@vitest/coverage-v8": "^4.1.10",
78
- "esbuild": "^0.28.1",
79
- "jsdom": "^29.1.1",
80
- "oxfmt": "^0.59.0",
81
- "oxlint": "^1.74.0",
82
- "tailwindcss": "^4.3.3",
83
- "tsx": "^4.23.1",
84
- "typescript": "^7.0.2",
85
- "vite": "^8.1.5",
86
- "vitest": "^4.1.10"
87
- },
88
- "engines": {
89
- "node": ">=26.5.0 <27"
90
- },
91
- "packageManager": "pnpm@10.34.3"
92
- }
2
+ "name": "birdclaw",
3
+ "version": "0.11.0",
4
+ "description": "Local Twitter memory in SQLite for archives, DMs, likes, bookmarks, and moderation",
5
+ "homepage": "https://github.com/steipete/birdclaw#readme",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/steipete/birdclaw.git"
10
+ },
11
+ "bin": {
12
+ "birdclaw": "bin/birdclaw.mjs"
13
+ },
14
+ "files": [
15
+ "bin/",
16
+ "dist/cli/",
17
+ "dist/client/",
18
+ "dist/server/",
19
+ "CHANGELOG.md",
20
+ "LICENSE",
21
+ "README.md",
22
+ "package.json"
23
+ ],
24
+ "type": "module",
25
+ "imports": {
26
+ "#/*": "./src/*"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "dependencies": {
32
+ "@modelcontextprotocol/sdk": "^1.29.0",
33
+ "@tanstack/react-query": "^5.101.2",
34
+ "@tanstack/react-router": "1.170.18",
35
+ "commander": "^15.0.0",
36
+ "effect": "^3.22.0",
37
+ "lucide-react": "^1.25.0",
38
+ "mapbox-gl": "^3.26.0",
39
+ "react": "^19.2.7",
40
+ "react-dom": "^19.2.7",
41
+ "react-map-gl": "^8.1.1",
42
+ "supercluster": "^8.0.1",
43
+ "zod": "^4.4.3"
44
+ },
45
+ "devDependencies": {
46
+ "@playwright/test": "^1.61.1",
47
+ "@tailwindcss/typography": "^0.5.20",
48
+ "@tailwindcss/vite": "^4.3.3",
49
+ "@tanstack/react-start": "1.168.30",
50
+ "@testing-library/dom": "^10.4.1",
51
+ "@testing-library/jest-dom": "^6.9.1",
52
+ "@testing-library/react": "^16.3.2",
53
+ "@types/geojson": "^7946.0.16",
54
+ "@types/node": "^26.1.1",
55
+ "@types/react": "^19.2.17",
56
+ "@types/react-dom": "^19.2.3",
57
+ "@types/supercluster": "^7.1.3",
58
+ "@vitejs/plugin-react": "^6.0.3",
59
+ "@vitest/coverage-v8": "^4.1.10",
60
+ "esbuild": "^0.28.1",
61
+ "jsdom": "^29.1.1",
62
+ "oxfmt": "^0.59.0",
63
+ "oxlint": "^1.74.0",
64
+ "tailwindcss": "^4.3.3",
65
+ "tsx": "^4.23.1",
66
+ "typescript": "^7.0.2",
67
+ "vite": "^8.1.5",
68
+ "vitest": "^4.1.10"
69
+ },
70
+ "engines": {
71
+ "node": ">=26.5.0 <27"
72
+ },
73
+ "scripts": {
74
+ "dev": "BIRDCLAW_LOCAL_WEB=1 vite dev --host 127.0.0.1 --port 3000",
75
+ "build": "vite build && node scripts/build-cli.mjs",
76
+ "preview": "node bin/birdclaw.mjs serve",
77
+ "test": "node ./scripts/run-vitest.mjs run",
78
+ "coverage": "node ./scripts/run-vitest.mjs run --coverage",
79
+ "e2e": "playwright test",
80
+ "typecheck": "tsc --noEmit",
81
+ "format": "oxfmt --write bin src scripts playwright vite.config.ts vitest.config.ts playwright.config.ts",
82
+ "format:check": "oxfmt --check bin src scripts playwright vite.config.ts vitest.config.ts playwright.config.ts",
83
+ "lint": "oxlint --import-plugin --node-plugin --vitest-plugin --deny-warnings -A require-mock-type-parameters -A no-control-regex bin src scripts playwright vite.config.ts vitest.config.ts playwright.config.ts",
84
+ "check": "pnpm run format:check && pnpm run lint && pnpm run typecheck",
85
+ "pack:smoke": "node scripts/package-smoke.mjs",
86
+ "perf:browser": "node ./scripts/browser-perf.mjs",
87
+ "cli": "tsx src/cli.ts",
88
+ "docs:site": "node scripts/build-docs-site.mjs"
89
+ }
90
+ }
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/blocks-C84MpzHq.js","assets/rolldown-runtime-B-9mzPXz.js","assets/react-BwGzW7mM.js","assets/schemas-CMQMhQXI.js","assets/query-client-CA-do_IS.js","assets/useQuery-CL_NXLnc.js","assets/AvatarChip-DsHj3LT7.js","assets/route-search-CmZT7pGD.js","assets/useDebouncedValue-BJLRInUq.js"])))=>i.map(i=>d[i]);
2
- import"./rolldown-runtime-B-9mzPXz.js";import{t as e}from"./react-BwGzW7mM.js";import{n as t,t as n}from"./lazyRouteComponent-CLLbUvMd.js";import{Rn as r}from"./schemas-CMQMhQXI.js";import"./query-client-CA-do_IS.js";import"./AvatarChip-DsHj3LT7.js";import{t as i}from"./route-search-CmZT7pGD.js";import{n as a,t as o}from"./preload-helper-MpqUbZCn.js";import"./useDebouncedValue-BJLRInUq.js";r(),e(),a();var s=t(`/blocks`)({component:n(()=>o(()=>import(`./blocks-C84MpzHq.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8])),`component`),validateSearch:i});export{s as t};
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-B-9mzPXz.js";import{t}from"./react-BwGzW7mM.js";import{Dn as n,Gt as r,Kt as i,M as a,Mn as o,On as s,Rn as c,Ut as l,Wt as u,an as d,dn as f,fn as p,kn as ee,on as te,sn as ne}from"./schemas-CMQMhQXI.js";import{t as re}from"./search-C_LqodNa.js";import{A as ie,a as ae,b as oe,d as m,n as h,r as g,s as _}from"./query-client-CA-do_IS.js";import{t as v}from"./useQuery-CL_NXLnc.js";import{i as y,r as se}from"./account-selection-h7m9xmzU.js";import{n as ce,r as le,t as ue}from"./FeedState-DhMv4zXD.js";import{r as de}from"./route-search-CmZT7pGD.js";import{n as b,t as x}from"./dms-Q1a1kZ_P.js";import{t as S}from"./SyncNowButton-DDYT2jQT.js";import{t as C}from"./useDebouncedValue-BJLRInUq.js";var w=e(t()),T=c(),E=[{value:`all`,label:`All`},{value:`unreplied`,label:`Unreplied`},{value:`replied`,label:`Replied`}],fe=[{value:`recent`,label:`Newest`},{value:`followers`,label:`Followers`}],pe=[{value:`all`,label:`All`},{value:`accepted`,label:`Accepted`},{value:`requests`,label:`Requests`}],D=`flex h-[46px] shrink-0 items-center gap-2 rounded-md border border-[var(--line)] bg-[var(--bg)] px-3 py-0 text-[14px] text-[var(--ink)] outline-none transition-colors duration-150 focus-within:border-[var(--accent)] focus-within:shadow-[0_0_0_1px_var(--accent)]`;function O(){let e=x.useSearch(),t=x.useNavigate();return(0,T.jsx)(k,{searchState:e,onSearchChange:(e,n)=>void t({search:e,replace:n?.replace})})}function k({searchState:e,onSearchChange:t}={}){let c=oe(),[x,O]=(0,w.useState)(()=>de({})),k=e??x,A=(e,n)=>t?t(e,n):O(e),j=k.inbox,M=k.reply,N=k.minFollowers,P=k.minInfluence,F=k.sort,I=k.q,L=k.conversation||void 0,[R,z]=(0,w.useState)(``),B=v({queryKey:h.status,queryFn:({signal:e})=>ae({signal:e})}).data??null,V=se(B?.accounts),H=C(I,180),U=[...h.dms,{inboxFilter:j,replyFilter:M,minFollowers:N,minInfluenceScore:P,sort:F,search:H,selectedAccountId:V??null,selectedConversationId:L??null}],W=v({queryKey:U,queryFn:({signal:e})=>{let t=new URL(`/api/query`,window.location.origin);return t.searchParams.set(`resource`,`dms`),t.searchParams.set(`inbox`,j),t.searchParams.set(`replyFilter`,M),t.searchParams.set(`sort`,F),N.trim()&&t.searchParams.set(`minFollowers`,N.trim()),P.trim()&&t.searchParams.set(`minInfluenceScore`,P.trim()),V&&j!==`requests`&&t.searchParams.set(`account`,V),L&&t.searchParams.set(`conversationId`,L),H.trim()&&t.searchParams.set(`search`,H.trim()),g(t,{signal:e},m,`Direct messages unavailable`)},placeholderData:ie,staleTime:5*6e4}),G=W.data,K=G?.resource===`dms`?G:null,q=K?.items??[],me=K?.selectedConversation?.messages??[],J=K?.selectedConversation?.conversation.id;(0,w.useEffect)(()=>{if(!W.data)return;let e=J??q[0]?.id,t=L&&q.some(e=>e.id===L)?L:e;t&&t!==L&&A({...k,conversation:t},{replace:!0})},[W.data,q,J]);let Y=q.find(e=>e.id===L)??null,he=!!(!W.isError&&L&&J&&L!==J),X=(0,w.useMemo)(()=>B?`${String(B.stats.dms)} conversations cached locally`:`Loading direct messages...`,[B]),Z=y({mutationFn:({conversationId:e,text:t})=>_({kind:`replyDm`,conversationId:e,text:t}),onMutate:async({conversationId:e,text:t})=>{await c.cancelQueries({queryKey:U});let n=c.getQueryData(U);if(!n||n.resource!==`dms`||!Y)return{previous:n};let r=new Date().toISOString(),i=B?.accounts.find(e=>e.id===Y.accountId),a=(i?.handle??Y.accountHandle).replace(/^@/,``),o={id:`optimistic-${r}`,conversationId:e,text:t,createdAt:r,direction:`outbound`,isReplied:!0,mediaCount:0,sender:{id:`local-${Y.accountId}`,handle:a,displayName:i?.name??a,bio:``,followersCount:0,avatarHue:18,createdAt:r}};return c.setQueryData(U,{...n,items:n.items.map(n=>n.id===e?{...n,lastMessageAt:r,lastMessagePreview:t,needsReply:!1,unreadCount:0}:n),selectedConversation:n.selectedConversation?{...n.selectedConversation,messages:[...n.selectedConversation.messages,o]}:n.selectedConversation}),{previous:n}},onError:(e,t,n)=>{n?.previous&&c.setQueryData(U,n.previous)},onSettled:()=>Promise.all([c.invalidateQueries({queryKey:h.dms}),c.invalidateQueries({queryKey:h.status})])});async function ge(e){let t=R.trim();if(!(!t||!Y)){z(``);try{await Z.mutateAsync({conversationId:e,text:t}),A({...k,conversation:e})}catch{z(t)}}}function _e(){Promise.all([c.invalidateQueries({queryKey:h.dms}),c.invalidateQueries({queryKey:h.status})])}let ve=W.isPending,Q=W.error?W.error instanceof Error?W.error.message:`Messages unavailable`:null,$=Z.error?Z.error instanceof Error?Z.error.message:`Reply failed`:null;return(0,T.jsxs)(T.Fragment,{children:[(0,T.jsxs)(`header`,{className:l,children:[(0,T.jsxs)(`div`,{className:u,children:[(0,T.jsxs)(`div`,{className:`flex min-w-0 flex-col`,children:[(0,T.jsx)(`h1`,{className:i,children:`Messages`}),(0,T.jsx)(`p`,{className:r,children:X})]}),(0,T.jsx)(S,{accounts:B?.accounts,kind:`dms`,label:`Sync DMs`,onSynced:_e,syncOptions:{inbox:j,limit:j===`requests`?200:50,maxPages:j===`requests`?3:1}})]}),(0,T.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 px-4 pb-3`,children:[(0,T.jsx)(`div`,{className:p,"aria-label":`DM inbox`,children:pe.map(e=>(0,T.jsx)(`button`,{"aria-pressed":j===e.value,className:a(f,j===e.value&&`bg-[var(--bg-active)] text-[var(--ink)]`),onClick:()=>A({...k,inbox:e.value}),type:`button`,children:e.label},e.value))}),(0,T.jsxs)(`label`,{className:a(ne,`flex-1 min-w-[200px]`),children:[(0,T.jsx)(re,{className:d,strokeWidth:2}),(0,T.jsx)(`input`,{className:te,onChange:e=>A({...k,q:e.target.value},{replace:!0}),placeholder:`Search DMs`,value:I})]}),(0,T.jsxs)(`label`,{className:a(D,`w-[156px]`),children:[(0,T.jsx)(`span`,{className:`shrink-0 text-[12px] font-semibold text-[var(--ink-soft)]`,children:`Followers`}),(0,T.jsx)(`input`,{className:`min-w-0 flex-1 border-0 bg-transparent text-right text-[14px] text-[var(--ink)] outline-none placeholder:text-[var(--ink-soft)]`,inputMode:`numeric`,onChange:e=>A({...k,minFollowers:e.target.value},{replace:!0}),placeholder:`Any`,value:N})]}),(0,T.jsxs)(`label`,{className:a(D,`w-[132px]`),children:[(0,T.jsx)(`span`,{className:`shrink-0 text-[12px] font-semibold text-[var(--ink-soft)]`,children:`Score`}),(0,T.jsx)(`input`,{className:`min-w-0 flex-1 border-0 bg-transparent text-right text-[14px] text-[var(--ink)] outline-none placeholder:text-[var(--ink-soft)]`,inputMode:`numeric`,onChange:e=>A({...k,minInfluence:e.target.value},{replace:!0}),placeholder:`Any`,value:P})]}),(0,T.jsx)(`div`,{className:p,children:fe.map(e=>(0,T.jsx)(`button`,{className:a(f,e.value===F&&`bg-[var(--bg-active)] text-[var(--ink)]`),onClick:()=>A({...k,sort:e.value}),type:`button`,children:e.label},e.value))})]}),(0,T.jsx)(`div`,{className:ee,"aria-label":`DM reply filter`,children:E.map(e=>{let t=M===e.value;return(0,T.jsx)(`button`,{type:`button`,"aria-pressed":t,className:a(n,t&&`text-[var(--ink)] font-bold`),onClick:()=>A({...k,reply:e.value}),children:(0,T.jsxs)(`span`,{className:`relative inline-flex flex-col items-center justify-center py-1`,children:[e.value,t?(0,T.jsx)(`span`,{className:s}):null]})},e.value)})})]}),$?(0,T.jsx)(`p`,{className:a(o,`px-4 py-2 text-red-500`),children:$}):null,ve&&q.length===0||he?(0,T.jsx)(le,{detail:`Reading local conversations and reply state`,label:`Loading messages`}):Q?(0,T.jsx)(ce,{action:(0,T.jsx)(`button`,{className:`rounded-full bg-[var(--accent)] px-4 py-1.5 text-[14px] font-bold text-white`,onClick:()=>void W.refetch(),type:`button`,children:`Retry`}),message:Q,title:`Could not load messages`}):q.length===0?(0,T.jsx)(ue,{detail:`Sync DMs or broaden the filters to find a conversation.`,label:`No conversations in this view`}):(0,T.jsx)(b,{conversations:q,onReplyDraftChange:z,onReplySend:ge,onSelectConversation:e=>A({...k,conversation:e}),replyDraft:R,selectedConversation:Y,selectedMessages:me})]})}export{k as DmsRouteView,O as component};
@@ -1,4 +0,0 @@
1
- //#region node_modules/.pnpm/@tanstack+react-start@1.168.28_esbuild@0.28.1_react-dom@19.2.7_react@19.2.7__react@19.2_60d34fa2ee9fd8798a68612b96b5f9e4/node_modules/@tanstack/react-start/dist/plugin/default-entry/start.ts
2
- var startInstance = void 0;
3
- //#endregion
4
- export { startInstance };
@@ -3,9 +3,9 @@ import { D as tweetConversationResponseSchema, a as fetchQueryEnvelope, d as run
3
3
  import { r as formatCompactNumber, t as AvatarChip } from "./AvatarChip-B5ASnpQ4.js";
4
4
  import { r as useSelectedAccountId } from "./account-selection-CTdFGWRk.js";
5
5
  import { a as TweetSkeletonRows, n as FeedError, o as BirdclawEmpty, r as FeedLoading, s as BirdclawLoading, t as FeedEmpty } from "./FeedState-YrMZ10Gf.js";
6
+ import { t as useDebouncedValue } from "./useDebouncedValue-DOnA6Xcy.js";
6
7
  import { d as isTweetArticleUrlEntity, f as normalizeTweetUrlEntityRangeForText, s as safeHttpUrl, t as ProfilePreview } from "./ProfilePreview-Dk2CdOOS.js";
7
8
  import { t as SmartTimestamp } from "./SmartTimestamp-sxGoy8Uj.js";
8
- import { t as useDebouncedValue } from "./useDebouncedValue-DOnA6Xcy.js";
9
9
  import { t as TweetRichText } from "./TweetRichText-BEo_OCEM.js";
10
10
  import { createContext, createElement, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
11
11
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";