routstrd 0.1.6 → 0.1.8

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.
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "permissions": {
3
3
  "allow": [
4
- "Bash(bun build:*)"
4
+ "Bash(bun build:*)",
5
+ "Bash(/Users/r/projects/routstr_main/routstrd/log_balance_table.sh)"
5
6
  ]
6
7
  }
7
8
  }
package/bun.lock CHANGED
@@ -5,7 +5,7 @@
5
5
  "name": "routstrd",
6
6
  "dependencies": {
7
7
  "@cashu/cashu-ts": "^3.1.1",
8
- "@routstr/sdk": "file:../routstr-chat/sdk",
8
+ "@routstr/sdk": "^0.2.8",
9
9
  "applesauce-core": "^5.1.0",
10
10
  "applesauce-relay": "^5.1.0",
11
11
  "commander": "^14.0.2",
@@ -25,123 +25,13 @@
25
25
  "packages": {
26
26
  "@cashu/cashu-ts": ["@cashu/cashu-ts@3.5.0", "", { "dependencies": { "@noble/curves": "^2.0.1", "@noble/hashes": "^2.0.1", "@scure/base": "^2.0.0", "@scure/bip32": "^2.0.1" } }, "sha512-LVOfCY1ZjQ+/f/CwekCeH+QRjN9SaHp8rTUjf8f4feHxT9Bqn/Bw+qYfNhaBKLWrqS19DMK/q/ern3AQ2MCq9w=="],
27
27
 
28
- "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="],
29
-
30
- "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="],
31
-
32
- "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="],
33
-
34
- "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="],
35
-
36
- "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="],
37
-
38
- "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="],
39
-
40
- "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="],
41
-
42
- "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="],
43
-
44
- "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="],
45
-
46
- "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="],
47
-
48
- "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="],
49
-
50
- "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="],
51
-
52
- "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="],
53
-
54
- "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="],
55
-
56
- "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="],
57
-
58
- "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="],
59
-
60
- "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="],
61
-
62
- "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="],
63
-
64
- "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="],
65
-
66
- "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="],
67
-
68
- "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="],
69
-
70
- "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="],
71
-
72
- "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="],
73
-
74
- "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="],
75
-
76
- "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="],
77
-
78
- "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="],
79
-
80
- "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
81
-
82
- "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
83
-
84
- "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
85
-
86
- "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
87
-
88
28
  "@noble/ciphers": ["@noble/ciphers@0.5.3", "", {}, "sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w=="],
89
29
 
90
30
  "@noble/curves": ["@noble/curves@2.0.1", "", { "dependencies": { "@noble/hashes": "2.0.1" } }, "sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw=="],
91
31
 
92
32
  "@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="],
93
33
 
94
- "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.1", "", { "os": "android", "cpu": "arm" }, "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA=="],
95
-
96
- "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.1", "", { "os": "android", "cpu": "arm64" }, "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA=="],
97
-
98
- "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.60.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw=="],
99
-
100
- "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.60.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew=="],
101
-
102
- "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.60.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w=="],
103
-
104
- "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.60.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g=="],
105
-
106
- "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.60.1", "", { "os": "linux", "cpu": "arm" }, "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g=="],
107
-
108
- "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.60.1", "", { "os": "linux", "cpu": "arm" }, "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg=="],
109
-
110
- "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.60.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ=="],
111
-
112
- "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.60.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA=="],
113
-
114
- "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ=="],
115
-
116
- "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw=="],
117
-
118
- "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.60.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw=="],
119
-
120
- "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.60.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg=="],
121
-
122
- "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg=="],
123
-
124
- "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.60.1", "", { "os": "linux", "cpu": "none" }, "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg=="],
125
-
126
- "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.60.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ=="],
127
-
128
- "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.60.1", "", { "os": "linux", "cpu": "x64" }, "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg=="],
129
-
130
- "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.60.1", "", { "os": "linux", "cpu": "x64" }, "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w=="],
131
-
132
- "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.60.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw=="],
133
-
134
- "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.60.1", "", { "os": "none", "cpu": "arm64" }, "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA=="],
135
-
136
- "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.60.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g=="],
137
-
138
- "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.60.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg=="],
139
-
140
- "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg=="],
141
-
142
- "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ=="],
143
-
144
- "@routstr/sdk": ["@routstr/sdk@file:../routstr-chat/sdk", { "dependencies": { "@cashu/cashu-ts": "^3.1.1", "applesauce-core": "^5.1.0", "applesauce-relay": "^5.1.0", "rxjs": "^7.8.1", "zustand": "^5.0.5" }, "devDependencies": { "@types/better-sqlite3": "^7.6.12", "@types/node": "^22.0.0", "tsup": "^8.0.0", "typescript": "^5.0.0" }, "optionalDependencies": { "better-sqlite3": "^11.7.2" }, "peerDependencies": { "typescript": ">=5.0.0" } }],
34
+ "@routstr/sdk": ["@routstr/sdk@0.2.8", "", { "dependencies": { "@cashu/cashu-ts": "^3.1.1", "applesauce-core": "^5.1.0", "applesauce-relay": "^5.1.0", "rxjs": "^7.8.1", "zustand": "^5.0.5" }, "optionalDependencies": { "better-sqlite3": "^11.7.2" }, "peerDependencies": { "typescript": ">=5.0.0" } }, "sha512-Pe1C6LtGbn4NaTGbR/SRNCo8P0XWNIVk+TXvEMNBQc5h4Gr/Jn4eLtOSgFg6jMxzJcuoVPrDXD5EQICWDotVQw=="],
145
35
 
146
36
  "@scure/base": ["@scure/base@2.0.0", "", {}, "sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w=="],
147
37
 
@@ -149,24 +39,16 @@
149
39
 
150
40
  "@scure/bip39": ["@scure/bip39@1.2.1", "", { "dependencies": { "@noble/hashes": "~1.3.0", "@scure/base": "~1.1.0" } }, "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg=="],
151
41
 
152
- "@types/better-sqlite3": ["@types/better-sqlite3@7.6.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA=="],
153
-
154
42
  "@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="],
155
43
 
156
- "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
157
-
158
44
  "@types/node": ["@types/node@25.3.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A=="],
159
45
 
160
46
  "@types/qrcode": ["@types/qrcode@1.5.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw=="],
161
47
 
162
- "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
163
-
164
48
  "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
165
49
 
166
50
  "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
167
51
 
168
- "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
169
-
170
52
  "applesauce-core": ["applesauce-core@5.1.0", "", { "dependencies": { "debug": "^4.4.0", "fast-deep-equal": "^3.1.3", "hash-sum": "^2.0.0", "nanoid": "^5.0.9", "nostr-tools": "~2.19", "rxjs": "^7.8.1" } }, "sha512-kk4nHndK4zjS8Sa6mC8LGtQ0LDSP4hlCGPJ9lpyIln7MkZaNFWD9eFd+fsEhfE9kyrne9IyYuVfJNp+EqY1b9w=="],
171
53
 
172
54
  "applesauce-relay": ["applesauce-relay@5.1.0", "", { "dependencies": { "@noble/hashes": "^1.7.1", "applesauce-core": "^5.1.0", "nanoid": "^5.0.9", "nostr-tools": "~2.19", "rxjs": "^7.8.1" } }, "sha512-d0LTJmQmr5gsYFm9A6efPEo2Bx/ewoL7LNsIdieMx34QohZBpPb137RvU9KQ1lFIXTm0tudd8VYfAPncqti2OQ=="],
@@ -183,14 +65,8 @@
183
65
 
184
66
  "bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="],
185
67
 
186
- "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="],
187
-
188
- "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
189
-
190
68
  "camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="],
191
69
 
192
- "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
193
-
194
70
  "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="],
195
71
 
196
72
  "cliui": ["cliui@6.0.0", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="],
@@ -201,10 +77,6 @@
201
77
 
202
78
  "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
203
79
 
204
- "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
205
-
206
- "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
207
-
208
80
  "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
209
81
 
210
82
  "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="],
@@ -221,24 +93,16 @@
221
93
 
222
94
  "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="],
223
95
 
224
- "esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="],
225
-
226
96
  "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="],
227
97
 
228
98
  "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
229
99
 
230
- "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
231
-
232
100
  "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="],
233
101
 
234
102
  "find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="],
235
103
 
236
- "fix-dts-default-cjs-exports": ["fix-dts-default-cjs-exports@1.0.1", "", { "dependencies": { "magic-string": "^0.30.17", "mlly": "^1.7.4", "rollup": "^4.34.8" } }, "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg=="],
237
-
238
104
  "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="],
239
105
 
240
- "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
241
-
242
106
  "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
243
107
 
244
108
  "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="],
@@ -253,30 +117,16 @@
253
117
 
254
118
  "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
255
119
 
256
- "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="],
257
-
258
- "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
259
-
260
- "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
261
-
262
- "load-tsconfig": ["load-tsconfig@0.2.5", "", {}, "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg=="],
263
-
264
120
  "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
265
121
 
266
- "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
267
-
268
122
  "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="],
269
123
 
270
124
  "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
271
125
 
272
126
  "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="],
273
127
 
274
- "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="],
275
-
276
128
  "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
277
129
 
278
- "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
279
-
280
130
  "nanoid": ["nanoid@5.1.6", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg=="],
281
131
 
282
132
  "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="],
@@ -287,8 +137,6 @@
287
137
 
288
138
  "nostr-wasm": ["nostr-wasm@0.1.0", "", {}, "sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA=="],
289
139
 
290
- "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
291
-
292
140
  "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
293
141
 
294
142
  "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
@@ -299,20 +147,8 @@
299
147
 
300
148
  "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
301
149
 
302
- "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
303
-
304
- "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
305
-
306
- "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
307
-
308
- "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
309
-
310
- "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
311
-
312
150
  "pngjs": ["pngjs@5.0.0", "", {}, "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="],
313
151
 
314
- "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
315
-
316
152
  "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="],
317
153
 
318
154
  "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="],
@@ -323,16 +159,10 @@
323
159
 
324
160
  "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="],
325
161
 
326
- "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
327
-
328
162
  "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
329
163
 
330
164
  "require-main-filename": ["require-main-filename@2.0.0", "", {}, "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="],
331
165
 
332
- "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
333
-
334
- "rollup": ["rollup@4.60.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.1", "@rollup/rollup-android-arm64": "4.60.1", "@rollup/rollup-darwin-arm64": "4.60.1", "@rollup/rollup-darwin-x64": "4.60.1", "@rollup/rollup-freebsd-arm64": "4.60.1", "@rollup/rollup-freebsd-x64": "4.60.1", "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", "@rollup/rollup-linux-arm-musleabihf": "4.60.1", "@rollup/rollup-linux-arm64-gnu": "4.60.1", "@rollup/rollup-linux-arm64-musl": "4.60.1", "@rollup/rollup-linux-loong64-gnu": "4.60.1", "@rollup/rollup-linux-loong64-musl": "4.60.1", "@rollup/rollup-linux-ppc64-gnu": "4.60.1", "@rollup/rollup-linux-ppc64-musl": "4.60.1", "@rollup/rollup-linux-riscv64-gnu": "4.60.1", "@rollup/rollup-linux-riscv64-musl": "4.60.1", "@rollup/rollup-linux-s390x-gnu": "4.60.1", "@rollup/rollup-linux-x64-gnu": "4.60.1", "@rollup/rollup-linux-x64-musl": "4.60.1", "@rollup/rollup-openbsd-x64": "4.60.1", "@rollup/rollup-openharmony-arm64": "4.60.1", "@rollup/rollup-win32-arm64-msvc": "4.60.1", "@rollup/rollup-win32-ia32-msvc": "4.60.1", "@rollup/rollup-win32-x64-gnu": "4.60.1", "@rollup/rollup-win32-x64-msvc": "4.60.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w=="],
335
-
336
166
  "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="],
337
167
 
338
168
  "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
@@ -345,8 +175,6 @@
345
175
 
346
176
  "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="],
347
177
 
348
- "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
349
-
350
178
  "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
351
179
 
352
180
  "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
@@ -355,34 +183,16 @@
355
183
 
356
184
  "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="],
357
185
 
358
- "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="],
359
-
360
186
  "tar-fs": ["tar-fs@2.1.4", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ=="],
361
187
 
362
188
  "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="],
363
189
 
364
- "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
365
-
366
- "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
367
-
368
- "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
369
-
370
- "tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="],
371
-
372
- "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
373
-
374
- "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
375
-
376
190
  "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
377
191
 
378
- "tsup": ["tsup@8.5.1", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.27.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "^0.7.6", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing=="],
379
-
380
192
  "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="],
381
193
 
382
194
  "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
383
195
 
384
- "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="],
385
-
386
196
  "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
387
197
 
388
198
  "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
@@ -401,8 +211,6 @@
401
211
 
402
212
  "zustand": ["zustand@5.0.11", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg=="],
403
213
 
404
- "@routstr/sdk/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="],
405
-
406
214
  "@scure/bip39/@noble/hashes": ["@noble/hashes@1.3.1", "", {}, "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA=="],
407
215
 
408
216
  "@scure/bip39/@scure/base": ["@scure/base@1.1.1", "", {}, "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA=="],
@@ -417,10 +225,6 @@
417
225
 
418
226
  "nostr-tools/@scure/bip32": ["@scure/bip32@1.3.1", "", { "dependencies": { "@noble/curves": "~1.1.0", "@noble/hashes": "~1.3.1", "@scure/base": "~1.1.0" } }, "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A=="],
419
227
 
420
- "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
421
-
422
- "@routstr/sdk/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
423
-
424
228
  "nostr-tools/@noble/curves/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="],
425
229
 
426
230
  "nostr-tools/@scure/bip32/@noble/curves": ["@noble/curves@1.1.0", "", { "dependencies": { "@noble/hashes": "1.3.1" } }, "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA=="],
@@ -29475,17 +29475,49 @@ function extractResponseId(body) {
29475
29475
  return trimmed.length > 0 ? trimmed : undefined;
29476
29476
  }
29477
29477
  function extractUsageFromSSEJson(parsed, fallbackSatsCost = 0) {
29478
- if (!parsed || typeof parsed !== "object" || !parsed.usage) {
29478
+ if (!parsed || typeof parsed !== "object") {
29479
+ return null;
29480
+ }
29481
+ if (!parsed.usage && parsed.cost && typeof parsed.cost === "object") {
29482
+ const costObj = parsed.cost;
29483
+ const msats2 = costObj.total_msats ?? 0;
29484
+ const cost2 = costObj.total_usd ?? 0;
29485
+ if (msats2 === 0 && cost2 === 0)
29486
+ return null;
29487
+ return {
29488
+ promptTokens: Number(costObj.input_tokens ?? 0),
29489
+ completionTokens: Number(costObj.output_tokens ?? 0),
29490
+ totalTokens: Number((costObj.input_tokens ?? 0) + (costObj.output_tokens ?? 0)),
29491
+ cost: Number(cost2),
29492
+ satsCost: msats2 > 0 ? msats2 / 1000 : fallbackSatsCost
29493
+ };
29494
+ }
29495
+ if (!parsed.usage) {
29479
29496
  return null;
29480
29497
  }
29481
29498
  const usage = parsed.usage;
29482
29499
  const usageCost = usage.cost;
29483
- const cost = typeof usageCost === "number" ? usageCost : usageCost?.total_usd ?? parsed.metadata?.routstr?.cost?.total_usd ?? 0;
29484
- const msats = parsed.metadata?.routstr?.cost?.total_msats ?? (typeof usage.cost_sats === "number" ? usage.cost_sats * 1000 : 0);
29500
+ let cost = 0;
29501
+ let msats = 0;
29502
+ if (typeof usageCost === "number") {
29503
+ cost = usageCost;
29504
+ } else if (usageCost && typeof usageCost === "object") {
29505
+ cost = usageCost.total_usd ?? 0;
29506
+ msats = usageCost.total_msats ?? 0;
29507
+ }
29508
+ if (cost === 0) {
29509
+ cost = parsed.metadata?.routstr?.cost?.total_usd ?? 0;
29510
+ }
29511
+ if (msats === 0) {
29512
+ msats = parsed.metadata?.routstr?.cost?.total_msats ?? (typeof usage.cost_sats === "number" ? usage.cost_sats * 1000 : 0);
29513
+ }
29514
+ const promptTokens = Number(usage.prompt_tokens ?? usage.input_tokens ?? 0);
29515
+ const completionTokens = Number(usage.completion_tokens ?? usage.output_tokens ?? 0);
29516
+ const totalTokens = Number(usage.total_tokens ?? promptTokens + completionTokens);
29485
29517
  const result = {
29486
- promptTokens: Number(usage.prompt_tokens ?? 0),
29487
- completionTokens: Number(usage.completion_tokens ?? 0),
29488
- totalTokens: Number(usage.total_tokens ?? 0),
29518
+ promptTokens,
29519
+ completionTokens,
29520
+ totalTokens,
29489
29521
  cost: Number(cost ?? 0),
29490
29522
  satsCost: msats > 0 ? msats / 1000 : fallbackSatsCost
29491
29523
  };
@@ -29653,71 +29685,83 @@ function createSSEParserTransform(onUsage, onResponseId) {
29653
29685
  let buffer = "";
29654
29686
  let usageCaptured = false;
29655
29687
  let responseIdCaptured = false;
29656
- const maybeCaptureUsageFromJson = (jsonText) => {
29688
+ const inspectDataPayload = (jsonText) => {
29689
+ if (usageCaptured && responseIdCaptured)
29690
+ return;
29691
+ const trimmed = jsonText.trim();
29692
+ if (!trimmed || trimmed === "[DONE]")
29693
+ return;
29694
+ if (!trimmed.startsWith("{") && !trimmed.startsWith("["))
29695
+ return;
29657
29696
  try {
29658
- const data = JSON.parse(jsonText);
29659
- const responseId = data.id;
29660
- if (typeof responseId === "string" && responseId.trim().length > 0) {
29661
- onResponseId?.(responseId.trim());
29662
- responseIdCaptured = true;
29697
+ const data = JSON.parse(trimmed);
29698
+ if (!responseIdCaptured) {
29699
+ const responseId = data?.id;
29700
+ if (typeof responseId === "string" && responseId.trim().length > 0) {
29701
+ onResponseId?.(responseId.trim());
29702
+ responseIdCaptured = true;
29703
+ }
29663
29704
  }
29664
- const usage = extractUsageFromSSEJson(data);
29665
- if (usage) {
29666
- onUsage(usage);
29667
- usageCaptured = true;
29705
+ if (!usageCaptured) {
29706
+ const usage = extractUsageFromSSEJson(data);
29707
+ if (usage) {
29708
+ onUsage(usage);
29709
+ usageCaptured = true;
29710
+ }
29668
29711
  }
29669
29712
  } catch {}
29670
29713
  };
29671
- const processLine = (self, line) => {
29672
- const trimmed = line.trim();
29673
- if (!trimmed) {
29714
+ const inspectEventBlock = (eventBlock) => {
29715
+ if (usageCaptured && responseIdCaptured)
29674
29716
  return;
29717
+ const lines = eventBlock.split(/\r?\n/);
29718
+ const dataParts = [];
29719
+ for (const line of lines) {
29720
+ if (!line || line.startsWith(":"))
29721
+ continue;
29722
+ if (line.startsWith("data:")) {
29723
+ const value = line.startsWith("data: ") ? line.slice(6) : line.slice(5);
29724
+ dataParts.push(value);
29725
+ }
29675
29726
  }
29676
- if (trimmed === "data: [DONE]" || trimmed === "[DONE]") {
29677
- self.push(`data: [DONE]
29678
-
29679
- `);
29727
+ if (dataParts.length === 0)
29680
29728
  return;
29681
- }
29682
- if (trimmed.startsWith("data:")) {
29683
- const dataStr = trimmed.startsWith("data: ") ? trimmed.slice(6) : trimmed.slice(5).trimStart();
29684
- if (dataStr === "[DONE]") {
29685
- self.push(`data: [DONE]
29686
-
29687
- `);
29688
- return;
29689
- }
29690
- maybeCaptureUsageFromJson(dataStr);
29691
- self.push(`data: ${dataStr}
29692
-
29729
+ const payload = dataParts.join(`
29693
29730
  `);
29731
+ inspectDataPayload(payload);
29732
+ };
29733
+ const emitEventBlock = (self, eventBlock) => {
29734
+ if (eventBlock.length === 0)
29694
29735
  return;
29695
- }
29696
- if (trimmed.startsWith("{")) {
29697
- maybeCaptureUsageFromJson(trimmed);
29698
- self.push(`data: ${trimmed}
29736
+ inspectEventBlock(eventBlock);
29737
+ self.push(eventBlock + `
29699
29738
 
29700
- `);
29701
- return;
29702
- }
29703
- self.push(line + `
29704
29739
  `);
29705
29740
  };
29706
29741
  return new Transform({
29707
- transform(chunk, encoding, callback) {
29742
+ transform(chunk, _encoding, callback) {
29708
29743
  buffer += chunk.toString();
29709
- const lines = buffer.split(/\r?\n/);
29710
- buffer = lines.pop() || "";
29711
- for (const line of lines) {
29712
- processLine(this, line);
29744
+ const terminator = /\r?\n\r?\n/g;
29745
+ let lastIndex = 0;
29746
+ let match;
29747
+ while ((match = terminator.exec(buffer)) !== null) {
29748
+ const block = buffer.slice(lastIndex, match.index);
29749
+ lastIndex = match.index + match[0].length;
29750
+ emitEventBlock(this, block);
29751
+ }
29752
+ if (lastIndex > 0) {
29753
+ buffer = buffer.slice(lastIndex);
29713
29754
  }
29714
29755
  callback();
29715
29756
  },
29716
29757
  flush(callback) {
29717
- if (buffer.trim()) {
29718
- processLine(this, buffer);
29758
+ if (buffer.length > 0) {
29759
+ const tail = buffer.replace(/\r?\n+$/, "");
29760
+ if (tail.length > 0) {
29761
+ emitEventBlock(this, tail);
29762
+ }
29763
+ buffer = "";
29719
29764
  }
29720
- buffer = "";
29721
29765
  callback();
29722
29766
  }
29723
29767
  });
@@ -31428,11 +31472,14 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
31428
31472
  if (parsed.choices?.[0]?.delta?.reasoning) {
31429
31473
  result.reasoning = parsed.choices[0].delta.reasoning;
31430
31474
  }
31431
- if (parsed.usage) {
31432
- result.usage = toUsageStats(extractUsageFromSSEJson(parsed)) ?? {
31433
- total_tokens: parsed.usage.total_tokens,
31434
- prompt_tokens: parsed.usage.prompt_tokens,
31435
- completion_tokens: parsed.usage.completion_tokens
31475
+ const extractedUsage = extractUsageFromSSEJson(parsed);
31476
+ if (extractedUsage) {
31477
+ result.usage = toUsageStats(extractedUsage);
31478
+ } else if (parsed.usage) {
31479
+ result.usage = {
31480
+ total_tokens: parsed.usage.total_tokens ?? parsed.usage.input_tokens + parsed.usage.output_tokens,
31481
+ prompt_tokens: parsed.usage.prompt_tokens ?? parsed.usage.input_tokens,
31482
+ completion_tokens: parsed.usage.completion_tokens ?? parsed.usage.output_tokens
31436
31483
  };
31437
31484
  }
31438
31485
  if (parsed.id) {
@@ -31725,23 +31772,62 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
31725
31772
  try {
31726
31773
  const torMode = isTorContext();
31727
31774
  const disabledProviders = new Set(this.providerRegistry.getDisabledProviders());
31775
+ console.log(`[findNextBestProvider:${this.instanceId}] Starting search for model: ${modelId}`);
31776
+ console.log(`[findNextBestProvider:${this.instanceId}] currentBaseUrl: ${currentBaseUrl}`);
31777
+ console.log(`[findNextBestProvider:${this.instanceId}] torMode: ${torMode}`);
31778
+ console.log(`[findNextBestProvider:${this.instanceId}] disabledProviders: ${[...disabledProviders]}`);
31779
+ console.log(`[findNextBestProvider:${this.instanceId}] failedProviders: ${[...this.failedProviders]}`);
31780
+ console.log(`[findNextBestProvider:${this.instanceId}] providersOnCooldown: ${this.providersOnCoolDown.map(([url2]) => url2)}`);
31728
31781
  const allProviders = this.providerRegistry.getAllProvidersModels();
31782
+ console.log(`[findNextBestProvider:${this.instanceId}] Total providers in registry: ${Object.keys(allProviders).length}`);
31729
31783
  const candidates = [];
31784
+ let skippedCurrent = 0, skippedFailed = 0, skippedDisabled = 0, skippedCooldown = 0, skippedOnion = 0, skippedNoModel = 0;
31730
31785
  for (const [baseUrl, models] of Object.entries(allProviders)) {
31731
- if (baseUrl === currentBaseUrl || this.failedProviders.has(baseUrl) || disabledProviders.has(baseUrl) || this.isOnCooldown(baseUrl)) {
31786
+ if (baseUrl === currentBaseUrl) {
31787
+ console.log(`[findNextBestProvider:${this.instanceId}] SKIP (current): ${baseUrl}`);
31788
+ skippedCurrent++;
31789
+ continue;
31790
+ }
31791
+ if (this.failedProviders.has(baseUrl)) {
31792
+ console.log(`[findNextBestProvider:${this.instanceId}] SKIP (failed): ${baseUrl}`);
31793
+ skippedFailed++;
31794
+ continue;
31795
+ }
31796
+ if (disabledProviders.has(baseUrl)) {
31797
+ console.log(`[findNextBestProvider:${this.instanceId}] SKIP (disabled): ${baseUrl}`);
31798
+ skippedDisabled++;
31799
+ continue;
31800
+ }
31801
+ if (this.isOnCooldown(baseUrl)) {
31802
+ console.log(`[findNextBestProvider:${this.instanceId}] SKIP (cooldown): ${baseUrl}`);
31803
+ skippedCooldown++;
31732
31804
  continue;
31733
31805
  }
31734
31806
  if (!torMode && (isOnionUrl(baseUrl) || isInsecureHttpUrl(baseUrl))) {
31807
+ console.log(`[findNextBestProvider:${this.instanceId}] SKIP (onion/http): ${baseUrl}`);
31808
+ skippedOnion++;
31735
31809
  continue;
31736
31810
  }
31737
31811
  const model2 = models.find((m2) => m2.id === modelId);
31738
- if (!model2)
31812
+ if (!model2) {
31813
+ console.log(`[findNextBestProvider:${this.instanceId}] SKIP (no model ${modelId}): ${baseUrl} has models: ${models.map((m2) => m2.id).join(", ")}`);
31814
+ skippedNoModel++;
31739
31815
  continue;
31816
+ }
31740
31817
  const cost = model2.sats_pricing?.completion ?? 0;
31818
+ console.log(`[findNextBestProvider:${this.instanceId}] CANDIDATE: ${baseUrl} cost: ${cost}`);
31741
31819
  candidates.push({ baseUrl, model: model2, cost });
31742
31820
  }
31821
+ console.log(`[findNextBestProvider:${this.instanceId}] Skipped: current=${skippedCurrent}, failed=${skippedFailed}, disabled=${skippedDisabled}, cooldown=${skippedCooldown}, onion=${skippedOnion}, noModel=${skippedNoModel}`);
31822
+ console.log(`[findNextBestProvider:${this.instanceId}] Total candidates: ${candidates.length}`);
31743
31823
  candidates.sort((a, b) => a.cost - b.cost);
31744
- return candidates.length > 0 ? candidates[0].baseUrl : null;
31824
+ if (candidates.length > 0) {
31825
+ console.log(`[findNextBestProvider:${this.instanceId}] Selected provider: ${candidates[0].baseUrl} with cost: ${candidates[0].cost}`);
31826
+ return candidates[0].baseUrl;
31827
+ } else {
31828
+ console.log(`[findNextBestProvider:${this.instanceId}] No candidate providers found`);
31829
+ return null;
31830
+ }
31745
31831
  } catch (error) {
31746
31832
  console.error("Error finding next best provider:", error);
31747
31833
  return null;
@@ -33660,7 +33746,8 @@ var import_rxjs24, InsufficientBalanceError, ProviderError, MintUnreachableError
33660
33746
  const MAX_RETRIES_PER_PROVIDER = 2;
33661
33747
  const { path, method, body, selectedModel, baseUrl, mintUrl } = params;
33662
33748
  let tryNextProvider = false;
33663
- this._log("DEBUG", `[RoutstrClient] _handleErrorResponse: status=${status}, baseUrl=${baseUrl}, mode=${this.mode}, token preview=${token}, requestId=${requestId}`);
33749
+ const errorMessage = responseBody;
33750
+ this._log("DEBUG", `[RoutstrClient] _handleErrorResponse: status=${status}, baseUrl=${baseUrl}, mode=${this.mode}, token preview=${token}, requestId=${requestId}, errorMessage=${errorMessage}`);
33664
33751
  this._log("DEBUG", `[RoutstrClient] _handleErrorResponse: Attempting to receive/restore token for ${baseUrl}`);
33665
33752
  if (params.token.startsWith("cashu")) {
33666
33753
  const receiveResult = await this.cashuSpender.receiveToken(params.token);
package/dist/index.js CHANGED
@@ -28790,6 +28790,7 @@ async function startDaemon(options = {}) {
28790
28790
  init_cli_shared();
28791
28791
  init_config();
28792
28792
  import { existsSync as existsSync8, mkdirSync as mkdirSync4 } from "fs";
28793
+ import { execSync } from "child_process";
28793
28794
 
28794
28795
  // src/integrations/opencode.ts
28795
28796
  import { existsSync as existsSync6, mkdirSync as mkdirSync3 } from "fs";
@@ -36953,6 +36954,8 @@ ${initStderr}`.toLowerCase();
36953
36954
  Initialization complete!`);
36954
36955
  logger.log(`
36955
36956
  use 'routstrd wallet receive cashu <token>' or 'routstrd wallet receive bolt11 2100' to top up your local wallet!`);
36957
+ logger.log(`
36958
+ To ensure routstrd persists across system restarts, run: 'routstrd service install'`);
36956
36959
  }
36957
36960
  async function checkCocodInstalled() {
36958
36961
  try {
@@ -37259,6 +37262,10 @@ program.command("monitor").description("Open interactive TUI for usage monitorin
37259
37262
  const { runUsageTui: runUsageTui2 } = await Promise.resolve().then(() => (init_usage(), exports_usage));
37260
37263
  await runUsageTui2();
37261
37264
  });
37265
+ program.command("top").description("Open interactive TUI for usage monitoring (alias for monitor)").action(async () => {
37266
+ const { runUsageTui: runUsageTui2 } = await Promise.resolve().then(() => (init_usage(), exports_usage));
37267
+ await runUsageTui2();
37268
+ });
37262
37269
  var walletCmd = program.command("wallet").description("Wallet operations");
37263
37270
  walletCmd.command("status").description("Check wallet status").action(async () => {
37264
37271
  await handleDaemonCommand("/wallet/status");
@@ -37340,6 +37347,62 @@ walletMintsCmd.command("info <url>").description("Get wallet mint info").action(
37340
37347
  program.command("stop").description("Stop the background daemon").action(async () => {
37341
37348
  await handleDaemonCommand("/stop", { method: "POST" });
37342
37349
  });
37350
+ var serviceCmd = program.command("service").description("Manage routstrd as a system service using PM2");
37351
+ serviceCmd.command("install").description("Install and start routstrd using PM2 for persistence").action(async () => {
37352
+ try {
37353
+ execSync("pm2 -v", { stdio: "ignore" });
37354
+ } catch (e) {
37355
+ console.log("PM2 not found. Installing PM2 globally with bun...");
37356
+ try {
37357
+ execSync("bun install -g pm2", { stdio: "inherit" });
37358
+ } catch (err) {
37359
+ console.error("Failed to install PM2. Please install it manually: bun install -g pm2");
37360
+ process.exit(1);
37361
+ }
37362
+ }
37363
+ let daemonPath;
37364
+ try {
37365
+ daemonPath = Bun.resolveSync("./daemon/index.js", import.meta.url);
37366
+ } catch (e) {
37367
+ const path = __require("path");
37368
+ daemonPath = path.join(path.dirname(import.meta.url).replace("file://", ""), "daemon", "index.js");
37369
+ }
37370
+ if (!existsSync8(daemonPath)) {
37371
+ console.error(`Could not find daemon at ${daemonPath}. Did you run 'bun run build'?`);
37372
+ process.exit(1);
37373
+ }
37374
+ console.log("Starting routstrd via PM2...");
37375
+ try {
37376
+ execSync(`pm2 start "${daemonPath}" --name routstrd --interpreter bun`, {
37377
+ stdio: "inherit"
37378
+ });
37379
+ console.log(`
37380
+ \u2705 routstrd is now managed by PM2.`);
37381
+ console.log(`
37382
+ To ensure it starts on system reboot, run:`);
37383
+ console.log(" pm2 startup");
37384
+ console.log(" pm2 save");
37385
+ console.log(`
37386
+ To view logs:`);
37387
+ console.log(" pm2 logs routstrd");
37388
+ } catch (err) {
37389
+ console.error("Failed to start routstrd via PM2.");
37390
+ process.exit(1);
37391
+ }
37392
+ });
37393
+ serviceCmd.command("uninstall").description("Stop and remove routstrd from PM2").action(() => {
37394
+ try {
37395
+ execSync("pm2 delete routstrd", { stdio: "inherit" });
37396
+ console.log("\u2705 routstrd service removed from PM2.");
37397
+ } catch (e) {
37398
+ console.error("Failed to remove service. It might not be running in PM2.");
37399
+ }
37400
+ });
37401
+ serviceCmd.command("logs").description("View PM2 logs for routstrd").action(() => {
37402
+ try {
37403
+ execSync("pm2 logs routstrd", { stdio: "inherit" });
37404
+ } catch (e) {}
37405
+ });
37343
37406
  program.command("restart").description("Restart the background daemon").option("--port <port>", "Port to listen on").option("-p, --provider <provider>", "Default provider to use").action(async (options) => {
37344
37407
  const config = await loadConfig();
37345
37408
  const wasRunning = await isDaemonRunning();
@@ -37444,63 +37507,25 @@ program.command("logs").description("View daemon logs").option("-f, --follow", "
37444
37507
  process.exit(1);
37445
37508
  }
37446
37509
  const lines = parseInt(options.lines, 10);
37447
- const readLastLines = async () => {
37448
- let allLines = [];
37449
- if (existsSync8(yesterdayFile)) {
37450
- const yesterdayContent = await Bun.file(yesterdayFile).text();
37451
- allLines = yesterdayContent.split(`
37452
- `).filter(Boolean);
37453
- }
37454
- if (existsSync8(todayFile)) {
37455
- const todayContent = await Bun.file(todayFile).text();
37456
- allLines = allLines.concat(todayContent.split(`
37457
- `).filter(Boolean));
37458
- }
37459
- return allLines.slice(-lines);
37460
- };
37461
- const printLines = async () => {
37462
- const lastLines = await readLastLines();
37463
- for (const line of lastLines) {
37464
- console.log(line);
37465
- }
37466
- };
37510
+ const logFiles = [yesterdayFile, todayFile].filter((file, index, files) => {
37511
+ return existsSync8(file) && files.indexOf(file) === index;
37512
+ });
37467
37513
  if (options.follow) {
37468
- let currentLogFile = todayFile;
37469
- let lastSize = 0;
37470
- if (existsSync8(currentLogFile)) {
37471
- lastSize = (await Bun.file(currentLogFile).text()).length;
37472
- }
37473
- await printLines();
37474
- const interval = setInterval(async () => {
37475
- const newLogFile = getLogFileForDate2();
37476
- if (newLogFile !== currentLogFile) {
37477
- console.log(`
37478
- --- Switched to ${newLogFile} ---
37479
- `);
37480
- currentLogFile = newLogFile;
37481
- lastSize = existsSync8(currentLogFile) ? (await Bun.file(currentLogFile).text()).length : 0;
37482
- }
37483
- if (existsSync8(currentLogFile)) {
37484
- const content2 = await Bun.file(currentLogFile).text();
37485
- const currentSize = content2.length;
37486
- if (currentSize > lastSize) {
37487
- const allLines = content2.split(`
37488
- `).filter(Boolean);
37489
- const newLines = allLines.slice(Math.floor(lastSize === 0 ? 0 : -1), -1);
37490
- for (const line of newLines) {
37491
- console.log(line);
37492
- }
37493
- lastSize = currentSize;
37494
- }
37495
- }
37496
- }, 1000);
37497
- process.on("SIGINT", () => {
37498
- clearInterval(interval);
37499
- process.exit(0);
37514
+ const proc2 = Bun.spawn(["tail", "-n", String(lines), "-f", todayFile], {
37515
+ stdout: "inherit",
37516
+ stderr: "inherit",
37517
+ stdin: "inherit"
37500
37518
  });
37501
- } else {
37502
- await printLines();
37519
+ const exitCode2 = await proc2.exited;
37520
+ process.exit(exitCode2);
37503
37521
  }
37522
+ const proc = Bun.spawn(["tail", "-n", String(lines), ...logFiles], {
37523
+ stdout: "inherit",
37524
+ stderr: "inherit",
37525
+ stdin: "inherit"
37526
+ });
37527
+ const exitCode = await proc.exited;
37528
+ process.exit(exitCode);
37504
37529
  });
37505
37530
  function cli(args) {
37506
37531
  program.parse(args);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "routstrd",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "module": "src/index.ts",
5
5
  "type": "module",
6
6
  "private": false,
@@ -24,7 +24,7 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@cashu/cashu-ts": "^3.1.1",
27
- "@routstr/sdk": "^0.2.9",
27
+ "@routstr/sdk": "^0.2.11",
28
28
  "applesauce-core": "^5.1.0",
29
29
  "applesauce-relay": "^5.1.0",
30
30
  "commander": "^14.0.2",
package/src/cli.ts CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  loadConfig,
9
9
  } from "./cli-shared";
10
10
  import { existsSync, mkdirSync } from "fs";
11
+ import { execSync } from "child_process";
11
12
  import {
12
13
  CONFIG_DIR,
13
14
  DB_PATH,
@@ -203,6 +204,9 @@ async function initDaemon(): Promise<void> {
203
204
  logger.log(
204
205
  "\n use 'routstrd wallet receive cashu <token>' or 'routstrd wallet receive bolt11 2100' to top up your local wallet!",
205
206
  );
207
+ logger.log(
208
+ "\nTo ensure routstrd persists across system restarts, run: 'routstrd service install'",
209
+ );
206
210
  }
207
211
 
208
212
  async function checkCocodInstalled(): Promise<boolean> {
@@ -721,6 +725,14 @@ program
721
725
  await runUsageTui();
722
726
  });
723
727
 
728
+ program
729
+ .command("top")
730
+ .description("Open interactive TUI for usage monitoring (alias for monitor)")
731
+ .action(async () => {
732
+ const { runUsageTui } = await import("./tui/usage/index.ts");
733
+ await runUsageTui();
734
+ });
735
+
724
736
  const walletCmd = program.command("wallet").description("Wallet operations");
725
737
 
726
738
  walletCmd
@@ -866,6 +878,89 @@ program
866
878
  await handleDaemonCommand("/stop", { method: "POST" });
867
879
  });
868
880
 
881
+ // Service - PM2 management
882
+ const serviceCmd = program
883
+ .command("service")
884
+ .description("Manage routstrd as a system service using PM2");
885
+
886
+ serviceCmd
887
+ .command("install")
888
+ .description("Install and start routstrd using PM2 for persistence")
889
+ .action(async () => {
890
+ // 1. Check if PM2 is installed
891
+ try {
892
+ execSync("pm2 -v", { stdio: "ignore" });
893
+ } catch (e) {
894
+ console.log("PM2 not found. Installing PM2 globally with bun...");
895
+ try {
896
+ execSync("bun install -g pm2", { stdio: "inherit" });
897
+ } catch (err) {
898
+ console.error("Failed to install PM2. Please install it manually: bun install -g pm2");
899
+ process.exit(1);
900
+ }
901
+ }
902
+
903
+ // 2. Resolve the path to the daemon
904
+ // In a global install, we want the bundled daemon in dist/daemon/index.js
905
+ let daemonPath: string;
906
+ try {
907
+ // Try to resolve relative to this file first (works in dev and global)
908
+ daemonPath = Bun.resolveSync("./daemon/index.js", import.meta.url);
909
+ } catch (e) {
910
+ // Fallback for some bundling scenarios
911
+ const path = require("path");
912
+ daemonPath = path.join(path.dirname(import.meta.url).replace("file://", ""), "daemon", "index.js");
913
+ }
914
+
915
+ if (!existsSync(daemonPath)) {
916
+ console.error(`Could not find daemon at ${daemonPath}. Did you run 'bun run build'?`);
917
+ process.exit(1);
918
+ }
919
+
920
+ console.log("Starting routstrd via PM2...");
921
+ try {
922
+ // Use --interpreter bun to ensure it runs with bun
923
+ execSync(`pm2 start "${daemonPath}" --name routstrd --interpreter bun`, {
924
+ stdio: "inherit",
925
+ });
926
+
927
+ console.log("\n✅ routstrd is now managed by PM2.");
928
+ console.log("\nTo ensure it starts on system reboot, run:");
929
+ console.log(" pm2 startup");
930
+ console.log(" pm2 save");
931
+ console.log("\nTo view logs:");
932
+ console.log(" pm2 logs routstrd");
933
+ } catch (err) {
934
+ console.error("Failed to start routstrd via PM2.");
935
+ process.exit(1);
936
+ }
937
+ });
938
+
939
+ serviceCmd
940
+ .command("uninstall")
941
+ .description("Stop and remove routstrd from PM2")
942
+ .action(() => {
943
+ try {
944
+ execSync("pm2 delete routstrd", { stdio: "inherit" });
945
+ console.log("✅ routstrd service removed from PM2.");
946
+ } catch (e) {
947
+ console.error(
948
+ "Failed to remove service. It might not be running in PM2.",
949
+ );
950
+ }
951
+ });
952
+
953
+ serviceCmd
954
+ .command("logs")
955
+ .description("View PM2 logs for routstrd")
956
+ .action(() => {
957
+ try {
958
+ execSync("pm2 logs routstrd", { stdio: "inherit" });
959
+ } catch (e) {
960
+ // Ignored
961
+ }
962
+ });
963
+
869
964
  // Restart
870
965
  program
871
966
  .command("restart")
@@ -1013,76 +1108,29 @@ program
1013
1108
 
1014
1109
  const lines = parseInt(options.lines, 10);
1015
1110
 
1016
- const readLastLines = async (): Promise<string[]> => {
1017
- let allLines: string[] = [];
1018
-
1019
- // Read yesterday's log first if it exists
1020
- if (existsSync(yesterdayFile)) {
1021
- const yesterdayContent = await Bun.file(yesterdayFile).text();
1022
- allLines = yesterdayContent.split("\n").filter(Boolean);
1023
- }
1024
-
1025
- // Then read today's log
1026
- if (existsSync(todayFile)) {
1027
- const todayContent = await Bun.file(todayFile).text();
1028
- allLines = allLines.concat(todayContent.split("\n").filter(Boolean));
1029
- }
1030
-
1031
- return allLines.slice(-lines);
1032
- };
1033
-
1034
- const printLines = async (): Promise<void> => {
1035
- const lastLines = await readLastLines();
1036
- for (const line of lastLines) {
1037
- console.log(line);
1038
- }
1039
- };
1111
+ const logFiles = [yesterdayFile, todayFile].filter((file, index, files) => {
1112
+ return existsSync(file) && files.indexOf(file) === index;
1113
+ });
1040
1114
 
1041
1115
  if (options.follow) {
1042
- let currentLogFile = todayFile;
1043
- let lastSize = 0;
1044
-
1045
- if (existsSync(currentLogFile)) {
1046
- lastSize = (await Bun.file(currentLogFile).text()).length;
1047
- }
1116
+ const proc = Bun.spawn(["tail", "-n", String(lines), "-f", todayFile], {
1117
+ stdout: "inherit",
1118
+ stderr: "inherit",
1119
+ stdin: "inherit",
1120
+ });
1048
1121
 
1049
- await printLines();
1050
-
1051
- const interval = setInterval(async () => {
1052
- // Check if we need to switch to a new date file
1053
- const newLogFile = getLogFileForDate();
1054
- if (newLogFile !== currentLogFile) {
1055
- console.log(`\n--- Switched to ${newLogFile} ---\n`);
1056
- currentLogFile = newLogFile;
1057
- lastSize = existsSync(currentLogFile)
1058
- ? (await Bun.file(currentLogFile).text()).length
1059
- : 0;
1060
- }
1122
+ const exitCode = await proc.exited;
1123
+ process.exit(exitCode);
1124
+ }
1061
1125
 
1062
- if (existsSync(currentLogFile)) {
1063
- const content = await Bun.file(currentLogFile).text();
1064
- const currentSize = content.length;
1065
- if (currentSize > lastSize) {
1066
- const allLines = content.split("\n").filter(Boolean);
1067
- const newLines = allLines.slice(
1068
- Math.floor(lastSize === 0 ? 0 : -1),
1069
- -1,
1070
- );
1071
- for (const line of newLines) {
1072
- console.log(line);
1073
- }
1074
- lastSize = currentSize;
1075
- }
1076
- }
1077
- }, 1000);
1126
+ const proc = Bun.spawn(["tail", "-n", String(lines), ...logFiles], {
1127
+ stdout: "inherit",
1128
+ stderr: "inherit",
1129
+ stdin: "inherit",
1130
+ });
1078
1131
 
1079
- process.on("SIGINT", () => {
1080
- clearInterval(interval);
1081
- process.exit(0);
1082
- });
1083
- } else {
1084
- await printLines();
1085
- }
1132
+ const exitCode = await proc.exited;
1133
+ process.exit(exitCode);
1086
1134
  });
1087
1135
 
1088
1136
  export function cli(args: string[]) {