@nyte-ai/host 0.0.0-stage → 0.0.19

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 (250) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +6 -2
  3. package/THIRD-PARTY-NOTICES.md +866 -0
  4. package/dist/chunks/canvas-preview-0cmbkp2j.js +65 -0
  5. package/dist/chunks/canvas-preview-0nq75h9k.js +7 -0
  6. package/dist/chunks/canvas-preview-11nadadc.js +241 -0
  7. package/dist/chunks/canvas-preview-1sq7z9jq.js +17 -0
  8. package/dist/chunks/canvas-preview-2jwbe14k.js +130 -0
  9. package/dist/chunks/canvas-preview-2zdyh9ny.js +26 -0
  10. package/dist/chunks/canvas-preview-31w7xm8z.js +34 -0
  11. package/dist/chunks/canvas-preview-4b6sayhg.js +295 -0
  12. package/dist/chunks/canvas-preview-4e0pxa32.js +63 -0
  13. package/dist/chunks/canvas-preview-518dh8by.js +169 -0
  14. package/dist/chunks/canvas-preview-55s0y68g.js +387 -0
  15. package/dist/chunks/canvas-preview-5ekjx6sw.js +613 -0
  16. package/dist/chunks/canvas-preview-5mex725c.js +14 -0
  17. package/dist/chunks/canvas-preview-5z63am63.js +295 -0
  18. package/dist/chunks/canvas-preview-65xqjw7f.js +20 -0
  19. package/dist/chunks/canvas-preview-69fkk9yn.js +95 -0
  20. package/dist/chunks/canvas-preview-8xc0vn7v.js +458 -0
  21. package/dist/chunks/canvas-preview-9aqczacs.js +73 -0
  22. package/dist/chunks/canvas-preview-af86jz8t.js +141 -0
  23. package/dist/chunks/canvas-preview-aq5j4p25.js +240 -0
  24. package/dist/chunks/canvas-preview-b2v8wfnz.js +36 -0
  25. package/dist/chunks/canvas-preview-befkjea2.js +60 -0
  26. package/dist/chunks/canvas-preview-bxnqt8cd.js +103 -0
  27. package/dist/chunks/canvas-preview-cawy6vbz.js +352 -0
  28. package/dist/chunks/canvas-preview-crmzxxt8.js +518 -0
  29. package/dist/chunks/canvas-preview-drctegz4.js +591 -0
  30. package/dist/chunks/canvas-preview-e3vnkkc5.js +134 -0
  31. package/dist/chunks/canvas-preview-ec2mt7es.js +108 -0
  32. package/dist/chunks/canvas-preview-fxa0rfb0.js +61 -0
  33. package/dist/chunks/canvas-preview-g5fkjs34.js +598 -0
  34. package/dist/chunks/canvas-preview-jeddjex8.js +166 -0
  35. package/dist/chunks/canvas-preview-k1yg4fgp.js +571 -0
  36. package/dist/chunks/canvas-preview-kdqgrstc.js +194 -0
  37. package/dist/chunks/canvas-preview-kn7kvbfj.js +12 -0
  38. package/dist/chunks/canvas-preview-kp75gb63.js +141 -0
  39. package/dist/chunks/canvas-preview-mgcx2b2p.js +271 -0
  40. package/dist/chunks/canvas-preview-n2a35zv5.js +81 -0
  41. package/dist/chunks/canvas-preview-pkzqg96v.js +63 -0
  42. package/dist/chunks/canvas-preview-rp4x6y1h.js +144 -0
  43. package/dist/chunks/canvas-preview-s94ebwf5.js +112 -0
  44. package/dist/chunks/canvas-preview-skzwvw4d.js +23 -0
  45. package/dist/chunks/canvas-preview-srgfpdmf.js +60 -0
  46. package/dist/chunks/canvas-preview-tjhabynd.js +252 -0
  47. package/dist/chunks/canvas-preview-tnqe7k0b.js +374 -0
  48. package/dist/chunks/canvas-preview-vaatfznm.js +189 -0
  49. package/dist/chunks/canvas-preview-vm9zdp2t.js +398 -0
  50. package/dist/chunks/canvas-preview-w54ymtb3.js +272 -0
  51. package/dist/chunks/canvas-preview-wg80rbc2.js +46 -0
  52. package/dist/chunks/canvas-preview-y5y6ghaw.js +125 -0
  53. package/dist/chunks/canvas-preview-ycepb05s.js +176 -0
  54. package/dist/chunks/canvas-preview-yjz0f7n4.js +50 -0
  55. package/dist/chunks/canvas-preview-zaaj99wd.js +244 -0
  56. package/dist/src/canvas-preview.d.ts +29 -0
  57. package/dist/src/canvas-preview.js +271 -0
  58. package/dist/src/credentials.d.ts +44 -0
  59. package/dist/src/credentials.js +10 -0
  60. package/dist/src/deploy/cloudflare/worker.d.ts +50 -0
  61. package/dist/src/deploy/cloudflare/worker.js +196 -0
  62. package/dist/src/deploy/vercel/nitro.config.d.ts +2 -0
  63. package/dist/src/deploy/vercel/nitro.config.js +30 -0
  64. package/dist/src/deploy/vercel/server/routes/[...].d.ts +2 -0
  65. package/dist/src/deploy/vercel/server/routes/[...].js +18 -0
  66. package/dist/src/deploy/vercel/server/utils/host.d.ts +13 -0
  67. package/dist/src/deploy/vercel/server/utils/host.js +7 -0
  68. package/dist/src/deploy/vercel/server/utils/repair.d.ts +1 -0
  69. package/dist/src/deploy/vercel/server/utils/repair.js +6 -0
  70. package/dist/src/deploy/vercel/server/utils/step.d.ts +10 -0
  71. package/dist/src/deploy/vercel/server/utils/step.js +6 -0
  72. package/dist/src/deploy/vercel/server/workflows/drive.d.ts +14 -0
  73. package/dist/src/deploy/vercel/server/workflows/drive.js +13 -0
  74. package/dist/src/durable-object.d.ts +14 -0
  75. package/dist/src/durable-object.js +231 -0
  76. package/dist/src/hash.d.ts +1 -0
  77. package/dist/src/hash.js +6 -0
  78. package/dist/src/identity-key.d.ts +11 -0
  79. package/dist/src/identity-key.js +9 -0
  80. package/dist/src/identity.d.ts +12 -0
  81. package/dist/src/identity.js +6 -0
  82. package/dist/src/images/exif.d.ts +1 -0
  83. package/dist/src/images/exif.js +6 -0
  84. package/dist/src/images/node.d.ts +37 -0
  85. package/dist/src/images/node.js +12 -0
  86. package/dist/src/images/photon.d.ts +3 -0
  87. package/dist/src/images/photon.js +7 -0
  88. package/dist/src/images/worker.d.ts +1 -0
  89. package/dist/src/images/worker.js +23 -0
  90. package/dist/src/index.d.ts +20 -0
  91. package/dist/src/index.js +121 -0
  92. package/dist/src/key-file.d.ts +1 -0
  93. package/dist/src/key-file.js +7 -0
  94. package/dist/src/listen-fetch.d.ts +8 -0
  95. package/dist/src/listen-fetch.js +9 -0
  96. package/dist/src/listen.d.ts +4 -0
  97. package/dist/src/listen.js +10 -0
  98. package/dist/src/local/command.d.ts +20 -0
  99. package/dist/src/local/command.js +12 -0
  100. package/dist/src/local/feed.d.ts +7 -0
  101. package/dist/src/local/feed.js +6 -0
  102. package/dist/src/local/files.d.ts +18 -0
  103. package/dist/src/local/files.js +13 -0
  104. package/dist/src/local/git-watch.d.ts +15 -0
  105. package/dist/src/local/git-watch.js +7 -0
  106. package/dist/src/local/git.d.ts +5 -0
  107. package/dist/src/local/git.js +13 -0
  108. package/dist/src/local/github.d.ts +30 -0
  109. package/dist/src/local/github.js +9 -0
  110. package/dist/src/local/identity.d.ts +3 -0
  111. package/dist/src/local/identity.js +7 -0
  112. package/dist/src/local/jobs.d.ts +7 -0
  113. package/dist/src/local/jobs.js +7 -0
  114. package/dist/src/local/legacy-trust.d.ts +10 -0
  115. package/dist/src/local/legacy-trust.js +6 -0
  116. package/dist/src/local/patch.d.ts +16 -0
  117. package/dist/src/local/patch.js +17 -0
  118. package/dist/src/local/provider.d.ts +11 -0
  119. package/dist/src/local/provider.js +20 -0
  120. package/dist/src/local/snapshots.d.ts +7 -0
  121. package/dist/src/local/snapshots.js +11 -0
  122. package/dist/src/local/text.d.ts +1 -0
  123. package/dist/src/local/text.js +6 -0
  124. package/dist/src/local/tree.d.ts +50 -0
  125. package/dist/src/local/tree.js +16 -0
  126. package/dist/src/local/workspace-migration.d.ts +2 -0
  127. package/dist/src/local/workspace-migration.js +7 -0
  128. package/dist/src/local/worktrees.d.ts +46 -0
  129. package/dist/src/local/worktrees.js +14 -0
  130. package/dist/src/mcp/config.d.ts +75 -0
  131. package/dist/src/mcp/config.js +12 -0
  132. package/dist/src/mcp/connect.d.ts +15 -0
  133. package/dist/src/mcp/connect.js +9 -0
  134. package/dist/src/mcp/hub.d.ts +19 -0
  135. package/dist/src/mcp/hub.js +11 -0
  136. package/dist/src/mcp/oauth.d.ts +46 -0
  137. package/dist/src/mcp/oauth.js +12 -0
  138. package/dist/src/mcp/tools.d.ts +29 -0
  139. package/dist/src/mcp/tools.js +12 -0
  140. package/dist/src/open.d.ts +14 -0
  141. package/dist/src/open.js +46 -0
  142. package/dist/src/plugins/loader.d.ts +21 -0
  143. package/dist/src/plugins/loader.js +11 -0
  144. package/dist/src/postgres.d.ts +19 -0
  145. package/dist/src/postgres.js +8 -0
  146. package/dist/src/providers.d.ts +16 -0
  147. package/dist/src/providers.js +112 -0
  148. package/dist/src/secrets.d.ts +12 -0
  149. package/dist/src/secrets.js +8 -0
  150. package/dist/src/serve/binding.d.ts +39 -0
  151. package/dist/src/serve/binding.js +6 -0
  152. package/dist/src/serve/handler.d.ts +15 -0
  153. package/dist/src/serve/handler.js +8 -0
  154. package/dist/src/serve/stream-server.d.ts +6 -0
  155. package/dist/src/serve/stream-server.js +6 -0
  156. package/dist/src/session-index.d.ts +11 -0
  157. package/dist/src/session-index.js +11 -0
  158. package/dist/src/shell-env.d.ts +14 -0
  159. package/dist/src/shell-env.js +108 -0
  160. package/dist/src/sqlite-workers.d.ts +6 -0
  161. package/dist/src/sqlite-workers.js +6 -0
  162. package/dist/src/sqlite.d.ts +8 -0
  163. package/dist/src/sqlite.js +11 -0
  164. package/dist/src/store-rows.d.ts +13 -0
  165. package/dist/src/store-rows.js +26 -0
  166. package/dist/src/store-usage.d.ts +25 -0
  167. package/dist/src/store-usage.js +19 -0
  168. package/dist/src/usage-history.d.ts +54 -0
  169. package/dist/src/usage-history.js +14 -0
  170. package/dist/src/usage-scan.d.ts +24 -0
  171. package/dist/src/usage-scan.js +65 -0
  172. package/dist/src/usage-service.d.ts +23 -0
  173. package/dist/src/usage-service.js +16 -0
  174. package/dist/src/usage-summary.d.ts +9 -0
  175. package/dist/src/usage-summary.js +16 -0
  176. package/dist/src/usage-types.d.ts +86 -0
  177. package/dist/src/usage-types.js +0 -0
  178. package/dist/src/usage-worker.d.ts +1 -0
  179. package/dist/src/usage-worker.js +29 -0
  180. package/dist/src/usage.d.ts +195 -0
  181. package/dist/src/usage.js +23 -0
  182. package/package.json +140 -3
  183. package/src/canvas-preview.ts +403 -0
  184. package/src/credentials.ts +294 -0
  185. package/src/deploy/cloudflare/README.md +3 -0
  186. package/src/deploy/cloudflare/worker.ts +306 -0
  187. package/src/deploy/cloudflare/wrangler.jsonc +12 -0
  188. package/src/deploy/vercel/README.md +3 -0
  189. package/src/deploy/vercel/nitro.config.ts +29 -0
  190. package/src/deploy/vercel/server/routes/[...].ts +10 -0
  191. package/src/deploy/vercel/server/utils/host.ts +104 -0
  192. package/src/deploy/vercel/server/utils/repair.ts +35 -0
  193. package/src/deploy/vercel/server/utils/step.ts +25 -0
  194. package/src/deploy/vercel/server/workflows/drive.ts +46 -0
  195. package/src/deploy/vercel/tsconfig.json +9 -0
  196. package/src/deploy/vercel/types/bun.d.ts +2 -0
  197. package/src/durable-object.ts +386 -0
  198. package/src/hash.ts +5 -0
  199. package/src/identity-key.ts +20 -0
  200. package/src/identity.ts +66 -0
  201. package/src/images/exif.ts +69 -0
  202. package/src/images/node.ts +163 -0
  203. package/src/images/photon.ts +141 -0
  204. package/src/images/worker.ts +29 -0
  205. package/src/index.ts +39 -0
  206. package/src/key-file.ts +53 -0
  207. package/src/listen-fetch.ts +409 -0
  208. package/src/listen.ts +228 -0
  209. package/src/local/command.ts +161 -0
  210. package/src/local/feed.ts +70 -0
  211. package/src/local/files.ts +817 -0
  212. package/src/local/git-watch.ts +199 -0
  213. package/src/local/git.ts +919 -0
  214. package/src/local/github.ts +691 -0
  215. package/src/local/identity.ts +21 -0
  216. package/src/local/jobs.ts +573 -0
  217. package/src/local/legacy-trust.ts +105 -0
  218. package/src/local/patch.ts +334 -0
  219. package/src/local/provider.ts +184 -0
  220. package/src/local/snapshots.ts +778 -0
  221. package/src/local/text.ts +9 -0
  222. package/src/local/tree.ts +398 -0
  223. package/src/local/workspace-migration.ts +95 -0
  224. package/src/local/worktrees.ts +239 -0
  225. package/src/mcp/config.ts +330 -0
  226. package/src/mcp/connect.ts +92 -0
  227. package/src/mcp/hub.ts +836 -0
  228. package/src/mcp/oauth.ts +436 -0
  229. package/src/mcp/tools.ts +333 -0
  230. package/src/open.ts +449 -0
  231. package/src/plugins/loader.ts +186 -0
  232. package/src/postgres.ts +492 -0
  233. package/src/providers.ts +135 -0
  234. package/src/secrets.ts +31 -0
  235. package/src/serve/binding.ts +629 -0
  236. package/src/serve/handler.ts +362 -0
  237. package/src/serve/stream-server.ts +176 -0
  238. package/src/session-index.ts +99 -0
  239. package/src/shell-env.ts +153 -0
  240. package/src/sqlite-workers.ts +283 -0
  241. package/src/sqlite.ts +553 -0
  242. package/src/store-rows.ts +110 -0
  243. package/src/store-usage.ts +347 -0
  244. package/src/usage-history.ts +219 -0
  245. package/src/usage-scan.ts +81 -0
  246. package/src/usage-service.ts +82 -0
  247. package/src/usage-summary.ts +79 -0
  248. package/src/usage-types.ts +87 -0
  249. package/src/usage-worker.ts +24 -0
  250. package/src/usage.ts +776 -0
@@ -0,0 +1,82 @@
1
+ import { join } from "node:path";
2
+ import { FileModelsStore, nyteProviders } from "@nyte-ai/ai";
3
+ import { createModels } from "@nyte-ai/ai/models";
4
+ import type { Models } from "@nyte-ai/ai";
5
+ import { serial } from "@nyte-ai/schema/serial";
6
+ import type { Api, Model } from "@nyte-ai/schema/model";
7
+ import { readNyteUsage } from "./store-usage.ts";
8
+ import {
9
+ loadUsageScanCaches,
10
+ readLocalUsage,
11
+ saveUsageScanCaches,
12
+ type UsageScanCaches,
13
+ } from "./usage.ts";
14
+ import type { UsageSnapshot, UsageWindow } from "./usage-types.ts";
15
+
16
+ export interface UsageScanRequest {
17
+ readonly window: UsageWindow;
18
+ readonly catalog?: readonly Model<Api>[];
19
+ }
20
+
21
+ export type UsageScan = UsageSnapshot;
22
+
23
+ export interface UsageScanReader {
24
+ scan(request: UsageScanRequest): Promise<UsageScan>;
25
+ close(): Promise<void>;
26
+ }
27
+
28
+ export function catalogForUsage(models: Pick<Models, "getModels">): readonly Model<Api>[] {
29
+ return [...models.getModels("anthropic"), ...models.getModels("openai-codex")];
30
+ }
31
+
32
+ export class UsageScanner implements UsageScanReader {
33
+ private readonly home: string;
34
+ private readonly cachePath: string;
35
+ private caches: UsageScanCaches | undefined;
36
+ private readonly models: ReturnType<typeof createModels>;
37
+ private readonly scans = serial();
38
+
39
+ constructor(home: string) {
40
+ this.home = home;
41
+ this.cachePath = join(home, ".nyte", "usage-scan-cache.json");
42
+ this.models = createModels({
43
+ modelsStore: new FileModelsStore(join(home, ".nyte", "models-store.json")),
44
+ });
45
+
46
+ for (const provider of nyteProviders()) this.models.setProvider(provider);
47
+ }
48
+
49
+ scan(request: UsageScanRequest): Promise<UsageScan> {
50
+ return this.scans.run(async () => {
51
+ if (request.catalog === undefined)
52
+ await this.models.refresh({
53
+ providers: ["anthropic", "openai-codex"],
54
+ allowNetwork: false,
55
+ });
56
+ const catalog = request.catalog;
57
+
58
+ const models: Pick<Models, "getModels"> =
59
+ catalog === undefined
60
+ ? this.models
61
+ : {
62
+ getModels: (provider) =>
63
+ catalog.filter((model) => provider === undefined || model.provider === provider),
64
+ };
65
+
66
+ const caches = (this.caches ??= await loadUsageScanCaches(this.cachePath));
67
+ const local = await readLocalUsage({ models, window: request.window, caches });
68
+ const report = readNyteUsage(this.home, request.window);
69
+ void this.scans.run(() => saveUsageScanCaches(this.cachePath, caches));
70
+
71
+ return {
72
+ ...report,
73
+ ...local,
74
+ nyteError: report.sources.find((source) => source.status === "failed")?.message ?? null,
75
+ };
76
+ });
77
+ }
78
+
79
+ close(): Promise<void> {
80
+ return this.scans.settled();
81
+ }
82
+ }
@@ -0,0 +1,79 @@
1
+ import { addUsage } from "@nyte-ai/core/server";
2
+ import type { Usage } from "@nyte-ai/schema";
3
+ import type { Usage as ModelUsageCounts } from "@nyte-ai/schema/model";
4
+ import type { ModelUsage, UsageSummary } from "./usage-types.ts";
5
+
6
+ export function emptyModelUsage(): ModelUsageCounts {
7
+ return {
8
+ input: 0,
9
+ output: 0,
10
+ cacheRead: 0,
11
+ cacheWrite: 0,
12
+ totalTokens: 0,
13
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
14
+ };
15
+ }
16
+
17
+ export function recordedUsage(usage: ModelUsageCounts): Usage {
18
+ return {
19
+ input: usage.input,
20
+ output: usage.output,
21
+ cacheRead: usage.cacheRead,
22
+ cacheWrite: usage.cacheWrite,
23
+ reasoning: usage.reasoning ?? null,
24
+ total: usage.totalTokens,
25
+ cost: { ...usage.cost },
26
+ };
27
+ }
28
+
29
+ export function emptyUsageSummary(): UsageSummary {
30
+ return {
31
+ models: [],
32
+ compaction: recordedUsage(emptyModelUsage()),
33
+ tools: recordedUsage(emptyModelUsage()),
34
+ total: recordedUsage(emptyModelUsage()),
35
+ cacheSavings: 0,
36
+ };
37
+ }
38
+
39
+ export function summarizeModels(rows: readonly ModelUsage[]): UsageSummary {
40
+ const models = new Map<string, ModelUsage>();
41
+ let total = recordedUsage(emptyModelUsage());
42
+ let savings = 0;
43
+
44
+ for (const row of rows) {
45
+ savings += cacheSavings(row.usage);
46
+ const key = JSON.stringify([row.provider, row.model]);
47
+ const previous = models.get(key);
48
+ models.set(
49
+ key,
50
+ previous === undefined
51
+ ? row
52
+ : { ...row, turns: previous.turns + row.turns, usage: addUsage(previous.usage, row.usage) },
53
+ );
54
+ total = addUsage(total, row.usage);
55
+ }
56
+
57
+ return {
58
+ ...emptyUsageSummary(),
59
+ models: [...models.values()].toSorted(
60
+ (left, right) =>
61
+ right.usage.cost.total - left.usage.cost.total ||
62
+ right.usage.total - left.usage.total ||
63
+ left.model.localeCompare(right.model) ||
64
+ left.provider.localeCompare(right.provider),
65
+ ),
66
+ total,
67
+ cacheSavings: savings,
68
+ };
69
+ }
70
+
71
+ export function cacheSavings(usage: Usage): number {
72
+ if (usage.input === 0) return 0;
73
+
74
+ return usage.cacheRead * (usage.cost.input / usage.input) - usage.cost.cacheRead;
75
+ }
76
+
77
+ export function usageTokens(usage: Usage): number {
78
+ return usage.total || usage.input + usage.output + usage.cacheRead + usage.cacheWrite;
79
+ }
@@ -0,0 +1,87 @@
1
+ import type { SessionId, Usage } from "@nyte-ai/schema";
2
+
3
+ export interface UsageWindow {
4
+ readonly sinceDay: string | null;
5
+ readonly untilDay: string;
6
+ }
7
+
8
+ export interface UsageTotals {
9
+ readonly input: number;
10
+ readonly output: number;
11
+ readonly cacheRead: number;
12
+ readonly cacheWrite: number;
13
+ readonly reasoning: number;
14
+ readonly tokens: number;
15
+ readonly cost: number;
16
+ readonly cacheSavings: number;
17
+ }
18
+
19
+ export type UsageSubject =
20
+ | { readonly kind: "model"; readonly provider: string; readonly model: string }
21
+ | { readonly kind: "tool" }
22
+ | { readonly kind: "compaction" };
23
+
24
+ export interface UsageEntry {
25
+ readonly day: string;
26
+ readonly workspacePath: string | null;
27
+ readonly sessionId: SessionId;
28
+ readonly subject: UsageSubject;
29
+ readonly totals: UsageTotals;
30
+ }
31
+
32
+ export interface UsageSession {
33
+ readonly sessionId: SessionId;
34
+ readonly name?: string;
35
+ readonly workspacePath: string | null;
36
+ readonly lastActivityAt: number;
37
+ }
38
+
39
+ export interface UsageSource {
40
+ readonly workspacePath: string | null;
41
+ readonly status: "ok" | "failed";
42
+ readonly sessions: number;
43
+ readonly message: string | null;
44
+ }
45
+
46
+ export interface UsageReport {
47
+ readonly readAt: number;
48
+ readonly sinceDay: string;
49
+ readonly untilDay: string;
50
+ readonly entries: readonly UsageEntry[];
51
+ readonly sessions: readonly UsageSession[];
52
+ readonly sources: readonly UsageSource[];
53
+ readonly previous?: { readonly cost: number; readonly tokens: number };
54
+ readonly earliestDay?: string;
55
+ }
56
+
57
+ export interface ModelUsage {
58
+ readonly provider: string;
59
+ readonly model: string;
60
+ readonly turns: number;
61
+ readonly usage: Usage;
62
+ }
63
+
64
+ export interface UsageSummary {
65
+ readonly models: readonly ModelUsage[];
66
+ readonly compaction: Usage;
67
+ readonly tools: Usage;
68
+ readonly total: Usage;
69
+ readonly cacheSavings: number;
70
+ }
71
+
72
+ export type LocalHistoryUsage =
73
+ | { readonly kind: "missing" }
74
+ | { readonly kind: "failed"; readonly message: string }
75
+ | {
76
+ readonly kind: "ready";
77
+ readonly summary: UsageSummary;
78
+ readonly unpricedRecords: number;
79
+ readonly malformedRecords: number;
80
+ readonly unreadableFiles: number;
81
+ };
82
+
83
+ export interface UsageSnapshot extends UsageReport {
84
+ readonly nyteError: string | null;
85
+ readonly claudeCode: LocalHistoryUsage;
86
+ readonly codex: LocalHistoryUsage;
87
+ }
@@ -0,0 +1,24 @@
1
+ import { parentPort } from "node:worker_threads";
2
+ import { UsageScanner } from "./usage-service.ts";
3
+ import type { UsageWorkerReply, UsageWorkerRequest } from "./usage-scan.ts";
4
+
5
+ const port = parentPort;
6
+
7
+ if (port === null) throw new Error("The usage worker must run on a worker thread.");
8
+
9
+ let scanner: UsageScanner | undefined;
10
+
11
+ port.on("message", (request: UsageWorkerRequest) => {
12
+ scanner ??= new UsageScanner(request.home);
13
+ void scanner.scan(request).then(
14
+ (scan) => {
15
+ port.postMessage({ id: request.id, scan } satisfies UsageWorkerReply);
16
+ },
17
+ (cause: unknown) => {
18
+ port.postMessage({
19
+ id: request.id,
20
+ error: cause instanceof Error ? cause.message : String(cause),
21
+ } satisfies UsageWorkerReply);
22
+ },
23
+ );
24
+ });