@codetreker/daynight 0.3.0 → 0.6.2

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 (133) hide show
  1. package/dist/api/client.d.ts +43 -0
  2. package/dist/api/client.js +285 -0
  3. package/dist/api/client.js.map +1 -0
  4. package/dist/api/index.d.ts +7 -0
  5. package/dist/api/index.js +5 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/json.d.ts +3 -0
  8. package/dist/api/json.js +25 -0
  9. package/dist/api/json.js.map +1 -0
  10. package/dist/api/operation.d.ts +23 -0
  11. package/dist/api/operation.js +78 -0
  12. package/dist/api/operation.js.map +1 -0
  13. package/dist/api/parse.d.ts +12 -0
  14. package/dist/api/parse.js +160 -0
  15. package/dist/api/parse.js.map +1 -0
  16. package/dist/api/types.d.ts +75 -0
  17. package/dist/api/types.js +2 -0
  18. package/dist/api/types.js.map +1 -0
  19. package/dist/cli/application.js +10 -20
  20. package/dist/cli/application.js.map +1 -1
  21. package/dist/cli/commands.d.ts +3 -3
  22. package/dist/cli/commands.js +29 -4
  23. package/dist/cli/commands.js.map +1 -1
  24. package/dist/cli/schema.d.ts +53 -0
  25. package/dist/cli/schema.js +113 -0
  26. package/dist/cli/schema.js.map +1 -0
  27. package/dist/commands/completion/bash.d.ts +2 -0
  28. package/dist/commands/completion/bash.js +279 -0
  29. package/dist/commands/completion/bash.js.map +1 -0
  30. package/dist/commands/completion/command.d.ts +2 -0
  31. package/dist/commands/completion/command.js +20 -0
  32. package/dist/commands/completion/command.js.map +1 -0
  33. package/dist/commands/completion/definition.d.ts +2 -0
  34. package/dist/commands/completion/definition.js +8 -0
  35. package/dist/commands/completion/definition.js.map +1 -0
  36. package/dist/commands/completion/zsh.d.ts +2 -0
  37. package/dist/commands/completion/zsh.js +165 -0
  38. package/dist/commands/completion/zsh.js.map +1 -0
  39. package/dist/commands/project/command.d.ts +6 -0
  40. package/dist/commands/project/command.js +39 -0
  41. package/dist/commands/project/command.js.map +1 -0
  42. package/dist/commands/project/definition.d.ts +2 -0
  43. package/dist/commands/project/definition.js +35 -0
  44. package/dist/commands/project/definition.js.map +1 -0
  45. package/dist/commands/project/rendering.d.ts +4 -0
  46. package/dist/commands/project/rendering.js +17 -0
  47. package/dist/commands/project/rendering.js.map +1 -0
  48. package/dist/commands/review/adapters/copilot.d.ts +16 -9
  49. package/dist/commands/review/adapters/copilot.js +196 -99
  50. package/dist/commands/review/adapters/copilot.js.map +1 -1
  51. package/dist/commands/review/command.js +16 -98
  52. package/dist/commands/review/command.js.map +1 -1
  53. package/dist/commands/review/config.d.ts +1 -2
  54. package/dist/commands/review/config.js +24 -43
  55. package/dist/commands/review/config.js.map +1 -1
  56. package/dist/commands/review/coordinator.d.ts +2 -2
  57. package/dist/commands/review/coordinator.js +5 -1
  58. package/dist/commands/review/coordinator.js.map +1 -1
  59. package/dist/commands/review/definition.d.ts +2 -0
  60. package/dist/commands/review/definition.js +33 -0
  61. package/dist/commands/review/definition.js.map +1 -0
  62. package/dist/commands/review/listing.js +2 -8
  63. package/dist/commands/review/listing.js.map +1 -1
  64. package/dist/commands/review/paths.d.ts +2 -3
  65. package/dist/commands/review/paths.js +4 -6
  66. package/dist/commands/review/paths.js.map +1 -1
  67. package/dist/commands/review/processes.d.ts +2 -2
  68. package/dist/commands/review/repositories.js +13 -102
  69. package/dist/commands/review/repositories.js.map +1 -1
  70. package/dist/commands/review/runtime.d.ts +4 -1
  71. package/dist/commands/review/runtime.js +7 -4
  72. package/dist/commands/review/runtime.js.map +1 -1
  73. package/dist/commands/review/skill.d.ts +11 -0
  74. package/dist/commands/review/skill.js +242 -0
  75. package/dist/commands/review/skill.js.map +1 -0
  76. package/dist/commands/review/skills/daynight-review/SKILL.md +63 -0
  77. package/dist/commands/review/store.d.ts +4 -0
  78. package/dist/commands/review/store.js +8 -0
  79. package/dist/commands/review/store.js.map +1 -1
  80. package/dist/commands/server/runtime.d.ts +16 -0
  81. package/dist/commands/server/runtime.js +52 -0
  82. package/dist/commands/server/runtime.js.map +1 -0
  83. package/dist/commands/task/command.d.ts +8 -0
  84. package/dist/commands/task/command.js +106 -0
  85. package/dist/commands/task/command.js.map +1 -0
  86. package/dist/commands/task/definition.d.ts +2 -0
  87. package/dist/commands/task/definition.js +50 -0
  88. package/dist/commands/task/definition.js.map +1 -0
  89. package/dist/commands/task/rendering.d.ts +5 -0
  90. package/dist/commands/task/rendering.js +49 -0
  91. package/dist/commands/task/rendering.js.map +1 -0
  92. package/dist/commands/update/command.js +5 -15
  93. package/dist/commands/update/command.js.map +1 -1
  94. package/dist/commands/update/definition.d.ts +2 -0
  95. package/dist/commands/update/definition.js +7 -0
  96. package/dist/commands/update/definition.js.map +1 -0
  97. package/dist/config/document.d.ts +9 -0
  98. package/dist/config/document.js +45 -0
  99. package/dist/config/document.js.map +1 -0
  100. package/dist/config/files.d.ts +7 -0
  101. package/dist/config/files.js +69 -0
  102. package/dist/config/files.js.map +1 -0
  103. package/dist/config/paths.d.ts +6 -0
  104. package/dist/config/paths.js +9 -0
  105. package/dist/config/paths.js.map +1 -0
  106. package/dist/config/server.d.ts +7 -0
  107. package/dist/config/server.js +34 -0
  108. package/dist/config/server.js.map +1 -0
  109. package/dist/platform/files.d.ts +1 -0
  110. package/dist/platform/files.js +48 -0
  111. package/dist/platform/files.js.map +1 -0
  112. package/dist/platform/terminal.d.ts +1 -0
  113. package/dist/platform/terminal.js +10 -0
  114. package/dist/platform/terminal.js.map +1 -0
  115. package/dist/platform/text.d.ts +2 -0
  116. package/dist/platform/text.js +3 -0
  117. package/dist/platform/text.js.map +1 -0
  118. package/dist/repository/binding.d.ts +21 -0
  119. package/dist/repository/binding.js +242 -0
  120. package/dist/repository/binding.js.map +1 -0
  121. package/dist/repository/context.d.ts +10 -0
  122. package/dist/repository/context.js +32 -0
  123. package/dist/repository/context.js.map +1 -0
  124. package/dist/repository/git.d.ts +20 -0
  125. package/dist/repository/git.js +213 -0
  126. package/dist/repository/git.js.map +1 -0
  127. package/dist/repository/identity.d.ts +5 -0
  128. package/dist/repository/identity.js +154 -0
  129. package/dist/repository/identity.js.map +1 -0
  130. package/dist/repository/index.d.ts +4 -0
  131. package/dist/repository/index.js +3 -0
  132. package/dist/repository/index.js.map +1 -0
  133. package/package.json +5 -4
@@ -0,0 +1,43 @@
1
+ import type { Operation } from "./operation.js";
2
+ import type { CreateProjectInput, CreateTaskInput, ErrorDetails, Project, ServerError, Task, TaskFilters, TaskGraph, UpdateTaskInput } from "./types.js";
3
+ type Context = {
4
+ readonly operation: string;
5
+ readonly projectId?: string;
6
+ readonly taskId?: string;
7
+ };
8
+ export type ApiPhase = "prepare" | "request" | "response" | "protocol" | "pagination";
9
+ export declare class ApiError extends Error {
10
+ readonly operation: string;
11
+ readonly phase: ApiPhase;
12
+ readonly projectId?: string;
13
+ readonly taskId?: string;
14
+ readonly status?: number;
15
+ readonly code?: string;
16
+ readonly requestId?: string;
17
+ readonly details?: ErrorDetails;
18
+ readonly outcomeUnconfirmed: boolean;
19
+ readonly confirmedRefusal: boolean;
20
+ constructor(context: Context, phase: ApiPhase, options: {
21
+ readonly cause: unknown;
22
+ readonly status?: number;
23
+ readonly serverError?: ServerError;
24
+ readonly outcomeUnconfirmed?: boolean;
25
+ readonly confirmedRefusal?: boolean;
26
+ });
27
+ }
28
+ export type ApiClient = {
29
+ createProject(input: CreateProjectInput): Promise<Project>;
30
+ getProject(projectId: string): Promise<Project>;
31
+ listProjects(): Promise<readonly Project[]>;
32
+ createTask(projectId: string, input: CreateTaskInput): Promise<Task>;
33
+ getTask(projectId: string, taskId: string): Promise<Task>;
34
+ listTasks(projectId: string, filters?: TaskFilters): Promise<readonly Task[]>;
35
+ updateTask(projectId: string, taskId: string, input: UpdateTaskInput): Promise<Task>;
36
+ getTaskGraph(projectId: string): Promise<TaskGraph>;
37
+ };
38
+ export declare const createApiClient: (options: {
39
+ readonly serverUrl: string;
40
+ readonly operation: Operation;
41
+ readonly fetch?: typeof globalThis.fetch;
42
+ }) => ApiClient;
43
+ export {};
@@ -0,0 +1,285 @@
1
+ import { performance } from "node:perf_hooks";
2
+ import { parseApiJson, stringifyApiJson } from "./json.js";
3
+ import { OperationError } from "./operation.js";
4
+ import { canonicalId, parsePage, parseProject, parseServerError, parseTask, parseTaskGraph, ProtocolError } from "./parse.js";
5
+ export class ApiError extends Error {
6
+ operation;
7
+ phase;
8
+ projectId;
9
+ taskId;
10
+ status;
11
+ code;
12
+ requestId;
13
+ details;
14
+ outcomeUnconfirmed;
15
+ confirmedRefusal;
16
+ constructor(context, phase, options) {
17
+ const target = [context.projectId === undefined ? "" : ` project=${context.projectId}`, context.taskId === undefined ? "" : ` task=${context.taskId}`].join("");
18
+ const server = options.serverError;
19
+ const reason = server === undefined
20
+ ? options.cause instanceof OperationError ? options.cause.message : phase === "protocol" || phase === "pagination" ? "Invalid server response." : "Local HTTP request failed."
21
+ : `${server.code}: ${server.message} (requestId=${server.requestId})`;
22
+ const details = server?.details;
23
+ const detailText = details === undefined ? "" : ` details=${JSON.stringify(details)}`;
24
+ super(`${context.operation}${target} [${phase}]: ${reason}${detailText}${options.outcomeUnconfirmed === true ? " Remote mutation outcome is unconfirmed; query the target before retrying." : ""}`, { cause: options.cause });
25
+ this.name = "ApiError";
26
+ this.operation = context.operation;
27
+ this.phase = phase;
28
+ if (context.projectId !== undefined)
29
+ this.projectId = context.projectId;
30
+ if (context.taskId !== undefined)
31
+ this.taskId = context.taskId;
32
+ if (options.status !== undefined)
33
+ this.status = options.status;
34
+ if (server !== undefined) {
35
+ this.code = server.code;
36
+ this.requestId = server.requestId;
37
+ }
38
+ if (details !== undefined)
39
+ this.details = details;
40
+ this.outcomeUnconfirmed = options.outcomeUnconfirmed === true;
41
+ this.confirmedRefusal = options.confirmedRefusal === true;
42
+ }
43
+ }
44
+ const resourceId = (value) => {
45
+ const parsed = canonicalId(value);
46
+ if (parsed === null)
47
+ throw new Error("Resource ID must be a hyphenated UUID.");
48
+ return parsed;
49
+ };
50
+ export const createApiClient = (options) => {
51
+ const origin = new URL(options.serverUrl);
52
+ if (!/^https?:$/.test(origin.protocol) || origin.username !== "" || origin.password !== "" || origin.pathname !== "/" || origin.search !== "" || origin.hash !== "")
53
+ throw new Error("serverUrl must be an HTTP(S) service origin without credentials, path, query or fragment.");
54
+ const operation = options.operation;
55
+ const fetch = options.fetch ?? globalThis.fetch;
56
+ const request = async (context, path, method, parse, body) => {
57
+ let phase = "prepare";
58
+ let dispatched = false;
59
+ let status;
60
+ let reader;
61
+ let bodyFailure;
62
+ let removeAbort = () => { };
63
+ let removeOperationAbort = () => { };
64
+ let timer;
65
+ let requestDeadline = Infinity;
66
+ let totalBudgetCapped = false;
67
+ let serverError;
68
+ const controller = new AbortController();
69
+ const checkRequest = () => {
70
+ operation.check();
71
+ if (controller.signal.aborted)
72
+ throw controller.signal.reason;
73
+ if (performance.now() >= requestDeadline) {
74
+ controller.abort(new OperationError(totalBudgetCapped ? "deadline" : "request_timeout"));
75
+ throw controller.signal.reason;
76
+ }
77
+ };
78
+ try {
79
+ operation.check();
80
+ const serialized = body === undefined ? undefined : stringifyApiJson(body);
81
+ const url = new URL(`/api/v1${path}`, origin);
82
+ const remaining = operation.remainingMs();
83
+ const timeout = Math.min(operation.limits.requestMs, remaining);
84
+ totalBudgetCapped = remaining <= operation.limits.requestMs;
85
+ requestDeadline = performance.now() + timeout;
86
+ timer = setTimeout(() => controller.abort(new OperationError(totalBudgetCapped ? "deadline" : "request_timeout")), Math.ceil(timeout));
87
+ timer.unref();
88
+ const cancel = () => controller.abort(operation.signal.reason);
89
+ operation.signal.addEventListener("abort", cancel, { once: true });
90
+ removeOperationAbort = () => operation.signal.removeEventListener("abort", cancel);
91
+ if (operation.signal.aborted)
92
+ cancel();
93
+ phase = "request";
94
+ checkRequest();
95
+ const aborted = new Promise((_resolve, reject) => {
96
+ const fail = () => reject(controller.signal.reason);
97
+ controller.signal.addEventListener("abort", fail, { once: true });
98
+ removeAbort = () => controller.signal.removeEventListener("abort", fail);
99
+ if (controller.signal.aborted)
100
+ fail();
101
+ });
102
+ const response = await Promise.race([Promise.resolve().then(() => {
103
+ checkRequest();
104
+ dispatched = true;
105
+ return fetch(url, {
106
+ method,
107
+ headers: { Accept: "application/json", ...(serialized === undefined ? {} : { "Content-Type": "application/json" }) },
108
+ ...(serialized === undefined ? {} : { body: serialized }),
109
+ redirect: "manual",
110
+ signal: controller.signal,
111
+ });
112
+ }), aborted]);
113
+ status = response.status;
114
+ phase = "response";
115
+ const decoder = new TextDecoder("utf-8", { fatal: true });
116
+ const chunks = [];
117
+ let pendingText = "";
118
+ let bytes = 0;
119
+ let decodingError;
120
+ if (response.body !== null) {
121
+ reader = response.body.getReader();
122
+ // Cancelling an already errored stream repeats its existing failure, rather than introducing a cleanup failure.
123
+ void reader.closed.catch((error) => { bodyFailure = error; });
124
+ while (true) {
125
+ checkRequest();
126
+ const chunk = await Promise.race([reader.read(), aborted]);
127
+ if (chunk.done)
128
+ break;
129
+ bytes += chunk.value.byteLength;
130
+ operation.consume(chunk.value.byteLength);
131
+ if (bytes > operation.limits.responseBytes)
132
+ throw new OperationError("response_limit");
133
+ // Count the whole bounded body even when UTF-8 decoding fails before its end.
134
+ if (decodingError === undefined) {
135
+ try {
136
+ pendingText += decoder.decode(chunk.value, { stream: true });
137
+ if (pendingText.length >= 65_536) {
138
+ chunks.push(pendingText);
139
+ pendingText = "";
140
+ }
141
+ }
142
+ catch (error) {
143
+ decodingError = error;
144
+ }
145
+ }
146
+ }
147
+ }
148
+ checkRequest();
149
+ phase = "protocol";
150
+ if (decodingError !== undefined)
151
+ throw decodingError;
152
+ chunks.push(pendingText, decoder.decode());
153
+ const contentType = response.headers.get("content-type");
154
+ if (contentType === null || !/^application\/json(?:\s*;\s*charset\s*=\s*(?:utf-8|"utf-8"))?\s*$/i.test(contentType))
155
+ throw new ProtocolError("Expected an application/json UTF-8 response.");
156
+ const value = parseApiJson(chunks.join(""));
157
+ checkRequest();
158
+ const expectedStatus = method === "POST" ? 201 : 200;
159
+ if (status !== expectedStatus) {
160
+ if (status < 400 || status > 599)
161
+ throw new ProtocolError("Unexpected HTTP status.");
162
+ serverError = parseServerError(value);
163
+ const confirmedRefusal = status >= 400 && status < 500;
164
+ throw new ApiError(context, "response", { cause: new Error(serverError.message), status, serverError, confirmedRefusal, outcomeUnconfirmed: method !== "GET" && !confirmedRefusal });
165
+ }
166
+ const result = parse(value);
167
+ checkRequest();
168
+ return result;
169
+ }
170
+ catch (cause) {
171
+ controller.abort(cause);
172
+ let failure = cause;
173
+ if (reader !== undefined) {
174
+ let cleanupTimer;
175
+ try {
176
+ const cleanup = reader.cancel(cause);
177
+ await Promise.race([cleanup, new Promise((_resolve, reject) => {
178
+ cleanupTimer = setTimeout(() => reject(new Error("Response stream cancellation exceeded its 100 ms cleanup deadline.")), 100);
179
+ })]);
180
+ }
181
+ catch (cleanupError) {
182
+ if (cleanupError !== cause && cleanupError !== bodyFailure)
183
+ failure = new AggregateError([cause, cleanupError], "HTTP request failed and response cleanup failed.", { cause });
184
+ }
185
+ finally {
186
+ if (cleanupTimer !== undefined)
187
+ clearTimeout(cleanupTimer);
188
+ }
189
+ }
190
+ if (cause instanceof ApiError && failure === cause)
191
+ throw cause;
192
+ throw new ApiError(context, phase, {
193
+ cause: failure,
194
+ ...(status === undefined ? {} : { status }),
195
+ ...(serverError === undefined ? {} : { serverError }),
196
+ confirmedRefusal: cause instanceof ApiError && cause.confirmedRefusal,
197
+ outcomeUnconfirmed: cause instanceof ApiError ? cause.outcomeUnconfirmed : method !== "GET" && dispatched,
198
+ });
199
+ }
200
+ finally {
201
+ if (timer !== undefined)
202
+ clearTimeout(timer);
203
+ removeAbort();
204
+ removeOperationAbort();
205
+ reader?.releaseLock();
206
+ }
207
+ };
208
+ const list = async (context, path, parse, filters = {}) => {
209
+ const result = [];
210
+ const seenIds = new Set();
211
+ const seenCursors = new Set();
212
+ let cursor = null;
213
+ try {
214
+ do {
215
+ operation.check();
216
+ const query = new URLSearchParams({ ...filters, limit: "100", ...(cursor === null ? {} : { cursor }) });
217
+ const page = await request(context, `${path}?${query}`, "GET", (value) => parsePage(value, parse));
218
+ for (const item of page.items) {
219
+ if (seenIds.has(item.id))
220
+ throw new ProtocolError("Duplicate resource ID across list pages.");
221
+ seenIds.add(item.id);
222
+ result.push(item);
223
+ }
224
+ cursor = page.nextCursor;
225
+ if (cursor !== null) {
226
+ if (seenCursors.has(cursor))
227
+ throw new ProtocolError("Repeated pagination cursor.");
228
+ seenCursors.add(cursor);
229
+ }
230
+ } while (cursor !== null);
231
+ operation.check();
232
+ return result;
233
+ }
234
+ catch (cause) {
235
+ if (cause instanceof ApiError)
236
+ throw cause;
237
+ throw new ApiError(context, "pagination", { cause });
238
+ }
239
+ };
240
+ return {
241
+ createProject: (input) => request({ operation: "project.create" }, "/projects", "POST", (value) => parseProject(value), { name: input.name, repoUrl: input.repoUrl }),
242
+ getProject: (projectId) => {
243
+ const project = resourceId(projectId);
244
+ return request({ operation: "project.show", projectId: project }, `/projects/${encodeURIComponent(project)}`, "GET", (value) => parseProject(value, project));
245
+ },
246
+ listProjects: () => list({ operation: "project.list" }, "/projects", (value) => parseProject(value)),
247
+ createTask: (projectId, input) => {
248
+ const project = resourceId(projectId);
249
+ return request({ operation: "task.create", projectId: project }, `/projects/${encodeURIComponent(project)}/tasks`, "POST", (value) => parseTask(value, project), {
250
+ title: input.title,
251
+ ...(input.description === undefined ? {} : { description: input.description }),
252
+ ...(input.dependsOn === undefined ? {} : { dependsOn: input.dependsOn }),
253
+ });
254
+ },
255
+ getTask: (projectId, taskId) => {
256
+ const project = resourceId(projectId), task = resourceId(taskId);
257
+ return request({ operation: "task.show", projectId: project, taskId: task }, `/projects/${encodeURIComponent(project)}/tasks/${encodeURIComponent(task)}`, "GET", (value) => parseTask(value, project, task));
258
+ },
259
+ listTasks: (projectId, filters = {}) => {
260
+ const project = resourceId(projectId);
261
+ const query = { ...(filters.status === undefined ? {} : { status: filters.status }), ...(filters.ready === undefined ? {} : { ready: String(filters.ready) }) };
262
+ return list({ operation: "task.list", projectId: project }, `/projects/${encodeURIComponent(project)}/tasks`, (value) => {
263
+ const task = parseTask(value, project);
264
+ if ((filters.status !== undefined && task.status !== filters.status) || (filters.ready !== undefined && task.ready !== filters.ready))
265
+ throw new ProtocolError("Task does not match the requested filters.");
266
+ return task;
267
+ }, query);
268
+ },
269
+ updateTask: (projectId, taskId, input) => {
270
+ const project = resourceId(projectId), task = resourceId(taskId);
271
+ return request({ operation: "task.update", projectId: project, taskId: task }, `/projects/${encodeURIComponent(project)}/tasks/${encodeURIComponent(task)}`, "PATCH", (value) => parseTask(value, project, task), {
272
+ version: input.version,
273
+ ...(input.title === undefined ? {} : { title: input.title }),
274
+ ...(input.description === undefined ? {} : { description: input.description }),
275
+ ...(input.status === undefined ? {} : { status: input.status }),
276
+ ...(input.dependsOn === undefined ? {} : { dependsOn: input.dependsOn }),
277
+ });
278
+ },
279
+ getTaskGraph: (projectId) => {
280
+ const project = resourceId(projectId);
281
+ return request({ operation: "task.graph", projectId: project }, `/projects/${encodeURIComponent(project)}/task-graph`, "GET", (value) => parseTaskGraph(value, project));
282
+ },
283
+ };
284
+ };
285
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { ApiError, createApiClient } from "./client.js";
2
+ export type { ApiClient, ApiPhase } from "./client.js";
3
+ export { parseApiJson, parseVersionArgument, stringifyApiJson } from "./json.js";
4
+ export { createOperation, DEFAULT_OPERATION_LIMITS, OperationError } from "./operation.js";
5
+ export type { Operation, OperationLimits } from "./operation.js";
6
+ export { canonicalId, ProtocolError } from "./parse.js";
7
+ export type * from "./types.js";
@@ -0,0 +1,5 @@
1
+ export { ApiError, createApiClient } from "./client.js";
2
+ export { parseApiJson, parseVersionArgument, stringifyApiJson } from "./json.js";
3
+ export { createOperation, DEFAULT_OPERATION_LIMITS, OperationError } from "./operation.js";
4
+ export { canonicalId, ProtocolError } from "./parse.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE3F,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const parseVersionArgument: (value: string) => bigint;
2
+ export declare const parseApiJson: (text: string) => unknown;
3
+ export declare const stringifyApiJson: (value: unknown) => string;
@@ -0,0 +1,25 @@
1
+ const losslessJson = JSON;
2
+ const maxVersion = 9223372036854775807n;
3
+ export const parseVersionArgument = (value) => {
4
+ if (!/^[0-9]+$/.test(value))
5
+ throw new Error("version must be a positive 64-bit integer.");
6
+ const version = BigInt(value);
7
+ if (version < 1n || version > maxVersion)
8
+ throw new Error("version must be a positive 64-bit integer.");
9
+ return version;
10
+ };
11
+ export const parseApiJson = (text) => losslessJson.parse(text, (key, value, context) => {
12
+ if (key !== "version" || typeof value !== "number")
13
+ return value;
14
+ // Go int64 versions must retain their original numeric lexeme past JavaScript's safe integer range.
15
+ const source = context.source;
16
+ return source !== undefined && /^-?[0-9]+$/.test(source) ? BigInt(source) : value;
17
+ });
18
+ export const stringifyApiJson = (value) => JSON.stringify(value, (_key, item) => {
19
+ if (typeof item !== "bigint")
20
+ return item;
21
+ if (item < 1n || item > maxVersion)
22
+ throw new Error("version must be a positive 64-bit integer.");
23
+ return losslessJson.rawJSON(item.toString());
24
+ });
25
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/api/json.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,IAGpB,CAAC;AAEF,MAAM,UAAU,GAAG,oBAA0B,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAU,EAAE;IAC5D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC3F,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,OAAO,GAAG,EAAE,IAAI,OAAO,GAAG,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACxG,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IACtG,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACjE,oGAAoG;IACpG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,OAAO,MAAM,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACpF,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAa,EAAE,EAAE;IACxG,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAClG,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ export type OperationLimits = {
2
+ readonly totalMs: number;
3
+ readonly requestMs: number;
4
+ readonly responseBytes: number;
5
+ readonly totalBytes: number;
6
+ };
7
+ export declare const DEFAULT_OPERATION_LIMITS: OperationLimits;
8
+ export declare class OperationError extends Error {
9
+ readonly kind: "cancelled" | "deadline" | "request_timeout" | "response_limit" | "total_limit" | "disposed";
10
+ constructor(kind: "cancelled" | "deadline" | "request_timeout" | "response_limit" | "total_limit" | "disposed", options?: ErrorOptions);
11
+ }
12
+ export type Operation = {
13
+ readonly signal: AbortSignal;
14
+ readonly limits: OperationLimits;
15
+ check(): void;
16
+ remainingMs(): number;
17
+ consume(bytes: number): void;
18
+ dispose(): void;
19
+ };
20
+ export declare const createOperation: (options?: {
21
+ readonly signal?: AbortSignal;
22
+ readonly limits?: Partial<OperationLimits>;
23
+ }) => Operation;
@@ -0,0 +1,78 @@
1
+ import { performance } from "node:perf_hooks";
2
+ export const DEFAULT_OPERATION_LIMITS = Object.freeze({
3
+ totalMs: 5 * 60_000,
4
+ requestMs: 30_000,
5
+ responseBytes: 128 * 1_048_576,
6
+ totalBytes: 256 * 1_048_576,
7
+ });
8
+ export class OperationError extends Error {
9
+ kind;
10
+ constructor(kind, options) {
11
+ const messages = {
12
+ cancelled: "Operation cancelled.",
13
+ deadline: "Operation deadline exceeded.",
14
+ request_timeout: "HTTP request deadline exceeded.",
15
+ response_limit: "HTTP response byte limit exceeded.",
16
+ total_limit: "Operation response byte budget exceeded.",
17
+ disposed: "Operation has been disposed.",
18
+ };
19
+ super(messages[kind], options);
20
+ this.kind = kind;
21
+ this.name = "OperationError";
22
+ }
23
+ }
24
+ export const createOperation = (options = {}) => {
25
+ const limits = Object.freeze({ ...DEFAULT_OPERATION_LIMITS, ...options.limits });
26
+ for (const [name, value] of Object.entries(limits)) {
27
+ if (!Number.isSafeInteger(value) || value <= 0)
28
+ throw new RangeError(`${name} must be a positive safe integer.`);
29
+ }
30
+ if (limits.totalMs > 2_147_483_647 || limits.requestMs > 2_147_483_647)
31
+ throw new RangeError("Operation deadlines must fit the supported timer range.");
32
+ const controller = new AbortController();
33
+ const deadline = performance.now() + limits.totalMs;
34
+ let consumed = 0;
35
+ let disposed = false;
36
+ const cancel = () => controller.abort(new OperationError("cancelled", { cause: options.signal?.reason }));
37
+ const timer = setTimeout(() => controller.abort(new OperationError("deadline")), limits.totalMs);
38
+ timer.unref();
39
+ options.signal?.addEventListener("abort", cancel, { once: true });
40
+ if (options.signal?.aborted)
41
+ cancel();
42
+ const check = () => {
43
+ if (controller.signal.aborted)
44
+ throw controller.signal.reason;
45
+ if (disposed)
46
+ throw new OperationError("disposed");
47
+ if (performance.now() >= deadline) {
48
+ controller.abort(new OperationError("deadline"));
49
+ throw controller.signal.reason;
50
+ }
51
+ };
52
+ return {
53
+ signal: controller.signal,
54
+ limits,
55
+ check,
56
+ remainingMs: () => { check(); return Math.max(0, deadline - performance.now()); },
57
+ consume: (bytes) => {
58
+ check();
59
+ if (!Number.isSafeInteger(bytes) || bytes < 0)
60
+ throw new RangeError("Response byte count must be a nonnegative safe integer.");
61
+ consumed += bytes;
62
+ if (consumed > limits.totalBytes) {
63
+ controller.abort(new OperationError("total_limit"));
64
+ throw controller.signal.reason;
65
+ }
66
+ },
67
+ dispose: () => {
68
+ if (disposed)
69
+ return;
70
+ disposed = true;
71
+ clearTimeout(timer);
72
+ options.signal?.removeEventListener("abort", cancel);
73
+ if (!controller.signal.aborted)
74
+ controller.abort(new OperationError("disposed"));
75
+ },
76
+ };
77
+ };
78
+ //# sourceMappingURL=operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation.js","sourceRoot":"","sources":["../../src/api/operation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Page, Project, ServerError, Task, TaskGraph } from "./types.js";
2
+ export declare class ProtocolError extends Error {
3
+ constructor(message?: string);
4
+ }
5
+ export declare const canonicalId: (value: string) => string | null;
6
+ export declare const parseProject: (value: unknown, expectedId?: string) => Project;
7
+ export declare const parseTask: (value: unknown, projectId: string, taskId?: string) => Task;
8
+ export declare const parsePage: <T extends {
9
+ readonly id: string;
10
+ }>(value: unknown, parse: (item: unknown) => T) => Page<T>;
11
+ export declare const parseTaskGraph: (value: unknown, projectId: string) => TaskGraph;
12
+ export declare const parseServerError: (value: unknown) => ServerError;