@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,108 @@
1
+ // src/shell-env.ts
2
+ import { spawn } from "node:child_process";
3
+ import { randomUUID } from "node:crypto";
4
+ import { isAbsolute } from "node:path";
5
+ import { holdProcessEnvironment } from "@nyte-ai/core/server";
6
+ var TIMEOUT_MS = 1e4;
7
+ var OUTPUT_LIMIT = 64 * 1024;
8
+ var SHELL_LOCAL = new Set(["PWD", "OLDPWD", "SHLVL", "_"]);
9
+ var shared;
10
+ function completeShellEnvironment() {
11
+ if (shared === undefined) {
12
+ shared = createShellEnvironmentRepair();
13
+ holdProcessEnvironment(shared());
14
+ }
15
+ return shared();
16
+ }
17
+ function createShellEnvironmentRepair({
18
+ env = process.env,
19
+ platform = process.platform,
20
+ timeoutMs = TIMEOUT_MS
21
+ } = {}) {
22
+ let attempt;
23
+ return () => {
24
+ attempt ??= repairShellEnvironment({ env, platform, timeoutMs });
25
+ return attempt;
26
+ };
27
+ }
28
+ async function repairShellEnvironment({
29
+ env,
30
+ platform,
31
+ timeoutMs
32
+ }) {
33
+ const shell = env.SHELL || "/bin/sh";
34
+ if (platform === "win32" || !isAbsolute(shell))
35
+ return;
36
+ const inheritedPath = env.PATH;
37
+ const loaded = await readLoginShellEnvironment({ shell, env, timeoutMs });
38
+ if (loaded === undefined)
39
+ return;
40
+ for (const [name, value] of loaded) {
41
+ if (name !== "PATH" && !SHELL_LOCAL.has(name))
42
+ env[name] = value;
43
+ }
44
+ const path = loaded.get("PATH");
45
+ if (path === undefined || path === "")
46
+ return;
47
+ env.PATH = inheritedPath ? `${path}:${inheritedPath}` : path;
48
+ }
49
+ function readLoginShellEnvironment({
50
+ shell,
51
+ env,
52
+ timeoutMs
53
+ }) {
54
+ return new Promise((resolve) => {
55
+ const marker = `nyte-env-${randomUUID()}`;
56
+ const fence = `\x00${marker}\x00`;
57
+ const printFence = `printf '\\000${marker}\\000'`;
58
+ const child = spawn(shell, ["-ilc", `${printFence}; /usr/bin/env -0; ${printFence}`], {
59
+ env,
60
+ detached: true,
61
+ stdio: ["ignore", "pipe", "ignore"]
62
+ });
63
+ const chunks = [];
64
+ let bytes = 0;
65
+ let settled = false;
66
+ const finish = (loaded) => {
67
+ if (settled)
68
+ return;
69
+ settled = true;
70
+ clearTimeout(timer);
71
+ child.stdout.destroy();
72
+ child.kill("SIGKILL");
73
+ resolve(loaded);
74
+ };
75
+ const timer = setTimeout(() => finish(undefined), timeoutMs);
76
+ child.on("error", () => finish(undefined));
77
+ child.stdout.on("error", () => finish(undefined));
78
+ child.stdout.on("data", (chunk) => {
79
+ bytes += chunk.byteLength;
80
+ if (bytes > OUTPUT_LIMIT) {
81
+ finish(undefined);
82
+ return;
83
+ }
84
+ chunks.push(chunk);
85
+ });
86
+ child.on("close", (code) => {
87
+ const [, fenced, ...after] = Buffer.concat(chunks).toString("utf8").split(fence);
88
+ if (code !== 0 || fenced === undefined || after.length === 0) {
89
+ finish(undefined);
90
+ return;
91
+ }
92
+ finish(parseEnvironment(fenced));
93
+ });
94
+ });
95
+ }
96
+ function parseEnvironment(output) {
97
+ const loaded = new Map;
98
+ for (const entry of output.split("\x00")) {
99
+ const [name = "", ...value] = entry.split("=");
100
+ if (name !== "" && value.length > 0)
101
+ loaded.set(name, value.join("="));
102
+ }
103
+ return loaded;
104
+ }
105
+ export {
106
+ completeShellEnvironment,
107
+ createShellEnvironmentRepair
108
+ };
@@ -0,0 +1,6 @@
1
+ import type { DatabaseSync, SQLInputValue } from "node:sqlite";
2
+ export declare function sqliteWorkers(database: DatabaseSync, path: string): {
3
+ check: () => void;
4
+ read(sql: string, params: readonly SQLInputValue[]): Promise<readonly Record<string, string | number | bigint | null>[] | undefined>;
5
+ close(): Promise<void>;
6
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ sqliteWorkers2
3
+ } from "../chunks/canvas-preview-zaaj99wd.js";
4
+ export {
5
+ sqliteWorkers2 as sqliteWorkers
6
+ };
@@ -0,0 +1,8 @@
1
+ import type { Store } from "@nyte-ai/core";
2
+ /** The local store's file: `NYTE_DB` when set, so a source run keeps its own chats, else `.nyte/nyte.db` under `home`. */
3
+ export declare function storePath(home: string): string;
4
+ export declare function sqliteStore(input: {
5
+ readonly path: string;
6
+ } | {
7
+ readonly memory: true;
8
+ }): Store;
@@ -0,0 +1,11 @@
1
+ import {
2
+ storePath2,
3
+ sqliteStore2
4
+ } from "../chunks/canvas-preview-tnqe7k0b.js";
5
+ import"../chunks/canvas-preview-zaaj99wd.js";
6
+ import"../chunks/canvas-preview-0cmbkp2j.js";
7
+ import"../chunks/canvas-preview-69fkk9yn.js";
8
+ export {
9
+ sqliteStore2 as sqliteStore,
10
+ storePath2 as storePath
11
+ };
@@ -0,0 +1,13 @@
1
+ import type { ByteReader, Ref, Revision, SessionEvent } from "@nyte-ai/schema";
2
+ import type { LoggedRow, StoredObject, StoredRecord } from "@nyte-ai/core/store";
3
+ export declare function prefixEnd(prefix: string): string | null;
4
+ export declare function mintRevision(): Revision;
5
+ export declare function decodeEvent(seq: number, at: number, text: string): SessionEvent;
6
+ export declare function parseNumber(value: unknown): number;
7
+ export declare function parseText(value: unknown): string | null;
8
+ export declare function parseRef(row: Readonly<Record<string, unknown>>): Ref;
9
+ export declare function parseStoredRecord(row: Readonly<Record<string, unknown>>): StoredRecord;
10
+ export declare function parseStoredObject(row: Readonly<Record<string, unknown>>): StoredObject;
11
+ export declare function loggedRow(row: Readonly<Record<string, unknown>>): LoggedRow;
12
+ export declare function collect(bytes: AsyncIterable<Uint8Array>): Promise<Uint8Array>;
13
+ export declare function memoryReader(bytes: Uint8Array): ByteReader;
@@ -0,0 +1,26 @@
1
+ import {
2
+ prefixEnd2,
3
+ mintRevision2,
4
+ decodeEvent2,
5
+ parseNumber2,
6
+ parseText2,
7
+ parseRef2,
8
+ parseStoredRecord2,
9
+ parseStoredObject2,
10
+ loggedRow2,
11
+ collect2,
12
+ memoryReader2
13
+ } from "../chunks/canvas-preview-69fkk9yn.js";
14
+ export {
15
+ collect2 as collect,
16
+ decodeEvent2 as decodeEvent,
17
+ loggedRow2 as loggedRow,
18
+ memoryReader2 as memoryReader,
19
+ mintRevision2 as mintRevision,
20
+ parseNumber2 as parseNumber,
21
+ parseRef2 as parseRef,
22
+ parseStoredObject2 as parseStoredObject,
23
+ parseStoredRecord2 as parseStoredRecord,
24
+ parseText2 as parseText,
25
+ prefixEnd2 as prefixEnd
26
+ };
@@ -0,0 +1,25 @@
1
+ import type { SessionId, Usage } from "@nyte-ai/schema";
2
+ import type { UsageReport, UsageSubject, UsageWindow } from "./usage-types.ts";
3
+ export interface UsageRecord {
4
+ readonly at: number;
5
+ readonly subject: UsageSubject;
6
+ readonly usage: Usage;
7
+ }
8
+ export interface SessionUsage {
9
+ readonly sessionId: SessionId;
10
+ readonly name: string | undefined;
11
+ readonly records: readonly UsageRecord[];
12
+ readonly lastActivityAt?: number;
13
+ }
14
+ export interface StoreRead {
15
+ readonly workspacePath: string | null;
16
+ readonly sessions: readonly SessionUsage[];
17
+ readonly failure: {
18
+ readonly message: string;
19
+ } | null;
20
+ }
21
+ export declare const USAGE_EVENTS = "SELECT session, seq, at, event FROM log WHERE json_extract(event, '$.kind') = 'request' OR (json_extract(event, '$.kind') = 'run' AND json_extract(event, '$.change') = 'started') ORDER BY session, seq";
22
+ export declare function localDay(at: number): string;
23
+ export declare function shiftDay(day: string, delta: number): string;
24
+ export declare function projectUsageReport(stores: readonly StoreRead[], window: UsageWindow, readAt: number): UsageReport;
25
+ export declare function readNyteUsage(home: string, window: UsageWindow): UsageReport;
@@ -0,0 +1,19 @@
1
+ import {
2
+ USAGE_EVENTS2,
3
+ localDay2,
4
+ shiftDay2,
5
+ projectUsageReport2,
6
+ readNyteUsage2
7
+ } from "../chunks/canvas-preview-11nadadc.js";
8
+ import"../chunks/canvas-preview-srgfpdmf.js";
9
+ import"../chunks/canvas-preview-tnqe7k0b.js";
10
+ import"../chunks/canvas-preview-zaaj99wd.js";
11
+ import"../chunks/canvas-preview-0cmbkp2j.js";
12
+ import"../chunks/canvas-preview-69fkk9yn.js";
13
+ export {
14
+ USAGE_EVENTS2 as USAGE_EVENTS,
15
+ localDay2 as localDay,
16
+ projectUsageReport2 as projectUsageReport,
17
+ readNyteUsage2 as readNyteUsage,
18
+ shiftDay2 as shiftDay
19
+ };
@@ -0,0 +1,54 @@
1
+ import type { Stats } from "node:fs";
2
+ import { Type, type TSchema } from "typebox";
3
+ export interface HistoryLine {
4
+ readonly text: string;
5
+ /** False for a last line without its newline: its writer may still be appending it. */
6
+ readonly terminated: boolean;
7
+ }
8
+ export interface HistoryFold<Scan> {
9
+ line(line: HistoryLine): void;
10
+ scan(): Scan;
11
+ }
12
+ /** Folds a history file's lines into a scan. `scan()` returns a copy, so folding goes on without changing it. */
13
+ export type HistoryParser<Scan> = (from: Scan | undefined) => HistoryFold<Scan>;
14
+ export interface FileScan<Scan> {
15
+ readonly size: number;
16
+ readonly mtimeMs: number;
17
+ /** The byte after the last newline, where a grown file resumes. */
18
+ readonly position: number;
19
+ /** The scan of every line up to `position`. */
20
+ readonly committed: Scan;
21
+ }
22
+ export declare function fileScanSchema<Scan extends TSchema>(scan: Scan): Type.TObject<{
23
+ size: Type.TNumber;
24
+ mtimeMs: Type.TNumber;
25
+ position: Type.TNumber;
26
+ committed: Scan;
27
+ }>;
28
+ /** Scans keyed by path. A scan answers while its file keeps the size and mtime it was read at. */
29
+ export declare class UsageScanCache<Scan> {
30
+ #private;
31
+ constructor(files?: Iterable<readonly [string, FileScan<Scan>]>);
32
+ keys(): IterableIterator<string>;
33
+ entries(): IterableIterator<[string, FileScan<Scan>]>;
34
+ get(path: string): FileScan<Scan> | undefined;
35
+ set(path: string, scan: FileScan<Scan>): void;
36
+ /** Forgets every file a read did not reach. */
37
+ keepOnly(seen: ReadonlySet<string>): void;
38
+ /** Whether a scan was added or forgotten since the last {@link markSaved}. */
39
+ get changed(): boolean;
40
+ markSaved(): void;
41
+ }
42
+ /**
43
+ * Reads a history file through `cache`. An unchanged file answers from the cache without being
44
+ * opened, and a file that only grew is read from its last newline on; any other change rereads it.
45
+ * A last line without its newline is folded into the answer but not the cache, since its writer may
46
+ * still be appending it: the next read starts from that line again.
47
+ */
48
+ export declare function readHistory<Scan>(path: string, info: Stats, parser: HistoryParser<Scan>, cache: UsageScanCache<Scan> | undefined, signal: AbortSignal | undefined): Promise<Scan>;
49
+ /** Reads a cache document written by {@link writeCacheDocument}; a missing, torn or outdated one reads as `undefined`. */
50
+ export declare function readCacheDocument<Document>(path: string, validator: {
51
+ Check(value: unknown): value is Document;
52
+ }): Promise<Document | undefined>;
53
+ /** Replaces the cache document whole, so a reader never sees half of one. Resolves whether the write landed. */
54
+ export declare function writeCacheDocument<Document>(path: string, document: Document): Promise<boolean>;
@@ -0,0 +1,14 @@
1
+ import {
2
+ fileScanSchema2,
3
+ UsageScanCache2,
4
+ readHistory2,
5
+ readCacheDocument2,
6
+ writeCacheDocument2
7
+ } from "../chunks/canvas-preview-kp75gb63.js";
8
+ export {
9
+ UsageScanCache2 as UsageScanCache,
10
+ fileScanSchema2 as fileScanSchema,
11
+ readCacheDocument2 as readCacheDocument,
12
+ readHistory2 as readHistory,
13
+ writeCacheDocument2 as writeCacheDocument
14
+ };
@@ -0,0 +1,24 @@
1
+ import type { UsageScan, UsageScanReader, UsageScanRequest } from "./usage-service.ts";
2
+ export interface UsageWorkerRequest extends UsageScanRequest {
3
+ readonly id: number;
4
+ readonly home: string;
5
+ }
6
+ export type UsageWorkerReply = {
7
+ readonly id: number;
8
+ readonly scan: UsageScan;
9
+ } | {
10
+ readonly id: number;
11
+ readonly error: string;
12
+ };
13
+ export declare class UsageScanWorker implements UsageScanReader {
14
+ private readonly home;
15
+ private readonly entry;
16
+ private worker;
17
+ private nextId;
18
+ private readonly pending;
19
+ constructor(home: string, entry: string | URL);
20
+ scan(request: UsageScanRequest): Promise<UsageScan>;
21
+ close(): Promise<void>;
22
+ private spawn;
23
+ private fail;
24
+ }
@@ -0,0 +1,65 @@
1
+ // src/usage-scan.ts
2
+ import { Worker } from "node:worker_threads";
3
+
4
+ class UsageScanWorker {
5
+ home;
6
+ entry;
7
+ worker;
8
+ nextId = 1;
9
+ pending = new Map;
10
+ constructor(home, entry) {
11
+ this.home = home;
12
+ this.entry = entry;
13
+ }
14
+ async scan(request) {
15
+ const worker = this.spawn();
16
+ const id = this.nextId++;
17
+ return new Promise((resolve, reject) => {
18
+ this.pending.set(id, { resolve, reject });
19
+ try {
20
+ worker.postMessage({ id, home: this.home, ...request });
21
+ } catch (cause) {
22
+ this.pending.delete(id);
23
+ reject(cause);
24
+ }
25
+ });
26
+ }
27
+ async close() {
28
+ const worker = this.worker;
29
+ if (worker === undefined)
30
+ return;
31
+ this.fail(worker, new Error("Usage worker closed."));
32
+ await worker.terminate();
33
+ }
34
+ spawn() {
35
+ if (this.worker !== undefined)
36
+ return this.worker;
37
+ const worker = new Worker(this.entry);
38
+ worker.unref();
39
+ worker.on("message", (reply) => {
40
+ const request = this.pending.get(reply.id);
41
+ this.pending.delete(reply.id);
42
+ if ("scan" in reply)
43
+ request?.resolve(reply.scan);
44
+ else
45
+ request?.reject(new Error(reply.error));
46
+ });
47
+ worker.on("error", (cause) => this.fail(worker, cause));
48
+ worker.on("exit", (code) => {
49
+ this.fail(worker, new Error(`Usage worker exited with code ${String(code)}.`));
50
+ });
51
+ this.worker = worker;
52
+ return worker;
53
+ }
54
+ fail(worker, cause) {
55
+ if (this.worker !== worker)
56
+ return;
57
+ this.worker = undefined;
58
+ for (const request of this.pending.values())
59
+ request.reject(cause);
60
+ this.pending.clear();
61
+ }
62
+ }
63
+ export {
64
+ UsageScanWorker
65
+ };
@@ -0,0 +1,23 @@
1
+ import type { Models } from "@nyte-ai/ai";
2
+ import type { Api, Model } from "@nyte-ai/schema/model";
3
+ import type { UsageSnapshot, UsageWindow } from "./usage-types.ts";
4
+ export interface UsageScanRequest {
5
+ readonly window: UsageWindow;
6
+ readonly catalog?: readonly Model<Api>[];
7
+ }
8
+ export type UsageScan = UsageSnapshot;
9
+ export interface UsageScanReader {
10
+ scan(request: UsageScanRequest): Promise<UsageScan>;
11
+ close(): Promise<void>;
12
+ }
13
+ export declare function catalogForUsage(models: Pick<Models, "getModels">): readonly Model<Api>[];
14
+ export declare class UsageScanner implements UsageScanReader {
15
+ private readonly home;
16
+ private readonly cachePath;
17
+ private caches;
18
+ private readonly models;
19
+ private readonly scans;
20
+ constructor(home: string);
21
+ scan(request: UsageScanRequest): Promise<UsageScan>;
22
+ close(): Promise<void>;
23
+ }
@@ -0,0 +1,16 @@
1
+ import {
2
+ catalogForUsage2,
3
+ UsageScanner2
4
+ } from "../chunks/canvas-preview-fxa0rfb0.js";
5
+ import"../chunks/canvas-preview-k1yg4fgp.js";
6
+ import"../chunks/canvas-preview-11nadadc.js";
7
+ import"../chunks/canvas-preview-kp75gb63.js";
8
+ import"../chunks/canvas-preview-srgfpdmf.js";
9
+ import"../chunks/canvas-preview-tnqe7k0b.js";
10
+ import"../chunks/canvas-preview-zaaj99wd.js";
11
+ import"../chunks/canvas-preview-0cmbkp2j.js";
12
+ import"../chunks/canvas-preview-69fkk9yn.js";
13
+ export {
14
+ UsageScanner2 as UsageScanner,
15
+ catalogForUsage2 as catalogForUsage
16
+ };
@@ -0,0 +1,9 @@
1
+ import type { Usage } from "@nyte-ai/schema";
2
+ import type { Usage as ModelUsageCounts } from "@nyte-ai/schema/model";
3
+ import type { ModelUsage, UsageSummary } from "./usage-types.ts";
4
+ export declare function emptyModelUsage(): ModelUsageCounts;
5
+ export declare function recordedUsage(usage: ModelUsageCounts): Usage;
6
+ export declare function emptyUsageSummary(): UsageSummary;
7
+ export declare function summarizeModels(rows: readonly ModelUsage[]): UsageSummary;
8
+ export declare function cacheSavings(usage: Usage): number;
9
+ export declare function usageTokens(usage: Usage): number;
@@ -0,0 +1,16 @@
1
+ import {
2
+ emptyModelUsage2,
3
+ recordedUsage2,
4
+ emptyUsageSummary2,
5
+ summarizeModels2,
6
+ cacheSavings2,
7
+ usageTokens2
8
+ } from "../chunks/canvas-preview-srgfpdmf.js";
9
+ export {
10
+ cacheSavings2 as cacheSavings,
11
+ emptyModelUsage2 as emptyModelUsage,
12
+ emptyUsageSummary2 as emptyUsageSummary,
13
+ recordedUsage2 as recordedUsage,
14
+ summarizeModels2 as summarizeModels,
15
+ usageTokens2 as usageTokens
16
+ };
@@ -0,0 +1,86 @@
1
+ import type { SessionId, Usage } from "@nyte-ai/schema";
2
+ export interface UsageWindow {
3
+ readonly sinceDay: string | null;
4
+ readonly untilDay: string;
5
+ }
6
+ export interface UsageTotals {
7
+ readonly input: number;
8
+ readonly output: number;
9
+ readonly cacheRead: number;
10
+ readonly cacheWrite: number;
11
+ readonly reasoning: number;
12
+ readonly tokens: number;
13
+ readonly cost: number;
14
+ readonly cacheSavings: number;
15
+ }
16
+ export type UsageSubject = {
17
+ readonly kind: "model";
18
+ readonly provider: string;
19
+ readonly model: string;
20
+ } | {
21
+ readonly kind: "tool";
22
+ } | {
23
+ readonly kind: "compaction";
24
+ };
25
+ export interface UsageEntry {
26
+ readonly day: string;
27
+ readonly workspacePath: string | null;
28
+ readonly sessionId: SessionId;
29
+ readonly subject: UsageSubject;
30
+ readonly totals: UsageTotals;
31
+ }
32
+ export interface UsageSession {
33
+ readonly sessionId: SessionId;
34
+ readonly name?: string;
35
+ readonly workspacePath: string | null;
36
+ readonly lastActivityAt: number;
37
+ }
38
+ export interface UsageSource {
39
+ readonly workspacePath: string | null;
40
+ readonly status: "ok" | "failed";
41
+ readonly sessions: number;
42
+ readonly message: string | null;
43
+ }
44
+ export interface UsageReport {
45
+ readonly readAt: number;
46
+ readonly sinceDay: string;
47
+ readonly untilDay: string;
48
+ readonly entries: readonly UsageEntry[];
49
+ readonly sessions: readonly UsageSession[];
50
+ readonly sources: readonly UsageSource[];
51
+ readonly previous?: {
52
+ readonly cost: number;
53
+ readonly tokens: number;
54
+ };
55
+ readonly earliestDay?: string;
56
+ }
57
+ export interface ModelUsage {
58
+ readonly provider: string;
59
+ readonly model: string;
60
+ readonly turns: number;
61
+ readonly usage: Usage;
62
+ }
63
+ export interface UsageSummary {
64
+ readonly models: readonly ModelUsage[];
65
+ readonly compaction: Usage;
66
+ readonly tools: Usage;
67
+ readonly total: Usage;
68
+ readonly cacheSavings: number;
69
+ }
70
+ export type LocalHistoryUsage = {
71
+ readonly kind: "missing";
72
+ } | {
73
+ readonly kind: "failed";
74
+ 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
+ export interface UsageSnapshot extends UsageReport {
83
+ readonly nyteError: string | null;
84
+ readonly claudeCode: LocalHistoryUsage;
85
+ readonly codex: LocalHistoryUsage;
86
+ }
File without changes
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import"../chunks/canvas-preview-69fkk9yn.js";
2
+ import"../chunks/canvas-preview-zaaj99wd.js";
3
+ import"../chunks/canvas-preview-0cmbkp2j.js";
4
+ import"../chunks/canvas-preview-tnqe7k0b.js";
5
+ import"../chunks/canvas-preview-srgfpdmf.js";
6
+ import"../chunks/canvas-preview-11nadadc.js";
7
+ import"../chunks/canvas-preview-kp75gb63.js";
8
+ import"../chunks/canvas-preview-k1yg4fgp.js";
9
+ import {
10
+ UsageScanner2
11
+ } from "../chunks/canvas-preview-fxa0rfb0.js";
12
+
13
+ // src/usage-worker.ts
14
+ import { parentPort } from "node:worker_threads";
15
+ var port = parentPort;
16
+ if (port === null)
17
+ throw new Error("The usage worker must run on a worker thread.");
18
+ var scanner;
19
+ port.on("message", (request) => {
20
+ scanner ??= new UsageScanner2(request.home);
21
+ scanner.scan(request).then((scan) => {
22
+ port.postMessage({ id: request.id, scan });
23
+ }, (cause) => {
24
+ port.postMessage({
25
+ id: request.id,
26
+ error: cause instanceof Error ? cause.message : String(cause)
27
+ });
28
+ });
29
+ });