@rubytech/create-maxy-code 0.1.475 → 0.1.477
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.
- package/package.json +1 -1
- package/payload/platform/lib/storage-broker/dist/cf-exec.d.ts.map +1 -1
- package/payload/platform/lib/storage-broker/dist/cf-exec.js +3 -2
- package/payload/platform/lib/storage-broker/dist/cf-exec.js.map +1 -1
- package/payload/platform/lib/storage-broker/src/cf-exec.ts +3 -2
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +3 -3
- package/payload/platform/plugins/cloudflare/skills/calendar-site/template/schema.sql +13 -3
- package/payload/platform/plugins/docs/references/calendar-booking.md +2 -2
- package/payload/platform/plugins/scheduling/PLUGIN.md +2 -2
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-block-sqlite.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-block-sqlite.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-block-sqlite.test.js +150 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-block-sqlite.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-block.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-block.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-block.test.js +248 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-block.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-reconcile.test.js +158 -23
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-reconcile.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-schema-migration.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-schema-migration.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-schema-migration.test.js +200 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/booking-schema-migration.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-sync-provision.test.d.ts +2 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-sync-provision.test.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-sync-provision.test.js +309 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/connector-sync-provision.test.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/d1-command.test.js +219 -19
- package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/d1-command.test.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.d.ts +184 -11
- package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.js +211 -22
- package/payload/platform/plugins/scheduling/mcp/dist/lib/booking-reconcile.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-sync-provision.d.ts +109 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-sync-provision.d.ts.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-sync-provision.js +213 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/connector-sync-provision.js.map +1 -0
- package/payload/platform/plugins/scheduling/mcp/dist/lib/d1-command.d.ts +80 -8
- package/payload/platform/plugins/scheduling/mcp/dist/lib/d1-command.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/lib/d1-command.js +202 -8
- package/payload/platform/plugins/scheduling/mcp/dist/lib/d1-command.js.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.d.ts +6 -4
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.d.ts.map +1 -1
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js +411 -141
- package/payload/platform/plugins/scheduling/mcp/dist/scripts/reconcile-bookings.js.map +1 -1
- package/payload/platform/scripts/cpu-triage.sh +313 -0
- package/payload/server/{chunk-Y6V45R6M.js → chunk-JECAP3Z2.js} +296 -63
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/public/activity.html +6 -6
- package/payload/server/public/assets/{AdminLoginScreens-B44KbEuC.js → AdminLoginScreens-mEKP4pDi.js} +1 -1
- package/payload/server/public/assets/{AdminShell-BjxV2qkb.js → AdminShell-BwSaZ88d.js} +1 -1
- package/payload/server/public/assets/{Checkbox-DSeZNGNA.js → Checkbox-CN4uQ80w.js} +1 -1
- package/payload/server/public/assets/activity-CIQ8ozNZ.js +1 -0
- package/payload/server/public/assets/{admin-B4LpTCur.js → admin-BVhgfgs1.js} +1 -1
- package/payload/server/public/assets/{browser-CEFvaWwI.js → browser-D-HMmHcM.js} +1 -1
- package/payload/server/public/assets/{calendar-B3zo6V34.js → calendar-tGWvFyFn.js} +1 -1
- package/payload/server/public/assets/chat-DkttVxAz.js +1 -0
- package/payload/server/public/assets/chevron-left-CZ4ez9G5.js +1 -0
- package/payload/server/public/assets/data-P-mcmnNi.js +1 -0
- package/payload/server/public/assets/{graph-labels-GlTEIYJj.js → graph-labels-qnBleOE6.js} +1 -1
- package/payload/server/public/assets/{graph-RaOrnSf2.js → graph-zEw610xK.js} +1 -1
- package/payload/server/public/assets/{maximize-2-CHDa8p5h.js → maximize-2-BlTjXT_Y.js} +1 -1
- package/payload/server/public/assets/{operator-DtqHY4jV.js → operator-C7oIw2PG.js} +1 -1
- package/payload/server/public/assets/{page-DxnWgPtd.js → page-CTP7OFZa.js} +1 -1
- package/payload/server/public/assets/{page-CkhFj8GQ.js → page-DL6Zsdvk.js} +1 -1
- package/payload/server/public/assets/{public-D5TUfQ3I.js → public-r1A9dqR_.js} +1 -1
- package/payload/server/public/assets/{rotate-ccw-BJjVAQQY.js → rotate-ccw-CzkkKx4-.js} +1 -1
- package/payload/server/public/assets/{tasks-CM9pYYG1.js → tasks-fIJwYFWG.js} +1 -1
- package/payload/server/public/assets/{time-entry-format-C5RYEYjM.js → time-entry-format-j669DgXj.js} +1 -1
- package/payload/server/public/assets/{triangle-alert-DLfIsuo_.js → triangle-alert-BPgCgIef.js} +1 -1
- package/payload/server/public/assets/{useCopyFeedback-7yKeiAzV.js → useCopyFeedback-BmLa2aes.js} +1 -1
- package/payload/server/public/assets/{useSelectionMode-CWlh6AEq.js → useSelectionMode-DnnM7A8-.js} +1 -1
- package/payload/server/public/assets/{useSubAccountSwitcher-B2n9QPVI.css → useSubAccountSwitcher-C_E8h07P.css} +1 -1
- package/payload/server/public/assets/{useVoiceRecorder-j3ZArZ2H.js → useVoiceRecorder-u2dwZfen.js} +1 -1
- package/payload/server/public/browser.html +5 -5
- package/payload/server/public/calendar.html +6 -6
- package/payload/server/public/chat.html +12 -12
- package/payload/server/public/data.html +11 -11
- package/payload/server/public/graph.html +11 -11
- package/payload/server/public/index.html +14 -14
- package/payload/server/public/operator.html +14 -14
- package/payload/server/public/public.html +12 -12
- package/payload/server/public/tasks.html +5 -5
- package/payload/server/server.js +358 -189
- package/payload/server/public/assets/activity-Mz1BhgB1.js +0 -1
- package/payload/server/public/assets/chat-5tJdo9i_.js +0 -1
- package/payload/server/public/assets/chevron-left-BJllrPBj.js +0 -1
- package/payload/server/public/assets/data-Du79EgR-.js +0 -1
- /package/payload/server/public/assets/{useSubAccountSwitcher-CBlKgwms.js → useSubAccountSwitcher-CFa6ZAT1.js} +0 -0
|
@@ -1,23 +1,223 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
// Task 1805 — the transport is HTTP, not a process per statement. These pin the
|
|
2
|
+
// requests it composes, the rows it parses, the one-lookup-per-run cache, and the
|
|
3
|
+
// two bounds (60 s request, 16 MB streamed response) inherited from the spawnSync
|
|
4
|
+
// call this replaced. Task 1350's npx-head guard is retired with the spawn it guarded.
|
|
5
|
+
import { describe, it, expect, vi } from "vitest";
|
|
6
|
+
import { buildD1LookupRequest, buildD1QueryRequest, createD1Client, D1_RESPONSE_CAP_BYTES, D1_TIMEOUT_MS, } from "../d1-command.js";
|
|
7
|
+
const ACC = "acc123";
|
|
8
|
+
const DB_ID = "11111111-2222-3333-4444-555555555555";
|
|
9
|
+
function bodyOf(text) {
|
|
10
|
+
return (async function* () {
|
|
11
|
+
yield new TextEncoder().encode(text);
|
|
12
|
+
})();
|
|
13
|
+
}
|
|
14
|
+
/** A fetch seam whose responses are scripted per call, recording what it received. */
|
|
15
|
+
function fakeFetch(responses) {
|
|
16
|
+
const calls = [];
|
|
17
|
+
let i = 0;
|
|
18
|
+
const fn = async (url, init) => {
|
|
19
|
+
calls.push({ url, init });
|
|
20
|
+
const r = responses[i++];
|
|
21
|
+
if (!r)
|
|
22
|
+
throw new Error(`unexpected extra fetch to ${url}`);
|
|
23
|
+
return { ok: r.ok ?? true, status: r.status ?? 200, chunks: bodyOf(r.text) };
|
|
24
|
+
};
|
|
25
|
+
return { fn, calls };
|
|
26
|
+
}
|
|
27
|
+
const lookupOk = (name) => JSON.stringify({ success: true, result: [{ uuid: DB_ID, name }] });
|
|
28
|
+
const queryOk = (rows) => JSON.stringify({ success: true, result: [{ results: rows, success: true }] });
|
|
29
|
+
describe("buildD1LookupRequest", () => {
|
|
30
|
+
it("addresses the account's D1 list endpoint filtered by the database name", () => {
|
|
31
|
+
const { url, init } = buildD1LookupRequest(ACC, "book db", "tok");
|
|
32
|
+
expect(url).toBe(`https://api.cloudflare.com/client/v4/accounts/${ACC}/d1/database?name=book+db`);
|
|
33
|
+
expect(init.method).toBe("GET");
|
|
34
|
+
});
|
|
35
|
+
it("carries a bearer Authorization header", () => {
|
|
36
|
+
const { init } = buildD1LookupRequest(ACC, "mydb", "tok");
|
|
37
|
+
expect(Object.keys(init.headers)).toContain("Authorization");
|
|
38
|
+
expect(init.headers.Authorization.startsWith("Bearer ")).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("buildD1QueryRequest", () => {
|
|
42
|
+
it("posts the SQL to the database's query endpoint", () => {
|
|
43
|
+
const { url, init } = buildD1QueryRequest(ACC, DB_ID, "SELECT 1", "tok");
|
|
44
|
+
expect(url).toBe(`https://api.cloudflare.com/client/v4/accounts/${ACC}/d1/database/${DB_ID}/query`);
|
|
45
|
+
expect(init.method).toBe("POST");
|
|
46
|
+
expect(init.headers["Content-Type"]).toBe("application/json");
|
|
47
|
+
expect(JSON.parse(init.body)).toEqual({ sql: "SELECT 1", params: [] });
|
|
48
|
+
});
|
|
49
|
+
it("sends values as bound parameters rather than folding them into the SQL", () => {
|
|
50
|
+
const { init } = buildD1QueryRequest(ACC, DB_ID, "UPDATE bookings SET swept=1 WHERE bookingId=?1", "tok", ["b'1"]);
|
|
51
|
+
const sent = JSON.parse(init.body);
|
|
52
|
+
expect(sent.params).toEqual(["b'1"]);
|
|
53
|
+
expect(sent.sql).not.toContain("b'1");
|
|
54
|
+
});
|
|
55
|
+
it("carries a bearer Authorization header", () => {
|
|
56
|
+
const { init } = buildD1QueryRequest(ACC, DB_ID, "SELECT 1", "tok");
|
|
57
|
+
expect(Object.keys(init.headers)).toContain("Authorization");
|
|
58
|
+
expect(init.headers.Authorization.startsWith("Bearer ")).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it("starts no process — the module exports no argv builder", async () => {
|
|
61
|
+
const mod = await import("../d1-command.js");
|
|
62
|
+
expect("buildD1Command" in mod).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe("createD1Client", () => {
|
|
66
|
+
it("resolves the database by name then returns the query's rows", async () => {
|
|
67
|
+
const { fn, calls } = fakeFetch([
|
|
68
|
+
{ text: lookupOk("mydb") },
|
|
69
|
+
{ text: queryOk([{ bookingId: "b1" }]) },
|
|
20
70
|
]);
|
|
71
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
72
|
+
await expect(client.query("mydb", "SELECT 1")).resolves.toEqual([{ bookingId: "b1" }]);
|
|
73
|
+
expect(calls[0].url).toContain("/d1/database?name=mydb");
|
|
74
|
+
expect(calls[1].url).toContain(`/d1/database/${DB_ID}/query`);
|
|
75
|
+
});
|
|
76
|
+
it("returns an empty row set when the statement produced no results", async () => {
|
|
77
|
+
const { fn } = fakeFetch([{ text: lookupOk("mydb") }, { text: queryOk([]) }]);
|
|
78
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
79
|
+
await expect(client.query("mydb", "UPDATE t SET x=1")).resolves.toEqual([]);
|
|
80
|
+
});
|
|
81
|
+
it("passes a caller's parameters through to the request body", async () => {
|
|
82
|
+
const { fn, calls } = fakeFetch([{ text: lookupOk("mydb") }, { text: queryOk([]) }]);
|
|
83
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
84
|
+
await client.query("mydb", "UPDATE t SET x=1 WHERE id=?1", ["abc"]);
|
|
85
|
+
expect(JSON.parse(calls[1].init.body).params).toEqual(["abc"]);
|
|
86
|
+
});
|
|
87
|
+
it("looks the database up once per run and reuses the id for later statements", async () => {
|
|
88
|
+
const { fn, calls } = fakeFetch([
|
|
89
|
+
{ text: lookupOk("mydb") },
|
|
90
|
+
{ text: queryOk([]) },
|
|
91
|
+
{ text: queryOk([]) },
|
|
92
|
+
]);
|
|
93
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
94
|
+
await client.query("mydb", "SELECT 1");
|
|
95
|
+
await client.query("mydb", "SELECT 2");
|
|
96
|
+
expect(calls.filter((c) => c.url.includes("?name=")).length).toBe(1);
|
|
97
|
+
expect(calls.length).toBe(3);
|
|
98
|
+
});
|
|
99
|
+
it("counts the statements it issued and the time it spent", async () => {
|
|
100
|
+
const { fn } = fakeFetch([
|
|
101
|
+
{ text: lookupOk("mydb") },
|
|
102
|
+
{ text: queryOk([]) },
|
|
103
|
+
{ text: queryOk([]) },
|
|
104
|
+
]);
|
|
105
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
106
|
+
await client.query("mydb", "SELECT 1");
|
|
107
|
+
await client.query("mydb", "SELECT 2");
|
|
108
|
+
expect(client.statements).toBe(2);
|
|
109
|
+
expect(client.elapsedMs).toBeGreaterThanOrEqual(0);
|
|
110
|
+
});
|
|
111
|
+
it("refuses a name the account does not carry rather than querying a guessed id", async () => {
|
|
112
|
+
const { fn } = fakeFetch([
|
|
113
|
+
{ text: JSON.stringify({ success: true, result: [{ uuid: DB_ID, name: "otherdb" }] }) },
|
|
114
|
+
]);
|
|
115
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
116
|
+
await expect(client.query("mydb", "SELECT 1")).rejects.toThrow(/mydb/);
|
|
117
|
+
});
|
|
118
|
+
it("surfaces a non-2xx with its status and body", async () => {
|
|
119
|
+
const { fn } = fakeFetch([{ ok: false, status: 403, text: '{"errors":[{"code":10000}]}' }]);
|
|
120
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
121
|
+
await expect(client.query("mydb", "SELECT 1")).rejects.toThrow(/403[\s\S]*10000/);
|
|
122
|
+
});
|
|
123
|
+
it("surfaces a 2xx that is not a success envelope with its body", async () => {
|
|
124
|
+
const { fn } = fakeFetch([
|
|
125
|
+
{ text: lookupOk("mydb") },
|
|
126
|
+
{ text: JSON.stringify({ success: false, errors: [{ message: "no such table" }] }) },
|
|
127
|
+
]);
|
|
128
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
129
|
+
await expect(client.query("mydb", "SELECT 1")).rejects.toThrow(/no such table/);
|
|
130
|
+
});
|
|
131
|
+
it("surfaces a statement that reports its own failure inside a success envelope", async () => {
|
|
132
|
+
// The REST API's per-statement `success` semantics are undocumented, so this
|
|
133
|
+
// refuses to let an unmeasured fact decide correctness. If a failed sweep can
|
|
134
|
+
// arrive this way, treating it as success would leave the row unswept while
|
|
135
|
+
// the caller believed it had swept — a silent no-op on the write path.
|
|
136
|
+
const { fn } = fakeFetch([
|
|
137
|
+
{ text: lookupOk("mydb") },
|
|
138
|
+
{
|
|
139
|
+
text: JSON.stringify({
|
|
140
|
+
success: true,
|
|
141
|
+
result: [{ success: false, results: [], error: "no such table: bookings" }],
|
|
142
|
+
}),
|
|
143
|
+
},
|
|
144
|
+
]);
|
|
145
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
146
|
+
await expect(client.query("mydb", "UPDATE bookings SET swept=1")).rejects.toThrow(/no such table/);
|
|
147
|
+
});
|
|
148
|
+
it("accepts a statement that omits the success flag rather than requiring it", async () => {
|
|
149
|
+
// Absent is not false. Requiring an undocumented field to be present would
|
|
150
|
+
// reject healthy responses that simply do not carry it.
|
|
151
|
+
const { fn } = fakeFetch([
|
|
152
|
+
{ text: lookupOk("mydb") },
|
|
153
|
+
{ text: JSON.stringify({ success: true, result: [{ results: [{ n: 1 }] }] }) },
|
|
154
|
+
]);
|
|
155
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
156
|
+
await expect(client.query("mydb", "SELECT 1")).resolves.toEqual([{ n: 1 }]);
|
|
157
|
+
});
|
|
158
|
+
it("counts a statement that was issued and then failed, not only ones that succeeded", async () => {
|
|
159
|
+
// `statements` is what reached D1. Counting successes only would report 0 for
|
|
160
|
+
// both "the name lookup failed so nothing was sent" and "one statement was
|
|
161
|
+
// sent and errored", which the op=d1 line needs to tell apart.
|
|
162
|
+
const { fn } = fakeFetch([
|
|
163
|
+
{ text: lookupOk("mydb") },
|
|
164
|
+
{ ok: false, status: 500, text: "boom" },
|
|
165
|
+
]);
|
|
166
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
167
|
+
await expect(client.query("mydb", "SELECT 1")).rejects.toThrow(/500/);
|
|
168
|
+
expect(client.statements).toBe(1);
|
|
169
|
+
});
|
|
170
|
+
it("counts no statement when the name lookup itself failed", async () => {
|
|
171
|
+
const { fn } = fakeFetch([{ ok: false, status: 403, text: "denied" }]);
|
|
172
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
173
|
+
await expect(client.query("mydb", "SELECT 1")).rejects.toThrow(/403/);
|
|
174
|
+
expect(client.statements).toBe(0);
|
|
175
|
+
});
|
|
176
|
+
it("surfaces a 2xx that is not JSON with its body", async () => {
|
|
177
|
+
const { fn } = fakeFetch([{ text: "<html>gateway</html>" }]);
|
|
178
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
179
|
+
await expect(client.query("mydb", "SELECT 1")).rejects.toThrow(/gateway/);
|
|
180
|
+
});
|
|
181
|
+
it("aborts a response past the cap while streaming, not after buffering it", async () => {
|
|
182
|
+
// Three chunks of 8 MB. The cap is 16 MB, so the third crosses it. Counting
|
|
183
|
+
// the chunks consumed proves the read stopped rather than materialising the
|
|
184
|
+
// whole body and checking its length afterwards.
|
|
185
|
+
let consumed = 0;
|
|
186
|
+
const chunk = new Uint8Array(8 * 1024 * 1024);
|
|
187
|
+
const fn = async () => ({
|
|
188
|
+
ok: true,
|
|
189
|
+
status: 200,
|
|
190
|
+
chunks: (async function* () {
|
|
191
|
+
for (let i = 0; i < 5; i++) {
|
|
192
|
+
consumed++;
|
|
193
|
+
yield chunk;
|
|
194
|
+
}
|
|
195
|
+
})(),
|
|
196
|
+
});
|
|
197
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
198
|
+
await expect(client.query("mydb", "SELECT 1")).rejects.toThrow(/cap/);
|
|
199
|
+
expect(consumed).toBe(3);
|
|
200
|
+
expect(D1_RESPONSE_CAP_BYTES).toBe(16 * 1024 * 1024);
|
|
201
|
+
});
|
|
202
|
+
it("rejects at the 60 s bound rather than hanging when the endpoint stalls", async () => {
|
|
203
|
+
vi.useFakeTimers();
|
|
204
|
+
try {
|
|
205
|
+
// Honours the signal the client attached; resolves never otherwise. This is
|
|
206
|
+
// the property the PID lock depends on: a stalled Cloudflare must not wedge
|
|
207
|
+
// the run and hold the lock.
|
|
208
|
+
const fn = (_url, init) => new Promise((_resolve, reject) => {
|
|
209
|
+
init.signal.addEventListener("abort", () => reject(init.signal.reason));
|
|
210
|
+
});
|
|
211
|
+
const client = createD1Client({ accountId: ACC, token: "tok", fetchFn: fn });
|
|
212
|
+
const pending = client.query("mydb", "SELECT 1");
|
|
213
|
+
const assertion = expect(pending).rejects.toThrow(/timed out after 60000ms/);
|
|
214
|
+
await vi.advanceTimersByTimeAsync(D1_TIMEOUT_MS + 1);
|
|
215
|
+
await assertion;
|
|
216
|
+
expect(D1_TIMEOUT_MS).toBe(60_000);
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
vi.useRealTimers();
|
|
220
|
+
}
|
|
21
221
|
});
|
|
22
222
|
});
|
|
23
223
|
//# sourceMappingURL=d1-command.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"d1-command.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/d1-command.test.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,qEAAqE;AACrE,yEAAyE;AACzE,4EAA4E;AAC5E,kEAAkE;AAClE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACnB,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM;YACnC,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU;SAC9C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"d1-command.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/d1-command.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Session } from "neo4j-driver";
|
|
2
|
+
import type { DispatchDestination } from "./connector-sync-provision.js";
|
|
2
3
|
export interface BookingRow {
|
|
3
4
|
bookingId: string;
|
|
4
5
|
slotStart: string;
|
|
@@ -13,16 +14,77 @@ export interface ReconcileResult {
|
|
|
13
14
|
}
|
|
14
15
|
export declare function bookingUid(bookingId: string): string;
|
|
15
16
|
export declare function reconcileOne(session: Session, accountId: string, booking: BookingRow): Promise<ReconcileResult>;
|
|
17
|
+
/**
|
|
18
|
+
* The single definition of a row the reconcile loop acts on.
|
|
19
|
+
*
|
|
20
|
+
* `status='accepted'` is the row the booking page captured. `kind='booking'` is
|
|
21
|
+
* the row that must become a :Meeting — a `kind='block'` row only reserves a
|
|
22
|
+
* slot and has no meeting by design, so counting it as unreconciled is a false
|
|
23
|
+
* positive that is indistinguishable in the log from a genuinely lost booking.
|
|
24
|
+
*
|
|
25
|
+
* Both call sites build their statements from this constant. Two literals is
|
|
26
|
+
* the defect: the sweep and the audit disagreed about what needed reconciling,
|
|
27
|
+
* and only the sweep's opinion could act.
|
|
28
|
+
*/
|
|
29
|
+
export declare const ELIGIBLE_BOOKING_PREDICATE = "status='accepted' AND kind='booking'";
|
|
30
|
+
/** The one D1 read that serves both the sweep and the audit. */
|
|
31
|
+
export declare const ELIGIBLE_BOOKING_SELECT = "SELECT bookingId, slotStart, slotEnd, name, email, note, attempts FROM bookings WHERE status='accepted' AND kind='booking' ORDER BY id";
|
|
32
|
+
/** This account's booking :Meeting uids. Read once per run and used for both
|
|
33
|
+
* the sweep's claim decision and the audit's counts. */
|
|
34
|
+
export declare function fetchBookingMeetingUids(session: Session, accountId: string): Promise<string[]>;
|
|
35
|
+
/**
|
|
36
|
+
* The rows the sweep must claim: eligible, and with no :Meeting carrying their
|
|
37
|
+
* uid.
|
|
38
|
+
*
|
|
39
|
+
* Task 1807 — this deliberately does not consult `swept`. `swept` records that
|
|
40
|
+
* a write was attempted, not that a meeting exists; gating retry on it made a
|
|
41
|
+
* booking whose meeting later went missing permanently unreachable, while the
|
|
42
|
+
* audit reported it every tick. Re-entry is safe because `reconcileOne` is
|
|
43
|
+
* idempotent on (accountId, uid) and returns created=false on a re-run.
|
|
44
|
+
*/
|
|
45
|
+
export declare function selectUnreconciled<T extends Record<string, unknown>>(rows: T[], meetingUids: Set<string>): T[];
|
|
16
46
|
export interface AuditCounts {
|
|
47
|
+
/** Eligible rows the audit looked at. Without it, pendingUnreconciled=0 out
|
|
48
|
+
* of 0 (nothing to do) is indistinguishable from 0 out of 28 (verified
|
|
49
|
+
* clean), and an audit that returns the same value for both is not an audit. */
|
|
50
|
+
eligibleExamined: number;
|
|
17
51
|
pendingUnreconciled: number;
|
|
18
52
|
orphanMeetings: number;
|
|
19
53
|
}
|
|
20
54
|
/**
|
|
21
|
-
* Compare D1's
|
|
22
|
-
* pendingUnreconciled —
|
|
23
|
-
* orphanMeetings — a booking :Meeting with no backing D1 row.
|
|
55
|
+
* Compare D1's eligible booking ids against the account's booking :Meeting set.
|
|
56
|
+
* pendingUnreconciled — eligible in D1 but no :Meeting (reconcile lagging or lost).
|
|
57
|
+
* orphanMeetings — a booking :Meeting with no backing eligible D1 row.
|
|
58
|
+
*
|
|
59
|
+
* Pure: both inputs are read by the caller, which uses the same two lists for
|
|
60
|
+
* the sweep, so the sweep and the audit cannot disagree about the population.
|
|
61
|
+
*/
|
|
62
|
+
export declare function auditCounts(eligibleIds: string[], meetingUids: string[]): AuditCounts;
|
|
63
|
+
/**
|
|
64
|
+
* Statements that bring an already-provisioned bookings table up to the schema
|
|
65
|
+
* the sweep needs. Run once, on the first tick after upgrade, triggered by the
|
|
66
|
+
* eligible-row read failing on the missing column.
|
|
67
|
+
*
|
|
68
|
+
* A template schema change alone cannot reach an existing install: schema.sql
|
|
69
|
+
* is CREATE TABLE IF NOT EXISTS and is applied once at provisioning, so
|
|
70
|
+
* re-applying it to a live database is a no-op. Without this the first
|
|
71
|
+
* kind-qualified read would throw on every existing install and reconcile would
|
|
72
|
+
* stop entirely — strictly worse than the defect being fixed.
|
|
73
|
+
*
|
|
74
|
+
* The third statement classifies rows that predate the column. It is the only
|
|
75
|
+
* place the platform reads a block row's note: the marker is a free-text string
|
|
76
|
+
* owned by an out-of-tree script (Task 1811 absorbs that writer, after which
|
|
77
|
+
* kind='block' is set natively), so it may be used to interpret legacy rows once
|
|
78
|
+
* but never to decide control flow. It is safe to re-run.
|
|
24
79
|
*/
|
|
25
|
-
export declare
|
|
80
|
+
export declare const BOOKING_SCHEMA_MIGRATION: string[];
|
|
81
|
+
/** True when a D1 failure is the absent-column case the migration answers.
|
|
82
|
+
* Every other failure must stay a failure. */
|
|
83
|
+
export declare function isMissingColumnError(message: string): boolean;
|
|
84
|
+
/** True when an ALTER failed because the column is already there. SQLite has no
|
|
85
|
+
* ADD COLUMN IF NOT EXISTS, so each statement tolerates this independently and
|
|
86
|
+
* a half-migrated table completes rather than aborting. */
|
|
87
|
+
export declare function isDuplicateColumnError(message: string): boolean;
|
|
26
88
|
/** The exact instruction the recurring connector-sync admin turn runs. Silent on
|
|
27
89
|
* a clean run: the operator only hears from it on a failure or a change worth
|
|
28
90
|
* flagging. The op=cal-sync stderr line is the standing proof, not a chat reply. */
|
|
@@ -30,18 +92,129 @@ export declare const CONNECTOR_SYNC_PROMPT: string;
|
|
|
30
92
|
/**
|
|
31
93
|
* Create-only provisioning of the recurring connector-sync :Event. Idempotent:
|
|
32
94
|
* the existence probe keys on the `connectorSync` marker so a re-run never
|
|
33
|
-
* duplicates the event nor resets its advancing nextRun. Returns '
|
|
34
|
-
* first arming, '
|
|
95
|
+
* duplicates the event nor resets its advancing nextRun. Returns 'provisioned'
|
|
96
|
+
* on the first arming, 'already-provisioned' thereafter.
|
|
97
|
+
*
|
|
98
|
+
* Task 1809 — `dispatch` is the resolved EXCEPTION destination, not a gate. The
|
|
99
|
+
* caller decides whether to provision from the presence of a calendar
|
|
100
|
+
* connector (the sync's actual input) and resolves where an exception is
|
|
101
|
+
* reported separately; this function writes whichever channel it is handed.
|
|
35
102
|
*/
|
|
36
|
-
export declare function ensureConnectorSyncEvent(session: Session, accountId: string,
|
|
103
|
+
export declare function ensureConnectorSyncEvent(session: Session, accountId: string, dispatch: DispatchDestination): Promise<"provisioned" | "already-provisioned">;
|
|
37
104
|
export interface BusyInterval {
|
|
38
105
|
start: string;
|
|
39
106
|
end: string;
|
|
40
107
|
}
|
|
108
|
+
/** Which of the three states the drift comparison was actually in. `verified` is
|
|
109
|
+
* the only one where `conflicts` carries information: on the other two the
|
|
110
|
+
* comparison had nothing to compare and its 0 is vacuous. */
|
|
111
|
+
export type PublishedDriftOutcome = "verified" | "no-busy-data" | "no-published-slots";
|
|
112
|
+
export interface PublishedDrift {
|
|
113
|
+
outcome: PublishedDriftOutcome;
|
|
114
|
+
/** Size of the published-open set the comparison ran against. */
|
|
115
|
+
published: number;
|
|
116
|
+
/** Size of the connector-busy set the comparison ran against. */
|
|
117
|
+
busy: number;
|
|
118
|
+
/** Published-open slots overlapping any busy interval. Necessarily 0 on the
|
|
119
|
+
* two degraded outcomes, which is why the outcome token has to be read. */
|
|
120
|
+
conflicts: number;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Classify published-open booking slots against the connector-busy set — the
|
|
124
|
+
* drift the standing audit reports. `outcome: "verified"` with a nonzero
|
|
125
|
+
* `conflicts` means the booking page is currently offering a slot the connector
|
|
126
|
+
* shows busy. An empty published set reports `no-published-slots` even when the
|
|
127
|
+
* busy set is also empty: the site never publishing is the upstream condition.
|
|
128
|
+
*/
|
|
129
|
+
export declare function classifyPublishedDrift(published: BusyInterval[], busy: BusyInterval[]): PublishedDrift;
|
|
130
|
+
/** A slot as it appears in the published `availability_snapshot` payload. */
|
|
131
|
+
export interface PublishedSlot {
|
|
132
|
+
start: string;
|
|
133
|
+
end: string;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The published slots to block, given the connector-busy set.
|
|
137
|
+
*
|
|
138
|
+
* The returned slots are drawn from `published` verbatim, never synthesised
|
|
139
|
+
* from `busy`: the edge free/busy Function subtracts taken slots by an exact
|
|
140
|
+
* `slotStart` string match, so a block row keyed on a busy-interval boundary
|
|
141
|
+
* would block nothing.
|
|
142
|
+
*
|
|
143
|
+
* Two exclusions, both carried over from the out-of-tree script this replaces:
|
|
144
|
+
* a slot that has already started (the edge filters past slots anyway, so a
|
|
145
|
+
* row for one is inert churn), and a slot already taken by a real booking
|
|
146
|
+
* (already subtracted at the edge by that booking).
|
|
147
|
+
*/
|
|
148
|
+
export declare function selectBlockedSlots(published: PublishedSlot[], busy: BusyInterval[], taken: Set<string>, nowMs: number): PublishedSlot[];
|
|
149
|
+
/** A block row as held in D1. `bookingId` is the delete key. */
|
|
150
|
+
export interface BlockRow {
|
|
151
|
+
bookingId: string;
|
|
152
|
+
slotStart: string;
|
|
153
|
+
}
|
|
154
|
+
export interface BlockDiff {
|
|
155
|
+
toInsert: PublishedSlot[];
|
|
156
|
+
toDelete: string[];
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Reconcile the held block rows to the desired set, keyed on slot start.
|
|
160
|
+
*
|
|
161
|
+
* This replaces the out-of-tree script's delete-and-reinsert. That form
|
|
162
|
+
* rewrote every row on every run and left a window in which a still-busy slot
|
|
163
|
+
* was unblocked; this one writes nothing in the steady state and never
|
|
164
|
+
* unblocks a slot that is staying blocked.
|
|
165
|
+
*
|
|
166
|
+
* A slot held by more than one row (possible after an interrupted run) keeps
|
|
167
|
+
* one and deletes the rest, so a duplicate converges instead of persisting.
|
|
168
|
+
*/
|
|
169
|
+
export declare function diffBlockRows(desired: PublishedSlot[], current: BlockRow[]): BlockDiff;
|
|
170
|
+
/** The block rows this dispatcher owns. `kind='block'` is the whole identity —
|
|
171
|
+
* no free-text marker is consulted, which is the defect Task 1811 removes. */
|
|
172
|
+
export declare const BLOCK_ROWS_SELECT = "SELECT bookingId, slotStart FROM bookings WHERE kind='block'";
|
|
173
|
+
/** `status='accepted'` so the edge free/busy Function subtracts the slot;
|
|
174
|
+
* `kind='block'` so 1806's sweep and audit both exclude it by construction. */
|
|
175
|
+
export declare const BLOCK_ROW_INSERT: string;
|
|
176
|
+
/** The `kind` qualifier is a safety belt, not a filter: even handed the id of a
|
|
177
|
+
* real booking this statement cannot delete it. */
|
|
178
|
+
export declare const BLOCK_ROW_DELETE = "DELETE FROM bookings WHERE bookingId=?1 AND kind='block'";
|
|
179
|
+
/** Positional parameters for BLOCK_ROW_INSERT. The slot bounds are copied from
|
|
180
|
+
* the published snapshot verbatim — the edge matches `slotStart` exactly. */
|
|
181
|
+
export declare function blockInsertParams(slot: PublishedSlot, bookingId: string, nowIso: string): string[];
|
|
182
|
+
/** The closed vocabulary of the `op=cal-block` outcome field. Deliberately the
|
|
183
|
+
* same tokens as `op=cal-drift` so an operator reads one vocabulary across the
|
|
184
|
+
* sibling lines. Typed so a mistyped literal fails the build. */
|
|
185
|
+
export type BlockOutcome = PublishedDriftOutcome | "snapshot-unreadable" | "error";
|
|
186
|
+
export interface BlockPlan {
|
|
187
|
+
outcome: BlockOutcome;
|
|
188
|
+
diff: BlockDiff;
|
|
189
|
+
}
|
|
41
190
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
191
|
+
* Decide what the blocking step should write. Pure, so the safety rule below is
|
|
192
|
+
* testable without a live D1 or Neo4j — the rule is the highest-consequence
|
|
193
|
+
* line in this feature and was previously enforced only by an `if` at the call
|
|
194
|
+
* site that no test could reach.
|
|
195
|
+
*
|
|
196
|
+
* Writes happen ONLY on `verified`: the snapshot was read, it holds slots, and
|
|
197
|
+
* the busy set holds at least one usable interval. Every degraded outcome
|
|
198
|
+
* returns no writes, which means an absent or unreadable busy set RETAINS the
|
|
199
|
+
* rows already held rather than clearing them.
|
|
200
|
+
*
|
|
201
|
+
* That asymmetry is deliberate. An empty busy set is ambiguous between a
|
|
202
|
+
* genuinely clear calendar and a sync that failed, never ran, or was
|
|
203
|
+
* deauthorised — `syncConnectorBusy` writes an empty set on the documented
|
|
204
|
+
* deauthorise path. Over-blocking is recoverable by the operator; under-blocking
|
|
205
|
+
* double-books a customer against a real commitment. The retained rows are
|
|
206
|
+
* reported on the `op=cal-block` line so the condition is visible, not silent.
|
|
45
207
|
*/
|
|
46
|
-
export declare function
|
|
208
|
+
export declare function planBlockWrites(input: {
|
|
209
|
+
/** False when the snapshot could not be read at all, as distinct from a
|
|
210
|
+
* snapshot that was read and holds no slots. */
|
|
211
|
+
publishedReadable: boolean;
|
|
212
|
+
/** False when the busy set could not be read at all (the graph read threw). */
|
|
213
|
+
busyReadable: boolean;
|
|
214
|
+
published: PublishedSlot[];
|
|
215
|
+
busy: BusyInterval[];
|
|
216
|
+
taken: Set<string>;
|
|
217
|
+
current: BlockRow[];
|
|
218
|
+
nowMs: number;
|
|
219
|
+
}): BlockPlan;
|
|
47
220
|
//# sourceMappingURL=booking-reconcile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"booking-reconcile.d.ts","sourceRoot":"","sources":["../../src/lib/booking-reconcile.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"booking-reconcile.d.ts","sourceRoot":"","sources":["../../src/lib/booking-reconcile.ts"],"names":[],"mappings":"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"}
|