hikoutei 0.5.0 → 0.5.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 (73) hide show
  1. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.d.ts +5 -15
  2. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.d.ts.map +1 -1
  3. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.js +33 -945
  4. package/dist/adapter/sheets/providers/google-sheets-api/GoogleSheetsApiSyncProvider.js.map +1 -1
  5. package/dist/adapter/sheets/providers/google-sheets-api/model/planner.d.ts +14 -20
  6. package/dist/adapter/sheets/providers/google-sheets-api/model/planner.d.ts.map +1 -1
  7. package/dist/adapter/sheets/providers/google-sheets-api/model/planner.js +16 -200
  8. package/dist/adapter/sheets/providers/google-sheets-api/model/planner.js.map +1 -1
  9. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerDeletion.d.ts +14 -0
  10. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerDeletion.d.ts.map +1 -0
  11. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerDeletion.js +37 -0
  12. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerDeletion.js.map +1 -0
  13. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerReceipt.d.ts +19 -0
  14. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerReceipt.d.ts.map +1 -0
  15. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerReceipt.js +76 -0
  16. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerReceipt.js.map +1 -0
  17. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerWorkingRow.d.ts +23 -0
  18. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerWorkingRow.d.ts.map +1 -0
  19. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerWorkingRow.js +122 -0
  20. package/dist/adapter/sheets/providers/google-sheets-api/model/plannerWorkingRow.js.map +1 -0
  21. package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.d.ts +15 -222
  22. package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.d.ts.map +1 -1
  23. package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.js +14 -687
  24. package/dist/adapter/sheets/providers/google-sheets-api/model/preflight.js.map +1 -1
  25. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightContext.d.ts +125 -0
  26. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightContext.d.ts.map +1 -0
  27. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightContext.js +161 -0
  28. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightContext.js.map +1 -0
  29. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightFields.d.ts +67 -0
  30. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightFields.d.ts.map +1 -0
  31. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightFields.js +94 -0
  32. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightFields.js.map +1 -0
  33. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightHeaders.d.ts +24 -0
  34. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightHeaders.d.ts.map +1 -0
  35. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightHeaders.js +52 -0
  36. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightHeaders.js.map +1 -0
  37. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightParsing.d.ts +23 -0
  38. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightParsing.d.ts.map +1 -0
  39. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightParsing.js +239 -0
  40. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightParsing.js.map +1 -0
  41. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightRows.d.ts +53 -0
  42. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightRows.d.ts.map +1 -0
  43. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightRows.js +198 -0
  44. package/dist/adapter/sheets/providers/google-sheets-api/model/preflightRows.js.map +1 -0
  45. package/dist/adapter/sheets/providers/google-sheets-api/operations/anchors.d.ts +21 -0
  46. package/dist/adapter/sheets/providers/google-sheets-api/operations/anchors.d.ts.map +1 -0
  47. package/dist/adapter/sheets/providers/google-sheets-api/operations/anchors.js +57 -0
  48. package/dist/adapter/sheets/providers/google-sheets-api/operations/anchors.js.map +1 -0
  49. package/dist/adapter/sheets/providers/google-sheets-api/operations/applyEffects.d.ts +19 -0
  50. package/dist/adapter/sheets/providers/google-sheets-api/operations/applyEffects.d.ts.map +1 -0
  51. package/dist/adapter/sheets/providers/google-sheets-api/operations/applyEffects.js +188 -0
  52. package/dist/adapter/sheets/providers/google-sheets-api/operations/applyEffects.js.map +1 -0
  53. package/dist/adapter/sheets/providers/google-sheets-api/operations/fastAppend.d.ts +13 -0
  54. package/dist/adapter/sheets/providers/google-sheets-api/operations/fastAppend.d.ts.map +1 -0
  55. package/dist/adapter/sheets/providers/google-sheets-api/operations/fastAppend.js +229 -0
  56. package/dist/adapter/sheets/providers/google-sheets-api/operations/fastAppend.js.map +1 -0
  57. package/dist/adapter/sheets/providers/google-sheets-api/operations/preflightOp.d.ts +27 -0
  58. package/dist/adapter/sheets/providers/google-sheets-api/operations/preflightOp.d.ts.map +1 -0
  59. package/dist/adapter/sheets/providers/google-sheets-api/operations/preflightOp.js +54 -0
  60. package/dist/adapter/sheets/providers/google-sheets-api/operations/preflightOp.js.map +1 -0
  61. package/dist/adapter/sheets/providers/google-sheets-api/operations/provisioning.d.ts +28 -0
  62. package/dist/adapter/sheets/providers/google-sheets-api/operations/provisioning.d.ts.map +1 -0
  63. package/dist/adapter/sheets/providers/google-sheets-api/operations/provisioning.js +256 -0
  64. package/dist/adapter/sheets/providers/google-sheets-api/operations/provisioning.js.map +1 -0
  65. package/dist/adapter/sheets/providers/google-sheets-api/operations/readRows.d.ts +40 -0
  66. package/dist/adapter/sheets/providers/google-sheets-api/operations/readRows.d.ts.map +1 -0
  67. package/dist/adapter/sheets/providers/google-sheets-api/operations/readRows.js +186 -0
  68. package/dist/adapter/sheets/providers/google-sheets-api/operations/readRows.js.map +1 -0
  69. package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.d.ts +57 -0
  70. package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.d.ts.map +1 -0
  71. package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.js +130 -0
  72. package/dist/adapter/sheets/providers/google-sheets-api/operations/shared.js.map +1 -0
  73. package/package.json +1 -1
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Projection provisioning for the Google Sheets API sync provider.
3
+ *
4
+ * Creates missing tabs and their header rows, or verifies existing tabs, in
5
+ * ONE atomic batchUpdate. An existing tab with no content anywhere in its
6
+ * used grid gets its headers initialized; an existing tab with content must
7
+ * match the registered headers exactly (order, duplicates, width), otherwise
8
+ * provisioning fails closed BEFORE any mutation. The operation is idempotent:
9
+ * a retry after a lost response re-enumerates, sees the exact headers, and
10
+ * succeeds without rewriting anything.
11
+ */
12
+ import { GOOGLE_SHEETS_API_PROVISION_ENUMERATION_FIELDS, GOOGLE_SHEETS_API_PROVISION_FIELDS, gridHeaderCells, parseSpreadsheetDocument, } from "../model/preflight.js";
13
+ import { invalidProviderRequest, invalidProviderState } from "../errors.js";
14
+ import { allocateSheetId } from "../model/sheetIdAllocator.js";
15
+ import { columnLetters, parseRegisteredRange, quoteA1SheetName, } from "../model/valueNormalization.js";
16
+ import { requireValidBatchUpdateReply, runRead, runWrite, } from "./shared.js";
17
+ /**
18
+ * Creates missing tabs and their header rows, or verifies existing tabs,
19
+ * in ONE atomic batchUpdate. An existing tab with no content anywhere in
20
+ * its used grid gets its headers initialized; an existing tab with content
21
+ * must match the registered headers exactly (order, duplicates, width),
22
+ * otherwise provisioning fails closed BEFORE any mutation. The operation
23
+ * is idempotent: a retry after a lost response re-enumerates, sees the
24
+ * exact headers, and succeeds without rewriting anything.
25
+ */
26
+ export async function provisionRegistry(deps, registrations) {
27
+ validateProvisionRegistrations(registrations);
28
+ // Enumerate every tab (no ranges, hidden included) with grid dimensions.
29
+ const enumerationRaw = await runRead(deps, () => deps.transport.getSpreadsheet({
30
+ spreadsheetId: deps.spreadsheetId,
31
+ ranges: [],
32
+ fields: GOOGLE_SHEETS_API_PROVISION_ENUMERATION_FIELDS,
33
+ timeoutMs: deps.readTimeoutMs,
34
+ }));
35
+ const sheets = parseSpreadsheetDocument(enumerationRaw, "provisioning enumeration");
36
+ const existingByTitle = new Map(sheets.sheets.map((sheet) => [sheet.title, sheet]));
37
+ // Read the full used grid of every existing registered tab (values plus
38
+ // formats). Missing tabs need no data read; they are created below.
39
+ const dataTargets = registrations.filter((registration) => existingByTitle.has(registration.sheetName));
40
+ const grids = new Map();
41
+ if (dataTargets.length > 0) {
42
+ const ranges = dataTargets.map((registration) => {
43
+ const existing = existingByTitle.get(registration.sheetName);
44
+ if (existing === undefined) {
45
+ invalidProviderState(`Registered sync sheet does not exist: ${registration.sheetName}`);
46
+ }
47
+ const endColumn = provisionGridEndColumn(registration, existing);
48
+ return `${quoteA1SheetName(registration.sheetName)}!A1:${columnLetters(endColumn)}1048576`;
49
+ });
50
+ const dataRaw = await runRead(deps, () => deps.transport.getSpreadsheet({
51
+ spreadsheetId: deps.spreadsheetId,
52
+ ranges,
53
+ fields: GOOGLE_SHEETS_API_PROVISION_FIELDS,
54
+ timeoutMs: deps.readTimeoutMs,
55
+ }));
56
+ const document = parseSpreadsheetDocument(dataRaw, "provisioning grid");
57
+ for (const registration of dataTargets) {
58
+ const existing = existingByTitle.get(registration.sheetName);
59
+ if (existing === undefined) {
60
+ invalidProviderState(`Registered sync sheet does not exist: ${registration.sheetName}`);
61
+ }
62
+ const grid = document.grids.get(existing.sheetId);
63
+ if (grid === undefined) {
64
+ invalidProviderState(`grid data is missing for sheet ${existing.sheetId}`);
65
+ }
66
+ grids.set(registration.sheetName, grid);
67
+ }
68
+ }
69
+ // Plan all mutations: addSheet + header writes for missing tabs, header
70
+ // writes for truly-empty tabs, exact-match verification for content tabs.
71
+ const requests = [];
72
+ const createdSheets = [];
73
+ const initializedHeaders = [];
74
+ const usedSheetIds = new Set(sheets.sheets.map((sheet) => sheet.sheetId));
75
+ for (const registration of registrations) {
76
+ const range = parseRegisteredRange(registration.registeredRange);
77
+ const existing = existingByTitle.get(registration.sheetName);
78
+ const headerCells = registration.headers.map((header) => ({
79
+ userEnteredValue: { stringValue: header },
80
+ }));
81
+ if (existing === undefined) {
82
+ const sheetId = allocateSheetId(usedSheetIds);
83
+ usedSheetIds.add(sheetId);
84
+ requests.push({ kind: "addSheet", title: registration.sheetName, sheetId });
85
+ requests.push({
86
+ kind: "updateCells",
87
+ sheetId,
88
+ startRowIndex: 0,
89
+ startColumnIndex: range.startColumn - 1,
90
+ rows: [headerCells],
91
+ fields: "userEnteredValue",
92
+ });
93
+ createdSheets.push(registration.sheetName);
94
+ initializedHeaders.push(registration.sheetName);
95
+ continue;
96
+ }
97
+ const grid = grids.get(registration.sheetName);
98
+ if (grid === undefined) {
99
+ invalidProviderState(`provisioning grid is missing for ${registration.sheetName}`);
100
+ }
101
+ if (!gridHasContent(grid)) {
102
+ // Truly empty tab: initialize the header row only.
103
+ requests.push({
104
+ kind: "updateCells",
105
+ sheetId: existing.sheetId,
106
+ startRowIndex: 0,
107
+ startColumnIndex: range.startColumn - 1,
108
+ rows: [headerCells],
109
+ fields: "userEnteredValue",
110
+ });
111
+ initializedHeaders.push(registration.sheetName);
112
+ continue;
113
+ }
114
+ // Content tab: the header row must match the registered schema exactly.
115
+ assertProvisioningHeaders(grid, registration);
116
+ }
117
+ if (requests.length > 0) {
118
+ const response = await runWrite(deps, () => deps.transport.batchUpdate({
119
+ spreadsheetId: deps.spreadsheetId,
120
+ requests,
121
+ }));
122
+ requireValidBatchUpdateReply(response, requests.length);
123
+ }
124
+ return {
125
+ registrations: registrations.map(({ headers: _headers, ...route }) => route),
126
+ createdSheets,
127
+ initializedHeaders,
128
+ };
129
+ }
130
+ /** Validates provisioning registrations before any transport call. */
131
+ function validateProvisionRegistrations(registrations) {
132
+ if (registrations.length === 0) {
133
+ invalidProviderRequest("provisioning", "registrations must not be empty");
134
+ }
135
+ const tabNames = new Set();
136
+ for (const registration of registrations) {
137
+ if (registration.sheetName.trim() === "") {
138
+ invalidProviderRequest("provisioning", "sheetName must be non-empty");
139
+ }
140
+ if (tabNames.has(registration.sheetName)) {
141
+ invalidProviderRequest("provisioning", `cannot repeat a tab name: ${registration.sheetName}`);
142
+ }
143
+ tabNames.add(registration.sheetName);
144
+ const range = parseRegisteredRange(registration.registeredRange);
145
+ if (range.columnCount !== registration.headers.length) {
146
+ invalidProviderRequest("provisioning", `headers do not match registeredRange for ${registration.sheetName}`);
147
+ }
148
+ if (registration.headers.length === 0 ||
149
+ registration.headers.some((header) => header.trim() === "")) {
150
+ invalidProviderRequest("provisioning", `headers must contain non-empty names for ${registration.sheetName}`);
151
+ }
152
+ if (new Set(registration.headers).size !== registration.headers.length) {
153
+ invalidProviderRequest("provisioning", `headers must not contain duplicates for ${registration.sheetName}`);
154
+ }
155
+ }
156
+ }
157
+ /**
158
+ * Builds the provisioning data-read end column: the sheet's actual grid
159
+ * width when the enumeration supplied it (so content anywhere in the tab
160
+ * decides emptiness), otherwise the registered range's end column and
161
+ * emptiness is judged only from the returned grid.
162
+ */
163
+ function provisionGridEndColumn(registration, existing) {
164
+ const parsed = parseRegisteredRange(registration.registeredRange);
165
+ const registeredEnd = parsed.startColumn + parsed.columnCount - 1;
166
+ const gridColumns = existing.gridProperties?.columnCount;
167
+ if (gridColumns === undefined)
168
+ return registeredEnd;
169
+ return Math.max(gridColumns, registeredEnd);
170
+ }
171
+ /**
172
+ * Returns whether a provisioning grid has any content anywhere.
173
+ *
174
+ * Only cells with an actual ENTERED value count (a userEnteredValue carrying
175
+ * stringValue/numberValue/boolValue/formulaValue). Blank `{}` cells and
176
+ * format-only cells (userEnteredFormat without a value) are ignored, matching
177
+ * the Apps Script `getLastRow()/getLastColumn()` semantics provisioning was
178
+ * ported from — a blank-but-formatted tab is still initialized, never judged
179
+ * as a content tab that must match headers.
180
+ */
181
+ function gridHasContent(grid) {
182
+ for (const row of grid.rowData) {
183
+ for (const value of row.values) {
184
+ if (cellHasEnteredValue(value))
185
+ return true;
186
+ }
187
+ }
188
+ return false;
189
+ }
190
+ /** Returns whether one API cell carries a real entered value. */
191
+ function cellHasEnteredValue(value) {
192
+ if (value === null || typeof value !== "object" || Array.isArray(value))
193
+ return false;
194
+ const entered = value.userEnteredValue;
195
+ if (entered === null || typeof entered !== "object" || Array.isArray(entered))
196
+ return false;
197
+ const enteredRecord = entered;
198
+ return enteredRecord.stringValue !== undefined ||
199
+ enteredRecord.numberValue !== undefined ||
200
+ enteredRecord.boolValue !== undefined ||
201
+ enteredRecord.formulaValue !== undefined;
202
+ }
203
+ /**
204
+ * Verifies one content tab's header row against the registered schema:
205
+ * exact order, non-empty strings, no duplicates, and full registered-range
206
+ * coverage. Any drift fails closed BEFORE any mutation, mirroring the Apps
207
+ * Script "operational provisioning header mismatch" behavior (including a
208
+ * blank header row on a tab whose content lives outside the registered
209
+ * range).
210
+ */
211
+ function assertProvisioningHeaders(grid, registration) {
212
+ const range = parseRegisteredRange(registration.registeredRange);
213
+ const headerValues = gridHeaderCells(grid, range);
214
+ const actual = headerValues.map((value, index) => {
215
+ const raw = provisioningHeaderString(value);
216
+ if (raw === null) {
217
+ invalidProviderState(`operational provisioning header mismatch: ${registration.sheetName}` +
218
+ ` (header is missing at column ${index + 1})`);
219
+ }
220
+ return raw;
221
+ });
222
+ if (new Set(actual).size !== actual.length) {
223
+ invalidProviderState(`operational provisioning header mismatch: ${registration.sheetName} (duplicate header)`);
224
+ }
225
+ if (actual.length !== registration.headers.length ||
226
+ actual.some((header, index) => header !== registration.headers[index])) {
227
+ invalidProviderState(`operational provisioning header mismatch: ${registration.sheetName}`);
228
+ }
229
+ }
230
+ /**
231
+ * Reads a provisioning header cell as its raw string: string values as-is,
232
+ * numbers and booleans stringified (the Apps Script source compares
233
+ * `String(actual) === String(expected)`), anything else treated as missing.
234
+ */
235
+ function provisioningHeaderString(value) {
236
+ if (value === null || typeof value !== "object")
237
+ return null;
238
+ const record = value;
239
+ const entered = record.userEnteredValue;
240
+ if (entered === null || typeof entered !== "object")
241
+ return null;
242
+ const enteredRecord = entered;
243
+ if (enteredRecord.stringValue !== undefined) {
244
+ return typeof enteredRecord.stringValue === "string" ? enteredRecord.stringValue : null;
245
+ }
246
+ if (enteredRecord.numberValue !== undefined) {
247
+ return typeof enteredRecord.numberValue === "number" && Number.isFinite(enteredRecord.numberValue)
248
+ ? String(enteredRecord.numberValue)
249
+ : null;
250
+ }
251
+ if (enteredRecord.boolValue !== undefined) {
252
+ return typeof enteredRecord.boolValue === "boolean" ? String(enteredRecord.boolValue) : null;
253
+ }
254
+ return null;
255
+ }
256
+ //# sourceMappingURL=provisioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisioning.js","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/google-sheets-api/operations/provisioning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Values-only table reads and observation snapshots for the Google Sheets
3
+ * API sync provider.
4
+ *
5
+ * `readRowsBatch` serves several registered tables through ONE
6
+ * `spreadsheets.get` call (fail-closed on missing tabs, header drift, or
7
+ * malformed payloads). The snapshot operations share one grid read per
8
+ * batch, write missing row anchors in ONE atomic batch, and re-read once so
9
+ * committed anchors appear in every snapshot.
10
+ */
11
+ import type { ReadSyncSnapshotRequest, ReadSyncTableRowsRequest, SyncObservedSnapshot, SyncSheetsSnapshot, SyncTableRowsResult } from "../../../../../application/sync/sheets/syncSheets.js";
12
+ import { type SyncSnapshotReadMode } from "../../../../../application/sync/sheets/constants.js";
13
+ import { type ObservedTab } from "../model/observation.js";
14
+ import { type GoogleSheetsApiProviderDeps } from "./shared.js";
15
+ /** Reads one registered table's literal values with one REST read. */
16
+ export declare function readRows(deps: GoogleSheetsApiProviderDeps, request: ReadSyncTableRowsRequest): Promise<SyncTableRowsResult>;
17
+ /**
18
+ * Reads several registered tables through ONE `spreadsheets.get` call.
19
+ * Results are returned in request order; a missing tab, header drift, or
20
+ * malformed payload fails closed before any result is produced.
21
+ */
22
+ export declare function readRowsBatch(deps: GoogleSheetsApiProviderDeps, requests: readonly ReadSyncTableRowsRequest[]): Promise<readonly SyncTableRowsResult[]>;
23
+ /** Reads one full snapshot without any mutation (lock-free). */
24
+ export declare function readSnapshot(deps: GoogleSheetsApiProviderDeps, request: ReadSyncSnapshotRequest): Promise<SyncSheetsSnapshot>;
25
+ /** Combines anchor assignment and one snapshot read under one request. */
26
+ export declare function observeSnapshot(deps: GoogleSheetsApiProviderDeps, request: ReadSyncSnapshotRequest): Promise<SyncObservedSnapshot>;
27
+ /**
28
+ * Observes several projections with ONE grid read, ONE anchor write (when
29
+ * any anchor is missing), and ONE re-read (when anchors were written), so
30
+ * the committed anchors are reflected in every snapshot. The coordinator
31
+ * already holds every involved mutation lane before this call.
32
+ */
33
+ export declare function observeSnapshots(deps: GoogleSheetsApiProviderDeps, requests: readonly ReadSyncSnapshotRequest[]): Promise<readonly SyncObservedSnapshot[]>;
34
+ /** Reads the target grids of one or more observation requests (one call). */
35
+ export declare function readObservedTabs(deps: GoogleSheetsApiProviderDeps, requests: readonly {
36
+ readonly sheetName: string;
37
+ readonly registeredRange: string;
38
+ readonly readMode?: SyncSnapshotReadMode;
39
+ }[]): Promise<ReadonlyMap<string, ObservedTab>>;
40
+ //# sourceMappingURL=readRows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readRows.d.ts","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/google-sheets-api/operations/readRows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,sDAAsD,CAAC;AAK9D,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,qDAAqD,CAAC;AAW7D,OAAO,EAKL,KAAK,WAAW,EAEjB,MAAM,yBAAyB,CAAC;AAOjC,OAAO,EAML,KAAK,2BAA2B,EACjC,MAAM,aAAa,CAAC;AAGrB,sEAAsE;AACtE,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,2BAA2B,EACjC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,mBAAmB,CAAC,CAM9B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,2BAA2B,EACjC,QAAQ,EAAE,SAAS,wBAAwB,EAAE,GAC5C,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAiDzC;AAED,gEAAgE;AAChE,wBAAsB,YAAY,CAChC,IAAI,EAAE,2BAA2B,EACjC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAQ7B;AAED,0EAA0E;AAC1E,wBAAsB,eAAe,CACnC,IAAI,EAAE,2BAA2B,EACjC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,oBAAoB,CAAC,CAM/B;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,2BAA2B,EACjC,QAAQ,EAAE,SAAS,uBAAuB,EAAE,GAC3C,OAAO,CAAC,SAAS,oBAAoB,EAAE,CAAC,CAwE1C;AAED,6EAA6E;AAC7E,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,2BAA2B,EACjC,QAAQ,EAAE,SAAS;IACjB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CAC1C,EAAE,GACF,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAqB3C"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Values-only table reads and observation snapshots for the Google Sheets
3
+ * API sync provider.
4
+ *
5
+ * `readRowsBatch` serves several registered tables through ONE
6
+ * `spreadsheets.get` call (fail-closed on missing tabs, header drift, or
7
+ * malformed payloads). The snapshot operations share one grid read per
8
+ * batch, write missing row anchors in ONE atomic batch, and re-read once so
9
+ * committed anchors appear in every snapshot.
10
+ */
11
+ import { SYNC_SHEETS_ERROR_CODES, SyncSheetsContractError, } from "../../../../../application/sync/sheets/errors.js";
12
+ import { SYNC_SNAPSHOT_READ_MODES, } from "../../../../../application/sync/sheets/constants.js";
13
+ import { GOOGLE_SHEETS_API_LIGHTWEIGHT_OBSERVATION_FIELDS, GOOGLE_SHEETS_API_OBSERVATION_FIELDS, GOOGLE_SHEETS_API_VALUES_FIELDS, parseSpreadsheetDocument, } from "../model/preflight.js";
14
+ import { GOOGLE_SHEETS_API_ANCHOR_KEY } from "../constants.js";
15
+ import { invalidProviderState } from "../errors.js";
16
+ import { buildSnapshotFromTab, planRowAnchors, readTabGrids, } from "../model/observation.js";
17
+ import { buildTableRowsFromGrid } from "../model/tableRead.js";
18
+ import { columnLetters, parseRegisteredRange, quoteA1SheetName, } from "../model/valueNormalization.js";
19
+ import { definitionForPhysicalSheet, requireValidBatchUpdateReply, runRead, runWrite, validateRoute, } from "./shared.js";
20
+ import { observationTargetFor } from "./preflightOp.js";
21
+ /** Reads one registered table's literal values with one REST read. */
22
+ export async function readRows(deps, request) {
23
+ const [result] = await readRowsBatch(deps, [request]);
24
+ if (result === undefined) {
25
+ invalidProviderState("table read returned no result");
26
+ }
27
+ return result;
28
+ }
29
+ /**
30
+ * Reads several registered tables through ONE `spreadsheets.get` call.
31
+ * Results are returned in request order; a missing tab, header drift, or
32
+ * malformed payload fails closed before any result is produced.
33
+ */
34
+ export async function readRowsBatch(deps, requests) {
35
+ if (requests.length === 0)
36
+ return [];
37
+ const routes = requests.map((request) => {
38
+ const definition = definitionForPhysicalSheet(deps, request.physicalSheetId);
39
+ validateRoute(request, definition);
40
+ if (request.headers.length !== definition.headers.length ||
41
+ request.headers.some((header, index) => header !== definition.headers[index])) {
42
+ throw new SyncSheetsContractError(SYNC_SHEETS_ERROR_CODES.INVALID_EFFECT_PAYLOAD, "sync provider table read headers do not match the registered projection " +
43
+ definition.sheet.physicalSheetId);
44
+ }
45
+ return { request, definition };
46
+ });
47
+ const raw = await runRead(deps, () => deps.transport.getSpreadsheet({
48
+ spreadsheetId: deps.spreadsheetId,
49
+ ranges: routes.map(({ request }) => `${quoteA1SheetName(request.sheetName)}!A1:${rangeEndColumnLetters(request.registeredRange)}1048576`),
50
+ fields: GOOGLE_SHEETS_API_VALUES_FIELDS,
51
+ timeoutMs: deps.readTimeoutMs,
52
+ }));
53
+ const document = parseSpreadsheetDocument(raw, "table read");
54
+ const results = [];
55
+ for (const { request, definition } of routes) {
56
+ const sheet = document.sheets.find((candidate) => candidate.title === request.sheetName);
57
+ if (sheet === undefined) {
58
+ invalidProviderState(`Registered sync sheet does not exist: ${request.sheetName}`);
59
+ }
60
+ const grid = document.grids.get(sheet.sheetId);
61
+ if (grid === undefined) {
62
+ invalidProviderState(`grid data is missing for sheet ${sheet.sheetId}`);
63
+ }
64
+ const rows = buildTableRowsFromGrid(grid, {
65
+ registeredRange: request.registeredRange,
66
+ headers: definition.headers,
67
+ checkboxHeaders: definition.checkboxHeaders ?? [],
68
+ });
69
+ results.push({
70
+ sheetName: request.sheetName,
71
+ registeredRange: request.registeredRange,
72
+ headers: [...definition.headers],
73
+ rows,
74
+ });
75
+ }
76
+ return results;
77
+ }
78
+ /** Reads one full snapshot without any mutation (lock-free). */
79
+ export async function readSnapshot(deps, request) {
80
+ const target = observationTargetFor(deps, request);
81
+ const tabs = await readObservedTabs(deps, [request]);
82
+ const tab = tabs.get(request.sheetName);
83
+ if (tab === undefined) {
84
+ invalidProviderState(`Registered sync sheet does not exist: ${request.sheetName}`);
85
+ }
86
+ return buildSnapshotFromTab(tab, target);
87
+ }
88
+ /** Combines anchor assignment and one snapshot read under one request. */
89
+ export async function observeSnapshot(deps, request) {
90
+ const [observed] = await observeSnapshots(deps, [request]);
91
+ if (observed === undefined) {
92
+ invalidProviderState("observation returned no result");
93
+ }
94
+ return observed;
95
+ }
96
+ /**
97
+ * Observes several projections with ONE grid read, ONE anchor write (when
98
+ * any anchor is missing), and ONE re-read (when anchors were written), so
99
+ * the committed anchors are reflected in every snapshot. The coordinator
100
+ * already holds every involved mutation lane before this call.
101
+ */
102
+ export async function observeSnapshots(deps, requests) {
103
+ if (requests.length === 0)
104
+ return [];
105
+ const targets = requests.map((request) => observationTargetFor(deps, request));
106
+ const tabs = await readObservedTabs(deps, requests);
107
+ const plans = [];
108
+ let assignedTotal = 0;
109
+ for (let index = 0; index < requests.length; index += 1) {
110
+ const request = requests[index];
111
+ const target = targets[index];
112
+ if (request === undefined || target === undefined) {
113
+ invalidProviderState("observation request is unavailable");
114
+ }
115
+ const tab = tabs.get(request.sheetName);
116
+ if (tab === undefined) {
117
+ invalidProviderState(`Registered sync sheet does not exist: ${request.sheetName}`);
118
+ }
119
+ const anchors = planRowAnchors(tab, {
120
+ registeredRange: request.registeredRange,
121
+ headers: target.headers,
122
+ checkboxHeaders: target.checkboxHeaders,
123
+ });
124
+ assignedTotal += anchors.assigned;
125
+ plans.push({ request, target, tab, anchors });
126
+ }
127
+ if (assignedTotal > 0) {
128
+ // One atomic write for every planned anchor across all requested tabs.
129
+ const anchorRequests = [];
130
+ for (const entry of plans) {
131
+ for (const planned of entry.anchors.planned) {
132
+ anchorRequests.push({
133
+ kind: "createDeveloperMetadata",
134
+ sheetId: entry.tab.sheetId,
135
+ rowIndex: planned.rowIndex,
136
+ key: GOOGLE_SHEETS_API_ANCHOR_KEY,
137
+ value: planned.anchor,
138
+ });
139
+ }
140
+ }
141
+ const response = await runWrite(deps, () => deps.transport.batchUpdate({
142
+ spreadsheetId: deps.spreadsheetId,
143
+ requests: anchorRequests,
144
+ }));
145
+ requireValidBatchUpdateReply(response, anchorRequests.length);
146
+ // One shared re-read so the committed anchors appear in the snapshots
147
+ // (mirrors the Apps Script flush-while-locked behavior).
148
+ const refreshed = await readObservedTabs(deps, requests);
149
+ for (const entry of plans) {
150
+ const tab = refreshed.get(entry.request.sheetName);
151
+ if (tab === undefined) {
152
+ invalidProviderState(`Registered sync sheet does not exist: ${entry.request.sheetName}`);
153
+ }
154
+ entry.tab = tab;
155
+ }
156
+ }
157
+ return plans.map((entry) => ({
158
+ anchors: {
159
+ assigned: entry.anchors.assigned,
160
+ existing: entry.anchors.existing,
161
+ duplicateAnchors: entry.anchors.duplicateAnchors,
162
+ },
163
+ snapshot: buildSnapshotFromTab(entry.tab, entry.target),
164
+ }));
165
+ }
166
+ /** Reads the target grids of one or more observation requests (one call). */
167
+ export async function readObservedTabs(deps, requests) {
168
+ // One getSpreadsheet call serves the whole batch with ONE mask: the
169
+ // lighter user_input mask only when every request is lightweight (the
170
+ // lightweight branch never consults merges or dataValidation; the full
171
+ // mask is still correct for a mixed batch).
172
+ const lightweight = requests.length > 0 && requests.every((request) => request.readMode === SYNC_SNAPSHOT_READ_MODES.USER_INPUT);
173
+ const fields = lightweight
174
+ ? GOOGLE_SHEETS_API_LIGHTWEIGHT_OBSERVATION_FIELDS
175
+ : GOOGLE_SHEETS_API_OBSERVATION_FIELDS;
176
+ return runRead(deps, () => readTabGrids(deps.transport, deps.spreadsheetId, requests.map((request) => ({
177
+ sheetName: request.sheetName,
178
+ registeredRange: request.registeredRange,
179
+ })), fields, deps.readTimeoutMs));
180
+ }
181
+ /** Builds the A1 range end letters for one registered range. */
182
+ function rangeEndColumnLetters(registeredRange) {
183
+ const range = parseRegisteredRange(registeredRange);
184
+ return columnLetters(range.startColumn + range.columnCount - 1);
185
+ }
186
+ //# sourceMappingURL=readRows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readRows.js","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/google-sheets-api/operations/readRows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Shared wiring and pacing helpers for the Google Sheets API provider
3
+ * operations.
4
+ *
5
+ * The provider class hands one immutable `GoogleSheetsApiProviderDeps` object
6
+ * to every operation function so the class stays a thin facade. Pacing
7
+ * (read/write request-start limiters), redacted telemetry, route validation
8
+ * against the registered definition, and batchUpdate reply validation live
9
+ * here because every operation shares them.
10
+ */
11
+ import type { RegisteredSyncProjectionDefinition } from "../../../../../application/sync/sheets/sheetsProvisioning.js";
12
+ import { type Presence } from "../../../../../shared/state/index.js";
13
+ import type { GoogleSheetsApiRequestEvent } from "../GoogleSheetsApiSyncProvider.js";
14
+ import type { GoogleSheetsApiTransport } from "../transport/googleSheetsApiTransport.js";
15
+ import { RequestStartLimiter } from "../transport/rateLimiter.js";
16
+ /** Immutable wiring every operation function receives from the provider. */
17
+ export interface GoogleSheetsApiProviderDeps {
18
+ readonly spreadsheetId: string;
19
+ readonly definitions: readonly RegisteredSyncProjectionDefinition[];
20
+ readonly transport: GoogleSheetsApiTransport;
21
+ readonly readTimeoutMs: number;
22
+ readonly maxBatchBytes: number;
23
+ readonly readLimiter: RequestStartLimiter;
24
+ readonly writeLimiter: RequestStartLimiter;
25
+ readonly now: () => number;
26
+ readonly onRequest: ((event: GoogleSheetsApiRequestEvent) => void) | undefined;
27
+ }
28
+ /** Paces ONE `getSpreadsheet` transport call and emits one read event. */
29
+ export declare function runRead<T>(deps: GoogleSheetsApiProviderDeps, task: () => Promise<T>): Promise<T>;
30
+ /** Paces ONE `batchUpdate` transport call and emits one write event. */
31
+ export declare function runWrite<T>(deps: GoogleSheetsApiProviderDeps, task: () => Promise<T>): Promise<T>;
32
+ /** Emits one redacted telemetry event; diagnostics must never throw. */
33
+ export declare function emitRequest(deps: GoogleSheetsApiProviderDeps, operation: "getSpreadsheet" | "batchUpdate", operationCount: number, startedAt: number, ok: boolean, httpStatus: Presence<number>, code: Presence<string>): void;
34
+ /** Resolves the registered projection definition for one physical sheet. */
35
+ export declare function definitionForPhysicalSheet(deps: GoogleSheetsApiProviderDeps, physicalSheetId: string): RegisteredSyncProjectionDefinition;
36
+ /**
37
+ * Route validation against the registered definition (mirrors
38
+ * `validateRoute` in the Apps Script operation provider).
39
+ */
40
+ export declare function validateRoute(request: {
41
+ readonly sheetName: string;
42
+ readonly registeredRange: string;
43
+ readonly projection: string;
44
+ readonly schemaVersion: number;
45
+ }, definition: RegisteredSyncProjectionDefinition): void;
46
+ /** Derives the per-route effect options exactly like the Apps Script provider. */
47
+ export declare function effectRouteOptions(definition: RegisteredSyncProjectionDefinition): {
48
+ readonly identityField: Presence<string>;
49
+ readonly checkboxHeaders: readonly string[];
50
+ };
51
+ /**
52
+ * Validates a batchUpdate reply shape: one reply per request, with the
53
+ * addSheet reply carrying the created sheet id. A malformed 2xx response must
54
+ * not close effects, so this throws a delivery-uncertain state error.
55
+ */
56
+ export declare function requireValidBatchUpdateReply(value: unknown, requestCount: number): void;
57
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../../../src/adapter/sheets/providers/google-sheets-api/operations/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,8DAA8D,CAAC;AAMvH,OAAO,EAA6B,KAAK,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAChG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AACrF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAGlE,4EAA4E;AAC5E,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,kCAAkC,EAAE,CAAC;IACpE,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAChF;AAED,0EAA0E;AAC1E,wBAAsB,OAAO,CAAC,CAAC,EAC7B,IAAI,EAAE,2BAA2B,EACjC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED,wEAAwE;AACxE,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,IAAI,EAAE,2BAA2B,EACjC,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CACzB,IAAI,EAAE,2BAA2B,EACjC,SAAS,EAAE,gBAAgB,GAAG,aAAa,EAC3C,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,OAAO,EACX,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC5B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GACrB,IAAI,CAcN;AAED,4EAA4E;AAC5E,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,2BAA2B,EACjC,eAAe,EAAE,MAAM,GACtB,kCAAkC,CAWpC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE;IACP,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,EACD,UAAU,EAAE,kCAAkC,GAC7C,IAAI,CAaN;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,kCAAkC,GAC7C;IACD,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C,CAYA;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CA4BvF"}