dev3000 0.0.182 → 0.0.184

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 (60) hide show
  1. package/README.md +37 -169
  2. package/bin/d3k-runtime +2 -0
  3. package/bin/dev3000 +2 -119
  4. package/dist/cdp-monitor.d.ts +6 -0
  5. package/dist/cdp-monitor.d.ts.map +1 -1
  6. package/dist/cdp-monitor.js +30 -8
  7. package/dist/cdp-monitor.js.map +1 -1
  8. package/dist/cli.js +4 -53
  9. package/dist/cli.js.map +1 -1
  10. package/dist/dev-environment.d.ts.map +1 -1
  11. package/dist/dev-environment.js +8 -46
  12. package/dist/dev-environment.js.map +1 -1
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +2 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/runtime/browser-events.d.ts +5 -0
  18. package/dist/runtime/browser-events.d.ts.map +1 -0
  19. package/dist/runtime/browser-events.js +87 -0
  20. package/dist/runtime/browser-events.js.map +1 -0
  21. package/dist/runtime/cli.d.ts +3 -0
  22. package/dist/runtime/cli.d.ts.map +1 -0
  23. package/dist/runtime/cli.js +90 -0
  24. package/dist/runtime/cli.js.map +1 -0
  25. package/dist/runtime/runtime.d.ts +10 -0
  26. package/dist/runtime/runtime.d.ts.map +1 -0
  27. package/dist/runtime/runtime.js +346 -0
  28. package/dist/runtime/runtime.js.map +1 -0
  29. package/dist/runtime/session.d.ts +18 -0
  30. package/dist/runtime/session.d.ts.map +1 -0
  31. package/dist/runtime/session.js +61 -0
  32. package/dist/runtime/session.js.map +1 -0
  33. package/dist/runtime/timeline.d.ts +40 -0
  34. package/dist/runtime/timeline.d.ts.map +1 -0
  35. package/dist/runtime/timeline.js +69 -0
  36. package/dist/runtime/timeline.js.map +1 -0
  37. package/dist/skills/d3k/internal-skill.md +20 -131
  38. package/dist/skills/index.d.ts +54 -0
  39. package/dist/skills/index.d.ts.map +1 -0
  40. package/dist/skills/index.js +214 -0
  41. package/dist/skills/index.js.map +1 -0
  42. package/dist/utils/d3k-skill-installer.d.ts +4 -0
  43. package/dist/utils/d3k-skill-installer.d.ts.map +1 -0
  44. package/dist/utils/d3k-skill-installer.js +30 -0
  45. package/dist/utils/d3k-skill-installer.js.map +1 -0
  46. package/dist/utils/version-check.d.ts +1 -21
  47. package/dist/utils/version-check.d.ts.map +1 -1
  48. package/dist/utils/version-check.js +2 -97
  49. package/dist/utils/version-check.js.map +1 -1
  50. package/package.json +7 -16
  51. package/skills/d3k/PUBLISH.md +46 -0
  52. package/skills/d3k/SKILL.md +32 -0
  53. package/skills/d3k/agents/openai.yaml +4 -0
  54. package/skills/d3k/scripts/runtime.mjs +26 -0
  55. package/dist/commands/skill-runner.d.ts +0 -40
  56. package/dist/commands/skill-runner.d.ts.map +0 -1
  57. package/dist/commands/skill-runner.js +0 -826
  58. package/dist/commands/skill-runner.js.map +0 -1
  59. package/dist/skills/index.test.ts +0 -203
  60. package/dist/skills/index.ts +0 -259
@@ -0,0 +1,346 @@
1
+ import { spawn } from "node:child_process";
2
+ import { randomBytes } from "node:crypto";
3
+ import { chmodSync, closeSync, existsSync, mkdirSync, openSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
4
+ import { createServer } from "node:http";
5
+ import { get as httpsGet } from "node:https";
6
+ import { createServer as createTcpServer } from "node:net";
7
+ import { homedir } from "node:os";
8
+ import { join, resolve } from "node:path";
9
+ import { stripVTControlCharacters } from "node:util";
10
+ import { CDPMonitor } from "../cdp-monitor.js";
11
+ import { buildPortlessServerCommand, getPortlessProxyStatus, preparePortlessRuntime } from "../portless.js";
12
+ import { getProjectName } from "../utils/project-name.js";
13
+ import { findCurrentSession } from "../utils/session.js";
14
+ import { recordBrowserEvent } from "./browser-events.js";
15
+ import { queryRuntime, readRuntimeSession, runtimePaths } from "./session.js";
16
+ import { Timeline } from "./timeline.js";
17
+ // Trust the installed Portless CA explicitly; Node/Bun need not inherit the OS trust store.
18
+ async function probeServer(url) {
19
+ const caPath = join(process.env.PORTLESS_STATE_DIR || join(homedir(), ".portless"), "ca.pem");
20
+ const ca = existsSync(caPath) ? readFileSync(caPath) : undefined;
21
+ return new Promise((resolveProbe) => {
22
+ const request = httpsGet(url, { ca, timeout: 1500 }, (response) => {
23
+ response.destroy();
24
+ resolveProbe(![502, 503].includes(response.statusCode || 503));
25
+ });
26
+ request.on("timeout", () => request.destroy());
27
+ request.on("error", () => resolveProbe(false));
28
+ });
29
+ }
30
+ async function freePort() {
31
+ return new Promise((resolvePort, reject) => {
32
+ const server = createTcpServer();
33
+ server.once("error", reject);
34
+ server.listen(0, "127.0.0.1", () => {
35
+ const address = server.address();
36
+ if (!address || typeof address === "string") {
37
+ server.close();
38
+ reject(new Error("No available port"));
39
+ return;
40
+ }
41
+ server.close(() => resolvePort(address.port));
42
+ });
43
+ });
44
+ }
45
+ function defaultCommand(cwd) {
46
+ const pkg = JSON.parse(readFileSync(join(cwd, "package.json"), "utf8"));
47
+ if (!pkg.scripts?.dev)
48
+ throw new Error("No dev script; pass --command with the project's dev command");
49
+ const manager = typeof pkg.packageManager === "string"
50
+ ? pkg.packageManager.split("@")[0]
51
+ : existsSync(join(cwd, "bun.lock")) || existsSync(join(cwd, "bun.lockb"))
52
+ ? "bun"
53
+ : existsSync(join(cwd, "pnpm-lock.yaml"))
54
+ ? "pnpm"
55
+ : existsSync(join(cwd, "yarn.lock"))
56
+ ? "yarn"
57
+ : "npm";
58
+ if (!["bun", "pnpm", "yarn", "npm"].includes(manager))
59
+ throw new Error("Unknown package manager; pass --command");
60
+ return `${manager} run dev`;
61
+ }
62
+ /** Own the server, browser, and evidence until the retained process is stopped. */
63
+ export async function startRuntime(options = {}) {
64
+ const cwd = resolve(options.cwd || process.cwd());
65
+ const existing = readRuntimeSession(cwd);
66
+ if (existing) {
67
+ console.log(JSON.stringify(await queryRuntime("/status", cwd)));
68
+ return;
69
+ }
70
+ // A legacy CLI and the skill runtime must never own the same project together.
71
+ if (cwd === process.cwd() && findCurrentSession())
72
+ throw new Error("A legacy d3k session is active; stop it before starting the skill runtime");
73
+ const status = getPortlessProxyStatus();
74
+ if (!status.canonical || !status.serviceInstalled || status.setupRequired)
75
+ throw new Error("Canonical Portless is required. Run d3k-runtime portless setup, then retry.");
76
+ const prepared = preparePortlessRuntime(getProjectName(cwd));
77
+ if (!prepared.runtime)
78
+ throw new Error(prepared.error || "Portless is unavailable");
79
+ const command = options.command || defaultCommand(cwd);
80
+ const paths = runtimePaths(cwd);
81
+ mkdirSync(paths.directory, { recursive: true, mode: 0o700 });
82
+ const lockFile = join(paths.directory, "runtime.lock");
83
+ // Exclusive creation also closes the race between two simultaneous agent starts.
84
+ try {
85
+ const fd = openSync(lockFile, "wx", 0o600);
86
+ writeFileSync(fd, String(process.pid));
87
+ closeSync(fd);
88
+ }
89
+ catch (error) {
90
+ if (error.code !== "EEXIST")
91
+ throw error;
92
+ const owner = Number(readFileSync(lockFile, "utf8"));
93
+ if (!Number.isSafeInteger(owner) || owner <= 0)
94
+ throw new Error("Invalid runtime lock; inspect it before removing");
95
+ try {
96
+ process.kill(owner, 0);
97
+ throw new Error("A runtime is already starting for this project");
98
+ }
99
+ catch (lockError) {
100
+ if (lockError.code !== "ESRCH")
101
+ throw lockError;
102
+ }
103
+ unlinkSync(lockFile);
104
+ return startRuntime(options);
105
+ }
106
+ const timeline = new Timeline();
107
+ const session = {
108
+ sessionId: timeline.sessionId,
109
+ pid: process.pid,
110
+ cwd,
111
+ socketPath: paths.socketPath,
112
+ token: randomBytes(32).toString("hex"),
113
+ appUrl: prepared.runtime.url,
114
+ ready: false,
115
+ cdpUrl: null
116
+ };
117
+ let child;
118
+ let monitor;
119
+ let closing = false;
120
+ let failed = false;
121
+ const persist = () => writeFileSync(paths.sessionFile, JSON.stringify(session), { mode: 0o600 });
122
+ const log = (kind, message, level = "info") => timeline.append({ source: "runtime", level, kind, message });
123
+ const server = createServer((request, response) => {
124
+ response.setHeader("content-type", "application/json");
125
+ response.setHeader("cache-control", "no-store");
126
+ const send = (code, value) => {
127
+ response.statusCode = code;
128
+ response.end(JSON.stringify(value));
129
+ };
130
+ if (request.headers.authorization !== `Bearer ${session.token}`) {
131
+ send(403, { error: "Forbidden" });
132
+ return;
133
+ }
134
+ const url = new URL(request.url || "/", "http://runtime");
135
+ try {
136
+ if (request.method === "GET" && url.pathname === "/status") {
137
+ const cdpUrl = monitor?.getCdpUrl() ?? null;
138
+ const { token: _token, socketPath: _socket, ...publicSession } = session;
139
+ send(200, {
140
+ ...publicSession,
141
+ running: !closing,
142
+ ready: session.ready && !closing && (options.serversOnly || Boolean(cdpUrl)),
143
+ cdpUrl,
144
+ browserConnected: Boolean(cdpUrl),
145
+ cursor: timeline.read({ limit: 1 }).latest
146
+ });
147
+ }
148
+ else if (request.method === "GET" && url.pathname === "/events") {
149
+ const source = url.searchParams.get("source") || undefined;
150
+ const level = url.searchParams.get("level") || undefined;
151
+ if (source && !["server", "browser", "runtime"].includes(source))
152
+ throw new Error("Invalid source");
153
+ if (level && !["debug", "info", "warn", "error"].includes(level))
154
+ throw new Error("Invalid level");
155
+ send(200, timeline.read({
156
+ after: Number(url.searchParams.get("after") || 0),
157
+ limit: Number(url.searchParams.get("limit") || 100),
158
+ source: source,
159
+ level: level,
160
+ sessionId: url.searchParams.get("sessionId") || undefined
161
+ }));
162
+ }
163
+ else if (request.method === "POST" && url.pathname === "/stop") {
164
+ send(200, { stopping: true });
165
+ void shutdown();
166
+ }
167
+ else
168
+ send(404, { error: "Not found" });
169
+ }
170
+ catch (error) {
171
+ send(400, { error: String(error) });
172
+ }
173
+ });
174
+ const shutdown = async () => {
175
+ if (closing)
176
+ return;
177
+ closing = true;
178
+ console.log(JSON.stringify({
179
+ stopped: true,
180
+ sessionId: session.sessionId,
181
+ events: timeline.read({ after: Math.max(0, timeline.read({ limit: 1 }).latest - (failed ? 25 : 0)) }).events
182
+ }));
183
+ session.ready = false;
184
+ monitor?.prepareShutdown();
185
+ if (child?.pid) {
186
+ try {
187
+ if (process.platform === "win32")
188
+ child.kill("SIGTERM");
189
+ else
190
+ process.kill(-child.pid, "SIGTERM");
191
+ }
192
+ catch {
193
+ /* Already exited. */
194
+ }
195
+ }
196
+ await monitor?.shutdown().catch(() => { });
197
+ if (child?.pid && process.platform !== "win32") {
198
+ const pid = child.pid;
199
+ await new Promise((resolveWait) => setTimeout(resolveWait, 300));
200
+ try {
201
+ process.kill(-pid, "SIGKILL");
202
+ }
203
+ catch {
204
+ /* Process group exited. */
205
+ }
206
+ }
207
+ await new Promise((resolveClose) => server.close(() => resolveClose()));
208
+ for (const path of [paths.sessionFile, lockFile]) {
209
+ try {
210
+ unlinkSync(path);
211
+ }
212
+ catch {
213
+ /* Already removed. */
214
+ }
215
+ }
216
+ process.off("SIGTERM", onSignal);
217
+ process.off("SIGINT", onSignal);
218
+ };
219
+ const onSignal = () => {
220
+ void shutdown();
221
+ };
222
+ process.on("SIGTERM", onSignal);
223
+ process.on("SIGINT", onSignal);
224
+ try {
225
+ if (process.platform !== "win32") {
226
+ try {
227
+ unlinkSync(paths.socketPath);
228
+ }
229
+ catch (error) {
230
+ if (error.code !== "ENOENT")
231
+ throw error;
232
+ }
233
+ }
234
+ await new Promise((resolveListen, reject) => {
235
+ server.once("error", reject);
236
+ server.listen(paths.socketPath, resolveListen);
237
+ });
238
+ if (process.platform !== "win32")
239
+ chmodSync(paths.socketPath, 0o600);
240
+ persist();
241
+ log("starting", `Starting ${command}`);
242
+ child = spawn(buildPortlessServerCommand(prepared.runtime, command, { customCommand: true }), {
243
+ cwd,
244
+ shell: true,
245
+ detached: process.platform !== "win32",
246
+ stdio: ["ignore", "pipe", "pipe"],
247
+ env: { ...process.env, FORCE_COLOR: "0" }
248
+ });
249
+ for (const [stream, name] of [
250
+ [child.stdout, "stdout"],
251
+ [child.stderr, "stderr"]
252
+ ]) {
253
+ if (!stream)
254
+ continue;
255
+ // Split arbitrarily long lines too, so a server without newlines cannot grow memory forever.
256
+ stream.setEncoding("utf8");
257
+ let pending = "";
258
+ const emit = (line) => timeline.append({
259
+ source: "server",
260
+ level: /\b(error|exception|failed)\b/i.test(line) ? "error" : /\bwarn(ing)?\b/i.test(line) ? "warn" : "info",
261
+ kind: name,
262
+ message: stripVTControlCharacters(line)
263
+ });
264
+ stream.on("data", (chunk) => {
265
+ pending += chunk;
266
+ let newline = pending.indexOf("\n");
267
+ while (newline !== -1 || pending.length >= 8192) {
268
+ const end = newline !== -1 ? Math.min(newline, 8192) : 8192;
269
+ emit(pending.slice(0, end));
270
+ pending = pending.slice(end + (end === newline ? 1 : 0));
271
+ newline = pending.indexOf("\n");
272
+ }
273
+ });
274
+ stream.on("end", () => {
275
+ if (pending)
276
+ emit(pending);
277
+ pending = "";
278
+ });
279
+ }
280
+ child.once("error", (error) => {
281
+ if (closing)
282
+ return;
283
+ failed = true;
284
+ process.exitCode = 1;
285
+ log("server-error", String(error), "error");
286
+ void shutdown();
287
+ });
288
+ child.once("exit", (code, signal) => {
289
+ if (closing)
290
+ return;
291
+ failed = true;
292
+ process.exitCode = 1;
293
+ log("server-exit", `Server exited (${code ?? signal})`, "error");
294
+ void shutdown();
295
+ });
296
+ const deadline = Date.now() + (options.startupTimeout ?? 120000);
297
+ let listening = false;
298
+ while (!closing && Date.now() < deadline) {
299
+ if (await probeServer(session.appUrl)) {
300
+ listening = true;
301
+ break;
302
+ }
303
+ await new Promise((resolveWait) => setTimeout(resolveWait, 300));
304
+ }
305
+ if (closing) {
306
+ if (failed)
307
+ throw new Error("Dev server exited during startup");
308
+ return;
309
+ }
310
+ if (!listening)
311
+ throw new Error(`Server did not become ready within ${options.startupTimeout ?? 120000}ms`);
312
+ if (!options.serversOnly) {
313
+ monitor = new CDPMonitor(join(paths.directory, "chrome-profile"), join(paths.directory, "screenshots"), (_source, message) => {
314
+ if (message.startsWith("[INTERACTION]"))
315
+ timeline.append({ source: "browser", level: "info", kind: "interaction", message });
316
+ else if (message.startsWith("[CDP]") || message.startsWith("[CRASH]"))
317
+ log("browser-status", message);
318
+ }, false, undefined, false, undefined, session.appUrl, 30000, await freePort(), options.headless);
319
+ monitor.setAutomaticScreenshots(false);
320
+ monitor.setEventObserver((event) => recordBrowserEvent(timeline, event));
321
+ monitor.setOnWindowClosedCallback(() => {
322
+ void shutdown();
323
+ });
324
+ await monitor.start();
325
+ if (closing) {
326
+ await monitor.shutdown();
327
+ return;
328
+ }
329
+ await monitor.navigateToUrl(session.appUrl);
330
+ session.cdpUrl = monitor.getCdpUrl();
331
+ }
332
+ session.ready = true;
333
+ persist();
334
+ log("ready", session.appUrl);
335
+ console.log(JSON.stringify({ sessionId: session.sessionId, ready: true, appUrl: session.appUrl, cdpUrl: session.cdpUrl }));
336
+ }
337
+ catch (error) {
338
+ // Surface recent startup evidence before the in-memory session is torn down.
339
+ console.error(JSON.stringify({
340
+ startupEvents: timeline.read({ after: Math.max(0, timeline.read({ limit: 1 }).latest - 20) }).events
341
+ }));
342
+ await shutdown();
343
+ throw error;
344
+ }
345
+ }
346
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface RuntimeSession {
2
+ sessionId: string;
3
+ pid: number;
4
+ cwd: string;
5
+ socketPath: string;
6
+ token: string;
7
+ appUrl: string;
8
+ ready: boolean;
9
+ cdpUrl: string | null;
10
+ }
11
+ export declare function runtimePaths(cwd?: string): {
12
+ directory: string;
13
+ sessionFile: string;
14
+ socketPath: string;
15
+ };
16
+ export declare function readRuntimeSession(cwd?: string): RuntimeSession | null;
17
+ export declare function queryRuntime(path: string, cwd?: string, method?: string): Promise<unknown>;
18
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/runtime/session.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,wBAAgB,YAAY,CAAC,GAAG,SAAgB;;;;EAY/C;AAED,wBAAgB,kBAAkB,CAAC,GAAG,SAAgB,GAAG,cAAc,GAAG,IAAI,CAS7E;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAgB,EAAE,MAAM,SAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BtG"}
@@ -0,0 +1,61 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { request } from "node:http";
4
+ import { tmpdir } from "node:os";
5
+ import { join, resolve } from "node:path";
6
+ import { getProjectDir } from "../utils/project-name.js";
7
+ export function runtimePaths(cwd = process.cwd()) {
8
+ const directory = getProjectDir(cwd);
9
+ const key = createHash("sha256").update(resolve(directory)).digest("hex").slice(0, 20);
10
+ return {
11
+ directory,
12
+ sessionFile: join(directory, "runtime.json"),
13
+ // Short paths avoid macOS's 104-byte Unix socket limit.
14
+ socketPath: process.platform === "win32"
15
+ ? `\\\\.\\pipe\\d3k-${key}`
16
+ : join(tmpdir(), `d3k-${process.getuid?.() ?? "user"}-${key}.sock`)
17
+ };
18
+ }
19
+ export function readRuntimeSession(cwd = process.cwd()) {
20
+ try {
21
+ const session = JSON.parse(readFileSync(runtimePaths(cwd).sessionFile, "utf8"));
22
+ if (session.cwd !== resolve(cwd) || !Number.isSafeInteger(session.pid) || session.pid <= 0)
23
+ return null;
24
+ process.kill(session.pid, 0);
25
+ return session;
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ export async function queryRuntime(path, cwd = process.cwd(), method = "GET") {
32
+ const session = readRuntimeSession(cwd);
33
+ if (!session)
34
+ throw new Error("No active skill runtime for this project");
35
+ return new Promise((resolveResult, reject) => {
36
+ const req = request({ socketPath: session.socketPath, path, method, headers: { authorization: `Bearer ${session.token}` } }, (res) => {
37
+ let body = "";
38
+ res.setEncoding("utf8");
39
+ res.on("data", (chunk) => {
40
+ body += chunk;
41
+ });
42
+ res.on("error", reject);
43
+ res.on("end", () => {
44
+ try {
45
+ const result = JSON.parse(body);
46
+ if (res.statusCode !== 200)
47
+ reject(new Error(result.error || `Runtime returned ${res.statusCode}`));
48
+ else
49
+ resolveResult(result);
50
+ }
51
+ catch (error) {
52
+ reject(error);
53
+ }
54
+ });
55
+ });
56
+ req.setTimeout(5000, () => req.destroy(new Error("Runtime request timed out")));
57
+ req.on("error", reject);
58
+ req.end();
59
+ });
60
+ }
61
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/runtime/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export type EventSource = "server" | "browser" | "runtime";
2
+ export type EventLevel = "debug" | "info" | "warn" | "error";
3
+ export interface TimelineEvent {
4
+ seq: number;
5
+ timestamp: string;
6
+ source: EventSource;
7
+ level: EventLevel;
8
+ kind: string;
9
+ message: string;
10
+ data?: Record<string, unknown>;
11
+ }
12
+ export interface EventQuery {
13
+ after?: number;
14
+ limit?: number;
15
+ source?: EventSource;
16
+ level?: EventLevel;
17
+ sessionId?: string;
18
+ }
19
+ /** A byte- and count-bounded timeline. Cursors advance only through examined events. */
20
+ export declare class Timeline {
21
+ private readonly maxEvents;
22
+ private readonly maxBytes;
23
+ readonly sessionId: `${string}-${string}-${string}-${string}-${string}`;
24
+ private entries;
25
+ private bytes;
26
+ private sequence;
27
+ constructor(maxEvents?: number, maxBytes?: number);
28
+ append(input: Omit<TimelineEvent, "seq" | "timestamp">): TimelineEvent;
29
+ read(query?: EventQuery): {
30
+ sessionId: `${string}-${string}-${string}-${string}-${string}`;
31
+ events: TimelineEvent[];
32
+ cursor: number;
33
+ latest: number;
34
+ oldest: number;
35
+ reset: boolean;
36
+ dropped: number;
37
+ hasMore: boolean;
38
+ };
39
+ }
40
+ //# sourceMappingURL=timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../src/runtime/timeline.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;AAC1D,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAC5D,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE,UAAU,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AACD,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wFAAwF;AACxF,qBAAa,QAAQ;IAOjB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAP3B,QAAQ,CAAC,SAAS,sDAAe;IACjC,OAAO,CAAC,OAAO,CAAgD;IAC/D,OAAO,CAAC,KAAK,CAAI;IACjB,OAAO,CAAC,QAAQ,CAAI;IAEpB,YACmB,SAAS,SAAO,EAChB,QAAQ,SAAkB,EAG5C;IAED,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,WAAW,CAAC,GAAG,aAAa,CAgBrE;IAED,IAAI,CAAC,KAAK,GAAE,UAAe;;;;;;;;;MA8B1B;CACF"}
@@ -0,0 +1,69 @@
1
+ import { randomUUID } from "node:crypto";
2
+ /** A byte- and count-bounded timeline. Cursors advance only through examined events. */
3
+ export class Timeline {
4
+ maxEvents;
5
+ maxBytes;
6
+ sessionId = randomUUID();
7
+ entries = [];
8
+ bytes = 0;
9
+ sequence = 0;
10
+ constructor(maxEvents = 5000, maxBytes = 8 * 1024 * 1024) {
11
+ this.maxEvents = maxEvents;
12
+ this.maxBytes = maxBytes;
13
+ if (maxEvents < 1 || maxBytes < 1024)
14
+ throw new Error("Invalid timeline capacity");
15
+ }
16
+ append(input) {
17
+ const event = { ...input, seq: ++this.sequence, timestamp: new Date().toISOString() };
18
+ // Bound individual events as well as the overall buffer.
19
+ event.message = event.message.slice(0, 8192);
20
+ if (Buffer.byteLength(JSON.stringify(event)) > Math.min(32768, this.maxBytes)) {
21
+ event.data = { truncated: true };
22
+ event.message = event.message.slice(0, Math.min(512, this.maxBytes / 8));
23
+ }
24
+ const bytes = Buffer.byteLength(JSON.stringify(event));
25
+ this.entries.push({ event, bytes });
26
+ this.bytes += bytes;
27
+ while (this.entries.length > this.maxEvents || this.bytes > this.maxBytes) {
28
+ const removed = this.entries.shift();
29
+ if (removed)
30
+ this.bytes -= removed.bytes;
31
+ }
32
+ return event;
33
+ }
34
+ read(query = {}) {
35
+ const after = query.after ?? 0;
36
+ const limit = query.limit ?? 100;
37
+ if (!Number.isSafeInteger(after) || after < 0 || !Number.isSafeInteger(limit) || limit < 1 || limit > 500) {
38
+ throw new Error("after must be a nonnegative integer; limit must be 1–500");
39
+ }
40
+ const oldest = this.entries[0]?.event.seq ?? this.sequence + 1;
41
+ const reset = Boolean(query.sessionId && query.sessionId !== this.sessionId);
42
+ const start = reset ? 0 : after;
43
+ if (!reset && start > this.sequence)
44
+ throw new Error("Cursor is ahead of this session; supply sessionId");
45
+ const events = [];
46
+ let cursor = start;
47
+ for (const { event } of this.entries) {
48
+ if (event.seq <= start)
49
+ continue;
50
+ cursor = event.seq;
51
+ if ((!query.source || event.source === query.source) && (!query.level || event.level === query.level)) {
52
+ events.push(event);
53
+ if (events.length === limit)
54
+ break;
55
+ }
56
+ }
57
+ return {
58
+ sessionId: this.sessionId,
59
+ events,
60
+ cursor,
61
+ latest: this.sequence,
62
+ oldest,
63
+ reset,
64
+ dropped: Math.max(0, oldest - start - 1),
65
+ hasMore: cursor < this.sequence
66
+ };
67
+ }
68
+ }
69
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../src/runtime/timeline.ts"],"names":[],"mappings":"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"}