@oddington/sdk 0.1.46 → 0.1.48
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/README.md +21 -39
- package/dist/browser.js +27 -65
- package/dist/index.js +1 -1
- package/dist/types/packages/sdk/src/public.d.ts +1 -1
- package/dist/types/shared/data-contract.d.ts +8 -51
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -710,7 +710,7 @@ operands and infer projected `query`, `pages` and `all` values from normalized
|
|
|
710
710
|
schemas. Multiple aliases share the root declaration. Refresh explicitly with
|
|
711
711
|
the same CLI command after publishing schema changes; app builds and launches
|
|
712
712
|
never refresh it. Missing metadata and dynamic repository strings retain generic
|
|
713
|
-
types. Read/search
|
|
713
|
+
types. Read/search and change payloads remain generic. Committed or stale
|
|
714
714
|
types grant no runtime authority and never replace authoritative Data validation.
|
|
715
715
|
|
|
716
716
|
Iterate matching Records on demand or collect them with an explicit total ceiling:
|
|
@@ -734,7 +734,7 @@ Both helpers preserve literal collection arrays and selected-link inference.
|
|
|
734
734
|
prefetches after a consumer stops. Independent collection cursors continue live positions; versions and requested
|
|
735
735
|
counts may change between pages. Completed collections yield empty arrays on later pages and retain
|
|
736
736
|
requested counts. Empty matches yield one versioned page. Helpers own continuation;
|
|
737
|
-
use `query` for a manual `after` cursor
|
|
737
|
+
use `query` for a manual `after` cursor.
|
|
738
738
|
|
|
739
739
|
`all` sends one bounded collection operation. Selected hosted execution uses one
|
|
740
740
|
ordinary database transaction, and local execution reads one captured in-memory
|
|
@@ -753,6 +753,7 @@ Read known stable refs directly, including refs from different collections:
|
|
|
753
753
|
|
|
754
754
|
```ts
|
|
755
755
|
const invoice = await general.records.read('invoices/one'); // complete Record or null
|
|
756
|
+
const invoiceWithBody = await general.records.read('invoices/one', { body: true });
|
|
756
757
|
const batch = await general.records.read(['invoices/one', 'suppliers/acme']);
|
|
757
758
|
// batch.$meta.version identifies one repository snapshot.
|
|
758
759
|
// batch.records has one Record-or-null slot per input, in the same order.
|
|
@@ -762,38 +763,12 @@ An array accepts 1–100 distinct valid refs; a one-element array keeps the batc
|
|
|
762
763
|
shape, and all-missing batches still carry their version. Both forms send one
|
|
763
764
|
bounded operation through the same app/routine authority and snapshot as `query`.
|
|
764
765
|
Records include `$ref`, `$version` and all canonical structured fields; links
|
|
765
|
-
remain refs, omitted and null fields stay distinct
|
|
766
|
-
`$filing` are excluded.
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
```ts
|
|
773
|
-
const versions = await general.history.list({ limit: 50 });
|
|
774
|
-
const older = versions.length
|
|
775
|
-
? await general.history.list({ before: versions.at(-1)!.version }) : [];
|
|
776
|
-
const close = await general.history.at('2026-10-09T16:30:00Z');
|
|
777
|
-
```
|
|
778
|
-
|
|
779
|
-
List returns an entry array in descending published sequence, with an exclusive
|
|
780
|
-
visible `before` and a default limit of 50 (integer 1–100). Cutoff accepts a real
|
|
781
|
-
RFC 3339 instant with an explicit offset and returns the greatest visible sequence
|
|
782
|
-
published at or before it, or null. Entries contain exactly `version`, `publishedAt`,
|
|
783
|
-
`author`, `authoredAt`, `committer`, `committedAt`, `message`, `created`, `updated`,
|
|
784
|
-
and `deleted`. Git identities and complete messages are repository facts; changed
|
|
785
|
-
refs are lexical. Versions are opaque published identities, never Git expressions.
|
|
786
|
-
Each operation captures input before resolving authority and makes one request.
|
|
787
|
-
Incomplete selected metadata fails the whole result retryably with `unavailable`;
|
|
788
|
-
current Records remain independent. Hosted routines retain their captured ceiling
|
|
789
|
-
until their own authoritative publication advances it. History is served through
|
|
790
|
-
the member/run Data transport. Local apps and local routines use the same calls;
|
|
791
|
-
their OS parent may acquire one bounded page or cutoff result, retain it against
|
|
792
|
-
the exact repository target and published ceiling, and serve an identical warm
|
|
793
|
-
request without another hosted call. Authority loss, expiry, target replacement
|
|
794
|
-
or published-version replacement invalidates that retained result. Prepared local
|
|
795
|
-
changes do not appear in published History.
|
|
796
|
-
Historical Record selection and `history.changes` are not exposed by this slice.
|
|
766
|
+
remain refs, and omitted and null fields stay distinct. Markdown bodies and
|
|
767
|
+
`$filing` are excluded by default. An exact read may request `{ body: true }` to
|
|
768
|
+
include the Markdown body as `$body`; query, search and pagination remain
|
|
769
|
+
body-free. Invalid refs, exceeded bounds, denied access and service failures
|
|
770
|
+
reject the entire call; only a missing Record returns null. No projection,
|
|
771
|
+
expansion or version argument is accepted.
|
|
797
772
|
|
|
798
773
|
Use bounded plain-text lookup to find full Records and guards:
|
|
799
774
|
|
|
@@ -822,7 +797,7 @@ hosted routines search their admitted hosted version. Local routines search the
|
|
|
822
797
|
schema-governed Markdown currently in the checkout, including staged, modified
|
|
823
798
|
and untracked Records. Each call refreshes its operation-local view; a later call
|
|
824
799
|
sees completed Changes writes and external edits. Search Records supply captured
|
|
825
|
-
versions for subsequent Changes.
|
|
800
|
+
versions for subsequent Changes.
|
|
826
801
|
|
|
827
802
|
`where` combines field conditions with AND. Alongside exact scalar/null equality
|
|
828
803
|
and `$in`, declared one-valued `integer`, `number`, `date` and `datetime` fields accept
|
|
@@ -900,9 +875,16 @@ body exactly. A string deliberately replaces it, `''` clears it, and `null` is
|
|
|
900
875
|
invalid. Body-only edits preserve front matter, field-only edits preserve the
|
|
901
876
|
body, and both share the Record's exact-byte version guard. Bodies round-trip
|
|
902
877
|
without Markdown interpretation, formatting, trimming, or fence semantics.
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
878
|
+
Selections and search return structured fields only. Exact reads remain
|
|
879
|
+
body-free unless they explicitly request the body:
|
|
880
|
+
|
|
881
|
+
```ts
|
|
882
|
+
const email = await general.records.read('emails/email-123', { body: true });
|
|
883
|
+
console.log(email?.$body);
|
|
884
|
+
```
|
|
885
|
+
|
|
886
|
+
Local change batches support 32 MiB of serialized JSON; hosted requests retain
|
|
887
|
+
their separate 256 KiB limit.
|
|
906
888
|
|
|
907
889
|
The customer routine owns content and authoring policy. For imported emails,
|
|
908
890
|
create with the prepared body, omit `$body` on ordinary reruns, and preserve existing source bodies on ordinary reruns. Existing notes and fenced blocks
|
|
@@ -975,7 +957,7 @@ also keeps that identity. Concurrent `apply()` calls coalesce, confirmed calls
|
|
|
975
957
|
replay the result, and changed intent requires a new change set. Updates are
|
|
976
958
|
bounded with creates and deletions to 10,000 total operations, with one operation
|
|
977
959
|
per ref. The complete serialized change request is limited to 32 MiB for local
|
|
978
|
-
file changes and 256 KiB for hosted writes. Search
|
|
960
|
+
file changes and 256 KiB for hosted writes. Search is outside this
|
|
979
961
|
Changes slice. Source Records use ordinary schema rules. Files checks access
|
|
980
962
|
when a consumer reads the referenced content.
|
|
981
963
|
|
package/dist/browser.js
CHANGED
|
@@ -1489,67 +1489,34 @@ var DataOperationError = class extends Error {
|
|
|
1489
1489
|
|
|
1490
1490
|
var invalid4 = () => {
|
|
1491
1491
|
throw new DataOperationError("invalid_query");
|
|
1492
|
-
},
|
|
1493
|
-
function
|
|
1494
|
-
return historyText(value) && value.length > 0 && new TextEncoder().encode(value).length <= 1024 && !/[\u0000-\u001f\u007f-\u009f]/.test(value) && !/^[0-9a-f]{40}$/i.test(value);
|
|
1495
|
-
}
|
|
1496
|
-
function historyProperties(value) {
|
|
1492
|
+
}, dataText = (value) => typeof value == "string" && !/[\u0000\uD800-\uDFFF]/u.test(value);
|
|
1493
|
+
function dataProperties(value) {
|
|
1497
1494
|
if (!value || typeof value != "object" || Array.isArray(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value))) return invalid4();
|
|
1498
1495
|
let descriptors = Object.getOwnPropertyDescriptors(value);
|
|
1499
1496
|
return Reflect.ownKeys(value).some((key) => typeof key != "string" || !descriptors[key]?.enumerable || !Object.hasOwn(descriptors[key], "value")) ? invalid4() : descriptors;
|
|
1500
1497
|
}
|
|
1501
|
-
|
|
1502
|
-
function historyArray(value) {
|
|
1498
|
+
function dataArray(value) {
|
|
1503
1499
|
if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype) return invalid4();
|
|
1504
1500
|
let descriptors = Object.getOwnPropertyDescriptors(value);
|
|
1505
1501
|
if (Reflect.ownKeys(value).length !== value.length + 1) return invalid4();
|
|
1506
1502
|
let result2 = [];
|
|
1507
|
-
for (let
|
|
1508
|
-
let descriptor = descriptors[
|
|
1503
|
+
for (let index = 0; index < value.length; index++) {
|
|
1504
|
+
let descriptor = descriptors[index];
|
|
1509
1505
|
if (!descriptor?.enumerable || !Object.hasOwn(descriptor, "value")) return invalid4();
|
|
1510
1506
|
result2.push(descriptor.value);
|
|
1511
1507
|
}
|
|
1512
1508
|
return result2;
|
|
1513
1509
|
}
|
|
1514
|
-
function captureOptions(value, changes) {
|
|
1515
|
-
if (value === void 0) return {};
|
|
1516
|
-
let descriptors = historyProperties(value), result2 = {}, allowed = changes ? ["collections", "refs", "from", "through", "limit", "after"] : ["limit", "before"];
|
|
1517
|
-
if (Object.keys(descriptors).some((key) => !allowed.includes(key))) return invalid4();
|
|
1518
|
-
for (let key of allowed) {
|
|
1519
|
-
if (!Object.hasOwn(descriptors, key)) continue;
|
|
1520
|
-
let scalar = descriptors[key].value;
|
|
1521
|
-
if (key === "collections" || key === "refs") {
|
|
1522
|
-
let values = historyArray(scalar);
|
|
1523
|
-
if (!values.length || values.length > (key === "collections" ? 16 : 100) || !values.every(key === "collections" ? historyCollection : validRecordRef) || new Set(values).size !== values.length) return invalid4();
|
|
1524
|
-
result2[key] = values;
|
|
1525
|
-
} else if (key === "limit") {
|
|
1526
|
-
if (!Number.isInteger(scalar) || scalar < 1 || scalar > (changes ? 500 : 100)) return invalid4();
|
|
1527
|
-
result2.limit = scalar;
|
|
1528
|
-
} else {
|
|
1529
|
-
if (!(key === "after" ? historyCursor(scalar) : historyVersion(scalar))) return invalid4();
|
|
1530
|
-
result2[key] = scalar;
|
|
1531
|
-
}
|
|
1532
|
-
}
|
|
1533
|
-
return result2;
|
|
1534
|
-
}
|
|
1535
|
-
var captureHistoryListOptions = (value) => captureOptions(value, !1), captureHistoryChangesOptions = (value) => captureOptions(value, !0);
|
|
1536
|
-
function captureHistoryInstant(value) {
|
|
1537
|
-
if (!historyText(value) || value.length > 1024) return invalid4();
|
|
1538
|
-
let match = /^(\d{4})-(\d{2})-(\d{2})[Tt](\d{2}):(\d{2}):(\d{2})(?:\.\d+)?([Zz]|([+-])(\d{2}):(\d{2}))$/.exec(value);
|
|
1539
|
-
if (!match) return invalid4();
|
|
1540
|
-
let [year, month, day, hour, minute, second] = match.slice(1, 7).map(Number), days = new Date(Date.UTC(year, month, 0));
|
|
1541
|
-
return days.setUTCFullYear(year), year < 1 || month < 1 || month > 12 || day < 1 || day > days.getUTCDate() || hour > 23 || minute > 59 || second > 59 || Number(match[9] ?? 0) > 23 || Number(match[10] ?? 0) > 59 ? invalid4() : value;
|
|
1542
|
-
}
|
|
1543
1510
|
|
|
1544
1511
|
var invalid5 = () => {
|
|
1545
1512
|
throw new DataOperationError("invalid_query");
|
|
1546
1513
|
};
|
|
1547
1514
|
function captureRecordsSearchInput(query, options) {
|
|
1548
|
-
if (!
|
|
1515
|
+
if (!dataText(query)) return invalid5();
|
|
1549
1516
|
let length = [...query.trim()].length;
|
|
1550
1517
|
if (length < 1 || length > 256) return invalid5();
|
|
1551
1518
|
if (options === void 0) return { query };
|
|
1552
|
-
let descriptors =
|
|
1519
|
+
let descriptors = dataProperties(options);
|
|
1553
1520
|
if (Object.keys(descriptors).some((key) => !["collections", "limit"].includes(key))) return invalid5();
|
|
1554
1521
|
let captured = {};
|
|
1555
1522
|
if (Object.hasOwn(descriptors, "collections")) {
|
|
@@ -1558,7 +1525,7 @@ function captureRecordsSearchInput(query, options) {
|
|
|
1558
1525
|
let collections = [];
|
|
1559
1526
|
for (let index = 0; index < supplied.length; index++) {
|
|
1560
1527
|
let descriptor = Object.getOwnPropertyDescriptor(supplied, String(index));
|
|
1561
|
-
if (!descriptor?.enumerable || !Object.hasOwn(descriptor, "value") || !
|
|
1528
|
+
if (!descriptor?.enumerable || !Object.hasOwn(descriptor, "value") || !dataText(descriptor.value)) return invalid5();
|
|
1562
1529
|
collections.push(descriptor.value);
|
|
1563
1530
|
}
|
|
1564
1531
|
if (new Set(collections).size !== collections.length) return invalid5();
|
|
@@ -1575,7 +1542,7 @@ function captureRecordsSearchInput(query, options) {
|
|
|
1575
1542
|
function captureRecordsReadRefs(value) {
|
|
1576
1543
|
if (!Array.isArray(value) || value.length < 1 || value.length > 100)
|
|
1577
1544
|
throw new DataOperationError("invalid_query");
|
|
1578
|
-
let refs =
|
|
1545
|
+
let refs = dataArray(value);
|
|
1579
1546
|
if (!refs.every((ref) => validRecordRef(ref) && !/[\r\n]/.test(ref)) || new Set(refs).size !== refs.length)
|
|
1580
1547
|
throw new DataOperationError("invalid_query");
|
|
1581
1548
|
return refs;
|
|
@@ -1583,13 +1550,13 @@ function captureRecordsReadRefs(value) {
|
|
|
1583
1550
|
function captureRecordsReadOptions(value) {
|
|
1584
1551
|
if (value === void 0) return {};
|
|
1585
1552
|
try {
|
|
1586
|
-
|
|
1553
|
+
dataProperties(value);
|
|
1587
1554
|
} catch {
|
|
1588
1555
|
throw new DataOperationError("invalid_query");
|
|
1589
1556
|
}
|
|
1590
|
-
if (!value || typeof value != "object" || Array.isArray(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value)) || Reflect.ownKeys(value).
|
|
1557
|
+
if (!value || typeof value != "object" || Array.isArray(value) || ![Object.prototype, null].includes(Object.getPrototypeOf(value)) || Reflect.ownKeys(value).some((key) => key !== "body") || Object.hasOwn(value, "body") && value.body !== !0)
|
|
1591
1558
|
throw new DataOperationError("invalid_query");
|
|
1592
|
-
return {};
|
|
1559
|
+
return Object.hasOwn(value, "body") ? { body: !0 } : {};
|
|
1593
1560
|
}
|
|
1594
1561
|
|
|
1595
1562
|
function capture3(value, ancestors = /* @__PURE__ */ new Set(), depth = 0) {
|
|
@@ -1597,7 +1564,7 @@ function capture3(value, ancestors = /* @__PURE__ */ new Set(), depth = 0) {
|
|
|
1597
1564
|
if (!value || typeof value != "object" || ancestors.has(value) || depth > 32) throw new DataOperationError("invalid_query");
|
|
1598
1565
|
ancestors.add(value);
|
|
1599
1566
|
try {
|
|
1600
|
-
return Array.isArray(value) ?
|
|
1567
|
+
return Array.isArray(value) ? dataArray(value).map((item) => capture3(item, ancestors, depth + 1)) : Object.fromEntries(Object.entries(dataProperties(value)).map(([key, descriptor]) => [key, capture3(descriptor.value, ancestors, depth + 1)]));
|
|
1601
1568
|
} finally {
|
|
1602
1569
|
ancestors.delete(value);
|
|
1603
1570
|
}
|
|
@@ -1607,13 +1574,13 @@ function captureRecordsAll(query, options) {
|
|
|
1607
1574
|
throw new DataOperationError("invalid_query");
|
|
1608
1575
|
};
|
|
1609
1576
|
try {
|
|
1610
|
-
let properties =
|
|
1577
|
+
let properties = dataProperties(options), maxRecords = properties.maxRecords?.value;
|
|
1611
1578
|
if (Object.keys(properties).join(",") !== "maxRecords" || !Number.isSafeInteger(maxRecords) || maxRecords < 1) return invalid9();
|
|
1612
|
-
let detached = capture3(query), selections =
|
|
1579
|
+
let detached = capture3(query), selections = dataProperties(detached);
|
|
1613
1580
|
if (Object.keys(selections).length < 1 || Object.keys(selections).length > 16) return invalid9();
|
|
1614
1581
|
for (let selection2 of Object.values(selections)) {
|
|
1615
|
-
let fields5 =
|
|
1616
|
-
if (fields5.$ && Object.hasOwn(
|
|
1582
|
+
let fields5 = dataProperties(selection2.value);
|
|
1583
|
+
if (fields5.$ && Object.hasOwn(dataProperties(fields5.$.value), "after")) return invalid9();
|
|
1617
1584
|
}
|
|
1618
1585
|
return { query: detached, maxRecords };
|
|
1619
1586
|
} catch {
|
|
@@ -1631,7 +1598,7 @@ var DATA_REQUEST_LIMIT = 256 * 1024, LOCAL_DATA_CHANGE_REQUEST_LIMIT = 32 * 1024
|
|
|
1631
1598
|
};
|
|
1632
1599
|
function mapping(value) {
|
|
1633
1600
|
try {
|
|
1634
|
-
return
|
|
1601
|
+
return dataProperties(value), value;
|
|
1635
1602
|
} catch {
|
|
1636
1603
|
return invalidChange();
|
|
1637
1604
|
}
|
|
@@ -1810,18 +1777,18 @@ function capture4(value, ancestors = /* @__PURE__ */ new Set(), depth = 0) {
|
|
|
1810
1777
|
if (!value || typeof value != "object" || ancestors.has(value) || depth > 32) return invalid6();
|
|
1811
1778
|
ancestors.add(value);
|
|
1812
1779
|
try {
|
|
1813
|
-
return Array.isArray(value) ?
|
|
1780
|
+
return Array.isArray(value) ? dataArray(value).map((item) => capture4(item, ancestors, depth + 1)) : Object.fromEntries(Object.entries(dataProperties(value)).map(([key, descriptor]) => [key, capture4(descriptor.value, ancestors, depth + 1)]));
|
|
1814
1781
|
} finally {
|
|
1815
1782
|
ancestors.delete(value);
|
|
1816
1783
|
}
|
|
1817
1784
|
}
|
|
1818
1785
|
function recordPagination(queryRecords) {
|
|
1819
1786
|
function pages(query) {
|
|
1820
|
-
let captured = capture4(query), names = Object.keys(
|
|
1787
|
+
let captured = capture4(query), names = Object.keys(dataProperties(captured));
|
|
1821
1788
|
for (let name2 of names) {
|
|
1822
|
-
let selection2 =
|
|
1789
|
+
let selection2 = dataProperties(captured[name2]);
|
|
1823
1790
|
if (Object.hasOwn(selection2, "$")) {
|
|
1824
|
-
let options =
|
|
1791
|
+
let options = dataProperties(selection2.$.value);
|
|
1825
1792
|
if (Object.hasOwn(options, "after")) return invalid6();
|
|
1826
1793
|
}
|
|
1827
1794
|
}
|
|
@@ -1839,15 +1806,15 @@ function recordPagination(queryRecords) {
|
|
|
1839
1806
|
})), response2 = await queryRecords(request2), page;
|
|
1840
1807
|
try {
|
|
1841
1808
|
page = capture4(response2);
|
|
1842
|
-
let keys4 = Object.keys(
|
|
1809
|
+
let keys4 = Object.keys(dataProperties(page));
|
|
1843
1810
|
(keys4.length !== active2.length + 1 || keys4.some((key) => key !== "$meta" && !active2.includes(key))) && unavailable();
|
|
1844
1811
|
let meta = page.$meta;
|
|
1845
|
-
(Object.keys(
|
|
1812
|
+
(Object.keys(dataProperties(meta)).sort().join(",") !== "collections,version" || !text2(meta.version)) && unavailable(), version = meta.version, Object.keys(dataProperties(meta.collections)).some((key) => !active2.includes(key)) && unavailable();
|
|
1846
1813
|
for (let name2 of active2) {
|
|
1847
|
-
let records =
|
|
1848
|
-
(Object.keys(
|
|
1814
|
+
let records = dataArray(page[name2]), metadata = Object.hasOwn(meta.collections, name2) ? meta.collections[name2] : {};
|
|
1815
|
+
(Object.keys(dataProperties(metadata)).some((key) => key !== "count" && key !== "next") || Object.hasOwn(metadata, "next") && !text2(metadata.next)) && unavailable();
|
|
1849
1816
|
for (let record4 of records) {
|
|
1850
|
-
|
|
1817
|
+
dataProperties(record4);
|
|
1851
1818
|
let row = record4;
|
|
1852
1819
|
(!validRecordRef(row.$ref) || !text2(row.$version)) && unavailable();
|
|
1853
1820
|
}
|
|
@@ -1908,11 +1875,6 @@ var genericData = {
|
|
|
1908
1875
|
all: async (query, options) => send3({ operation: "records.all", ...captureRecordsAll(query, options) }),
|
|
1909
1876
|
search: async (query, options) => send3({ operation: "records.search", ...captureRecordsSearchInput(query, options) })
|
|
1910
1877
|
},
|
|
1911
|
-
history: {
|
|
1912
|
-
list: async (options) => send3({ operation: "history.list", options: captureHistoryListOptions(options) }),
|
|
1913
|
-
at: async (instant) => send3({ operation: "history.at", instant: captureHistoryInstant(instant) }),
|
|
1914
|
-
changes: async (options) => send3({ operation: "history.changes", options: captureHistoryChangesOptions(options) })
|
|
1915
|
-
},
|
|
1916
1878
|
changes() {
|
|
1917
1879
|
let updates = [], creates = [], deletes = [], applyId, pending, confirmed, assertMutable = () => {
|
|
1918
1880
|
if (applyId) throw new DataOperationError("invalid_change", !1, "unapplied");
|
package/dist/index.js
CHANGED
|
@@ -33,7 +33,7 @@ Set tools to true or false.`;case"tools_require_file":return`The AI request is i
|
|
|
33
33
|
Using tools requires a File input.`;case"unsupported_media_type":return`AI couldn’t read this file.
|
|
34
34
|
Its media type is ${detail.mediaType}, which this input path doesn’t support.
|
|
35
35
|
|
|
36
|
-
Check the file’s stored media type before retrying. The model was not called.`}switch(code){case"access_denied":return"This routine doesn’t currently have permission to use AI.";case"capability_unavailable":return"AI is unavailable in this execution environment.";case"invalid_input":return"The AI request is invalid. Check its input, instructions and schema.";case"unsupported_file":return"AI couldn’t read this file in the requested format.";case"file_unavailable":return"AI couldn’t read or verify the file.";case"input_too_large":return"The AI input exceeds the size limit for this execution path.";case"output_too_large":return"The AI response exceeds the size limit for this execution path.";case"provider_failure":return"AI couldn’t complete the request. No more specific reason was recorded.";case"invalid_output":return"AI returned an answer OS could not accept.";case"cancelled":return"The AI operation was stopped before it completed."}}var ROUTINE_AI_VALUE_BYTES=256*1024;var ROUTINE_AI_RESULT_BYTES=6*ROUTINE_AI_VALUE_BYTES+1024;var ROUTINE_AI_EVIDENCE_BYTES=4*1024;var ROUTINE_AI_ERROR_CODES=["access_denied","capability_unavailable","invalid_input","unsupported_file","file_unavailable","input_too_large","output_too_large","provider_failure","invalid_output","cancelled"];class AIError extends Error{code;detail;constructor(code,options={}){const detail=parseRoutineAIErrorDetail(code,options.detail);super(routineAIErrorMessage(code,detail));this.code=code;this.name="AIError";if(detail)this.detail=Object.freeze(detail);if(code==="invalid_output"&&typeof options.text==="string"&&new TextEncoder().encode(options.text).byteLength<=ROUTINE_AI_VALUE_BYTES)Object.defineProperty(this,"text",{value:options.text})}}function parseRoutineAIError(value){try{const v=capture(value,"invalid_output","output_too_large",ROUTINE_AI_RESULT_BYTES);assertRoutineFields(v,["code","detail","text"]);if(!ROUTINE_AI_ERROR_CODES.includes(v.code))throw new Error;const detail=parseRoutineAIErrorDetail(v.code,v.detail);if(Object.hasOwn(v,"detail")&&!detail||Object.hasOwn(v,"text")&&(typeof v.text!=="string"||new TextEncoder().encode(v.text).byteLength>ROUTINE_AI_VALUE_BYTES)||v.code!=="invalid_output"&&Object.hasOwn(v,"text"))throw new Error;return new AIError(v.code,{detail,...v.text===undefined?{}:{text:v.text}})}catch{throw new AIError("invalid_output")}}function capture(value,invalid3,oversized,limit=ROUTINE_AI_VALUE_BYTES){try{assertRoutineJson(value);const encoded=JSON.stringify(value);if(new TextEncoder().encode(encoded).byteLength>limit)throw new AIError(oversized);return freezeRoutineMetadata(JSON.parse(encoded))}catch(error){if(error instanceof AIError)throw error;throw new AIError(invalid3)}}function parseRoutineAIRequest(value){const v=capture(value,"invalid_input","input_too_large");try{assertRoutineFields(v,v.kind==="generateObject"?["kind","instructions","input","schema","tools"]:["kind","instructions","input","tools"]);if(!["generateText","generateObject"].includes(v.kind)||typeof v.instructions!=="string"||!v.instructions.trim())throw new Error;const input=typeof v.input==="string"?v.input:parseFileDescriptor(v.input);if(Object.hasOwn(v,"tools")&&typeof v.tools!=="boolean")throw new AIError("invalid_input",{detail:{reason:"invalid_tools"}});if(v.tools===true&&typeof input==="string")throw new AIError("invalid_input",{detail:{reason:"tools_require_file"}});const tools=v.tools===true?{tools:true}:{};if(v.kind==="generateText")return freezeRoutineMetadata({kind:v.kind,instructions:v.instructions,input,...tools});const schema=parseAppRoutineContract({routine:"ai",input:v.schema,steps:[{id:"generate"}]}).input;return freezeRoutineMetadata({kind:v.kind,instructions:v.instructions,input,schema,...tools})}catch(error){if(error instanceof AIError)throw error;throw new AIError("invalid_input")}}function parseRoutineAIResult(request,value){let v;try{v=capture(value,"invalid_output","output_too_large",request.kind==="generateText"?ROUTINE_AI_RESULT_BYTES:ROUTINE_AI_VALUE_BYTES);assertRoutineFields(v,request.kind==="generateText"?["text"]:["object"]);if(request.kind==="generateText"){if(typeof v.text!=="string")throw new Error;return acceptText(request,v.text)}if(!Object.hasOwn(v,"object"))throw new Error}catch(error){if(error instanceof AIError)throw error;throw new AIError("invalid_output",{detail:{reason:"invalid_response"}})}validateObject(request.schema,v.object);return freezeRoutineMetadata({object:v.object})}function validateObject(schema,object3,text2){let detail={reason:"invalid_response"};try{validateRoutineSchemaValue(schema,object3,(issue)=>{detail=issue})}catch{throw new AIError("invalid_output",{...text2===undefined?{}:{text:text2},detail})}}function acceptText(request,text2){if(new TextEncoder().encode(text2).byteLength>ROUTINE_AI_VALUE_BYTES)throw new AIError("output_too_large");if(request.kind==="generateText"){if(!text2.trim())throw new AIError("invalid_output",{text:text2,detail:{reason:"empty_text"}});return freezeRoutineMetadata({text:text2})}let object3;const trimmed=text2.trim();const fenced=/^(`{3,}|~{3,})(?:json)?[ \t]*\r?\n([\s\S]*?)\r?\n\1[ \t]*$/i.exec(trimmed);try{object3=JSON.parse(fenced?fenced[2]:text2)}catch{throw new AIError("invalid_output",{text:text2,detail:{reason:"invalid_json"}})}validateObject(request.schema,object3,text2);return capture({object:object3},"invalid_output","output_too_large")}var ROUTINE_STEP_SUMMARY_BYTES=256*1024;var ROUTINE_STEP_OUTPUT_BYTES=1024*1024;function parseRoutineStepOutputDetail(value){const invalid3=()=>{throw new AppRoutineContractError("invalid_value")};assertRoutineFields(value,["step","sizeBytes","limitBytes","summaryBytes","dataBytes"]);const{step,sizeBytes,limitBytes,summaryBytes,dataBytes}=value;if(!isAppRoutineName(step)||![sizeBytes,limitBytes,summaryBytes,dataBytes].every((bytes)=>Number.isSafeInteger(bytes)&&bytes>0)||sizeBytes!==summaryBytes+dataBytes||limitBytes!==(summaryBytes>ROUTINE_STEP_SUMMARY_BYTES?ROUTINE_STEP_SUMMARY_BYTES:ROUTINE_STEP_OUTPUT_BYTES)||(limitBytes===ROUTINE_STEP_SUMMARY_BYTES?summaryBytes:sizeBytes)<=limitBytes)return invalid3();return freezeRoutineMetadata({step,sizeBytes,limitBytes,summaryBytes,dataBytes})}function routineStepOutputMessage(value){const detail=parseRoutineStepOutputDetail(value);const size=`${(detail.sizeBytes/(1024*1024)).toFixed(1)} MB`;const bound=detail.limitBytes===ROUTINE_STEP_SUMMARY_BYTES?`, including ${(detail.summaryBytes/1024).toFixed(1)} KB of summary. Each step's summary can return up to 256 KB.`:". Each step can return up to 1 MB across its summary and data.";return`Step ${detail.step} returned ${size} of output${bound} Return fewer fields or process a smaller batch, then try again.`}class RoutineStepOutputError extends Error{code="step_output_too_large";detail;constructor(detail){const captured=parseRoutineStepOutputDetail(detail);super(routineStepOutputMessage(captured));this.detail=captured;Object.freeze(this)}}function captureRoutineStepOutput(step,summary,data){assertRoutineJson(summary);assertRoutineJson(data);const summaryJson=JSON.stringify(summary),dataJson=JSON.stringify(data);const summaryBytes=new TextEncoder().encode(summaryJson).byteLength;const dataBytes=new TextEncoder().encode(dataJson).byteLength;const sizeBytes=summaryBytes+dataBytes;const limitBytes=summaryBytes>ROUTINE_STEP_SUMMARY_BYTES?ROUTINE_STEP_SUMMARY_BYTES:ROUTINE_STEP_OUTPUT_BYTES;if(summaryBytes>ROUTINE_STEP_SUMMARY_BYTES||sizeBytes>ROUTINE_STEP_OUTPUT_BYTES)throw new RoutineStepOutputError({step,sizeBytes,limitBytes,summaryBytes,dataBytes});return freezeRoutineMetadata({summary:JSON.parse(summaryJson),data:JSON.parse(dataJson)})}function captureRetainedStepOutput(step,value){const hasSummary=Object.hasOwn(value,"summary"),hasData=Object.hasOwn(value,"data");if(hasSummary&&hasData)return captureRoutineStepOutput(step,value.summary,value.data);for(const key of["summary","data"])if(Object.hasOwn(value,key)){assertRoutineJson(value[key]);const bytes=new TextEncoder().encode(JSON.stringify(value[key])).byteLength;if(bytes>(key==="summary"?ROUTINE_STEP_SUMMARY_BYTES:ROUTINE_STEP_OUTPUT_BYTES))throw new AppRoutineContractError("invalid_value")}return freezeRoutineMetadata(JSON.parse(JSON.stringify(value)))}var LIMIT=256*1024;var invalid3=()=>{throw new AppRoutineContractError("invalid_value")};var invalidContract3=()=>{throw new AppRoutineContractError("invalid_contract")};var empty={type:"object",properties:{},required:[],additionalProperties:false};function captureJson(value,maximum=LIMIT){assertRoutineJson(value);const encoded=JSON.stringify(value);if(maximum!==null&&new TextEncoder().encode(encoded).byteLength>maximum)return invalid3();return freezeRoutineMetadata(JSON.parse(encoded))}function capture2(schema,value){const captured=captureJson(value);validateRoutineSchemaValue(schema,captured);return captured}var schemas=new WeakMap;function nestedSchema(value){const metadata=schemaMetadata(value);if(Object.hasOwn(metadata,"default"))return invalidContract3();return metadata.schema}function schemaMetadata(value){if(!value||typeof value!=="object")return invalidContract3();const registered=schemas.get(value);if(registered)return registered;try{assertRoutineJson(value)}catch{return invalidContract3()}return{schema:parseAppRoutineContract({routine:"definition",input:value,steps:[{id:"inspect"}]}).input}}function declaration(value,defaults){try{assertRoutineJson(value)}catch{return invalidContract3()}const parsed=freezeRoutineMetadata(parseAppRoutineContract({routine:"definition",input:value,steps:[{id:"inspect"}]}).input);const captured=defaults?capture2(parsed,defaults.value):undefined;const builder=Object.defineProperty({...parsed},"default",{value:(value2)=>declaration(parsed,{value:value2})});schemas.set(builder,{schema:parsed,...defaults?{default:captured}:{}});return Object.freeze(builder)}var schema={object(properties){return declaration({type:"object",properties:Object.fromEntries(Object.entries(properties).map(([key,value])=>[key,nestedSchema(value)])),required:Object.keys(properties),additionalProperties:false})},array(items,options={}){assertRoutineFields(options,["maxItems"]);return declaration({type:"array",items:nestedSchema(items),...options})},string(options={}){return declaration({type:"string",...options})},integer(options={}){return declaration({type:"integer",...options})},number(options={}){return declaration({type:"number",...options})},boolean(){return declaration({type:"boolean"})}};var file=(options={})=>{assertRoutineFields(options,["storage","path"]);return declaration({type:"file",...options})};var definitions=new WeakMap;var defineRoutine=(definition)=>{assertRoutineFields(definition,["id","title","input","steps","result","access","responses","run"]);if(!isAppRoutineName(definition.id)||definition.title!==undefined&&!routineTitle(definition.title)||typeof definition.run!=="function")return invalidContract3();const input=definition.input===undefined?{schema:empty,default:{}}:schemaMetadata(definition.input);const result=definition.result===undefined?undefined:schemaMetadata(definition.result).schema;const access=parseRoutineAccess(definition.access);assertRoutineFields(definition.steps??{});const executable=Object.fromEntries(Object.entries(definition.steps??{}).map(([id2,step])=>{assertRoutineFields(step,["title","run"]);if(!routineTitle(step.title)||typeof step.run!=="function")return invalidContract3();return[id2,Object.freeze({title:step.title,run:step.run})]}));const steps=Object.entries(executable).map(([id2,step])=>({id:id2,title:step.title}));parseAppRoutineContract({routine:definition.id,input:input.schema,steps:steps.length?steps.map(({id:id2})=>({id:id2})):[{id:"inspect"}],...result?{result}:{}});const responses=[];const ids=new Set;if(definition.responses!==undefined){if(!Array.isArray(definition.responses)||definition.responses.length>64||Reflect.ownKeys(definition.responses).length!==definition.responses.length+1)return invalidContract3();for(let index=0;index<definition.responses.length;index++){const descriptor=Object.getOwnPropertyDescriptor(definition.responses,String(index));if(!descriptor||!Object.hasOwn(descriptor,"value"))return invalidContract3();const response=descriptor.value;assertRoutineFields(response,["id","results","run"]);if(!isAppRoutineName(response.id)||ids.has(response.id))return invalidContract3();ids.add(response.id);if(response.results!==undefined){try{assertRoutineJson(response.results)}catch{return invalidContract3()}}try{responses.push(defineHandler(response))}catch{return invalidContract3()}}}const contract=freezeRoutineMetadata({id:definition.id,...definition.title===undefined?{}:{title:definition.title},input:input.schema,...Object.hasOwn(input,"default")?{inputDefault:input.default}:{},access,responses:responses.map(({id:id2})=>({id:id2})),steps,...result?{result}:{}});const captured=Object.freeze({...definition,access,steps:Object.freeze(executable),responses:Object.freeze(responses),...definition.input===undefined?{}:{input:declaration(input.schema,Object.hasOwn(input,"default")?{value:input.default}:undefined)},...result===undefined?{}:{result:declaration(result)},run:(input2,os)=>executeRoutineDefinition(captured,input2,os)});definitions.set(captured,{contract,steps:executable,run:definition.run});return captured};function inspectRoutineDefinition(definition){if(!definition||typeof definition!=="object")return invalidContract3();const registered=definitions.get(definition);if(!registered)return invalidContract3();return registered.contract}function captureRoutineInput(definition,input){const contract=inspectRoutineDefinition(definition);return capture2(contract.input,input===undefined&&Object.hasOwn(contract,"inputDefault")?contract.inputDefault:input)}async function executeRoutineDefinition(definition,input,runtime){const captured=captureRoutineInput(definition,input);const{contract,steps,run}=definitions.get(definition);let active=true,accepting=true,broken=false;let outputFailure;let work=Promise.resolve();const aiWork=new Set;const generate=(kind,value)=>{const operation=(async()=>{if(!active||broken||contract.access.ai!==true)throw new AIError("access_denied");if(!runtime.ai)throw new AIError("capability_unavailable");let request;try{assertRoutineFields(value,kind==="generateObject"?["instructions","input","schema","tools"]:["instructions","input","tools"]);request=parseRoutineAIRequest({kind,instructions:value.instructions,input:value.input,...kind==="generateObject"?{schema:schemaMetadata(value.schema).schema}:{},...value.tools===undefined?{}:{tools:value.tools}})}catch(error){if(error instanceof AIError)throw error;throw new AIError("invalid_input")}const result2=await runtime.ai[kind](request);if(!active||broken)throw new AIError("access_denied");return parseRoutineAIResult(request,result2)})();aiWork.add(operation);operation.then(()=>aiWork.delete(operation),()=>aiWork.delete(operation));return operation};const called=new Set;const reached=new Set;const guarded=(value,receiver)=>typeof value==="function"?(...args)=>{if(!active||broken)throw new Error("Run authority ended");return guarded(Reflect.apply(value,receiver,args))}:value&&typeof value==="object"&&!(value instanceof Promise)?new Proxy({...value},{get(_target,key){return guarded(Reflect.get(value,key,value),value)}}):value;const validateHandlers=(value)=>{for(const question2 of value.questions??[])if(question2.handler&&!contract.responses.some((handler)=>handler.id===question2.handler.id))return invalid3();return value};let activeStep;const progress=new Map;const os=Object.freeze({...guarded({...runtime,run:freezeRoutineMetadata({id:runtime.run.id,async progress(value){assertRoutineFields(value,["completed","total"]);const{completed,total}=value;const prior=activeStep?progress.get(activeStep):undefined;if(!active||broken||!activeStep||!Number.isSafeInteger(completed)||!Number.isSafeInteger(total)||completed<1||completed>total||prior&&(prior.total!==total||completed<=prior.completed))return invalid3();const accepted=freezeRoutineMetadata({step:activeStep,completed,total});await runtime.run.progress(accepted);progress.set(activeStep,accepted)}}),ai:{generateText:(value)=>generate("generateText",value),generateObject:(value)=>generate("generateObject",value)},connections:{...runtime.connections,get:async(identity)=>{if(!active||broken||!contract.access.connections?.includes(identity))throw new Error("Connection unavailable");const value=await runtime.connections.get(identity);if(!active||broken)throw new Error("Run authority ended");return value}},inbox:{...runtime.inbox,publishAsk:(value,options)=>runtime.inbox.publishAsk(validateHandlers(value),options)}}),step(id2,...input2){let saved;try{if(!active||!accepting||broken||!Object.hasOwn(steps,id2)||called.has(id2)||input2.length>1)return invalid3();if(input2.length)saved=captureJson(input2[0],null);called.add(id2)}catch(error){broken=true;return Promise.reject(error)}const next=work.then(async()=>{if(broken)return invalid3();reached.add(id2);try{await runtime.step(id2,{status:"running"});activeStep=id2;const output=await steps[id2].run(saved,os);assertRoutineFields(output,["summary","data"]);if(!Object.hasOwn(output,"summary")||!Object.hasOwn(output,"data"))return invalid3();const{summary,data}=captureRoutineStepOutput(id2,output.summary,output.data);await runtime.step(id2,{status:"completed",summary,data});activeStep=undefined;return freezeRoutineMetadata({summary,data})}catch(error){if(error instanceof RoutineStepOutputError)outputFailure??=error;broken=true;activeStep=undefined;await runtime.step(id2,{status:"failed"});throw error}});work=next.then(()=>{},()=>{broken=true});return next}});let result,failure;try{result=await run(captured,os)}catch(error){failure=error;broken=true}accepting=false;await work;while(aiWork.size)await Promise.allSettled([...aiWork]);active=false;try{for(const step of contract.steps)if(!reached.has(step.id))await runtime.step(step.id,{status:"skipped"})}catch(error){throw outputFailure??error}if(broken)throw outputFailure??failure??new AppRoutineContractError("invalid_value");if(contract.result!==undefined)return capture2(contract.result,result);if(result!==undefined)return invalid3();return}var RECORD_READ_INPUT_LIMIT=1024*1024;var RECORD_CAPTURE_OUTPUT_LIMIT=25*1024*1024;function validRecordRef(value){return typeof value==="string"&&value.length<=512&&/^[_a-zA-Z0-9][a-zA-Z0-9_-]*(\/[_a-zA-Z0-9][a-zA-Z0-9_-]*)+$/.test(value)}var fieldProblems=["unknown","missing","invalid","source_schema"];var reasons={unknown:"unknown_field",missing:"missing_field",invalid:"invalid_value",source_schema:"source_schema_mismatch"};var expectationKinds={string:"a string",integer:"a safe integer",number:"a finite number",boolean:"a boolean",date:"a date in YYYY-MM-DD format",const:"the constant declared in the schema",datetime:"a UTC date and time in YYYY-MM-DDTHH:mm:ss.sssZ format, for example 2026-09-15T14:30:00.000Z",enum:"one of the choices declared in the schema",link:"a link to an existing record of an allowed type",object:"an object matching the schema",map:"a map matching the schema"};function expectationText(expected){if(!Object.hasOwn(expectationKinds,expected.type)||typeof expected.many!=="boolean"||typeof expected.nullable!=="boolean"||expected.decimalPlaces!==undefined&&(expected.type!=="number"||!Number.isInteger(expected.decimalPlaces)||expected.decimalPlaces<0||expected.decimalPlaces>6)||expected.format!==undefined&&(expected.type!=="date"||expected.format!=="month"))return;const scalar=expected.type==="number"&&expected.decimalPlaces!==undefined?`a finite number with at most ${expected.decimalPlaces} decimal places`:expected.type==="date"&&expected.format==="month"?"a date in YYYY-MM format":expectationKinds[expected.type];return`${expected.many?"Expected a list. Each item must be":"Expected"} ${scalar}.${expected.nullable?" The field may also be null.":""}`}function parseExpectation(text2){if(!text2)return;const parts=/^Expected (a list\. Each item must be )?(.+?)\.( The field may also be null\.)?$/.exec(text2);if(!parts)return;const number=/^a finite number with at most ([0-6]) decimal places$/.exec(parts[2]);const month=parts[2]==="a date in YYYY-MM format";const kind=number?"number":month?"date":Object.keys(expectationKinds).find((kind2)=>expectationKinds[kind2]===parts[2]);if(!kind)return;const expected={type:kind,many:!!parts[1],nullable:!!parts[3],...number?{decimalPlaces:Number(number[1])}:{},...month?{format:"month"}:{}};return expectationText(expected)===text2?expected:undefined}function parseDataValidationDetail(value){if(!value||typeof value!=="object"||Array.isArray(value))return;const v=value;if(Object.keys(v).some((key)=>!["record","field","reason","schemaFile","expected"].includes(key))||typeof v.record!=="string"||typeof v.field!=="string")return;const problem=fieldProblems.find((problem2)=>reasons[problem2]===v.reason);if(!problem||v.schemaFile!==undefined&&typeof v.schemaFile!=="string")return;let expected;if(Object.hasOwn(v,"expected")){if(!v.expected||typeof v.expected!=="object"||Array.isArray(v.expected))return;const e=v.expected;if(Object.keys(e).some((key)=>!["type","many","nullable","decimalPlaces","format"].includes(key)))return;expected={...e};if(!expectationText(expected))return}if(problem==="unknown"&&expected||problem==="source_schema"&&(v.field!=="media_type"||expected?.type!=="string"||expected.many||expected.nullable))return;if(!recordFieldMessage(v.record,v.field,problem,v.schemaFile,expected))return;return{record:v.record,field:v.field,reason:reasons[problem],...typeof v.schemaFile==="string"?{schemaFile:v.schemaFile}:{},...expected?{expected}:{}}}function recordFieldMessage(record2,field,problem,schemaPath,expected){if(!validRecordRef(record2)||!/^[a-zA-Z][a-zA-Z0-9_-]{0,127}$/.test(field))return;if(schemaPath!==undefined&&(schemaPath.length>256||!/^[a-zA-Z0-9_.-]+(?:\/[a-zA-Z0-9_.-]+)*\/_schema\.yaml$/.test(schemaPath)||schemaPath.split("/").some((part)=>[".","..",".git","routines"].includes(part))))return;const prefix=`Record "${record2}" isn't valid.`;const schema2=schemaPath?`"${schemaPath}"`:"the collection schema";if(problem==="source_schema")return field==="media_type"?`${prefix} This repository's Source schema${schemaPath?` ${schema2}`:""} doesn't include "media_type". The OS SDK uses "media_type" for file Sources. Update the Source schema in this repository to include this field.`:undefined;if(problem==="unknown")return`${prefix} The record contains "${field}", but ${schema2} doesn't define that field. Check that the record and ${schemaPath?"that file":"the collection schema"} use the same field name.`;if(problem==="missing")return`${prefix} The record is missing required field "${field}". Add it as defined in ${schema2}.`;const expectation=expected?expectationText(expected):undefined;if(expected&&!expectation)return;return`${prefix} The record has an invalid value for field "${field}".${expectation?` ${expectation}`:""} Check its definition in ${schema2}.`}function safeRecordFieldMessage(value){if(typeof value!=="string"||value.length>1200)return;const parts=/^Record "([^"]+)" isn't valid\. (.+)$/.exec(value);if(!parts)return;const schemaPath=/"([^"]+\/_schema\.yaml)"/.exec(value)?.[1];const field=[...parts[2].matchAll(/"([^"]+)"/g)].map((match)=>match[1]).find((part)=>part!==schemaPath);if(!field)return;const expected=parseExpectation(/\. (Expected .+) Check its definition in /.exec(value)?.[1]);return fieldProblems.map((problem)=>recordFieldMessage(parts[1],field,problem,schemaPath,expected)).find((message)=>message===value)}function dataValidationMessageFacts(error){if(error.code==="invalid_change"){const detail=parseDataValidationDetail(error.detail);if(detail){const problem=fieldProblems.find((problem2)=>reasons[problem2]===detail.reason);return{detail,message:recordFieldMessage(detail.record,detail.field,problem,detail.schemaFile,detail.expected)}}}const message=error.code==="invalid_change"?safeRecordFieldMessage(error.message):undefined;return message?{message}:{}}function explainDataValidation(error,message,detail){Object.assign(error,dataValidationMessageFacts({code:error.code,message:typeof message==="string"?message:"",detail}));return error}var localDataPath=(value,repository)=>typeof value==="string"&&value.length<=1024&&value.startsWith(`${repository}/`)&&!value.includes("\\")&&!/[\x00-\x1f\x7f]/.test(value)&&value.split("/").every((part)=>!!part&&part!=="."&&part!=="..");var localDataFile=(value,repository)=>{if(!value||typeof value!=="object"||Array.isArray(value))return false;const row=value;return Object.keys(row).sort().join(",")==="action,path"&&["created","updated","deleted"].includes(String(row.action))&&localDataPath(row.path,repository)};function parseDataFailureDetail(value){const invalid4=()=>{throw new Error("Invalid local Data failure detail")};if(!value||typeof value!=="object"||Array.isArray(value))return invalid4();const row=value;if(Object.keys(row).sort().join(",")!=="cause,code,files,nextAction,operation,repository"||!["local_data_read_failed","local_data_write_failed","local_data_write_partial"].includes(String(row.code))||!["read","write"].includes(String(row.operation))||typeof row.repository!=="string"||!/^[a-z0-9][a-z0-9._/-]{0,127}$/.test(row.repository)||row.repository.includes("//")||row.repository.includes("..")||!["fix_failed_file_then_rerun","review_resolve_then_rerun"].includes(String(row.nextAction)))return invalid4();const repository=row.repository;if(!row.cause||typeof row.cause!=="object"||Array.isArray(row.cause))return invalid4();const cause=row.cause;if(!["code,message","code,message,path"].includes(Object.keys(cause).sort().join(","))||!["schema_validation_failed","invalid_record","unsafe_record","stale_record","path_conflict","filesystem_unavailable"].includes(String(cause.code))||typeof cause.message!=="string"||!cause.message||cause.message.length>512||/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/.test(cause.message)||cause.path!==undefined&&!localDataPath(cause.path,repository))return invalid4();if(!row.files||typeof row.files!=="object"||Array.isArray(row.files))return invalid4();const files=row.files;if(Object.keys(files).some((key)=>!["state","saved","failed","notAttempted","savedOmitted","notAttemptedOmitted"].includes(key))||!["none","partial"].includes(String(files.state))||!Array.isArray(files.saved)||files.saved.length>128||!files.saved.every((item)=>localDataFile(item,repository))||files.failed!==undefined&&!localDataFile(files.failed,repository)||!Array.isArray(files.notAttempted)||files.notAttempted.length>128||!files.notAttempted.every((item)=>localDataFile(item,repository)))return invalid4();for(const key of["savedOmitted","notAttemptedOmitted"])if(files[key]!==undefined&&(!Number.isSafeInteger(files[key])||Number(files[key])<1||Number(files[key])>1e4))return invalid4();if(row.operation==="read"&&(row.code!=="local_data_read_failed"||files.state!=="none"||files.saved.length||files.failed!==undefined||files.notAttempted.length)||row.operation==="write"&&row.code==="local_data_read_failed"||row.code==="local_data_write_partial"&&(files.state!=="partial"||!files.saved.length)||row.code!=="local_data_write_partial"&&files.state==="partial")return invalid4();return structuredClone(value)}function parseDataOperationDetail(value){const validation=parseDataValidationDetail(value);if(validation)return validation;if(value&&typeof value==="object"&&!Array.isArray(value)&&value.code==="record_limit_exceeded"){const row=value;if(Object.keys(row).sort().join(",")!=="code,collections,maxRecords"||!Number.isSafeInteger(row.maxRecords)||Number(row.maxRecords)<1||!Array.isArray(row.collections)||!row.collections.length||row.collections.length>16||!row.collections.every((name)=>typeof name==="string"&&name.length<=512&&/^[_a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(name))||new Set(row.collections).size!==row.collections.length)throw new Error("Invalid Data operation detail");return structuredClone(value)}return parseDataFailureDetail(value)}function dataRecordLimitMessage(detail){const scope=detail.collections.length===1?` from ${detail.collections[0]}`:` across ${detail.collections.join(", ")}`;return`The routine tried to load more than ${detail.maxRecords.toLocaleString("en-US")} matching Records${scope}. `+"Narrow the query or increase maxRecords."}class DataOperationError extends Error{code;retryable;effect;component;detail;constructor(code,retryable=false,effect,component,detail){const parsed=detail===undefined?undefined:parseDataOperationDetail(detail);if(parsed&&("reason"in parsed?code!=="invalid_change":parsed.code==="record_limit_exceeded"&&code!=="capacity"))throw new Error("Invalid Data operation detail");super(code==="capacity"&&parsed&&"code"in parsed&&parsed.code==="record_limit_exceeded"?dataRecordLimitMessage(parsed):`Data operation failed: ${code}`);this.code=code;this.retryable=retryable;this.effect=effect;this.component=component;this.detail=detail;this.name="DataOperationError";if(parsed!==undefined)this.detail=parsed}}var invalid4=()=>{throw new DataOperationError("invalid_query")};var historyText=(value)=>typeof value==="string"&&!/[\u0000\uD800-\uDFFF]/u.test(value);function historyVersion(value){return historyText(value)&&value.length>0&&new TextEncoder().encode(value).length<=1024&&!/[\u0000-\u001f\u007f-\u009f]/.test(value)&&!/^[0-9a-f]{40}$/i.test(value)}function historyProperties(value){if(!value||typeof value!=="object"||Array.isArray(value)||![Object.prototype,null].includes(Object.getPrototypeOf(value)))return invalid4();const descriptors=Object.getOwnPropertyDescriptors(value);if(Reflect.ownKeys(value).some((key)=>typeof key!=="string"||!descriptors[key]?.enumerable||!Object.hasOwn(descriptors[key],"value")))return invalid4();return descriptors}var historyCollection=(value)=>typeof value==="string"&&value.length<=512&&/^[_a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(value);var historyCursor=(value)=>typeof value==="string"&&value.length<=128*1024&&/^history-cursor-v1\.[A-Za-z0-9_-]{1,64}\.[A-Za-z0-9_-]{16}\.[A-Za-z0-9_-]+$/.test(value);function historyArray(value){if(!Array.isArray(value)||Object.getPrototypeOf(value)!==Array.prototype)return invalid4();const descriptors=Object.getOwnPropertyDescriptors(value);if(Reflect.ownKeys(value).length!==value.length+1)return invalid4();const result=[];for(let i=0;i<value.length;i++){const descriptor=descriptors[i];if(!descriptor?.enumerable||!Object.hasOwn(descriptor,"value"))return invalid4();result.push(descriptor.value)}return result}function captureOptions(value,changes){if(value===undefined)return{};const descriptors=historyProperties(value),result={};const allowed=changes?["collections","refs","from","through","limit","after"]:["limit","before"];if(Object.keys(descriptors).some((key)=>!allowed.includes(key)))return invalid4();for(const key of allowed){if(!Object.hasOwn(descriptors,key))continue;const scalar=descriptors[key].value;if(key==="collections"||key==="refs"){const values=historyArray(scalar);if(!values.length||values.length>(key==="collections"?16:100)||!values.every(key==="collections"?historyCollection:validRecordRef)||new Set(values).size!==values.length)return invalid4();result[key]=values}else if(key==="limit"){if(!Number.isInteger(scalar)||scalar<1||scalar>(changes?500:100))return invalid4();result.limit=scalar}else{if(!(key==="after"?historyCursor(scalar):historyVersion(scalar)))return invalid4();result[key]=scalar}}return result}var captureHistoryListOptions=(value)=>captureOptions(value,false);var captureHistoryChangesOptions=(value)=>captureOptions(value,true);function captureHistoryInstant(value){if(!historyText(value)||value.length>1024)return invalid4();const match=/^(\d{4})-(\d{2})-(\d{2})[Tt](\d{2}):(\d{2}):(\d{2})(?:\.\d+)?([Zz]|([+-])(\d{2}):(\d{2}))$/.exec(value);if(!match)return invalid4();const[year,month,day,hour,minute,second]=match.slice(1,7).map(Number);const days=new Date(Date.UTC(year,month,0));days.setUTCFullYear(year);if(year<1||month<1||month>12||day<1||day>days.getUTCDate()||hour>23||minute>59||second>59||Number(match[9]??0)>23||Number(match[10]??0)>59)return invalid4();return value}var invalid5=()=>{throw new DataOperationError("invalid_query")};function captureRecordsSearchInput(query,options){if(!historyText(query))return invalid5();const length=[...query.trim()].length;if(length<1||length>256)return invalid5();if(options===undefined)return{query};const descriptors=historyProperties(options);if(Object.keys(descriptors).some((key)=>!["collections","limit"].includes(key)))return invalid5();const captured={};if(Object.hasOwn(descriptors,"collections")){const supplied=descriptors.collections.value;if(!Array.isArray(supplied)||supplied.length<1||supplied.length>16||Reflect.ownKeys(supplied).length!==supplied.length+1)return invalid5();const collections=[];for(let index=0;index<supplied.length;index++){const descriptor=Object.getOwnPropertyDescriptor(supplied,String(index));if(!descriptor?.enumerable||!Object.hasOwn(descriptor,"value")||!historyText(descriptor.value))return invalid5();collections.push(descriptor.value)}if(new Set(collections).size!==collections.length)return invalid5();captured.collections=collections}if(Object.hasOwn(descriptors,"limit")){const supplied=descriptors.limit.value;if(!Number.isInteger(supplied)||supplied<1||supplied>100)return invalid5();captured.limit=supplied}return{query,options:captured}}function captureRecordsReadRefs(value){if(!Array.isArray(value)||value.length<1||value.length>100)throw new DataOperationError("invalid_query");const refs=historyArray(value);if(!refs.every((ref)=>validRecordRef(ref)&&!/[\r\n]/.test(ref))||new Set(refs).size!==refs.length)throw new DataOperationError("invalid_query");return refs}function captureRecordsReadOptions(value){if(value===undefined)return{};try{historyProperties(value)}catch{throw new DataOperationError("invalid_query")}if(!value||typeof value!=="object"||Array.isArray(value)||![Object.prototype,null].includes(Object.getPrototypeOf(value))||Reflect.ownKeys(value).length)throw new DataOperationError("invalid_query");return{}}function capture3(value,ancestors=new Set,depth=0){if(value===null||typeof value==="string"||typeof value==="boolean"||typeof value==="number"&&Number.isFinite(value))return value;if(!value||typeof value!=="object"||ancestors.has(value)||depth>32)throw new DataOperationError("invalid_query");ancestors.add(value);try{if(Array.isArray(value))return historyArray(value).map((item)=>capture3(item,ancestors,depth+1));return Object.fromEntries(Object.entries(historyProperties(value)).map(([key,descriptor])=>[key,capture3(descriptor.value,ancestors,depth+1)]))}finally{ancestors.delete(value)}}function captureRecordsAll(query,options){const invalid6=()=>{throw new DataOperationError("invalid_query")};try{const properties=historyProperties(options),maxRecords=properties.maxRecords?.value;if(Object.keys(properties).join(",")!=="maxRecords"||!Number.isSafeInteger(maxRecords)||maxRecords<1)return invalid6();const detached=capture3(query);const selections=historyProperties(detached);if(Object.keys(selections).length<1||Object.keys(selections).length>16)return invalid6();for(const selection2 of Object.values(selections)){const fields3=historyProperties(selection2.value);if(fields3.$&&Object.hasOwn(historyProperties(fields3.$.value),"after"))return invalid6()}return{query:detached,maxRecords}}catch{return invalid6()}}function validRecordBody(value){return typeof value==="string"&&value===new TextDecoder("utf-8",{ignoreBOM:true}).decode(new TextEncoder().encode(value))}var RECORD_BODY_READ_BYTES=8*1024*1024;var DATA_REQUEST_LIMIT=256*1024;var LOCAL_DATA_CHANGE_REQUEST_LIMIT=32*1024*1024;var invalidChange=()=>{throw new DataOperationError("invalid_change",false,"unapplied")};function mapping(value){try{historyProperties(value);return value}catch{return invalidChange()}}function captureValue(value,ancestors=new Set,depth=0){if(value===null||typeof value==="string"||typeof value==="boolean"||typeof value==="number"&&Number.isFinite(value))return value;if(!value||typeof value!=="object"||ancestors.has(value)||depth>32)return invalidChange();ancestors.add(value);try{if(Array.isArray(value)){if(value.length>1e5||Object.keys(value).length!==value.length||Object.getOwnPropertySymbols(value).length)return invalidChange();return Array.from(value,(item)=>captureValue(item,ancestors,depth+1))}return Object.fromEntries(Object.entries(mapping(value)).map(([key,item])=>{if(["__proto__","constructor","prototype"].includes(key))return invalidChange();return[key,captureValue(item,ancestors,depth+1)]}))}finally{ancestors.delete(value)}}function captureDataDelete(record2){const identity=mapping(record2);if(!validRecordRef(identity.$ref)||typeof identity.$version!=="string"||!identity.$version.length||identity.$version.length>512)return invalidChange();return{ref:identity.$ref,expectedVersion:identity.$version}}function captureDataUpdate(record2,set){const identity=captureDataDelete(record2),input=mapping(set);const{$body,...fields3}=input;const body=Object.hasOwn(input,"$body");if(body&&!validRecordBody($body)||!Object.keys(fields3).length&&!body||Object.keys(fields3).some((key)=>key.startsWith("$")||["id","type"].includes(key)))return invalidChange();return{...identity,set:captureValue(fields3),...body?{body:$body}:{}}}function captureIdentities(value,update,allowEmpty=true){if(!Array.isArray(value)||!allowEmpty&&!value.length||value.length>1e4)return invalidChange();const captured=value.map((item)=>{const row=mapping(item);if(Object.keys(row).filter((key)=>!update||key!=="body").sort().join(",")!==(update?"expectedVersion,ref,set":"expectedVersion,ref"))return invalidChange();const identity={$ref:row.ref,$version:row.expectedVersion};if(update&&Object.keys(mapping(row.set)).some((key)=>key.startsWith("$")))return invalidChange();return update?captureDataUpdate(identity,{...mapping(row.set),...Object.hasOwn(row,"body")?{$body:row.body}:{}}):captureDataDelete(identity)});if(new Set(captured.map((item)=>item.ref)).size!==captured.length)return invalidChange();return captured}function captureDataUpdates(value,allowEmpty=false){return captureIdentities(value,true,allowEmpty)}function captureDataCreate(value){const row=mapping(value);if(!validRecordRef(row.$ref)||Object.keys(row).some((key)=>key.startsWith("$")&&!["$ref","$filing","$body"].includes(key)))return invalidChange();const{$ref:ref,$filing,$body,...fields3}=row;const body=Object.hasOwn(row,"$body");if(body&&!validRecordBody($body))return invalidChange();let filing;if($filing!==undefined){const components=mapping($filing);if(Object.entries(components).some(([name,value2])=>!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)||["constructor","prototype"].includes(name)||typeof value2!=="string"||!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(value2)))return invalidChange();filing={...components}}return{ref,fields:captureValue(fields3),...filing?{filing}:{},...body?{body:$body}:{}}}function captureDataChanges(updatesValue,createsValue=[],deletesValue=[]){const updates=captureDataUpdates(updatesValue,true);if(!Array.isArray(createsValue)||createsValue.length>1e4)return invalidChange();const creates=createsValue.map((item)=>{const row=mapping(item);if(Object.keys(row).some((key)=>!["ref","fields","filing","body"].includes(key))||!Object.hasOwn(row,"ref")||!Object.hasOwn(row,"fields"))return invalidChange();const fields3=mapping(row.fields);if(Object.keys(fields3).some((key)=>key.startsWith("$")))return invalidChange();return captureDataCreate({...fields3,$ref:row.ref,...Object.hasOwn(row,"filing")?{$filing:row.filing}:{},...Object.hasOwn(row,"body")?{$body:row.body}:{}})});const deletes=captureIdentities(deletesValue,false);const refs=[...updates,...creates,...deletes].map((item)=>item.ref);if(!refs.length||refs.length>1e4||new Set(refs).size!==refs.length)return invalidChange();return{updates,creates,deletes}}function checkDataRequestSize(input,limit=DATA_REQUEST_LIMIT){if(new TextEncoder().encode(JSON.stringify(input)).byteLength>limit)throw new DataOperationError("request_too_large",false,"unapplied")}function dataTransportError(status,value){const failures={400:["invalid_query","invalid_change"],401:["unauthenticated"],403:["access_denied"],409:["conflict","apply_pending"],413:["request_too_large"],429:["capacity"],503:["unavailable","apply_pending"]};const error=value&&typeof value==="object"&&"error"in value?value.error:undefined;const row=error&&typeof error==="object"?error:undefined;const code=failures[status]?.find((allowed)=>allowed===row?.code)??"unavailable";const effect=["unapplied","uncertain","applied"].includes(String(row?.effect))?row.effect:undefined;let detail;try{detail=row?.detail===undefined?undefined:parseDataOperationDetail(row.detail)}catch{}if(detail&&"reason"in detail&&code!=="invalid_change")detail=undefined;return explainDataValidation(new DataOperationError(code,typeof row?.retryable==="boolean"?row.retryable:["capacity","unavailable","apply_pending"].includes(code),code==="conflict"?"unapplied":effect,code==="invalid_change"&&typeof row?.component==="string"&&/^[a-zA-Z][a-zA-Z0-9_-]{0,127}$/.test(row.component)?row.component:undefined,detail),row?.message,row?.detail)}var AUTH_ORIGIN="https://auth.oddington.ai";function oddingtonOrigin(environment=process.env){const value=environment.OS_ORIGIN??AUTH_ORIGIN;const url=new URL(value);if(url.protocol!=="https:"&&url.hostname!=="127.0.0.1")throw new Error("OS_ORIGIN must use HTTPS");return url.origin}var nodeRequest;var nodeReadable;if(typeof __OS_BROWSER__==="undefined"||!__OS_BROWSER__){({request:nodeRequest}=await import("node:http"));({Readable:nodeReadable}=await import("node:stream"))}function privateRoutineRequest(environment=typeof __OS_BROWSER__!=="undefined"&&__OS_BROWSER__?{}:typeof process==="undefined"?{}:process.env){if(typeof __OS_BROWSER__!=="undefined"&&__OS_BROWSER__)return;const prepared=["OS_ROUTINE_LOCAL","OS_ROUTINE_LOCAL_SOCKET","OS_ROUTINE_LOCAL_TOKEN"].some((key)=>environment[key]!==undefined);const managed=["OS_FILES_SOCKET","OS_FILES_TOKEN"].some((key)=>environment[key]!==undefined);if(!prepared&&!managed)return;const socket=prepared?environment.OS_ROUTINE_LOCAL_SOCKET:environment.OS_FILES_SOCKET;const token=prepared?environment.OS_ROUTINE_LOCAL_TOKEN:environment.OS_FILES_TOKEN;const request=localRoutineRequest(prepared?environment:{OS_ROUTINE_LOCAL:"1",OS_ROUTINE_LOCAL_SOCKET:socket,OS_ROUTINE_LOCAL_TOKEN:token});const isCurrent=()=>prepared?environment.OS_ROUTINE_LOCAL==="1"&&environment.OS_ROUTINE_LOCAL_SOCKET===socket&&environment.OS_ROUTINE_LOCAL_TOKEN===token:environment.OS_FILES_SOCKET===socket&&environment.OS_FILES_TOKEN===token;if(!nodeRequest||!nodeReadable)throw new Error("Files transport unavailable");const httpRequest=nodeRequest,Readable=nodeReadable;const files=async(suffix,init,signal)=>{if(!isCurrent())throw new FileOperationError("unsupported_context",400);const tcp=/^tcp:\/\/127\.0\.0\.1:([1-9][0-9]{0,4})$/.exec(socket);const endpoint=tcp?{hostname:"127.0.0.1",port:Number(tcp[1])}:{socketPath:socket};const id2=crypto.randomUUID();if(init.body instanceof ReadableStream||suffix===""&&init.method==="POST"){await new Promise((resolve,reject)=>{const check=httpRequest({...endpoint,path:"/files/check-create",method:"POST",timeout:30000,signal,agent:false,headers:{...Object.fromEntries(new Headers(init.headers)),authorization:`Bearer ${token}`,"x-os-files-suffix":encodeURIComponent(suffix),"x-os-files-method":init.method??"GET"}},(response)=>{const bytes=Buffer.alloc(16384);let size=0;response.on("data",(chunk)=>{size+=chunk.length;if(size>16384)response.destroy(new Error("File operation start response exceeded 16 KiB."));else bytes.set(chunk,size-chunk.length)});response.once("error",reject);response.once("end",()=>{if(response.statusCode===204){resolve();return}try{const value=JSON.parse(bytes.subarray(0,size).toString());const code=value?.error?.code;const status=response.statusCode??503;if(["invalid_input","request_too_large","unsupported_context","access_denied","capacity","unavailable"].includes(code))reject(new FileOperationError(code,status,code==="capacity"||code==="unavailable",parseFileErrorDetail(value?.error?.detail)));else reject(new FileOperationError("unavailable",503,true))}catch{reject(new FileOperationError("unavailable",503,true))}})});check.once("error",()=>reject(new FileOperationError("unavailable",503,true)));check.once("timeout",()=>check.destroy(new Error("The file create check did not finish in time.")));check.end()});if(!isCurrent())throw new FileOperationError("unsupported_context",400)}let cancellation;const cancelCall=()=>cancellation??=new Promise((resolve,reject)=>{const cancel=httpRequest({...endpoint,path:"/files/cancel",method:"POST",timeout:30000,headers:{authorization:`Bearer ${token}`,"x-os-files-call":id2}},(response)=>{response.resume();response.once("end",resolve);response.once("error",reject)});cancel.once("error",reject);cancel.once("timeout",()=>cancel.destroy(new Error("Files cancellation stalled")));cancel.end()});let pumping=Promise.resolve();let sourceReader;const result=new Promise((resolve,reject)=>{const call=httpRequest({...endpoint,path:"/files/stream",method:"POST",headers:{...Object.fromEntries(new Headers(init.headers)),authorization:`Bearer ${token}`,"x-os-files-call":id2,"x-os-files-suffix":encodeURIComponent(suffix),"x-os-files-method":init.method??"GET"},signal,timeout:30000,agent:false},async(response)=>{try{call.setTimeout(0);if((response.statusCode??503)>=400){await sourceReader?.cancel().catch(()=>{});call.end()}await pumping;if(!isCurrent()){response.destroy();reject(new FileOperationError("unsupported_context",400));return}const headers=new Headers;for(const[key,value]of Object.entries(response.headers))if(value!==undefined)headers.set(key,Array.isArray(value)?value.join(", "):value);const source=Readable.toWeb(response,{strategy:{highWaterMark:65536,size:(chunk)=>chunk.byteLength}});const reader=source.getReader();if(response.statusCode===204){const timer=setTimeout(()=>response.destroy(new Error("Files completion stalled")),30000);try{if(!(await reader.read()).done)throw new FileOperationError("unavailable",503,true);if(!isCurrent())throw new FileOperationError("unsupported_context",400);resolve(new Response(null,{status:204,headers}))}finally{clearTimeout(timer);reader.releaseLock()}return}let closed=false;const body=new ReadableStream({async pull(controller){let timer;try{if(!isCurrent())throw new FileOperationError("unsupported_context",400);timer=setTimeout(()=>response.destroy(new Error("Files delivery stalled")),30000);const next=await reader.read();if(closed)return;if(next.done){closed=true;reader.releaseLock();controller.close()}else controller.enqueue(next.value)}catch(error){closed=true;controller.error(error);await cancelCall().catch(()=>{});response.socket?.destroy();response.destroy();await reader.cancel(error).catch(()=>{});reader.releaseLock()}finally{clearTimeout(timer)}},async cancel(reason){closed=true;await cancelCall().catch(()=>{});response.socket?.destroy();response.destroy();call.destroy();await reader.cancel(reason).catch(()=>{});reader.releaseLock()}},{highWaterMark:0});resolve(new Response(body,{status:response.statusCode??503,headers}))}catch(error){response.destroy();reject(error instanceof FileOperationError?error:new FileOperationError("unavailable",503,true))}});call.on("error",(error)=>{cancelCall().catch(()=>{});reject(error instanceof FileOperationError?error:new FileOperationError("unavailable",503,true))});call.on("timeout",()=>call.destroy(new Error("Files I/O stalled")));call.on("information",()=>call.setTimeout(30000));if(init.body instanceof ReadableStream){call.flushHeaders();const reader=sourceReader=init.body.getReader();const abort=()=>{reader.cancel(signal.reason).catch(()=>{})};signal.addEventListener("abort",abort,{once:true});call.once("close",abort);pumping=(async()=>{try{for(;;){const next=await reader.read();if(next.done)break;if(!(next.value instanceof Uint8Array))throw new FileOperationError("invalid_input",400);if(!isCurrent())throw new FileOperationError("unsupported_context",400);for(let offset=0;offset<next.value.byteLength;offset+=262144){if(call.destroyed)throw new Error("Files parent disconnected");await new Promise((done,fail2)=>{const closed=()=>fail2(new Error("Files parent disconnected"));call.once("close",closed);call.write(next.value.subarray(offset,offset+262144),(error)=>{call.removeListener("close",closed);error?fail2(error):done()})})}}call.end()}catch(error){call.destroy(error instanceof Error?error:new Error("Files transport failed"))}finally{await reader.cancel().catch(()=>{});signal.removeEventListener("abort",abort);call.removeListener("close",abort);reader.releaseLock()}})()}else call.end(init.body===undefined?undefined:Buffer.from(init.body))});try{return await result}finally{await pumping}};return{request,files,isCurrent,identity:`private:${socket}`}}function localRoutineRequest(environment=typeof __OS_BROWSER__!=="undefined"&&__OS_BROWSER__?{}:typeof process==="undefined"?{}:process.env){if(typeof __OS_BROWSER__==="undefined"||!__OS_BROWSER__){const{OS_ROUTINE_LOCAL:mode,OS_ROUTINE_LOCAL_SOCKET:socket,OS_ROUTINE_LOCAL_TOKEN:token}=environment;if(mode===undefined&&socket===undefined&&token===undefined)return;if(mode!=="1"||!socket||!token||!/^[0-9a-f]{64}$/.test(token))throw new Error("Preparation transport unavailable; nothing can publish");const tcp=/^tcp:\/\/127\.0\.0\.1:([1-9][0-9]{0,4})$/.exec(socket);const endpoint=tcp&&tcp[0]===socket&&Number(tcp[1])<=65535?{hostname:"127.0.0.1",port:Number(tcp[1])}:socket.startsWith("/")&&!socket.startsWith("//")&&!socket.includes("\x00")?{socketPath:socket}:undefined;if(!endpoint)throw new Error("Preparation transport unavailable; nothing can publish");return async(operation,input)=>{const{request}=await import("node:http");return await new Promise((resolve,reject)=>{const call=request({...endpoint,path:`/${operation}`,method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${token}`},timeout:operation==="ai/generate"?125000:120000},(response)=>{const limit=operation==="ai/generate"?ROUTINE_AI_RESULT_BYTES:33554432;const bytes=Buffer.alloc(limit);let size=0;response.on("data",(chunk)=>{size+=chunk.length;if(size>limit){response.destroy();reject(operation==="ai/generate"?new AIError("output_too_large"):new Error("Local result exceeds supported size"))}else bytes.set(chunk,size-chunk.length)});response.on("error",(error)=>reject(operation==="ai/generate"?new AIError("capability_unavailable"):error));response.on("end",()=>{try{const result=JSON.parse(bytes.subarray(0,size).toString());if(response.statusCode!==200){if(operation==="ai/generate")throw parseRoutineAIError(result.error);if(operation==="files/request"){const error=result.error;const status=response.statusCode??503;const codes=["invalid_input","unsupported_context","unauthenticated","access_denied","not_found","request_too_large","conflict","local_only","integrity","unavailable","capacity","method_not_allowed"];if(error?.code&&codes.includes(error.code))throw new FileOperationError(error.code,status,error.code==="capacity"||error.code==="unavailable",parseFileErrorDetail(error.detail));throw new FileOperationError("unavailable",503,true)}if(operation==="data/query"){throw dataTransportError(response.statusCode??0,result)}throw new Error(typeof result.error==="string"?result.error:"Preparation failed")}resolve(result)}catch(error){reject(operation==="ai/generate"&&!(error instanceof AIError)?new AIError("invalid_output"):error)}})});call.on("error",()=>reject(operation==="ai/generate"?new AIError("capability_unavailable"):operation==="data/query"?dataTransportError(503,{error:{code:"unavailable"}}):new Error("Preparation transport unavailable; nothing was published")));call.on("timeout",()=>call.destroy(new Error("Preparation timed out")));call.end(JSON.stringify(input))})}}}var installed;var ended=false;function routineTransport(){if(ended||installed&&!installed.isCurrent())throw new Error("Routine authority ended");return installed}var memberContext;var retainedContext;function installMemberContext(resolve,retained=resolve){memberContext=resolve;retainedContext=retained;return()=>{if(memberContext===resolve){memberContext=undefined;retainedContext=undefined}}}async function resolveAppContext(retained=false){const host=memberContext;if(!host)throw new Error("App context unavailable.");const context=await(retained?retainedContext:host)();if(host!==memberContext||!context.isCurrent()||context.expiresAt<=Date.now()||context.kind!=="local"&&(typeof context.accessToken!=="string"||!/^[^\s]{1,8192}$/.test(context.accessToken))){throw new Error("App context unavailable.")}return context}async function resolveDataContext(){try{if(typeof __OS_BROWSER__==="undefined"||!__OS_BROWSER__){const installed2=routineTransport();if(installed2)return{local:installed2.request};const local=localRoutineRequest();if(local)return{local};const managed=privateRoutineRequest();if(managed)return{local:managed.request}}const host=memberContext;if(host!==undefined){const context=await host();if(host!==memberContext||!context.isCurrent()||context.expiresAt<=Date.now())throw new Error;if(context.kind==="local")return{local:context.requestData};if(!context||!Number.isFinite(context.expiresAt)||context.expiresAt<=Date.now()||typeof context.accessToken!=="string"||!/^[^\s]{1,8192}$/.test(context.accessToken))throw new Error;return checked(context.workspace,context.endpoint,{authorization:`Bearer ${context.accessToken}`})}if(typeof __OS_BROWSER__==="undefined"||!__OS_BROWSER__){const environment=typeof process==="undefined"?undefined:process.env;if(!environment||!/^[0-9a-f]{64}$/.test(environment.OS_ROUTINE_RUN??""))throw new Error;return checked(environment.OS_ROUTINE_WORKSPACE,oddingtonOrigin(environment),{"x-os-run":environment.OS_ROUTINE_RUN})}throw new Error}catch{throw new DataOperationError("context_unavailable")}}async function resolveFilesContext(){try{const environment=typeof __OS_BROWSER__!=="undefined"&&__OS_BROWSER__?{}:typeof process==="undefined"?{}:process.env;if(typeof __OS_BROWSER__==="undefined"||!__OS_BROWSER__){const installed2=routineTransport();if(installed2)return{url:"private:installed",headers:{},isCurrent:installed2.isCurrent,local:installed2.request,localFiles:installed2.files,signal:undefined};const local=privateRoutineRequest(environment);if(local)return{url:local.identity,headers:{},isCurrent:local.isCurrent,local:local.request,localFiles:local.files,signal:undefined}}const host=memberContext;if(host){const context=await host();if(host!==memberContext||!context.isCurrent()||context.expiresAt<=Date.now())throw new Error;if(context.kind==="local")return{url:`private:app:${context.workspace}/${context.memberId}`,headers:{},isCurrent:context.isCurrent,signal:context.signal,local:undefined,localFiles:context.requestFiles};if(!Number.isFinite(context.expiresAt)||context.expiresAt<=Date.now()||typeof context.accessToken!=="string"||!/^[^\s]{1,8192}$/.test(context.accessToken))throw new Error;return{...filesContext(context.workspace,context.endpoint,{authorization:`Bearer ${context.accessToken}`}),isCurrent:context.isCurrent,local:undefined,localFiles:undefined,signal:undefined}}if(typeof __OS_BROWSER__==="undefined"||!__OS_BROWSER__){if(!/^[0-9a-f]{64}$/.test(environment.OS_ROUTINE_RUN??""))throw new Error;const workspace=environment.OS_ROUTINE_WORKSPACE;return{...filesContext(workspace,`https://${workspace}.oddington.ai`,{"x-os-run":environment.OS_ROUTINE_RUN}),local:undefined,localFiles:undefined,signal:undefined}}throw new Error}catch{throw new FileOperationError("unsupported_context",400)}}function filesContext(workspace,endpoint,headers){if(!workspace||!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(workspace)||workspace.length>63||["auth","www","api","os"].includes(workspace)||endpoint!==`https://${workspace}.oddington.ai`)throw new Error;return{url:`${endpoint}/api/files`,headers:{...headers,"x-os-workspace":workspace},isCurrent:()=>true}}function checked(workspace,endpoint,headers){if(!workspace||!/^[a-z0-9][a-z0-9-]{0,127}$/.test(workspace))throw new Error;const origin=new URL(endpoint);if(origin.protocol!=="https:"||origin.username||origin.password||origin.search||origin.hash||origin.pathname!=="/")throw new Error;return{url:`${origin.origin}/api/data`,headers:{...headers,"x-os-workspace":workspace}}}var invalid6=()=>{throw new DataOperationError("invalid_query")};var unavailable=()=>{throw new DataOperationError("unavailable")};var text2=(value)=>typeof value==="string"&&value.length>0;function capture4(value,ancestors=new Set,depth=0){if(value===null||typeof value==="string"||typeof value==="boolean"||typeof value==="number"&&Number.isFinite(value))return value;if(!value||typeof value!=="object"||ancestors.has(value)||depth>32)return invalid6();ancestors.add(value);try{if(Array.isArray(value))return historyArray(value).map((item)=>capture4(item,ancestors,depth+1));return Object.fromEntries(Object.entries(historyProperties(value)).map(([key,descriptor])=>[key,capture4(descriptor.value,ancestors,depth+1)]))}finally{ancestors.delete(value)}}function recordPagination(queryRecords){function pages(query){const captured=capture4(query);const names=Object.keys(historyProperties(captured));for(const name of names){const selection2=historyProperties(captured[name]);if(Object.hasOwn(selection2,"$")){const options=historyProperties(selection2.$.value);if(Object.hasOwn(options,"after"))return invalid6()}}return iterate();async function*iterate(){const state=new Map(names.map((name)=>[name,{seen:new Set,count:undefined,next:undefined}]));let active=names,version;do{const request=Object.fromEntries(active.map((name)=>{const selection2=captured[name];const next=state.get(name).next;return[name,next===undefined?selection2:{...selection2,$:{...selection2.$,after:next}}]}));const response=await queryRecords(request);let page;try{page=capture4(response);const keys2=Object.keys(historyProperties(page));if(keys2.length!==active.length+1||keys2.some((key)=>key!=="$meta"&&!active.includes(key)))unavailable();const meta=page.$meta;if(Object.keys(historyProperties(meta)).sort().join(",")!=="collections,version"||!text2(meta.version))unavailable();version=meta.version;const collectionKeys=Object.keys(historyProperties(meta.collections));if(collectionKeys.some((key)=>!active.includes(key)))unavailable();for(const name of active){const records=historyArray(page[name]);const metadata=Object.hasOwn(meta.collections,name)?meta.collections[name]:{};if(Object.keys(historyProperties(metadata)).some((key)=>key!=="count"&&key!=="next")||Object.hasOwn(metadata,"next")&&!text2(metadata.next))unavailable();for(const record2 of records){historyProperties(record2);const row=record2;if(!validRecordRef(row.$ref)||!text2(row.$version))unavailable()}const current=state.get(name);if(captured[name].$?.count===true){if(!Number.isSafeInteger(metadata.count)||metadata.count<0)unavailable();current.count=metadata.count}else if(Object.hasOwn(metadata,"count"))unavailable();if(metadata.next!==undefined){if(current.seen.has(metadata.next))unavailable();current.seen.add(metadata.next)}current.next=metadata.next}}catch{return unavailable()}const collections=Object.fromEntries(names.map((name)=>{const current=state.get(name);return[name,{...current.count===undefined?{}:{count:current.count},...current.next===undefined?{}:{next:current.next}}]}));const output=Object.fromEntries(names.map((name)=>[name,active.includes(name)?page[name]:[]]));active=active.filter((name)=>state.get(name).next!==undefined);yield{...output,$meta:{version,collections}}}while(active.length)}}return{pages}}var genericData={repository(repository){async function send(input){const context=await resolveDataContext();const envelope={repository,...input};const changing="operation"in input&&["changes.validate","changes.apply"].includes(String(input.operation));checkDataRequestSize(envelope,"local"in context&&changing?LOCAL_DATA_CHANGE_REQUEST_LIMIT:DATA_REQUEST_LIMIT);if("local"in context)return await context.local("data/query",envelope);try{const response=await fetch(context.url,{method:"POST",redirect:"error",cache:"no-store",headers:{"content-type":"application/json",...context.headers},body:JSON.stringify(envelope)});const result=await response.json();if(!response.ok){throw dataTransportError(response.status,result)}return result}catch(error){if(error instanceof DataOperationError)throw error;throw new DataOperationError("unavailable",true)}}async function read(input,options){const refs=captureRecordsReadRefs(typeof input==="string"?[input]:input);const captured=captureRecordsReadOptions(options);const result=await send({operation:"records.read",refs,...options===undefined?{}:{options:captured}});return typeof input==="string"?result.records[0]:result}const queryRecords=(query)=>send({operation:"records.query",query});return{collections:{list:()=>send({operation:"collections.list"}),schema:(name)=>send({operation:"collections.schema",name})},records:{read,query:queryRecords,...recordPagination(queryRecords),all:async(query,options)=>send({operation:"records.all",...captureRecordsAll(query,options)}),search:async(query,options)=>send({operation:"records.search",...captureRecordsSearchInput(query,options)})},history:{list:async(options)=>send({operation:"history.list",options:captureHistoryListOptions(options)}),at:async(instant)=>send({operation:"history.at",instant:captureHistoryInstant(instant)}),changes:async(options)=>send({operation:"history.changes",options:captureHistoryChangesOptions(options)})},changes(){let updates=[],creates=[],deletes=[],applyId;let pending,confirmed;const assertMutable=()=>{if(applyId)throw new DataOperationError("invalid_change",false,"unapplied")};const snapshot=(nextUpdates=updates,nextCreates=creates,nextDeletes=deletes)=>{const{updates:updates2,creates:creates2,deletes:deletes2}=captureDataChanges(nextUpdates,nextCreates,nextDeletes);const input={updates:updates2,...creates2.length?{creates:creates2}:{},...deletes2.length?{deletes:deletes2}:{}};checkDataRequestSize({repository,operation:"changes.apply",...input,applyId:applyId??"00000000-0000-4000-8000-000000000000"},LOCAL_DATA_CHANGE_REQUEST_LIMIT);return input};return{create(record2){assertMutable();const next=[...creates,captureDataCreate(record2)];snapshot(updates,next,deletes);creates=next},update(record2,set){assertMutable();const next=[...updates,captureDataUpdate(record2,set)];snapshot(next,creates,deletes);updates=next},delete(record2){assertMutable();const next=[...deletes,captureDataDelete(record2)];snapshot(updates,creates,next);deletes=next},async validate(){await send({operation:"changes.validate",...snapshot()})},apply(){if(confirmed)return Promise.resolve(structuredClone(confirmed));if(!pending){let captured;try{captured=snapshot()}catch(error){return Promise.reject(error)}applyId??=routineTransport()?.key("data")??crypto.randomUUID();pending=send({operation:"changes.apply",...captured,applyId}).then((result)=>{confirmed=structuredClone(result);return result}).catch((error)=>{if(error instanceof DataOperationError)throw explainDataValidation(new DataOperationError(error.code,error.retryable,error.effect??(["unavailable","apply_pending"].includes(error.code)?"uncertain":"unapplied"),error.component,error.detail),error.message,error.detail);throw new DataOperationError("unavailable",true,"uncertain")}).finally(()=>{pending=undefined})}return pending.then((result)=>structuredClone(result))}}}}}};var data=genericData;async function hostedContent(url,init,parent,upstream=fetch,check=async()=>{},failure){const delivery=new AbortController;const abort=()=>delivery.abort(parent.reason);parent.addEventListener("abort",abort,{once:true});if(parent.aborted)abort();const detach=()=>parent.removeEventListener("abort",abort);try{const response=await upstream(url,{...init,signal:delivery.signal});try{await check();if(delivery.signal.aborted)throw failure?.()??new FileOperationError("unavailable",503,true)}catch(error){response.body?.cancel().catch(()=>{});throw error}if(!response.body){detach();return response}const source=response.body;let reader;let settled=false;let output;const cancel=async(reason)=>{if(settled)return;settled=true;detach();delivery.signal.removeEventListener("abort",stop);delivery.abort(reason);try{await(reader?reader.cancel(reason):source.cancel(reason))}catch(error){if(error!==delivery.signal.reason&&!(error instanceof Error&&error.name==="AbortError"))throw error}finally{reader?.releaseLock()}};const stop=()=>{if(settled)return;const error=failure?.()??delivery.signal.reason;cancel(error).catch(()=>{});output.error(error)};const body=new ReadableStream({start(controller){output=controller;delivery.signal.addEventListener("abort",stop,{once:true});if(delivery.signal.aborted)stop()},async pull(controller){try{await check();if(settled)return;reader??=source.getReader();const{done,value}=await reader.read();await check();if(settled)return;if(done){settled=true;detach();delivery.signal.removeEventListener("abort",stop);reader.releaseLock();controller.close()}else controller.enqueue(value)}catch(error){if(settled)return;controller.error(failure?.()??error);await cancel(error).catch(()=>{})}},cancel},{highWaterMark:0});const wrapped=new Response(body,{status:response.status,statusText:response.statusText,headers:response.headers});for(const key of["url","redirected","type"])Object.defineProperty(wrapped,key,{value:response[key]});return wrapped}catch(error){detach();delivery.abort(error);throw error}}var MAX_BYTES=16*1024*1024;var PART_BYTES=8*1024*1024;var METADATA_BYTES=4096;var RESULT_BYTES=16*1024;var CONTROL_RESULT_BYTES=128*1024;var TIMEOUT_MS=30000;var MAX_ACTIVE=4;var ATTEMPTS=2;var active=0;var waiters=[];var invalid7=()=>new FileOperationError("invalid_input",400);var unavailable2=()=>new FileOperationError("unavailable",503,true);var failures={400:["invalid_input","unsupported_context"],401:["unauthenticated"],403:["access_denied"],404:["not_found"],405:["method_not_allowed"],409:["conflict","local_only"],413:["request_too_large"],429:["capacity"],503:["integrity","unavailable"]};function heldSlot(){let held=true;return()=>{if(!held)return;held=false;for(;;){const waiter=waiters.shift();if(!waiter){active--;return}if(!waiter.waiting)continue;waiter.waiting=false;waiter.signal?.removeEventListener("abort",waiter.abort);waiter.resolve(heldSlot());return}}}async function acquireSlot(signal){if(signal?.aborted)throw unavailable2();if(active<MAX_ACTIVE){active++;return heldSlot()}return new Promise((resolve,reject)=>{const waiter={signal,waiting:true,resolve,reject,abort(){if(!waiter.waiting)return;waiter.waiting=false;const index=waiters.indexOf(waiter);if(index!==-1)waiters.splice(index,1);reject(unavailable2())}};waiters.push(waiter);signal?.addEventListener("abort",waiter.abort,{once:true});if(signal?.aborted)waiter.abort()})}async function boundedBytes(stream,limit,signal){if(!stream)return new Uint8Array;const reader=stream.getReader();const bytes=new Uint8Array(limit);let size=0;const cancel=()=>{reader.cancel().catch(()=>{})};signal?.addEventListener("abort",cancel,{once:true});if(signal?.aborted)cancel();try{for(;;){const{done,value}=await reader.read();if(signal?.aborted)throw unavailable2();if(done)break;if(!(value instanceof Uint8Array))throw new FileOperationError("invalid_input",400,false,{reason:"invalid_bytes"});size+=value.byteLength;if(size>limit)throw new FileOperationError("request_too_large",413,false,{reason:"size_limit",limitBytes:limit,receivedBytes:size,receivedAtLeast:true});bytes.set(value,size-value.byteLength)}}catch(error){cancel();throw error}finally{signal?.removeEventListener("abort",cancel);reader.releaseLock()}return bytes.slice(0,size)}async function timed(work,parent,timeout=TIMEOUT_MS){const controller=new AbortController;let timer;let abort;const expiry=new Promise((_,reject)=>{abort=()=>{controller.abort();reject(unavailable2())};timer=setTimeout(abort,timeout);parent?.addEventListener("abort",abort,{once:true});if(parent?.aborted)abort()});try{return await Promise.race([work(controller.signal),expiry])}finally{clearTimeout(timer);parent?.removeEventListener("abort",abort)}}async function result(response,maximum=RESULT_BYTES){try{const bytes=await boundedBytes(response.body,maximum);return JSON.parse(new TextDecoder("utf-8",{fatal:true}).decode(bytes))}catch{throw unavailable2()}}async function send(suffix,init,descriptor,initial,parent){const original=initial;const checkCurrent=(context=original)=>{if(parent?.aborted)throw unavailable2();if(!original.isCurrent()||context.url!==original.url)throw new FileOperationError("unsupported_context",400)};for(let attempt=0;attempt<ATTEMPTS;attempt++){checkCurrent();const context=await resolveFilesContext();checkCurrent(context);try{const response=context.localFiles?await context.localFiles(suffix,init,parent):await(async()=>{const url=`${context.url}${suffix}`;const request={...init,signal:parent,headers:{...context.headers,...init.headers},redirect:"error",cache:"no-store"};return descriptor?fetch(url,request):hostedContent(url,request,parent)})();if(!response.ok){const value2=await result(response);const error=value2&&typeof value2==="object"&&"error"in value2?value2.error:undefined;const received=error&&typeof error==="object"&&"code"in error?error.code:undefined;const code=failures[response.status]?.find((code2)=>code2===received);throw code?new FileOperationError(code,response.status,code==="capacity"||code==="unavailable",parseFileErrorDetail(error?.detail)):unavailable2()}if(response.status!==200){response.body?.cancel().catch(()=>{});throw unavailable2()}try{checkCurrent()}catch(error){response.body?.cancel().catch(()=>{});throw error}if(!descriptor)return response;const value=await result(response,descriptor==="control"?CONTROL_RESULT_BYTES:RESULT_BYTES);if(descriptor==="control"){checkCurrent();return value}let parsed;if(descriptor==="enrichment"){if(!value||typeof value!=="object"||Array.isArray(value))throw unavailable2();const{name,...metadata}=value;if(!safeEnrichmentName(name))throw unavailable2();parsed={name,...parseEnrichmentDescriptor(metadata)}}else parsed=parseFileDescriptor(value);checkCurrent();return parsed}catch(error){const failure=error instanceof FileOperationError?error:unavailable2();if(init.body instanceof ReadableStream||!failure.retryable||attempt+1===ATTEMPTS)throw failure}}throw unavailable2()}function idPath(id2){if(typeof id2!=="string"||!FILE_ID_PATTERN.test(id2))throw invalid7();return`/${id2}`}async function multipartCreate(input,metadata,exchange,release,upload,expectedSha256){const route=upload?`${idPath(upload.file.id)}/upload/multipart`:"/multipart";let ticket;let reader;let chunk,offset=0;const receipts=[];const pending=new Set;const request=(work,timeout=TIMEOUT_MS)=>timed((signal)=>{const task=work(signal);pending.add(task);task.then(()=>pending.delete(task),()=>pending.delete(task));return task},undefined,timeout);const control=(body)=>({method:"POST",headers:{"content-type":"application/json",...ticket?{"x-os-transfer":ticket}:{}},body:JSON.stringify(body)});try{const startRequest=control(upload?.file??metadata);if(expectedSha256)startRequest.headers["x-os-original-sha256"]=expectedSha256;const start=await request((signal)=>exchange(`${route}/start`,startRequest,"control",signal));if(!start||typeof start!=="object"||Array.isArray(start))throw unavailable2();const session=start;if(Object.keys(session).sort().join(",")!=="partBytes,ticket"||session.partBytes!==PART_BYTES||typeof session.ticket!=="string"||!session.ticket||session.ticket.length>64*1024)throw unavailable2();ticket=session.ticket;if(input.file instanceof ReadableStream)reader=input.file.getReader();let lastProgress=Date.now();const next=async()=>{try{if(Date.now()-lastProgress>=TIMEOUT_MS)throw unavailable2();const value=await request(()=>reader.read(),Math.max(1,TIMEOUT_MS-(Date.now()-lastProgress)));if(value.value?.byteLength)lastProgress=Date.now();return value}catch(error){await reader.cancel(error).catch(()=>{});throw error}};for(let sent=0,partNumber=1;sent<metadata.size||metadata.size===0&&partNumber===1;partNumber++){const length=Math.min(PART_BYTES,metadata.size-sent);let part;if(input.file instanceof Uint8Array)part=new Uint8Array(input.file.subarray(sent,sent+length));else if(input.file instanceof Blob){const slice=input.file.slice(sent,sent+length);part=new Uint8Array(await request(()=>slice.arrayBuffer()))}else{part=new Uint8Array(length);let filled=0;while(filled<length){if(!chunk||offset===chunk.byteLength){chunk=undefined;offset=0;const value2=await next();if(value2.done)throw invalid7();if(!(value2.value instanceof Uint8Array))throw invalid7();chunk=value2.value;if(chunk.byteLength>metadata.size-sent-filled)throw invalid7()}const take=Math.min(length-filled,chunk.byteLength-offset);part.set(chunk.subarray(offset,offset+take),filled);filled+=take;offset+=take;if(offset===chunk.byteLength){chunk=undefined;offset=0}}}if(part.byteLength!==length)throw invalid7();if(reader&&sent+length===metadata.size){lastProgress=Date.now();for(;;){const value2=await next();if(value2.done)break;if(!(value2.value instanceof Uint8Array)||value2.value.byteLength)throw invalid7()}}const value=await request((signal)=>exchange(`${route}/part`,{method:"POST",headers:{"content-type":"application/octet-stream","x-os-transfer":ticket,"x-os-part":String(partNumber)},body:part.buffer},"control",signal));part=undefined;const receipt=value;if(!receipt||typeof receipt!=="object"||Object.keys(receipt).sort().join(",")!=="etag,partNumber"||receipt.partNumber!==partNumber||typeof receipt.etag!=="string"||!receipt.etag||receipt.etag.length>256||/[\u0000-\u001f\u007f]/.test(receipt.etag))throw unavailable2();receipts.push({partNumber,etag:receipt.etag});sent+=length;lastProgress=Date.now()}if(upload)for(const name of Object.keys(upload.file.enrichments)){const bytes=await request(()=>upload.enrichment(name));if(bytes.byteLength!==upload.file.enrichments[name].size||bytes.byteLength>MAX_BYTES)throw invalid7();await request((signal)=>exchange(`${route}/enrichments/${encodeURIComponent(name)}`,{method:"POST",headers:{"content-type":"application/octet-stream","x-os-transfer":ticket},body:bytes.buffer.slice(bytes.byteOffset,bytes.byteOffset+bytes.byteLength)},"control",signal))}await upload?.beforeComplete();const completion=control({parts:receipts});if(new TextEncoder().encode(completion.body).byteLength>128*1024)throw unavailable2();const completed=parseFileDescriptor(await request((signal)=>exchange(`${route}/complete`,completion,true,signal),TIMEOUT_MS+Math.ceil(metadata.size/(1024*1024))*1000));if(!upload){const acknowledged=await request((signal)=>exchange(`${route}/acknowledge`,control(completed),"control",signal));if(!acknowledged||typeof acknowledged!=="object"||Object.keys(acknowledged).join(",")!=="acknowledged"||acknowledged.acknowledged!==true)throw unavailable2()}return completed}catch(error){if(reader)await reader.cancel(error).catch(()=>{});if(ticket)await request((signal)=>exchange(`${route}/abort`,control({}),"control",signal)).catch(()=>{});throw error instanceof FileOperationError?error:unavailable2()}finally{chunk=undefined;reader?.releaseLock();if(pending.size)Promise.allSettled([...pending]).then(release);else release()}}async function operation(work,initial,parent){const context=initial??await resolveFilesContext();const signal=context.signal&&parent?AbortSignal.any([context.signal,parent]):context.signal??parent;const release=await acquireSlot(signal);const execute=async(signal2)=>{try{return await work(context,signal2)}finally{release()}};if(context.localFiles)return execute(signal??new AbortController().signal);return timed(execute,signal).catch((error)=>{throw error instanceof FileOperationError?error:unavailable2()})}function contentPath(id2,name){const path=idPath(id2);if(name===undefined)return`${path}/content`;if(!safeEnrichmentName(name))throw invalid7();return`${path}/enrichments/${encodeURIComponent(name)}/content`}async function read(id2,names){const context=await resolveFilesContext();idPath(id2);if(names===undefined||typeof names==="string"){const path=contentPath(id2,names);return operation((context2,signal)=>send(path,{method:"GET"},false,context2,signal),context)}if(!Array.isArray(names))throw invalid7();const distinct=[];const seen=new Set;for(const name of names){if(typeof name!=="string"||!safeEnrichmentName(name))throw invalid7();if(seen.has(name))continue;if(seen.size===16)throw invalid7();seen.add(name);distinct.push(name)}const paths=distinct.map((name)=>contentPath(id2,name));return timed(async(parent)=>{const responses={};try{for(let i=0;i<paths.length;i++){const response=await operation((context2,signal)=>send(paths[i],{method:"GET"},false,context2,signal),context,parent);Object.defineProperty(responses,distinct[i],{value:response,enumerable:true})}if(!context.isCurrent())throw new FileOperationError("unsupported_context",400);return responses}catch(error){for(const response of Object.values(responses))response.body?.cancel().catch(()=>{});throw error}})}var files={async upload(id2){return operation(async(context,signal)=>{const file2=await send(`${idPath(id2)}/upload`,{method:"POST"},true,context,signal);if(file2.id!==id2)throw unavailable2();return file2})},async create(input,options){const context=await resolveFilesContext();if(!input||typeof input!=="object"||Array.isArray(input)||Object.keys(input).some((key)=>!["file","size","path","name","storage","mediaType"].includes(key))||options!==undefined&&(!options||typeof options!=="object"||Array.isArray(options)||Object.keys(options).some((key)=>key!=="requestKey")))throw invalid7();const blob=input.file instanceof Blob;const array2=input.file instanceof Uint8Array;const stream=input.file instanceof ReadableStream;if(!blob&&!array2&&!stream)throw invalid7();const intrinsic=blob?input.file.size:array2?input.file.byteLength:undefined;if(intrinsic!==undefined&&input.size!==undefined&&input.size!==intrinsic){if(!Number.isSafeInteger(input.size)||input.size<0)throw new FileOperationError("invalid_input",400,false,{reason:"invalid_size"});throw new FileOperationError("invalid_input",400,false,{reason:"size_mismatch",expectedBytes:input.size,receivedBytes:intrinsic})}let name=input.name;if(name===undefined&&blob&&"name"in input.file&&typeof input.file.name==="string"){name=typeof globalThis.File!=="undefined"&&input.file instanceof globalThis.File?input.file.name:input.file.name.split(/[\\/]/).at(-1)}const mediaType=declaredOriginalMediaType(input.mediaType===undefined?blob&&input.file.type?input.file.type:"application/octet-stream":input.mediaType);const metadata=parseFileCreateMetadata({name,size:intrinsic??input.size,path:input.path,storage:input.storage,mediaType,requestKey:options?.requestKey===undefined?routineTransport()?.key("files")??crypto.randomUUID():options.requestKey},FILE_ORIGINAL_MAX_BYTES);if(!context.local&&!context.localFiles&&metadata.storage==="local")throw new FileOperationError("unsupported_context",400);const header=encodeURIComponent(JSON.stringify(metadata));if(new TextEncoder().encode(header).byteLength>METADATA_BYTES)throw invalid7();const release=await acquireSlot(context.signal);if(context.localFiles&&!routineTransport()&&metadata.size>MAX_BYTES){try{const signal=context.signal??new AbortController().signal;const file2=input.file;let offset=0;const body=file2 instanceof Blob?context.signal?file2:file2.stream():file2 instanceof ReadableStream?file2:new ReadableStream({pull(controller){if(offset===file2.byteLength){controller.close();return}const end=Math.min(offset+256*1024,file2.byteLength);controller.enqueue(file2.subarray(offset,end));offset=end}},{highWaterMark:0});return await send("",{method:"POST",headers:{"content-type":"application/octet-stream","x-os-file":header},body},true,context,signal)}finally{release()}}if(metadata.size>MAX_BYTES)return multipartCreate(input,metadata,(suffix,init,kind,signal)=>kind===true?send(suffix,init,true,context,signal):send(suffix,init,"control",context,signal),release);return timed(async(signal)=>{try{const bytes=array2?new Uint8Array(input.file):await boundedBytes(blob?input.file.stream():input.file,metadata.size,signal);if(bytes.byteLength!==metadata.size)throw new FileOperationError("invalid_input",400,false,{reason:"size_mismatch",expectedBytes:metadata.size,receivedBytes:bytes.byteLength});if(signal.aborted)throw unavailable2();return await send("",{method:"POST",headers:{"content-type":"application/octet-stream","x-os-file":header},body:bytes.buffer},true,context,signal)}finally{release()}},context.signal).catch((error)=>{throw error instanceof FileOperationError?error:unavailable2()})},async enrich(input){const context=await resolveFilesContext();if(!input||typeof input!=="object"||Array.isArray(input)||Object.keys(input).some((key)=>!["file","name","content","mediaType","replace"].includes(key))||typeof input.content!=="string"&&!(input.content instanceof Uint8Array))throw invalid7();const path=`${idPath(input.file)}/enrichments`;if(typeof input.content==="string"?input.content.length>MAX_BYTES:input.content.byteLength>MAX_BYTES)throw new FileOperationError("request_too_large",413);return operation(async(context2,signal)=>{let bytes;if(typeof input.content==="string"){const buffer=new Uint8Array(Math.min(MAX_BYTES,input.content.length*3));const encoded=new TextEncoder().encodeInto(input.content,buffer);if(encoded.read!==input.content.length)throw new FileOperationError("request_too_large",413);bytes=buffer.slice(0,encoded.written)}else bytes=new Uint8Array(input.content);const metadata=parseFileEnrichMetadata({name:input.name,size:bytes.byteLength,...input.mediaType===undefined?{}:{mediaType:input.mediaType},...input.replace===undefined?{}:{replace:input.replace}},MAX_BYTES);const header=encodeURIComponent(JSON.stringify(metadata));if(new TextEncoder().encode(header).byteLength>METADATA_BYTES)throw invalid7();const result2=await send(path,{method:"POST",headers:{"content-type":"application/octet-stream","x-os-enrichment":header},body:bytes.buffer},"enrichment",context2,signal);if(result2.name!==metadata.name)throw unavailable2();return result2},context)},async get(id2){return operation((context,signal)=>send(idPath(id2),{method:"GET"},true,context,signal))},read};var ROUTINE_CONNECTION_CREDENTIALS_ENV="OS_ROUTINE_CONNECTION_CREDENTIALS";function parseRoutineConnectionNames(value){if(!Array.isArray(value)||value.some((name)=>typeof name!=="string"||!/^(gmail|airtable|dropbox|outlook|sharepoint)\/[a-z0-9][a-z0-9-]{0,62}$/.test(name))||new Set(value).size!==value.length)throw new Error("Invalid routine connections");return value}var connectionUuid=(v)=>typeof v==="string"&&/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(v);function runtimeConnection(lease){switch(lease.provider){case"outlook":return{id:`outlook/${lease.name}`,provider:lease.provider,name:lease.name,mailboxEmail:lease.mailboxEmail,accessToken:lease.accessToken,expiresAt:lease.expiresAt};case"sharepoint":return{id:`sharepoint/${lease.name}`,provider:lease.provider,name:lease.name,siteId:lease.siteId,siteUrl:lease.siteUrl,accessToken:lease.accessToken,expiresAt:lease.expiresAt};case"gmail":return{id:`gmail/${lease.name}`,provider:lease.provider,name:lease.name,accountEmail:lease.accountEmail,scopes:[...lease.scopes],accessToken:lease.accessToken,expiresAt:lease.expiresAt};case"airtable":return{id:`airtable/${lease.name}`,provider:lease.provider,name:lease.name,baseId:lease.baseId,accessToken:lease.accessToken,runExpiresAt:lease.runExpiresAt};case"dropbox":return{id:`dropbox/${lease.name}`,provider:lease.provider,name:lease.name,accountId:lease.accountId,access:lease.access,rootPath:lease.rootPath,scopes:[...lease.scopes],accessToken:lease.accessToken,expiresAt:lease.expiresAt}}}function parseConnectionLease(raw,now=Date.now()){const v=raw;if(!v||typeof v!=="object"||Array.isArray(v)||!connectionUuid(v.connectionId)||!connectionUuid(v.runId)||typeof v.name!=="string"||!/^[a-z0-9][a-z0-9-]{0,62}$/.test(v.name)||typeof v.accessToken!=="string"||!/^[A-Za-z0-9._~+/-]{1,8192}={0,2}$/.test(v.accessToken))throw new Error("Invalid connection credential");if(v.provider==="outlook"||v.provider==="sharepoint"){const targetValid=v.provider==="outlook"?Object.keys(v).sort().join(",")==="accessToken,connectionId,expiresAt,mailboxEmail,name,provider,runId"&&validMicrosoftMailbox(v.mailboxEmail):Object.keys(v).sort().join(",")==="accessToken,connectionId,expiresAt,name,provider,runId,siteId,siteUrl"&&typeof v.siteUrl==="string"&&canonicalSharePointSiteUrl(v.siteUrl)===v.siteUrl&&validSharePointSiteId(v.siteId,v.siteUrl);if(!targetValid||typeof v.expiresAt!=="string"||!Number.isFinite(Date.parse(v.expiresAt))||Date.parse(v.expiresAt)<=now||Date.parse(v.expiresAt)>now+3600000)throw new Error("Invalid connection credential");return v}if(v.provider==="gmail"){if(Object.keys(v).sort().join(",")!=="accessToken,accountEmail,connectionId,expiresAt,name,provider,runId,scopes"||typeof v.accountEmail!=="string"||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v.accountEmail)||!validGoogleScopes(v.scopes)||typeof v.expiresAt!=="string"||!Number.isFinite(Date.parse(v.expiresAt))||Date.parse(v.expiresAt)<=now||Date.parse(v.expiresAt)>now+3600000)throw new Error("Invalid connection credential");return v}if(v.provider==="airtable"&&Object.keys(v).sort().join(",")==="accessToken,baseId,connectionId,name,provider,runExpiresAt,runId"&&typeof v.baseId==="string"&&/^app[A-Za-z0-9]+$/.test(v.baseId)&&typeof v.runExpiresAt==="string"&&Number.isFinite(Date.parse(v.runExpiresAt))&&Date.parse(v.runExpiresAt)>now&&Date.parse(v.runExpiresAt)<=now+15*60000)return v;if(v.provider==="dropbox"&&Object.keys(v).sort().join(",")==="access,accessToken,accountId,connectionId,expiresAt,name,provider,rootPath,runId,scopes"&&typeof v.accountId==="string"&&/^dbid:[A-Za-z0-9_-]{1,128}$/.test(v.accountId)&&v.access==="full_dropbox"&&validDropboxRootPath(v.rootPath)&&validDropboxFileScopes(v.scopes)&&typeof v.expiresAt==="string"&&Number.isFinite(Date.parse(v.expiresAt))&&Date.parse(v.expiresAt)>now&&Date.parse(v.expiresAt)<=now+14400000)return v;throw new Error("Invalid connection credential")}class AirtableOperationError extends Error{effect;receipts;constructor(message,effect="unapplied",receipts=[]){super(message);this.effect=effect;this.receipts=receipts;this.name="AirtableOperationError"}}var recordId=(v)=>typeof v==="string"&&/^rec[A-Za-z0-9]+$/.test(v);var tableId=(v)=>typeof v==="string"&&/^tbl[A-Za-z0-9]+$/.test(v);function fail2(message){throw new AirtableOperationError(message)}function object3(v){if(!v||typeof v!=="object"||Array.isArray(v)||![null,Object.prototype].includes(Object.getPrototypeOf(v)))fail2("Invalid Airtable data");return v}function keys2(v,allowed,required=allowed){if(Object.keys(v).some((k)=>!allowed.includes(k))||required.some((k)=>!Object.hasOwn(v,k)))fail2("Invalid Airtable input")}function text3(v){return typeof v==="string"&&v.length>0&&v.length<=1024}function fields3(v,nonempty=false){const result2=object3(v);if(nonempty&&!Object.keys(result2).length||Object.keys(result2).some((k)=>!text3(k)))fail2("Invalid Airtable fields");try{return serializable(result2)}catch{return fail2("Invalid Airtable fields")}}function record2(v){const r=object3(v);if(!recordId(r.id)||r.createdTime!==undefined&&(typeof r.createdTime!=="string"||!Number.isFinite(Date.parse(r.createdTime))))fail2("Malformed Airtable record");return{id:r.id,...r.createdTime===undefined?{}:{createdTime:r.createdTime},fields:fields3(r.fields)}}function equal(a,b){if(a===b)return true;if(!a||!b||typeof a!=="object"||typeof b!=="object"||Array.isArray(a)!==Array.isArray(b))return false;const left=Object.keys(a),right=Object.keys(b);return left.length===right.length&&left.every((k)=>Object.hasOwn(b,k)&&equal(a[k],b[k]))}function createConnections(transport){return{async get(){throw new Error("Connection unavailable")},airtable(name){if(typeof name!=="string"||!/^[a-z0-9][a-z0-9-]{0,62}$/.test(name))fail2("Invalid Airtable connection name");const call=(operation2,input)=>transport(name,operation2,input);return{tables:{list:async()=>await call("tables.list",{})},records:{list:async(input)=>await call("records.list",input),get:async(input)=>await call("records.get",input),create:async(input)=>await call("records.create",input),update:async(input)=>await call("records.update",input),delete:async(input)=>await call("records.delete",input)}}}}}async function executeAirtableOperation(authority,operation2,raw,options={}){const{name,baseId,accessToken}=authority;if(!/^[a-z0-9][a-z0-9-]{0,62}$/.test(name)||!/^app[A-Za-z0-9]+$/.test(baseId)||!/^[A-Za-z0-9._~+/-]{1,8192}={0,2}$/.test(accessToken))fail2("Airtable connection unavailable");let input;try{input=object3(serializable(raw))}catch{return fail2("Invalid Airtable input")}const mutation=["records.create","records.update","records.delete"].includes(operation2);const receipt=(ids2)=>({provider:"airtable",connection:`airtable/${name}`,baseId,table:input.table,operation:operation2.slice(8),records:ids2.map((id2)=>({id:id2}))});async function request(path2,init={},write=false){let response;try{response=await(options.fetch??fetch)(`https://api.airtable.com/v0/${path2}`,{...init,headers:{authorization:`Bearer ${accessToken}`,"content-type":"application/json"},redirect:"manual",signal:options.signal?AbortSignal.any([options.signal,AbortSignal.timeout(15000)]):AbortSignal.timeout(15000)})}catch{throw new AirtableOperationError("Airtable request acknowledgment unavailable",write?"uncertain":"unapplied")}if(!response.ok){await response.body?.cancel().catch(()=>{});throw new AirtableOperationError("Airtable request rejected",write&&(response.status>=500||response.status===408||response.status<400)?"uncertain":"unapplied")}try{if(!response.headers.get("content-type")?.toLowerCase().includes("application/json"))throw new Error;const value=object3(await response.json());const safe=serializable(value);if(Object.hasOwn(value,"error")||JSON.stringify(safe).includes(accessToken))throw new Error;return value}catch{throw new AirtableOperationError("Malformed Airtable acknowledgment",write?"uncertain":"unapplied")}}if(operation2==="tables.list"){keys2(input,[]);const tables=[],seen=new Set;let offset;do{const query2=new URLSearchParams(offset?{offset}:{});const page=await request(`meta/bases/${baseId}/tables?${query2}`);if(!Array.isArray(page.tables))fail2("Malformed Airtable tables");for(const value of page.tables){const t=object3(value);if(!tableId(t.id)||!text3(t.name)||!text3(t.primaryFieldId)||!Array.isArray(t.fields)||tables.some((existing)=>existing.id===t.id))fail2("Malformed Airtable table");const metadata=t.fields.map((value2)=>{const f=object3(value2);if(typeof f.id!=="string"||!/^fld[A-Za-z0-9]+$/.test(f.id)||!text3(f.name)||!text3(f.type))fail2("Malformed Airtable field");return{id:f.id,name:f.name,type:f.type,...f.options===undefined?{}:{options:serializable(f.options)}}});if(!metadata.some((f)=>f.id===t.primaryFieldId)||new Set(metadata.map((f)=>f.id)).size!==metadata.length)fail2("Malformed Airtable fields");tables.push({id:t.id,name:t.name,primaryFieldId:t.primaryFieldId,fields:metadata})}offset=nextOffset(page.offset,seen)}while(offset);return tables}if(!text3(input.table)||input.table==="."||input.table==="..")fail2("Invalid Airtable table");if(mutation&&!tableId(input.table))fail2("Airtable writes require a stable table ID");const path=`${baseId}/${encodeURIComponent(input.table)}`;if(operation2==="records.get"){keys2(input,["table","id"]);if(!recordId(input.id))fail2("Invalid Airtable record ID");const result3=record2(await request(`${path}/${input.id}`));if(result3.id!==input.id)fail2("Malformed Airtable record");return result3}if(operation2==="records.list"){keys2(input,["table","fields"],["table"]);if(input.fields!==undefined&&(!Array.isArray(input.fields)||!input.fields.length||input.fields.some((f)=>!text3(f))||new Set(input.fields).size!==input.fields.length))fail2("Invalid Airtable field selection");const records2=[],ids2=new Set,seen=new Set;let offset;do{const query2=new URLSearchParams;for(const field of input.fields??[])query2.append("fields[]",field);if(offset)query2.set("offset",offset);const page=await request(`${path}?${query2}`);if(!Array.isArray(page.records))fail2("Malformed Airtable records");for(const value of page.records){const r=record2(value);if(ids2.has(r.id))fail2("Malformed Airtable pagination");ids2.add(r.id);records2.push(r)}offset=nextOffset(page.offset,seen)}while(offset);return records2}if(!mutation)fail2("Unsupported Airtable operation");keys2(input,["table","records"]);if(!Array.isArray(input.records)||!input.records.length||input.records.length>10)fail2("Invalid Airtable batch");const kind=operation2.slice(8),ids=new Set;const records=input.records.map((value)=>{const r=object3(value);keys2(r,kind==="create"?["fields"]:kind==="update"?["id","expected","set"]:["id","expected"]);if(kind==="create")return{fields:fields3(r.fields,true)};if(!recordId(r.id)||ids.has(r.id))fail2("Invalid Airtable batch record ID");ids.add(r.id);const set=kind==="update"?fields3(r.set,true):undefined;if(set&&Object.values(set).some((value2)=>value2===null))fail2("Airtable guard null cannot be an update value");return{id:r.id,expected:fields3(r.expected),...set?{set}:{}}});for(const r of records){if(!("id"in r))continue;const current=record2(await request(`${path}/${r.id}`));if(current.id!==r.id)fail2("Malformed Airtable record");for(const[key,value]of Object.entries(r.expected)){if(value===null?Object.hasOwn(current.fields,key):!Object.hasOwn(current.fields,key)||!equal(current.fields[key],value))fail2("Airtable reviewed values are stale")}}await options.beforeMutation?.();const query=new URLSearchParams;if(kind==="delete")for(const id2 of ids)query.append("records[]",id2);const result2=await request(`${path}${kind==="delete"?`?${query}`:""}`,{method:kind==="create"?"POST":kind==="update"?"PATCH":"DELETE",...kind==="delete"?{}:{body:JSON.stringify({records:records.map((r)=>("id"in r)?{id:r.id,fields:r.set}:r)})}},true);const acknowledged=[],returned=[];try{if(!Array.isArray(result2.records))throw new Error;for(const value of result2.records){const r=object3(value);if(!recordId(r.id)||acknowledged.includes(r.id)||kind!=="create"&&!ids.has(r.id)||kind==="delete"&&r.deleted!==true)throw new Error;acknowledged.push(r.id);if(kind!=="delete")returned.push(record2(r))}if(acknowledged.length!==records.length)throw new Error}catch{throw new AirtableOperationError("Incomplete Airtable mutation acknowledgment",acknowledged.length?"partial":"uncertain",acknowledged.length?[receipt(acknowledged)]:[])}return{receipt:receipt(acknowledged),...kind==="delete"?{}:{records:returned}}}function nextOffset(value,seen){if(value===undefined)return;if(!text3(value)||seen.has(value))fail2("Malformed Airtable pagination");seen.add(value);return value}var MANAGED_CONNECTION_CAPABILITY_ENV="OS_MANAGED_CONNECTION_CAPABILITY";function managedConnections(capability){const endpoint=new URL(capability.endpoint);if(endpoint.protocol!=="http:"||endpoint.hostname!=="127.0.0.1"||!endpoint.port||endpoint.pathname!=="/"||endpoint.search||endpoint.hash||endpoint.username||endpoint.password||!/^[0-9a-f-]{36}$/.test(capability.token))throw new AirtableOperationError("Airtable capability unavailable");const transport=async(name,operation2,input)=>{let safeInput;try{safeInput=serializable(input)}catch{safeInput=null}try{const response=await fetch(new URL("airtable",endpoint),{method:"POST",redirect:"error",headers:{authorization:`Bearer ${capability.token}`,"content-type":"application/json"},body:JSON.stringify({name,operation:operation2,input:safeInput}),signal:AbortSignal.timeout(125000)});const value=await response.json();if(!response.ok)throw new AirtableOperationError("Airtable operation failed; the execution retains its evidence",value.effect==="partial"||value.effect==="uncertain"?value.effect:"unapplied",value.receipts??[]);return value}catch(error){if(error instanceof AirtableOperationError)throw error;throw new AirtableOperationError("Airtable parent acknowledgment unavailable",["records.create","records.update","records.delete"].includes(operation2)?"uncertain":"unapplied")}};return createConnections(transport)}var observer;function observeLocalRoutineEffects(value){observer=value}async function reportLocalRoutineEffect(value){await observer?.(value)}var identityPattern=/^(gmail|airtable|dropbox|outlook|sharepoint)\/([a-z0-9][a-z0-9-]{0,62})$/;var workspacePattern=/^[a-z0-9][a-z0-9-]{0,62}$/;var providerNames={gmail:"Gmail",airtable:"Airtable",dropbox:"Dropbox",outlook:"Outlook",sharepoint:"SharePoint"};function parseConnectionFailureDetail(value){if(!value||typeof value!=="object"||Array.isArray(value))throw new Error("Invalid Connection failure");const detail=value;if(!["identity","identity,workspace"].includes(Object.keys(detail).sort().join(","))||typeof detail.identity!=="string"||!identityPattern.test(detail.identity)||detail.workspace!==undefined&&(typeof detail.workspace!=="string"||!workspacePattern.test(detail.workspace)))throw new Error("Invalid Connection failure");return{identity:detail.identity,...detail.workspace===undefined?{}:{workspace:detail.workspace}}}function connectionFailureMessage(value){const detail=parseConnectionFailureDetail(value);const[,provider,name]=identityPattern.exec(detail.identity);const first=`Couldn’t use ${providerNames[provider]??provider} connection ${name}.`;return detail.workspace?`${first}
|
|
36
|
+
Check the file’s stored media type before retrying. The model was not called.`}switch(code){case"access_denied":return"This routine doesn’t currently have permission to use AI.";case"capability_unavailable":return"AI is unavailable in this execution environment.";case"invalid_input":return"The AI request is invalid. Check its input, instructions and schema.";case"unsupported_file":return"AI couldn’t read this file in the requested format.";case"file_unavailable":return"AI couldn’t read or verify the file.";case"input_too_large":return"The AI input exceeds the size limit for this execution path.";case"output_too_large":return"The AI response exceeds the size limit for this execution path.";case"provider_failure":return"AI couldn’t complete the request. No more specific reason was recorded.";case"invalid_output":return"AI returned an answer OS could not accept.";case"cancelled":return"The AI operation was stopped before it completed."}}var ROUTINE_AI_VALUE_BYTES=256*1024;var ROUTINE_AI_RESULT_BYTES=6*ROUTINE_AI_VALUE_BYTES+1024;var ROUTINE_AI_EVIDENCE_BYTES=4*1024;var ROUTINE_AI_ERROR_CODES=["access_denied","capability_unavailable","invalid_input","unsupported_file","file_unavailable","input_too_large","output_too_large","provider_failure","invalid_output","cancelled"];class AIError extends Error{code;detail;constructor(code,options={}){const detail=parseRoutineAIErrorDetail(code,options.detail);super(routineAIErrorMessage(code,detail));this.code=code;this.name="AIError";if(detail)this.detail=Object.freeze(detail);if(code==="invalid_output"&&typeof options.text==="string"&&new TextEncoder().encode(options.text).byteLength<=ROUTINE_AI_VALUE_BYTES)Object.defineProperty(this,"text",{value:options.text})}}function parseRoutineAIError(value){try{const v=capture(value,"invalid_output","output_too_large",ROUTINE_AI_RESULT_BYTES);assertRoutineFields(v,["code","detail","text"]);if(!ROUTINE_AI_ERROR_CODES.includes(v.code))throw new Error;const detail=parseRoutineAIErrorDetail(v.code,v.detail);if(Object.hasOwn(v,"detail")&&!detail||Object.hasOwn(v,"text")&&(typeof v.text!=="string"||new TextEncoder().encode(v.text).byteLength>ROUTINE_AI_VALUE_BYTES)||v.code!=="invalid_output"&&Object.hasOwn(v,"text"))throw new Error;return new AIError(v.code,{detail,...v.text===undefined?{}:{text:v.text}})}catch{throw new AIError("invalid_output")}}function capture(value,invalid3,oversized,limit=ROUTINE_AI_VALUE_BYTES){try{assertRoutineJson(value);const encoded=JSON.stringify(value);if(new TextEncoder().encode(encoded).byteLength>limit)throw new AIError(oversized);return freezeRoutineMetadata(JSON.parse(encoded))}catch(error){if(error instanceof AIError)throw error;throw new AIError(invalid3)}}function parseRoutineAIRequest(value){const v=capture(value,"invalid_input","input_too_large");try{assertRoutineFields(v,v.kind==="generateObject"?["kind","instructions","input","schema","tools"]:["kind","instructions","input","tools"]);if(!["generateText","generateObject"].includes(v.kind)||typeof v.instructions!=="string"||!v.instructions.trim())throw new Error;const input=typeof v.input==="string"?v.input:parseFileDescriptor(v.input);if(Object.hasOwn(v,"tools")&&typeof v.tools!=="boolean")throw new AIError("invalid_input",{detail:{reason:"invalid_tools"}});if(v.tools===true&&typeof input==="string")throw new AIError("invalid_input",{detail:{reason:"tools_require_file"}});const tools=v.tools===true?{tools:true}:{};if(v.kind==="generateText")return freezeRoutineMetadata({kind:v.kind,instructions:v.instructions,input,...tools});const schema=parseAppRoutineContract({routine:"ai",input:v.schema,steps:[{id:"generate"}]}).input;return freezeRoutineMetadata({kind:v.kind,instructions:v.instructions,input,schema,...tools})}catch(error){if(error instanceof AIError)throw error;throw new AIError("invalid_input")}}function parseRoutineAIResult(request,value){let v;try{v=capture(value,"invalid_output","output_too_large",request.kind==="generateText"?ROUTINE_AI_RESULT_BYTES:ROUTINE_AI_VALUE_BYTES);assertRoutineFields(v,request.kind==="generateText"?["text"]:["object"]);if(request.kind==="generateText"){if(typeof v.text!=="string")throw new Error;return acceptText(request,v.text)}if(!Object.hasOwn(v,"object"))throw new Error}catch(error){if(error instanceof AIError)throw error;throw new AIError("invalid_output",{detail:{reason:"invalid_response"}})}validateObject(request.schema,v.object);return freezeRoutineMetadata({object:v.object})}function validateObject(schema,object3,text2){let detail={reason:"invalid_response"};try{validateRoutineSchemaValue(schema,object3,(issue)=>{detail=issue})}catch{throw new AIError("invalid_output",{...text2===undefined?{}:{text:text2},detail})}}function acceptText(request,text2){if(new TextEncoder().encode(text2).byteLength>ROUTINE_AI_VALUE_BYTES)throw new AIError("output_too_large");if(request.kind==="generateText"){if(!text2.trim())throw new AIError("invalid_output",{text:text2,detail:{reason:"empty_text"}});return freezeRoutineMetadata({text:text2})}let object3;const trimmed=text2.trim();const fenced=/^(`{3,}|~{3,})(?:json)?[ \t]*\r?\n([\s\S]*?)\r?\n\1[ \t]*$/i.exec(trimmed);try{object3=JSON.parse(fenced?fenced[2]:text2)}catch{throw new AIError("invalid_output",{text:text2,detail:{reason:"invalid_json"}})}validateObject(request.schema,object3,text2);return capture({object:object3},"invalid_output","output_too_large")}var ROUTINE_STEP_SUMMARY_BYTES=256*1024;var ROUTINE_STEP_OUTPUT_BYTES=1024*1024;function parseRoutineStepOutputDetail(value){const invalid3=()=>{throw new AppRoutineContractError("invalid_value")};assertRoutineFields(value,["step","sizeBytes","limitBytes","summaryBytes","dataBytes"]);const{step,sizeBytes,limitBytes,summaryBytes,dataBytes}=value;if(!isAppRoutineName(step)||![sizeBytes,limitBytes,summaryBytes,dataBytes].every((bytes)=>Number.isSafeInteger(bytes)&&bytes>0)||sizeBytes!==summaryBytes+dataBytes||limitBytes!==(summaryBytes>ROUTINE_STEP_SUMMARY_BYTES?ROUTINE_STEP_SUMMARY_BYTES:ROUTINE_STEP_OUTPUT_BYTES)||(limitBytes===ROUTINE_STEP_SUMMARY_BYTES?summaryBytes:sizeBytes)<=limitBytes)return invalid3();return freezeRoutineMetadata({step,sizeBytes,limitBytes,summaryBytes,dataBytes})}function routineStepOutputMessage(value){const detail=parseRoutineStepOutputDetail(value);const size=`${(detail.sizeBytes/(1024*1024)).toFixed(1)} MB`;const bound=detail.limitBytes===ROUTINE_STEP_SUMMARY_BYTES?`, including ${(detail.summaryBytes/1024).toFixed(1)} KB of summary. Each step's summary can return up to 256 KB.`:". Each step can return up to 1 MB across its summary and data.";return`Step ${detail.step} returned ${size} of output${bound} Return fewer fields or process a smaller batch, then try again.`}class RoutineStepOutputError extends Error{code="step_output_too_large";detail;constructor(detail){const captured=parseRoutineStepOutputDetail(detail);super(routineStepOutputMessage(captured));this.detail=captured;Object.freeze(this)}}function captureRoutineStepOutput(step,summary,data){assertRoutineJson(summary);assertRoutineJson(data);const summaryJson=JSON.stringify(summary),dataJson=JSON.stringify(data);const summaryBytes=new TextEncoder().encode(summaryJson).byteLength;const dataBytes=new TextEncoder().encode(dataJson).byteLength;const sizeBytes=summaryBytes+dataBytes;const limitBytes=summaryBytes>ROUTINE_STEP_SUMMARY_BYTES?ROUTINE_STEP_SUMMARY_BYTES:ROUTINE_STEP_OUTPUT_BYTES;if(summaryBytes>ROUTINE_STEP_SUMMARY_BYTES||sizeBytes>ROUTINE_STEP_OUTPUT_BYTES)throw new RoutineStepOutputError({step,sizeBytes,limitBytes,summaryBytes,dataBytes});return freezeRoutineMetadata({summary:JSON.parse(summaryJson),data:JSON.parse(dataJson)})}function captureRetainedStepOutput(step,value){const hasSummary=Object.hasOwn(value,"summary"),hasData=Object.hasOwn(value,"data");if(hasSummary&&hasData)return captureRoutineStepOutput(step,value.summary,value.data);for(const key of["summary","data"])if(Object.hasOwn(value,key)){assertRoutineJson(value[key]);const bytes=new TextEncoder().encode(JSON.stringify(value[key])).byteLength;if(bytes>(key==="summary"?ROUTINE_STEP_SUMMARY_BYTES:ROUTINE_STEP_OUTPUT_BYTES))throw new AppRoutineContractError("invalid_value")}return freezeRoutineMetadata(JSON.parse(JSON.stringify(value)))}var LIMIT=256*1024;var invalid3=()=>{throw new AppRoutineContractError("invalid_value")};var invalidContract3=()=>{throw new AppRoutineContractError("invalid_contract")};var empty={type:"object",properties:{},required:[],additionalProperties:false};function captureJson(value,maximum=LIMIT){assertRoutineJson(value);const encoded=JSON.stringify(value);if(maximum!==null&&new TextEncoder().encode(encoded).byteLength>maximum)return invalid3();return freezeRoutineMetadata(JSON.parse(encoded))}function capture2(schema,value){const captured=captureJson(value);validateRoutineSchemaValue(schema,captured);return captured}var schemas=new WeakMap;function nestedSchema(value){const metadata=schemaMetadata(value);if(Object.hasOwn(metadata,"default"))return invalidContract3();return metadata.schema}function schemaMetadata(value){if(!value||typeof value!=="object")return invalidContract3();const registered=schemas.get(value);if(registered)return registered;try{assertRoutineJson(value)}catch{return invalidContract3()}return{schema:parseAppRoutineContract({routine:"definition",input:value,steps:[{id:"inspect"}]}).input}}function declaration(value,defaults){try{assertRoutineJson(value)}catch{return invalidContract3()}const parsed=freezeRoutineMetadata(parseAppRoutineContract({routine:"definition",input:value,steps:[{id:"inspect"}]}).input);const captured=defaults?capture2(parsed,defaults.value):undefined;const builder=Object.defineProperty({...parsed},"default",{value:(value2)=>declaration(parsed,{value:value2})});schemas.set(builder,{schema:parsed,...defaults?{default:captured}:{}});return Object.freeze(builder)}var schema={object(properties){return declaration({type:"object",properties:Object.fromEntries(Object.entries(properties).map(([key,value])=>[key,nestedSchema(value)])),required:Object.keys(properties),additionalProperties:false})},array(items,options={}){assertRoutineFields(options,["maxItems"]);return declaration({type:"array",items:nestedSchema(items),...options})},string(options={}){return declaration({type:"string",...options})},integer(options={}){return declaration({type:"integer",...options})},number(options={}){return declaration({type:"number",...options})},boolean(){return declaration({type:"boolean"})}};var file=(options={})=>{assertRoutineFields(options,["storage","path"]);return declaration({type:"file",...options})};var definitions=new WeakMap;var defineRoutine=(definition)=>{assertRoutineFields(definition,["id","title","input","steps","result","access","responses","run"]);if(!isAppRoutineName(definition.id)||definition.title!==undefined&&!routineTitle(definition.title)||typeof definition.run!=="function")return invalidContract3();const input=definition.input===undefined?{schema:empty,default:{}}:schemaMetadata(definition.input);const result=definition.result===undefined?undefined:schemaMetadata(definition.result).schema;const access=parseRoutineAccess(definition.access);assertRoutineFields(definition.steps??{});const executable=Object.fromEntries(Object.entries(definition.steps??{}).map(([id2,step])=>{assertRoutineFields(step,["title","run"]);if(!routineTitle(step.title)||typeof step.run!=="function")return invalidContract3();return[id2,Object.freeze({title:step.title,run:step.run})]}));const steps=Object.entries(executable).map(([id2,step])=>({id:id2,title:step.title}));parseAppRoutineContract({routine:definition.id,input:input.schema,steps:steps.length?steps.map(({id:id2})=>({id:id2})):[{id:"inspect"}],...result?{result}:{}});const responses=[];const ids=new Set;if(definition.responses!==undefined){if(!Array.isArray(definition.responses)||definition.responses.length>64||Reflect.ownKeys(definition.responses).length!==definition.responses.length+1)return invalidContract3();for(let index=0;index<definition.responses.length;index++){const descriptor=Object.getOwnPropertyDescriptor(definition.responses,String(index));if(!descriptor||!Object.hasOwn(descriptor,"value"))return invalidContract3();const response=descriptor.value;assertRoutineFields(response,["id","results","run"]);if(!isAppRoutineName(response.id)||ids.has(response.id))return invalidContract3();ids.add(response.id);if(response.results!==undefined){try{assertRoutineJson(response.results)}catch{return invalidContract3()}}try{responses.push(defineHandler(response))}catch{return invalidContract3()}}}const contract=freezeRoutineMetadata({id:definition.id,...definition.title===undefined?{}:{title:definition.title},input:input.schema,...Object.hasOwn(input,"default")?{inputDefault:input.default}:{},access,responses:responses.map(({id:id2})=>({id:id2})),steps,...result?{result}:{}});const captured=Object.freeze({...definition,access,steps:Object.freeze(executable),responses:Object.freeze(responses),...definition.input===undefined?{}:{input:declaration(input.schema,Object.hasOwn(input,"default")?{value:input.default}:undefined)},...result===undefined?{}:{result:declaration(result)},run:(input2,os)=>executeRoutineDefinition(captured,input2,os)});definitions.set(captured,{contract,steps:executable,run:definition.run});return captured};function inspectRoutineDefinition(definition){if(!definition||typeof definition!=="object")return invalidContract3();const registered=definitions.get(definition);if(!registered)return invalidContract3();return registered.contract}function captureRoutineInput(definition,input){const contract=inspectRoutineDefinition(definition);return capture2(contract.input,input===undefined&&Object.hasOwn(contract,"inputDefault")?contract.inputDefault:input)}async function executeRoutineDefinition(definition,input,runtime){const captured=captureRoutineInput(definition,input);const{contract,steps,run}=definitions.get(definition);let active=true,accepting=true,broken=false;let outputFailure;let work=Promise.resolve();const aiWork=new Set;const generate=(kind,value)=>{const operation=(async()=>{if(!active||broken||contract.access.ai!==true)throw new AIError("access_denied");if(!runtime.ai)throw new AIError("capability_unavailable");let request;try{assertRoutineFields(value,kind==="generateObject"?["instructions","input","schema","tools"]:["instructions","input","tools"]);request=parseRoutineAIRequest({kind,instructions:value.instructions,input:value.input,...kind==="generateObject"?{schema:schemaMetadata(value.schema).schema}:{},...value.tools===undefined?{}:{tools:value.tools}})}catch(error){if(error instanceof AIError)throw error;throw new AIError("invalid_input")}const result2=await runtime.ai[kind](request);if(!active||broken)throw new AIError("access_denied");return parseRoutineAIResult(request,result2)})();aiWork.add(operation);operation.then(()=>aiWork.delete(operation),()=>aiWork.delete(operation));return operation};const called=new Set;const reached=new Set;const guarded=(value,receiver)=>typeof value==="function"?(...args)=>{if(!active||broken)throw new Error("Run authority ended");return guarded(Reflect.apply(value,receiver,args))}:value&&typeof value==="object"&&!(value instanceof Promise)?new Proxy({...value},{get(_target,key){return guarded(Reflect.get(value,key,value),value)}}):value;const validateHandlers=(value)=>{for(const question2 of value.questions??[])if(question2.handler&&!contract.responses.some((handler)=>handler.id===question2.handler.id))return invalid3();return value};let activeStep;const progress=new Map;const os=Object.freeze({...guarded({...runtime,run:freezeRoutineMetadata({id:runtime.run.id,async progress(value){assertRoutineFields(value,["completed","total"]);const{completed,total}=value;const prior=activeStep?progress.get(activeStep):undefined;if(!active||broken||!activeStep||!Number.isSafeInteger(completed)||!Number.isSafeInteger(total)||completed<1||completed>total||prior&&(prior.total!==total||completed<=prior.completed))return invalid3();const accepted=freezeRoutineMetadata({step:activeStep,completed,total});await runtime.run.progress(accepted);progress.set(activeStep,accepted)}}),ai:{generateText:(value)=>generate("generateText",value),generateObject:(value)=>generate("generateObject",value)},connections:{...runtime.connections,get:async(identity)=>{if(!active||broken||!contract.access.connections?.includes(identity))throw new Error("Connection unavailable");const value=await runtime.connections.get(identity);if(!active||broken)throw new Error("Run authority ended");return value}},inbox:{...runtime.inbox,publishAsk:(value,options)=>runtime.inbox.publishAsk(validateHandlers(value),options)}}),step(id2,...input2){let saved;try{if(!active||!accepting||broken||!Object.hasOwn(steps,id2)||called.has(id2)||input2.length>1)return invalid3();if(input2.length)saved=captureJson(input2[0],null);called.add(id2)}catch(error){broken=true;return Promise.reject(error)}const next=work.then(async()=>{if(broken)return invalid3();reached.add(id2);try{await runtime.step(id2,{status:"running"});activeStep=id2;const output=await steps[id2].run(saved,os);assertRoutineFields(output,["summary","data"]);if(!Object.hasOwn(output,"summary")||!Object.hasOwn(output,"data"))return invalid3();const{summary,data}=captureRoutineStepOutput(id2,output.summary,output.data);await runtime.step(id2,{status:"completed",summary,data});activeStep=undefined;return freezeRoutineMetadata({summary,data})}catch(error){if(error instanceof RoutineStepOutputError)outputFailure??=error;broken=true;activeStep=undefined;await runtime.step(id2,{status:"failed"});throw error}});work=next.then(()=>{},()=>{broken=true});return next}});let result,failure;try{result=await run(captured,os)}catch(error){failure=error;broken=true}accepting=false;await work;while(aiWork.size)await Promise.allSettled([...aiWork]);active=false;try{for(const step of contract.steps)if(!reached.has(step.id))await runtime.step(step.id,{status:"skipped"})}catch(error){throw outputFailure??error}if(broken)throw outputFailure??failure??new AppRoutineContractError("invalid_value");if(contract.result!==undefined)return capture2(contract.result,result);if(result!==undefined)return invalid3();return}var RECORD_READ_INPUT_LIMIT=1024*1024;var RECORD_CAPTURE_OUTPUT_LIMIT=25*1024*1024;function validRecordRef(value){return typeof value==="string"&&value.length<=512&&/^[_a-zA-Z0-9][a-zA-Z0-9_-]*(\/[_a-zA-Z0-9][a-zA-Z0-9_-]*)+$/.test(value)}var fieldProblems=["unknown","missing","invalid","source_schema"];var reasons={unknown:"unknown_field",missing:"missing_field",invalid:"invalid_value",source_schema:"source_schema_mismatch"};var expectationKinds={string:"a string",integer:"a safe integer",number:"a finite number",boolean:"a boolean",date:"a date in YYYY-MM-DD format",const:"the constant declared in the schema",datetime:"a UTC date and time in YYYY-MM-DDTHH:mm:ss.sssZ format, for example 2026-09-15T14:30:00.000Z",enum:"one of the choices declared in the schema",link:"a link to an existing record of an allowed type",object:"an object matching the schema",map:"a map matching the schema"};function expectationText(expected){if(!Object.hasOwn(expectationKinds,expected.type)||typeof expected.many!=="boolean"||typeof expected.nullable!=="boolean"||expected.decimalPlaces!==undefined&&(expected.type!=="number"||!Number.isInteger(expected.decimalPlaces)||expected.decimalPlaces<0||expected.decimalPlaces>6)||expected.format!==undefined&&(expected.type!=="date"||expected.format!=="month"))return;const scalar=expected.type==="number"&&expected.decimalPlaces!==undefined?`a finite number with at most ${expected.decimalPlaces} decimal places`:expected.type==="date"&&expected.format==="month"?"a date in YYYY-MM format":expectationKinds[expected.type];return`${expected.many?"Expected a list. Each item must be":"Expected"} ${scalar}.${expected.nullable?" The field may also be null.":""}`}function parseExpectation(text2){if(!text2)return;const parts=/^Expected (a list\. Each item must be )?(.+?)\.( The field may also be null\.)?$/.exec(text2);if(!parts)return;const number=/^a finite number with at most ([0-6]) decimal places$/.exec(parts[2]);const month=parts[2]==="a date in YYYY-MM format";const kind=number?"number":month?"date":Object.keys(expectationKinds).find((kind2)=>expectationKinds[kind2]===parts[2]);if(!kind)return;const expected={type:kind,many:!!parts[1],nullable:!!parts[3],...number?{decimalPlaces:Number(number[1])}:{},...month?{format:"month"}:{}};return expectationText(expected)===text2?expected:undefined}function parseDataValidationDetail(value){if(!value||typeof value!=="object"||Array.isArray(value))return;const v=value;if(Object.keys(v).some((key)=>!["record","field","reason","schemaFile","expected"].includes(key))||typeof v.record!=="string"||typeof v.field!=="string")return;const problem=fieldProblems.find((problem2)=>reasons[problem2]===v.reason);if(!problem||v.schemaFile!==undefined&&typeof v.schemaFile!=="string")return;let expected;if(Object.hasOwn(v,"expected")){if(!v.expected||typeof v.expected!=="object"||Array.isArray(v.expected))return;const e=v.expected;if(Object.keys(e).some((key)=>!["type","many","nullable","decimalPlaces","format"].includes(key)))return;expected={...e};if(!expectationText(expected))return}if(problem==="unknown"&&expected||problem==="source_schema"&&(v.field!=="media_type"||expected?.type!=="string"||expected.many||expected.nullable))return;if(!recordFieldMessage(v.record,v.field,problem,v.schemaFile,expected))return;return{record:v.record,field:v.field,reason:reasons[problem],...typeof v.schemaFile==="string"?{schemaFile:v.schemaFile}:{},...expected?{expected}:{}}}function recordFieldMessage(record2,field,problem,schemaPath,expected){if(!validRecordRef(record2)||!/^[a-zA-Z][a-zA-Z0-9_-]{0,127}$/.test(field))return;if(schemaPath!==undefined&&(schemaPath.length>256||!/^[a-zA-Z0-9_.-]+(?:\/[a-zA-Z0-9_.-]+)*\/_schema\.yaml$/.test(schemaPath)||schemaPath.split("/").some((part)=>[".","..",".git","routines"].includes(part))))return;const prefix=`Record "${record2}" isn't valid.`;const schema2=schemaPath?`"${schemaPath}"`:"the collection schema";if(problem==="source_schema")return field==="media_type"?`${prefix} This repository's Source schema${schemaPath?` ${schema2}`:""} doesn't include "media_type". The OS SDK uses "media_type" for file Sources. Update the Source schema in this repository to include this field.`:undefined;if(problem==="unknown")return`${prefix} The record contains "${field}", but ${schema2} doesn't define that field. Check that the record and ${schemaPath?"that file":"the collection schema"} use the same field name.`;if(problem==="missing")return`${prefix} The record is missing required field "${field}". Add it as defined in ${schema2}.`;const expectation=expected?expectationText(expected):undefined;if(expected&&!expectation)return;return`${prefix} The record has an invalid value for field "${field}".${expectation?` ${expectation}`:""} Check its definition in ${schema2}.`}function safeRecordFieldMessage(value){if(typeof value!=="string"||value.length>1200)return;const parts=/^Record "([^"]+)" isn't valid\. (.+)$/.exec(value);if(!parts)return;const schemaPath=/"([^"]+\/_schema\.yaml)"/.exec(value)?.[1];const field=[...parts[2].matchAll(/"([^"]+)"/g)].map((match)=>match[1]).find((part)=>part!==schemaPath);if(!field)return;const expected=parseExpectation(/\. (Expected .+) Check its definition in /.exec(value)?.[1]);return fieldProblems.map((problem)=>recordFieldMessage(parts[1],field,problem,schemaPath,expected)).find((message)=>message===value)}function dataValidationMessageFacts(error){if(error.code==="invalid_change"){const detail=parseDataValidationDetail(error.detail);if(detail){const problem=fieldProblems.find((problem2)=>reasons[problem2]===detail.reason);return{detail,message:recordFieldMessage(detail.record,detail.field,problem,detail.schemaFile,detail.expected)}}}const message=error.code==="invalid_change"?safeRecordFieldMessage(error.message):undefined;return message?{message}:{}}function explainDataValidation(error,message,detail){Object.assign(error,dataValidationMessageFacts({code:error.code,message:typeof message==="string"?message:"",detail}));return error}var localDataPath=(value,repository)=>typeof value==="string"&&value.length<=1024&&value.startsWith(`${repository}/`)&&!value.includes("\\")&&!/[\x00-\x1f\x7f]/.test(value)&&value.split("/").every((part)=>!!part&&part!=="."&&part!=="..");var localDataFile=(value,repository)=>{if(!value||typeof value!=="object"||Array.isArray(value))return false;const row=value;return Object.keys(row).sort().join(",")==="action,path"&&["created","updated","deleted"].includes(String(row.action))&&localDataPath(row.path,repository)};function parseDataFailureDetail(value){const invalid4=()=>{throw new Error("Invalid local Data failure detail")};if(!value||typeof value!=="object"||Array.isArray(value))return invalid4();const row=value;if(Object.keys(row).sort().join(",")!=="cause,code,files,nextAction,operation,repository"||!["local_data_read_failed","local_data_write_failed","local_data_write_partial"].includes(String(row.code))||!["read","write"].includes(String(row.operation))||typeof row.repository!=="string"||!/^[a-z0-9][a-z0-9._/-]{0,127}$/.test(row.repository)||row.repository.includes("//")||row.repository.includes("..")||!["fix_failed_file_then_rerun","review_resolve_then_rerun"].includes(String(row.nextAction)))return invalid4();const repository=row.repository;if(!row.cause||typeof row.cause!=="object"||Array.isArray(row.cause))return invalid4();const cause=row.cause;if(!["code,message","code,message,path"].includes(Object.keys(cause).sort().join(","))||!["schema_validation_failed","invalid_record","unsafe_record","stale_record","path_conflict","filesystem_unavailable"].includes(String(cause.code))||typeof cause.message!=="string"||!cause.message||cause.message.length>512||/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/.test(cause.message)||cause.path!==undefined&&!localDataPath(cause.path,repository))return invalid4();if(!row.files||typeof row.files!=="object"||Array.isArray(row.files))return invalid4();const files=row.files;if(Object.keys(files).some((key)=>!["state","saved","failed","notAttempted","savedOmitted","notAttemptedOmitted"].includes(key))||!["none","partial"].includes(String(files.state))||!Array.isArray(files.saved)||files.saved.length>128||!files.saved.every((item)=>localDataFile(item,repository))||files.failed!==undefined&&!localDataFile(files.failed,repository)||!Array.isArray(files.notAttempted)||files.notAttempted.length>128||!files.notAttempted.every((item)=>localDataFile(item,repository)))return invalid4();for(const key of["savedOmitted","notAttemptedOmitted"])if(files[key]!==undefined&&(!Number.isSafeInteger(files[key])||Number(files[key])<1||Number(files[key])>1e4))return invalid4();if(row.operation==="read"&&(row.code!=="local_data_read_failed"||files.state!=="none"||files.saved.length||files.failed!==undefined||files.notAttempted.length)||row.operation==="write"&&row.code==="local_data_read_failed"||row.code==="local_data_write_partial"&&(files.state!=="partial"||!files.saved.length)||row.code!=="local_data_write_partial"&&files.state==="partial")return invalid4();return structuredClone(value)}function parseDataOperationDetail(value){const validation=parseDataValidationDetail(value);if(validation)return validation;if(value&&typeof value==="object"&&!Array.isArray(value)&&value.code==="record_limit_exceeded"){const row=value;if(Object.keys(row).sort().join(",")!=="code,collections,maxRecords"||!Number.isSafeInteger(row.maxRecords)||Number(row.maxRecords)<1||!Array.isArray(row.collections)||!row.collections.length||row.collections.length>16||!row.collections.every((name)=>typeof name==="string"&&name.length<=512&&/^[_a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(name))||new Set(row.collections).size!==row.collections.length)throw new Error("Invalid Data operation detail");return structuredClone(value)}return parseDataFailureDetail(value)}function dataRecordLimitMessage(detail){const scope=detail.collections.length===1?` from ${detail.collections[0]}`:` across ${detail.collections.join(", ")}`;return`The routine tried to load more than ${detail.maxRecords.toLocaleString("en-US")} matching Records${scope}. `+"Narrow the query or increase maxRecords."}class DataOperationError extends Error{code;retryable;effect;component;detail;constructor(code,retryable=false,effect,component,detail){const parsed=detail===undefined?undefined:parseDataOperationDetail(detail);if(parsed&&("reason"in parsed?code!=="invalid_change":parsed.code==="record_limit_exceeded"&&code!=="capacity"))throw new Error("Invalid Data operation detail");super(code==="capacity"&&parsed&&"code"in parsed&&parsed.code==="record_limit_exceeded"?dataRecordLimitMessage(parsed):`Data operation failed: ${code}`);this.code=code;this.retryable=retryable;this.effect=effect;this.component=component;this.detail=detail;this.name="DataOperationError";if(parsed!==undefined)this.detail=parsed}}var invalid4=()=>{throw new DataOperationError("invalid_query")};var dataText=(value)=>typeof value==="string"&&!/[\u0000\uD800-\uDFFF]/u.test(value);function dataProperties(value){if(!value||typeof value!=="object"||Array.isArray(value)||![Object.prototype,null].includes(Object.getPrototypeOf(value)))return invalid4();const descriptors=Object.getOwnPropertyDescriptors(value);if(Reflect.ownKeys(value).some((key)=>typeof key!=="string"||!descriptors[key]?.enumerable||!Object.hasOwn(descriptors[key],"value")))return invalid4();return descriptors}function dataArray(value){if(!Array.isArray(value)||Object.getPrototypeOf(value)!==Array.prototype)return invalid4();const descriptors=Object.getOwnPropertyDescriptors(value);if(Reflect.ownKeys(value).length!==value.length+1)return invalid4();const result=[];for(let index=0;index<value.length;index++){const descriptor=descriptors[index];if(!descriptor?.enumerable||!Object.hasOwn(descriptor,"value"))return invalid4();result.push(descriptor.value)}return result}var invalid5=()=>{throw new DataOperationError("invalid_query")};function captureRecordsSearchInput(query,options){if(!dataText(query))return invalid5();const length=[...query.trim()].length;if(length<1||length>256)return invalid5();if(options===undefined)return{query};const descriptors=dataProperties(options);if(Object.keys(descriptors).some((key)=>!["collections","limit"].includes(key)))return invalid5();const captured={};if(Object.hasOwn(descriptors,"collections")){const supplied=descriptors.collections.value;if(!Array.isArray(supplied)||supplied.length<1||supplied.length>16||Reflect.ownKeys(supplied).length!==supplied.length+1)return invalid5();const collections=[];for(let index=0;index<supplied.length;index++){const descriptor=Object.getOwnPropertyDescriptor(supplied,String(index));if(!descriptor?.enumerable||!Object.hasOwn(descriptor,"value")||!dataText(descriptor.value))return invalid5();collections.push(descriptor.value)}if(new Set(collections).size!==collections.length)return invalid5();captured.collections=collections}if(Object.hasOwn(descriptors,"limit")){const supplied=descriptors.limit.value;if(!Number.isInteger(supplied)||supplied<1||supplied>100)return invalid5();captured.limit=supplied}return{query,options:captured}}function captureRecordsReadRefs(value){if(!Array.isArray(value)||value.length<1||value.length>100)throw new DataOperationError("invalid_query");const refs=dataArray(value);if(!refs.every((ref)=>validRecordRef(ref)&&!/[\r\n]/.test(ref))||new Set(refs).size!==refs.length)throw new DataOperationError("invalid_query");return refs}function captureRecordsReadOptions(value){if(value===undefined)return{};try{dataProperties(value)}catch{throw new DataOperationError("invalid_query")}if(!value||typeof value!=="object"||Array.isArray(value)||![Object.prototype,null].includes(Object.getPrototypeOf(value))||Reflect.ownKeys(value).some((key)=>key!=="body")||Object.hasOwn(value,"body")&&value.body!==true)throw new DataOperationError("invalid_query");return Object.hasOwn(value,"body")?{body:true}:{}}function capture3(value,ancestors=new Set,depth=0){if(value===null||typeof value==="string"||typeof value==="boolean"||typeof value==="number"&&Number.isFinite(value))return value;if(!value||typeof value!=="object"||ancestors.has(value)||depth>32)throw new DataOperationError("invalid_query");ancestors.add(value);try{if(Array.isArray(value))return dataArray(value).map((item)=>capture3(item,ancestors,depth+1));return Object.fromEntries(Object.entries(dataProperties(value)).map(([key,descriptor])=>[key,capture3(descriptor.value,ancestors,depth+1)]))}finally{ancestors.delete(value)}}function captureRecordsAll(query,options){const invalid6=()=>{throw new DataOperationError("invalid_query")};try{const properties=dataProperties(options),maxRecords=properties.maxRecords?.value;if(Object.keys(properties).join(",")!=="maxRecords"||!Number.isSafeInteger(maxRecords)||maxRecords<1)return invalid6();const detached=capture3(query);const selections=dataProperties(detached);if(Object.keys(selections).length<1||Object.keys(selections).length>16)return invalid6();for(const selection2 of Object.values(selections)){const fields3=dataProperties(selection2.value);if(fields3.$&&Object.hasOwn(dataProperties(fields3.$.value),"after"))return invalid6()}return{query:detached,maxRecords}}catch{return invalid6()}}function validRecordBody(value){return typeof value==="string"&&value===new TextDecoder("utf-8",{ignoreBOM:true}).decode(new TextEncoder().encode(value))}var RECORD_BODY_READ_BYTES=8*1024*1024;var DATA_REQUEST_LIMIT=256*1024;var LOCAL_DATA_CHANGE_REQUEST_LIMIT=32*1024*1024;var invalidChange=()=>{throw new DataOperationError("invalid_change",false,"unapplied")};function mapping(value){try{dataProperties(value);return value}catch{return invalidChange()}}function captureValue(value,ancestors=new Set,depth=0){if(value===null||typeof value==="string"||typeof value==="boolean"||typeof value==="number"&&Number.isFinite(value))return value;if(!value||typeof value!=="object"||ancestors.has(value)||depth>32)return invalidChange();ancestors.add(value);try{if(Array.isArray(value)){if(value.length>1e5||Object.keys(value).length!==value.length||Object.getOwnPropertySymbols(value).length)return invalidChange();return Array.from(value,(item)=>captureValue(item,ancestors,depth+1))}return Object.fromEntries(Object.entries(mapping(value)).map(([key,item])=>{if(["__proto__","constructor","prototype"].includes(key))return invalidChange();return[key,captureValue(item,ancestors,depth+1)]}))}finally{ancestors.delete(value)}}function captureDataDelete(record2){const identity=mapping(record2);if(!validRecordRef(identity.$ref)||typeof identity.$version!=="string"||!identity.$version.length||identity.$version.length>512)return invalidChange();return{ref:identity.$ref,expectedVersion:identity.$version}}function captureDataUpdate(record2,set){const identity=captureDataDelete(record2),input=mapping(set);const{$body,...fields3}=input;const body=Object.hasOwn(input,"$body");if(body&&!validRecordBody($body)||!Object.keys(fields3).length&&!body||Object.keys(fields3).some((key)=>key.startsWith("$")||["id","type"].includes(key)))return invalidChange();return{...identity,set:captureValue(fields3),...body?{body:$body}:{}}}function captureIdentities(value,update,allowEmpty=true){if(!Array.isArray(value)||!allowEmpty&&!value.length||value.length>1e4)return invalidChange();const captured=value.map((item)=>{const row=mapping(item);if(Object.keys(row).filter((key)=>!update||key!=="body").sort().join(",")!==(update?"expectedVersion,ref,set":"expectedVersion,ref"))return invalidChange();const identity={$ref:row.ref,$version:row.expectedVersion};if(update&&Object.keys(mapping(row.set)).some((key)=>key.startsWith("$")))return invalidChange();return update?captureDataUpdate(identity,{...mapping(row.set),...Object.hasOwn(row,"body")?{$body:row.body}:{}}):captureDataDelete(identity)});if(new Set(captured.map((item)=>item.ref)).size!==captured.length)return invalidChange();return captured}function captureDataUpdates(value,allowEmpty=false){return captureIdentities(value,true,allowEmpty)}function captureDataCreate(value){const row=mapping(value);if(!validRecordRef(row.$ref)||Object.keys(row).some((key)=>key.startsWith("$")&&!["$ref","$filing","$body"].includes(key)))return invalidChange();const{$ref:ref,$filing,$body,...fields3}=row;const body=Object.hasOwn(row,"$body");if(body&&!validRecordBody($body))return invalidChange();let filing;if($filing!==undefined){const components=mapping($filing);if(Object.entries(components).some(([name,value2])=>!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)||["constructor","prototype"].includes(name)||typeof value2!=="string"||!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(value2)))return invalidChange();filing={...components}}return{ref,fields:captureValue(fields3),...filing?{filing}:{},...body?{body:$body}:{}}}function captureDataChanges(updatesValue,createsValue=[],deletesValue=[]){const updates=captureDataUpdates(updatesValue,true);if(!Array.isArray(createsValue)||createsValue.length>1e4)return invalidChange();const creates=createsValue.map((item)=>{const row=mapping(item);if(Object.keys(row).some((key)=>!["ref","fields","filing","body"].includes(key))||!Object.hasOwn(row,"ref")||!Object.hasOwn(row,"fields"))return invalidChange();const fields3=mapping(row.fields);if(Object.keys(fields3).some((key)=>key.startsWith("$")))return invalidChange();return captureDataCreate({...fields3,$ref:row.ref,...Object.hasOwn(row,"filing")?{$filing:row.filing}:{},...Object.hasOwn(row,"body")?{$body:row.body}:{}})});const deletes=captureIdentities(deletesValue,false);const refs=[...updates,...creates,...deletes].map((item)=>item.ref);if(!refs.length||refs.length>1e4||new Set(refs).size!==refs.length)return invalidChange();return{updates,creates,deletes}}function checkDataRequestSize(input,limit=DATA_REQUEST_LIMIT){if(new TextEncoder().encode(JSON.stringify(input)).byteLength>limit)throw new DataOperationError("request_too_large",false,"unapplied")}function dataTransportError(status,value){const failures={400:["invalid_query","invalid_change"],401:["unauthenticated"],403:["access_denied"],409:["conflict","apply_pending"],413:["request_too_large"],429:["capacity"],503:["unavailable","apply_pending"]};const error=value&&typeof value==="object"&&"error"in value?value.error:undefined;const row=error&&typeof error==="object"?error:undefined;const code=failures[status]?.find((allowed)=>allowed===row?.code)??"unavailable";const effect=["unapplied","uncertain","applied"].includes(String(row?.effect))?row.effect:undefined;let detail;try{detail=row?.detail===undefined?undefined:parseDataOperationDetail(row.detail)}catch{}if(detail&&"reason"in detail&&code!=="invalid_change")detail=undefined;return explainDataValidation(new DataOperationError(code,typeof row?.retryable==="boolean"?row.retryable:["capacity","unavailable","apply_pending"].includes(code),code==="conflict"?"unapplied":effect,code==="invalid_change"&&typeof row?.component==="string"&&/^[a-zA-Z][a-zA-Z0-9_-]{0,127}$/.test(row.component)?row.component:undefined,detail),row?.message,row?.detail)}var AUTH_ORIGIN="https://auth.oddington.ai";function oddingtonOrigin(environment=process.env){const value=environment.OS_ORIGIN??AUTH_ORIGIN;const url=new URL(value);if(url.protocol!=="https:"&&url.hostname!=="127.0.0.1")throw new Error("OS_ORIGIN must use HTTPS");return url.origin}var nodeRequest;var nodeReadable;if(typeof __OS_BROWSER__==="undefined"||!__OS_BROWSER__){({request:nodeRequest}=await import("node:http"));({Readable:nodeReadable}=await import("node:stream"))}function privateRoutineRequest(environment=typeof __OS_BROWSER__!=="undefined"&&__OS_BROWSER__?{}:typeof process==="undefined"?{}:process.env){if(typeof __OS_BROWSER__!=="undefined"&&__OS_BROWSER__)return;const prepared=["OS_ROUTINE_LOCAL","OS_ROUTINE_LOCAL_SOCKET","OS_ROUTINE_LOCAL_TOKEN"].some((key)=>environment[key]!==undefined);const managed=["OS_FILES_SOCKET","OS_FILES_TOKEN"].some((key)=>environment[key]!==undefined);if(!prepared&&!managed)return;const socket=prepared?environment.OS_ROUTINE_LOCAL_SOCKET:environment.OS_FILES_SOCKET;const token=prepared?environment.OS_ROUTINE_LOCAL_TOKEN:environment.OS_FILES_TOKEN;const request=localRoutineRequest(prepared?environment:{OS_ROUTINE_LOCAL:"1",OS_ROUTINE_LOCAL_SOCKET:socket,OS_ROUTINE_LOCAL_TOKEN:token});const isCurrent=()=>prepared?environment.OS_ROUTINE_LOCAL==="1"&&environment.OS_ROUTINE_LOCAL_SOCKET===socket&&environment.OS_ROUTINE_LOCAL_TOKEN===token:environment.OS_FILES_SOCKET===socket&&environment.OS_FILES_TOKEN===token;if(!nodeRequest||!nodeReadable)throw new Error("Files transport unavailable");const httpRequest=nodeRequest,Readable=nodeReadable;const files=async(suffix,init,signal)=>{if(!isCurrent())throw new FileOperationError("unsupported_context",400);const tcp=/^tcp:\/\/127\.0\.0\.1:([1-9][0-9]{0,4})$/.exec(socket);const endpoint=tcp?{hostname:"127.0.0.1",port:Number(tcp[1])}:{socketPath:socket};const id2=crypto.randomUUID();if(init.body instanceof ReadableStream||suffix===""&&init.method==="POST"){await new Promise((resolve,reject)=>{const check=httpRequest({...endpoint,path:"/files/check-create",method:"POST",timeout:30000,signal,agent:false,headers:{...Object.fromEntries(new Headers(init.headers)),authorization:`Bearer ${token}`,"x-os-files-suffix":encodeURIComponent(suffix),"x-os-files-method":init.method??"GET"}},(response)=>{const bytes=Buffer.alloc(16384);let size=0;response.on("data",(chunk)=>{size+=chunk.length;if(size>16384)response.destroy(new Error("File operation start response exceeded 16 KiB."));else bytes.set(chunk,size-chunk.length)});response.once("error",reject);response.once("end",()=>{if(response.statusCode===204){resolve();return}try{const value=JSON.parse(bytes.subarray(0,size).toString());const code=value?.error?.code;const status=response.statusCode??503;if(["invalid_input","request_too_large","unsupported_context","access_denied","capacity","unavailable"].includes(code))reject(new FileOperationError(code,status,code==="capacity"||code==="unavailable",parseFileErrorDetail(value?.error?.detail)));else reject(new FileOperationError("unavailable",503,true))}catch{reject(new FileOperationError("unavailable",503,true))}})});check.once("error",()=>reject(new FileOperationError("unavailable",503,true)));check.once("timeout",()=>check.destroy(new Error("The file create check did not finish in time.")));check.end()});if(!isCurrent())throw new FileOperationError("unsupported_context",400)}let cancellation;const cancelCall=()=>cancellation??=new Promise((resolve,reject)=>{const cancel=httpRequest({...endpoint,path:"/files/cancel",method:"POST",timeout:30000,headers:{authorization:`Bearer ${token}`,"x-os-files-call":id2}},(response)=>{response.resume();response.once("end",resolve);response.once("error",reject)});cancel.once("error",reject);cancel.once("timeout",()=>cancel.destroy(new Error("Files cancellation stalled")));cancel.end()});let pumping=Promise.resolve();let sourceReader;const result=new Promise((resolve,reject)=>{const call=httpRequest({...endpoint,path:"/files/stream",method:"POST",headers:{...Object.fromEntries(new Headers(init.headers)),authorization:`Bearer ${token}`,"x-os-files-call":id2,"x-os-files-suffix":encodeURIComponent(suffix),"x-os-files-method":init.method??"GET"},signal,timeout:30000,agent:false},async(response)=>{try{call.setTimeout(0);if((response.statusCode??503)>=400){await sourceReader?.cancel().catch(()=>{});call.end()}await pumping;if(!isCurrent()){response.destroy();reject(new FileOperationError("unsupported_context",400));return}const headers=new Headers;for(const[key,value]of Object.entries(response.headers))if(value!==undefined)headers.set(key,Array.isArray(value)?value.join(", "):value);const source=Readable.toWeb(response,{strategy:{highWaterMark:65536,size:(chunk)=>chunk.byteLength}});const reader=source.getReader();if(response.statusCode===204){const timer=setTimeout(()=>response.destroy(new Error("Files completion stalled")),30000);try{if(!(await reader.read()).done)throw new FileOperationError("unavailable",503,true);if(!isCurrent())throw new FileOperationError("unsupported_context",400);resolve(new Response(null,{status:204,headers}))}finally{clearTimeout(timer);reader.releaseLock()}return}let closed=false;const body=new ReadableStream({async pull(controller){let timer;try{if(!isCurrent())throw new FileOperationError("unsupported_context",400);timer=setTimeout(()=>response.destroy(new Error("Files delivery stalled")),30000);const next=await reader.read();if(closed)return;if(next.done){closed=true;reader.releaseLock();controller.close()}else controller.enqueue(next.value)}catch(error){closed=true;controller.error(error);await cancelCall().catch(()=>{});response.socket?.destroy();response.destroy();await reader.cancel(error).catch(()=>{});reader.releaseLock()}finally{clearTimeout(timer)}},async cancel(reason){closed=true;await cancelCall().catch(()=>{});response.socket?.destroy();response.destroy();call.destroy();await reader.cancel(reason).catch(()=>{});reader.releaseLock()}},{highWaterMark:0});resolve(new Response(body,{status:response.statusCode??503,headers}))}catch(error){response.destroy();reject(error instanceof FileOperationError?error:new FileOperationError("unavailable",503,true))}});call.on("error",(error)=>{cancelCall().catch(()=>{});reject(error instanceof FileOperationError?error:new FileOperationError("unavailable",503,true))});call.on("timeout",()=>call.destroy(new Error("Files I/O stalled")));call.on("information",()=>call.setTimeout(30000));if(init.body instanceof ReadableStream){call.flushHeaders();const reader=sourceReader=init.body.getReader();const abort=()=>{reader.cancel(signal.reason).catch(()=>{})};signal.addEventListener("abort",abort,{once:true});call.once("close",abort);pumping=(async()=>{try{for(;;){const next=await reader.read();if(next.done)break;if(!(next.value instanceof Uint8Array))throw new FileOperationError("invalid_input",400);if(!isCurrent())throw new FileOperationError("unsupported_context",400);for(let offset=0;offset<next.value.byteLength;offset+=262144){if(call.destroyed)throw new Error("Files parent disconnected");await new Promise((done,fail2)=>{const closed=()=>fail2(new Error("Files parent disconnected"));call.once("close",closed);call.write(next.value.subarray(offset,offset+262144),(error)=>{call.removeListener("close",closed);error?fail2(error):done()})})}}call.end()}catch(error){call.destroy(error instanceof Error?error:new Error("Files transport failed"))}finally{await reader.cancel().catch(()=>{});signal.removeEventListener("abort",abort);call.removeListener("close",abort);reader.releaseLock()}})()}else call.end(init.body===undefined?undefined:Buffer.from(init.body))});try{return await result}finally{await pumping}};return{request,files,isCurrent,identity:`private:${socket}`}}function localRoutineRequest(environment=typeof __OS_BROWSER__!=="undefined"&&__OS_BROWSER__?{}:typeof process==="undefined"?{}:process.env){if(typeof __OS_BROWSER__==="undefined"||!__OS_BROWSER__){const{OS_ROUTINE_LOCAL:mode,OS_ROUTINE_LOCAL_SOCKET:socket,OS_ROUTINE_LOCAL_TOKEN:token}=environment;if(mode===undefined&&socket===undefined&&token===undefined)return;if(mode!=="1"||!socket||!token||!/^[0-9a-f]{64}$/.test(token))throw new Error("Preparation transport unavailable; nothing can publish");const tcp=/^tcp:\/\/127\.0\.0\.1:([1-9][0-9]{0,4})$/.exec(socket);const endpoint=tcp&&tcp[0]===socket&&Number(tcp[1])<=65535?{hostname:"127.0.0.1",port:Number(tcp[1])}:socket.startsWith("/")&&!socket.startsWith("//")&&!socket.includes("\x00")?{socketPath:socket}:undefined;if(!endpoint)throw new Error("Preparation transport unavailable; nothing can publish");return async(operation,input)=>{const{request}=await import("node:http");return await new Promise((resolve,reject)=>{const call=request({...endpoint,path:`/${operation}`,method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${token}`},timeout:operation==="ai/generate"?125000:120000},(response)=>{const limit=operation==="ai/generate"?ROUTINE_AI_RESULT_BYTES:33554432;const bytes=Buffer.alloc(limit);let size=0;response.on("data",(chunk)=>{size+=chunk.length;if(size>limit){response.destroy();reject(operation==="ai/generate"?new AIError("output_too_large"):new Error("Local result exceeds supported size"))}else bytes.set(chunk,size-chunk.length)});response.on("error",(error)=>reject(operation==="ai/generate"?new AIError("capability_unavailable"):error));response.on("end",()=>{try{const result=JSON.parse(bytes.subarray(0,size).toString());if(response.statusCode!==200){if(operation==="ai/generate")throw parseRoutineAIError(result.error);if(operation==="files/request"){const error=result.error;const status=response.statusCode??503;const codes=["invalid_input","unsupported_context","unauthenticated","access_denied","not_found","request_too_large","conflict","local_only","integrity","unavailable","capacity","method_not_allowed"];if(error?.code&&codes.includes(error.code))throw new FileOperationError(error.code,status,error.code==="capacity"||error.code==="unavailable",parseFileErrorDetail(error.detail));throw new FileOperationError("unavailable",503,true)}if(operation==="data/query"){throw dataTransportError(response.statusCode??0,result)}throw new Error(typeof result.error==="string"?result.error:"Preparation failed")}resolve(result)}catch(error){reject(operation==="ai/generate"&&!(error instanceof AIError)?new AIError("invalid_output"):error)}})});call.on("error",()=>reject(operation==="ai/generate"?new AIError("capability_unavailable"):operation==="data/query"?dataTransportError(503,{error:{code:"unavailable"}}):new Error("Preparation transport unavailable; nothing was published")));call.on("timeout",()=>call.destroy(new Error("Preparation timed out")));call.end(JSON.stringify(input))})}}}var installed;var ended=false;function routineTransport(){if(ended||installed&&!installed.isCurrent())throw new Error("Routine authority ended");return installed}var memberContext;var retainedContext;function installMemberContext(resolve,retained=resolve){memberContext=resolve;retainedContext=retained;return()=>{if(memberContext===resolve){memberContext=undefined;retainedContext=undefined}}}async function resolveAppContext(retained=false){const host=memberContext;if(!host)throw new Error("App context unavailable.");const context=await(retained?retainedContext:host)();if(host!==memberContext||!context.isCurrent()||context.expiresAt<=Date.now()||context.kind!=="local"&&(typeof context.accessToken!=="string"||!/^[^\s]{1,8192}$/.test(context.accessToken))){throw new Error("App context unavailable.")}return context}async function resolveDataContext(){try{if(typeof __OS_BROWSER__==="undefined"||!__OS_BROWSER__){const installed2=routineTransport();if(installed2)return{local:installed2.request};const local=localRoutineRequest();if(local)return{local};const managed=privateRoutineRequest();if(managed)return{local:managed.request}}const host=memberContext;if(host!==undefined){const context=await host();if(host!==memberContext||!context.isCurrent()||context.expiresAt<=Date.now())throw new Error;if(context.kind==="local")return{local:context.requestData};if(!context||!Number.isFinite(context.expiresAt)||context.expiresAt<=Date.now()||typeof context.accessToken!=="string"||!/^[^\s]{1,8192}$/.test(context.accessToken))throw new Error;return checked(context.workspace,context.endpoint,{authorization:`Bearer ${context.accessToken}`})}if(typeof __OS_BROWSER__==="undefined"||!__OS_BROWSER__){const environment=typeof process==="undefined"?undefined:process.env;if(!environment||!/^[0-9a-f]{64}$/.test(environment.OS_ROUTINE_RUN??""))throw new Error;return checked(environment.OS_ROUTINE_WORKSPACE,oddingtonOrigin(environment),{"x-os-run":environment.OS_ROUTINE_RUN})}throw new Error}catch{throw new DataOperationError("context_unavailable")}}async function resolveFilesContext(){try{const environment=typeof __OS_BROWSER__!=="undefined"&&__OS_BROWSER__?{}:typeof process==="undefined"?{}:process.env;if(typeof __OS_BROWSER__==="undefined"||!__OS_BROWSER__){const installed2=routineTransport();if(installed2)return{url:"private:installed",headers:{},isCurrent:installed2.isCurrent,local:installed2.request,localFiles:installed2.files,signal:undefined};const local=privateRoutineRequest(environment);if(local)return{url:local.identity,headers:{},isCurrent:local.isCurrent,local:local.request,localFiles:local.files,signal:undefined}}const host=memberContext;if(host){const context=await host();if(host!==memberContext||!context.isCurrent()||context.expiresAt<=Date.now())throw new Error;if(context.kind==="local")return{url:`private:app:${context.workspace}/${context.memberId}`,headers:{},isCurrent:context.isCurrent,signal:context.signal,local:undefined,localFiles:context.requestFiles};if(!Number.isFinite(context.expiresAt)||context.expiresAt<=Date.now()||typeof context.accessToken!=="string"||!/^[^\s]{1,8192}$/.test(context.accessToken))throw new Error;return{...filesContext(context.workspace,context.endpoint,{authorization:`Bearer ${context.accessToken}`}),isCurrent:context.isCurrent,local:undefined,localFiles:undefined,signal:undefined}}if(typeof __OS_BROWSER__==="undefined"||!__OS_BROWSER__){if(!/^[0-9a-f]{64}$/.test(environment.OS_ROUTINE_RUN??""))throw new Error;const workspace=environment.OS_ROUTINE_WORKSPACE;return{...filesContext(workspace,`https://${workspace}.oddington.ai`,{"x-os-run":environment.OS_ROUTINE_RUN}),local:undefined,localFiles:undefined,signal:undefined}}throw new Error}catch{throw new FileOperationError("unsupported_context",400)}}function filesContext(workspace,endpoint,headers){if(!workspace||!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(workspace)||workspace.length>63||["auth","www","api","os"].includes(workspace)||endpoint!==`https://${workspace}.oddington.ai`)throw new Error;return{url:`${endpoint}/api/files`,headers:{...headers,"x-os-workspace":workspace},isCurrent:()=>true}}function checked(workspace,endpoint,headers){if(!workspace||!/^[a-z0-9][a-z0-9-]{0,127}$/.test(workspace))throw new Error;const origin=new URL(endpoint);if(origin.protocol!=="https:"||origin.username||origin.password||origin.search||origin.hash||origin.pathname!=="/")throw new Error;return{url:`${origin.origin}/api/data`,headers:{...headers,"x-os-workspace":workspace}}}var invalid6=()=>{throw new DataOperationError("invalid_query")};var unavailable=()=>{throw new DataOperationError("unavailable")};var text2=(value)=>typeof value==="string"&&value.length>0;function capture4(value,ancestors=new Set,depth=0){if(value===null||typeof value==="string"||typeof value==="boolean"||typeof value==="number"&&Number.isFinite(value))return value;if(!value||typeof value!=="object"||ancestors.has(value)||depth>32)return invalid6();ancestors.add(value);try{if(Array.isArray(value))return dataArray(value).map((item)=>capture4(item,ancestors,depth+1));return Object.fromEntries(Object.entries(dataProperties(value)).map(([key,descriptor])=>[key,capture4(descriptor.value,ancestors,depth+1)]))}finally{ancestors.delete(value)}}function recordPagination(queryRecords){function pages(query){const captured=capture4(query);const names=Object.keys(dataProperties(captured));for(const name of names){const selection2=dataProperties(captured[name]);if(Object.hasOwn(selection2,"$")){const options=dataProperties(selection2.$.value);if(Object.hasOwn(options,"after"))return invalid6()}}return iterate();async function*iterate(){const state=new Map(names.map((name)=>[name,{seen:new Set,count:undefined,next:undefined}]));let active=names,version;do{const request=Object.fromEntries(active.map((name)=>{const selection2=captured[name];const next=state.get(name).next;return[name,next===undefined?selection2:{...selection2,$:{...selection2.$,after:next}}]}));const response=await queryRecords(request);let page;try{page=capture4(response);const keys2=Object.keys(dataProperties(page));if(keys2.length!==active.length+1||keys2.some((key)=>key!=="$meta"&&!active.includes(key)))unavailable();const meta=page.$meta;if(Object.keys(dataProperties(meta)).sort().join(",")!=="collections,version"||!text2(meta.version))unavailable();version=meta.version;const collectionKeys=Object.keys(dataProperties(meta.collections));if(collectionKeys.some((key)=>!active.includes(key)))unavailable();for(const name of active){const records=dataArray(page[name]);const metadata=Object.hasOwn(meta.collections,name)?meta.collections[name]:{};if(Object.keys(dataProperties(metadata)).some((key)=>key!=="count"&&key!=="next")||Object.hasOwn(metadata,"next")&&!text2(metadata.next))unavailable();for(const record2 of records){dataProperties(record2);const row=record2;if(!validRecordRef(row.$ref)||!text2(row.$version))unavailable()}const current=state.get(name);if(captured[name].$?.count===true){if(!Number.isSafeInteger(metadata.count)||metadata.count<0)unavailable();current.count=metadata.count}else if(Object.hasOwn(metadata,"count"))unavailable();if(metadata.next!==undefined){if(current.seen.has(metadata.next))unavailable();current.seen.add(metadata.next)}current.next=metadata.next}}catch{return unavailable()}const collections=Object.fromEntries(names.map((name)=>{const current=state.get(name);return[name,{...current.count===undefined?{}:{count:current.count},...current.next===undefined?{}:{next:current.next}}]}));const output=Object.fromEntries(names.map((name)=>[name,active.includes(name)?page[name]:[]]));active=active.filter((name)=>state.get(name).next!==undefined);yield{...output,$meta:{version,collections}}}while(active.length)}}return{pages}}var genericData={repository(repository){async function send(input){const context=await resolveDataContext();const envelope={repository,...input};const changing="operation"in input&&["changes.validate","changes.apply"].includes(String(input.operation));checkDataRequestSize(envelope,"local"in context&&changing?LOCAL_DATA_CHANGE_REQUEST_LIMIT:DATA_REQUEST_LIMIT);if("local"in context)return await context.local("data/query",envelope);try{const response=await fetch(context.url,{method:"POST",redirect:"error",cache:"no-store",headers:{"content-type":"application/json",...context.headers},body:JSON.stringify(envelope)});const result=await response.json();if(!response.ok){throw dataTransportError(response.status,result)}return result}catch(error){if(error instanceof DataOperationError)throw error;throw new DataOperationError("unavailable",true)}}async function read(input,options){const refs=captureRecordsReadRefs(typeof input==="string"?[input]:input);const captured=captureRecordsReadOptions(options);const result=await send({operation:"records.read",refs,...options===undefined?{}:{options:captured}});return typeof input==="string"?result.records[0]:result}const queryRecords=(query)=>send({operation:"records.query",query});return{collections:{list:()=>send({operation:"collections.list"}),schema:(name)=>send({operation:"collections.schema",name})},records:{read,query:queryRecords,...recordPagination(queryRecords),all:async(query,options)=>send({operation:"records.all",...captureRecordsAll(query,options)}),search:async(query,options)=>send({operation:"records.search",...captureRecordsSearchInput(query,options)})},changes(){let updates=[],creates=[],deletes=[],applyId;let pending,confirmed;const assertMutable=()=>{if(applyId)throw new DataOperationError("invalid_change",false,"unapplied")};const snapshot=(nextUpdates=updates,nextCreates=creates,nextDeletes=deletes)=>{const{updates:updates2,creates:creates2,deletes:deletes2}=captureDataChanges(nextUpdates,nextCreates,nextDeletes);const input={updates:updates2,...creates2.length?{creates:creates2}:{},...deletes2.length?{deletes:deletes2}:{}};checkDataRequestSize({repository,operation:"changes.apply",...input,applyId:applyId??"00000000-0000-4000-8000-000000000000"},LOCAL_DATA_CHANGE_REQUEST_LIMIT);return input};return{create(record2){assertMutable();const next=[...creates,captureDataCreate(record2)];snapshot(updates,next,deletes);creates=next},update(record2,set){assertMutable();const next=[...updates,captureDataUpdate(record2,set)];snapshot(next,creates,deletes);updates=next},delete(record2){assertMutable();const next=[...deletes,captureDataDelete(record2)];snapshot(updates,creates,next);deletes=next},async validate(){await send({operation:"changes.validate",...snapshot()})},apply(){if(confirmed)return Promise.resolve(structuredClone(confirmed));if(!pending){let captured;try{captured=snapshot()}catch(error){return Promise.reject(error)}applyId??=routineTransport()?.key("data")??crypto.randomUUID();pending=send({operation:"changes.apply",...captured,applyId}).then((result)=>{confirmed=structuredClone(result);return result}).catch((error)=>{if(error instanceof DataOperationError)throw explainDataValidation(new DataOperationError(error.code,error.retryable,error.effect??(["unavailable","apply_pending"].includes(error.code)?"uncertain":"unapplied"),error.component,error.detail),error.message,error.detail);throw new DataOperationError("unavailable",true,"uncertain")}).finally(()=>{pending=undefined})}return pending.then((result)=>structuredClone(result))}}}}}};var data=genericData;async function hostedContent(url,init,parent,upstream=fetch,check=async()=>{},failure){const delivery=new AbortController;const abort=()=>delivery.abort(parent.reason);parent.addEventListener("abort",abort,{once:true});if(parent.aborted)abort();const detach=()=>parent.removeEventListener("abort",abort);try{const response=await upstream(url,{...init,signal:delivery.signal});try{await check();if(delivery.signal.aborted)throw failure?.()??new FileOperationError("unavailable",503,true)}catch(error){response.body?.cancel().catch(()=>{});throw error}if(!response.body){detach();return response}const source=response.body;let reader;let settled=false;let output;const cancel=async(reason)=>{if(settled)return;settled=true;detach();delivery.signal.removeEventListener("abort",stop);delivery.abort(reason);try{await(reader?reader.cancel(reason):source.cancel(reason))}catch(error){if(error!==delivery.signal.reason&&!(error instanceof Error&&error.name==="AbortError"))throw error}finally{reader?.releaseLock()}};const stop=()=>{if(settled)return;const error=failure?.()??delivery.signal.reason;cancel(error).catch(()=>{});output.error(error)};const body=new ReadableStream({start(controller){output=controller;delivery.signal.addEventListener("abort",stop,{once:true});if(delivery.signal.aborted)stop()},async pull(controller){try{await check();if(settled)return;reader??=source.getReader();const{done,value}=await reader.read();await check();if(settled)return;if(done){settled=true;detach();delivery.signal.removeEventListener("abort",stop);reader.releaseLock();controller.close()}else controller.enqueue(value)}catch(error){if(settled)return;controller.error(failure?.()??error);await cancel(error).catch(()=>{})}},cancel},{highWaterMark:0});const wrapped=new Response(body,{status:response.status,statusText:response.statusText,headers:response.headers});for(const key of["url","redirected","type"])Object.defineProperty(wrapped,key,{value:response[key]});return wrapped}catch(error){detach();delivery.abort(error);throw error}}var MAX_BYTES=16*1024*1024;var PART_BYTES=8*1024*1024;var METADATA_BYTES=4096;var RESULT_BYTES=16*1024;var CONTROL_RESULT_BYTES=128*1024;var TIMEOUT_MS=30000;var MAX_ACTIVE=4;var ATTEMPTS=2;var active=0;var waiters=[];var invalid7=()=>new FileOperationError("invalid_input",400);var unavailable2=()=>new FileOperationError("unavailable",503,true);var failures={400:["invalid_input","unsupported_context"],401:["unauthenticated"],403:["access_denied"],404:["not_found"],405:["method_not_allowed"],409:["conflict","local_only"],413:["request_too_large"],429:["capacity"],503:["integrity","unavailable"]};function heldSlot(){let held=true;return()=>{if(!held)return;held=false;for(;;){const waiter=waiters.shift();if(!waiter){active--;return}if(!waiter.waiting)continue;waiter.waiting=false;waiter.signal?.removeEventListener("abort",waiter.abort);waiter.resolve(heldSlot());return}}}async function acquireSlot(signal){if(signal?.aborted)throw unavailable2();if(active<MAX_ACTIVE){active++;return heldSlot()}return new Promise((resolve,reject)=>{const waiter={signal,waiting:true,resolve,reject,abort(){if(!waiter.waiting)return;waiter.waiting=false;const index=waiters.indexOf(waiter);if(index!==-1)waiters.splice(index,1);reject(unavailable2())}};waiters.push(waiter);signal?.addEventListener("abort",waiter.abort,{once:true});if(signal?.aborted)waiter.abort()})}async function boundedBytes(stream,limit,signal){if(!stream)return new Uint8Array;const reader=stream.getReader();const bytes=new Uint8Array(limit);let size=0;const cancel=()=>{reader.cancel().catch(()=>{})};signal?.addEventListener("abort",cancel,{once:true});if(signal?.aborted)cancel();try{for(;;){const{done,value}=await reader.read();if(signal?.aborted)throw unavailable2();if(done)break;if(!(value instanceof Uint8Array))throw new FileOperationError("invalid_input",400,false,{reason:"invalid_bytes"});size+=value.byteLength;if(size>limit)throw new FileOperationError("request_too_large",413,false,{reason:"size_limit",limitBytes:limit,receivedBytes:size,receivedAtLeast:true});bytes.set(value,size-value.byteLength)}}catch(error){cancel();throw error}finally{signal?.removeEventListener("abort",cancel);reader.releaseLock()}return bytes.slice(0,size)}async function timed(work,parent,timeout=TIMEOUT_MS){const controller=new AbortController;let timer;let abort;const expiry=new Promise((_,reject)=>{abort=()=>{controller.abort();reject(unavailable2())};timer=setTimeout(abort,timeout);parent?.addEventListener("abort",abort,{once:true});if(parent?.aborted)abort()});try{return await Promise.race([work(controller.signal),expiry])}finally{clearTimeout(timer);parent?.removeEventListener("abort",abort)}}async function result(response,maximum=RESULT_BYTES){try{const bytes=await boundedBytes(response.body,maximum);return JSON.parse(new TextDecoder("utf-8",{fatal:true}).decode(bytes))}catch{throw unavailable2()}}async function send(suffix,init,descriptor,initial,parent){const original=initial;const checkCurrent=(context=original)=>{if(parent?.aborted)throw unavailable2();if(!original.isCurrent()||context.url!==original.url)throw new FileOperationError("unsupported_context",400)};for(let attempt=0;attempt<ATTEMPTS;attempt++){checkCurrent();const context=await resolveFilesContext();checkCurrent(context);try{const response=context.localFiles?await context.localFiles(suffix,init,parent):await(async()=>{const url=`${context.url}${suffix}`;const request={...init,signal:parent,headers:{...context.headers,...init.headers},redirect:"error",cache:"no-store"};return descriptor?fetch(url,request):hostedContent(url,request,parent)})();if(!response.ok){const value2=await result(response);const error=value2&&typeof value2==="object"&&"error"in value2?value2.error:undefined;const received=error&&typeof error==="object"&&"code"in error?error.code:undefined;const code=failures[response.status]?.find((code2)=>code2===received);throw code?new FileOperationError(code,response.status,code==="capacity"||code==="unavailable",parseFileErrorDetail(error?.detail)):unavailable2()}if(response.status!==200){response.body?.cancel().catch(()=>{});throw unavailable2()}try{checkCurrent()}catch(error){response.body?.cancel().catch(()=>{});throw error}if(!descriptor)return response;const value=await result(response,descriptor==="control"?CONTROL_RESULT_BYTES:RESULT_BYTES);if(descriptor==="control"){checkCurrent();return value}let parsed;if(descriptor==="enrichment"){if(!value||typeof value!=="object"||Array.isArray(value))throw unavailable2();const{name,...metadata}=value;if(!safeEnrichmentName(name))throw unavailable2();parsed={name,...parseEnrichmentDescriptor(metadata)}}else parsed=parseFileDescriptor(value);checkCurrent();return parsed}catch(error){const failure=error instanceof FileOperationError?error:unavailable2();if(init.body instanceof ReadableStream||!failure.retryable||attempt+1===ATTEMPTS)throw failure}}throw unavailable2()}function idPath(id2){if(typeof id2!=="string"||!FILE_ID_PATTERN.test(id2))throw invalid7();return`/${id2}`}async function multipartCreate(input,metadata,exchange,release,upload,expectedSha256){const route=upload?`${idPath(upload.file.id)}/upload/multipart`:"/multipart";let ticket;let reader;let chunk,offset=0;const receipts=[];const pending=new Set;const request=(work,timeout=TIMEOUT_MS)=>timed((signal)=>{const task=work(signal);pending.add(task);task.then(()=>pending.delete(task),()=>pending.delete(task));return task},undefined,timeout);const control=(body)=>({method:"POST",headers:{"content-type":"application/json",...ticket?{"x-os-transfer":ticket}:{}},body:JSON.stringify(body)});try{const startRequest=control(upload?.file??metadata);if(expectedSha256)startRequest.headers["x-os-original-sha256"]=expectedSha256;const start=await request((signal)=>exchange(`${route}/start`,startRequest,"control",signal));if(!start||typeof start!=="object"||Array.isArray(start))throw unavailable2();const session=start;if(Object.keys(session).sort().join(",")!=="partBytes,ticket"||session.partBytes!==PART_BYTES||typeof session.ticket!=="string"||!session.ticket||session.ticket.length>64*1024)throw unavailable2();ticket=session.ticket;if(input.file instanceof ReadableStream)reader=input.file.getReader();let lastProgress=Date.now();const next=async()=>{try{if(Date.now()-lastProgress>=TIMEOUT_MS)throw unavailable2();const value=await request(()=>reader.read(),Math.max(1,TIMEOUT_MS-(Date.now()-lastProgress)));if(value.value?.byteLength)lastProgress=Date.now();return value}catch(error){await reader.cancel(error).catch(()=>{});throw error}};for(let sent=0,partNumber=1;sent<metadata.size||metadata.size===0&&partNumber===1;partNumber++){const length=Math.min(PART_BYTES,metadata.size-sent);let part;if(input.file instanceof Uint8Array)part=new Uint8Array(input.file.subarray(sent,sent+length));else if(input.file instanceof Blob){const slice=input.file.slice(sent,sent+length);part=new Uint8Array(await request(()=>slice.arrayBuffer()))}else{part=new Uint8Array(length);let filled=0;while(filled<length){if(!chunk||offset===chunk.byteLength){chunk=undefined;offset=0;const value2=await next();if(value2.done)throw invalid7();if(!(value2.value instanceof Uint8Array))throw invalid7();chunk=value2.value;if(chunk.byteLength>metadata.size-sent-filled)throw invalid7()}const take=Math.min(length-filled,chunk.byteLength-offset);part.set(chunk.subarray(offset,offset+take),filled);filled+=take;offset+=take;if(offset===chunk.byteLength){chunk=undefined;offset=0}}}if(part.byteLength!==length)throw invalid7();if(reader&&sent+length===metadata.size){lastProgress=Date.now();for(;;){const value2=await next();if(value2.done)break;if(!(value2.value instanceof Uint8Array)||value2.value.byteLength)throw invalid7()}}const value=await request((signal)=>exchange(`${route}/part`,{method:"POST",headers:{"content-type":"application/octet-stream","x-os-transfer":ticket,"x-os-part":String(partNumber)},body:part.buffer},"control",signal));part=undefined;const receipt=value;if(!receipt||typeof receipt!=="object"||Object.keys(receipt).sort().join(",")!=="etag,partNumber"||receipt.partNumber!==partNumber||typeof receipt.etag!=="string"||!receipt.etag||receipt.etag.length>256||/[\u0000-\u001f\u007f]/.test(receipt.etag))throw unavailable2();receipts.push({partNumber,etag:receipt.etag});sent+=length;lastProgress=Date.now()}if(upload)for(const name of Object.keys(upload.file.enrichments)){const bytes=await request(()=>upload.enrichment(name));if(bytes.byteLength!==upload.file.enrichments[name].size||bytes.byteLength>MAX_BYTES)throw invalid7();await request((signal)=>exchange(`${route}/enrichments/${encodeURIComponent(name)}`,{method:"POST",headers:{"content-type":"application/octet-stream","x-os-transfer":ticket},body:bytes.buffer.slice(bytes.byteOffset,bytes.byteOffset+bytes.byteLength)},"control",signal))}await upload?.beforeComplete();const completion=control({parts:receipts});if(new TextEncoder().encode(completion.body).byteLength>128*1024)throw unavailable2();const completed=parseFileDescriptor(await request((signal)=>exchange(`${route}/complete`,completion,true,signal),TIMEOUT_MS+Math.ceil(metadata.size/(1024*1024))*1000));if(!upload){const acknowledged=await request((signal)=>exchange(`${route}/acknowledge`,control(completed),"control",signal));if(!acknowledged||typeof acknowledged!=="object"||Object.keys(acknowledged).join(",")!=="acknowledged"||acknowledged.acknowledged!==true)throw unavailable2()}return completed}catch(error){if(reader)await reader.cancel(error).catch(()=>{});if(ticket)await request((signal)=>exchange(`${route}/abort`,control({}),"control",signal)).catch(()=>{});throw error instanceof FileOperationError?error:unavailable2()}finally{chunk=undefined;reader?.releaseLock();if(pending.size)Promise.allSettled([...pending]).then(release);else release()}}async function operation(work,initial,parent){const context=initial??await resolveFilesContext();const signal=context.signal&&parent?AbortSignal.any([context.signal,parent]):context.signal??parent;const release=await acquireSlot(signal);const execute=async(signal2)=>{try{return await work(context,signal2)}finally{release()}};if(context.localFiles)return execute(signal??new AbortController().signal);return timed(execute,signal).catch((error)=>{throw error instanceof FileOperationError?error:unavailable2()})}function contentPath(id2,name){const path=idPath(id2);if(name===undefined)return`${path}/content`;if(!safeEnrichmentName(name))throw invalid7();return`${path}/enrichments/${encodeURIComponent(name)}/content`}async function read(id2,names){const context=await resolveFilesContext();idPath(id2);if(names===undefined||typeof names==="string"){const path=contentPath(id2,names);return operation((context2,signal)=>send(path,{method:"GET"},false,context2,signal),context)}if(!Array.isArray(names))throw invalid7();const distinct=[];const seen=new Set;for(const name of names){if(typeof name!=="string"||!safeEnrichmentName(name))throw invalid7();if(seen.has(name))continue;if(seen.size===16)throw invalid7();seen.add(name);distinct.push(name)}const paths=distinct.map((name)=>contentPath(id2,name));return timed(async(parent)=>{const responses={};try{for(let i=0;i<paths.length;i++){const response=await operation((context2,signal)=>send(paths[i],{method:"GET"},false,context2,signal),context,parent);Object.defineProperty(responses,distinct[i],{value:response,enumerable:true})}if(!context.isCurrent())throw new FileOperationError("unsupported_context",400);return responses}catch(error){for(const response of Object.values(responses))response.body?.cancel().catch(()=>{});throw error}})}var files={async upload(id2){return operation(async(context,signal)=>{const file2=await send(`${idPath(id2)}/upload`,{method:"POST"},true,context,signal);if(file2.id!==id2)throw unavailable2();return file2})},async create(input,options){const context=await resolveFilesContext();if(!input||typeof input!=="object"||Array.isArray(input)||Object.keys(input).some((key)=>!["file","size","path","name","storage","mediaType"].includes(key))||options!==undefined&&(!options||typeof options!=="object"||Array.isArray(options)||Object.keys(options).some((key)=>key!=="requestKey")))throw invalid7();const blob=input.file instanceof Blob;const array2=input.file instanceof Uint8Array;const stream=input.file instanceof ReadableStream;if(!blob&&!array2&&!stream)throw invalid7();const intrinsic=blob?input.file.size:array2?input.file.byteLength:undefined;if(intrinsic!==undefined&&input.size!==undefined&&input.size!==intrinsic){if(!Number.isSafeInteger(input.size)||input.size<0)throw new FileOperationError("invalid_input",400,false,{reason:"invalid_size"});throw new FileOperationError("invalid_input",400,false,{reason:"size_mismatch",expectedBytes:input.size,receivedBytes:intrinsic})}let name=input.name;if(name===undefined&&blob&&"name"in input.file&&typeof input.file.name==="string"){name=typeof globalThis.File!=="undefined"&&input.file instanceof globalThis.File?input.file.name:input.file.name.split(/[\\/]/).at(-1)}const mediaType=declaredOriginalMediaType(input.mediaType===undefined?blob&&input.file.type?input.file.type:"application/octet-stream":input.mediaType);const metadata=parseFileCreateMetadata({name,size:intrinsic??input.size,path:input.path,storage:input.storage,mediaType,requestKey:options?.requestKey===undefined?routineTransport()?.key("files")??crypto.randomUUID():options.requestKey},FILE_ORIGINAL_MAX_BYTES);if(!context.local&&!context.localFiles&&metadata.storage==="local")throw new FileOperationError("unsupported_context",400);const header=encodeURIComponent(JSON.stringify(metadata));if(new TextEncoder().encode(header).byteLength>METADATA_BYTES)throw invalid7();const release=await acquireSlot(context.signal);if(context.localFiles&&!routineTransport()&&metadata.size>MAX_BYTES){try{const signal=context.signal??new AbortController().signal;const file2=input.file;let offset=0;const body=file2 instanceof Blob?context.signal?file2:file2.stream():file2 instanceof ReadableStream?file2:new ReadableStream({pull(controller){if(offset===file2.byteLength){controller.close();return}const end=Math.min(offset+256*1024,file2.byteLength);controller.enqueue(file2.subarray(offset,end));offset=end}},{highWaterMark:0});return await send("",{method:"POST",headers:{"content-type":"application/octet-stream","x-os-file":header},body},true,context,signal)}finally{release()}}if(metadata.size>MAX_BYTES)return multipartCreate(input,metadata,(suffix,init,kind,signal)=>kind===true?send(suffix,init,true,context,signal):send(suffix,init,"control",context,signal),release);return timed(async(signal)=>{try{const bytes=array2?new Uint8Array(input.file):await boundedBytes(blob?input.file.stream():input.file,metadata.size,signal);if(bytes.byteLength!==metadata.size)throw new FileOperationError("invalid_input",400,false,{reason:"size_mismatch",expectedBytes:metadata.size,receivedBytes:bytes.byteLength});if(signal.aborted)throw unavailable2();return await send("",{method:"POST",headers:{"content-type":"application/octet-stream","x-os-file":header},body:bytes.buffer},true,context,signal)}finally{release()}},context.signal).catch((error)=>{throw error instanceof FileOperationError?error:unavailable2()})},async enrich(input){const context=await resolveFilesContext();if(!input||typeof input!=="object"||Array.isArray(input)||Object.keys(input).some((key)=>!["file","name","content","mediaType","replace"].includes(key))||typeof input.content!=="string"&&!(input.content instanceof Uint8Array))throw invalid7();const path=`${idPath(input.file)}/enrichments`;if(typeof input.content==="string"?input.content.length>MAX_BYTES:input.content.byteLength>MAX_BYTES)throw new FileOperationError("request_too_large",413);return operation(async(context2,signal)=>{let bytes;if(typeof input.content==="string"){const buffer=new Uint8Array(Math.min(MAX_BYTES,input.content.length*3));const encoded=new TextEncoder().encodeInto(input.content,buffer);if(encoded.read!==input.content.length)throw new FileOperationError("request_too_large",413);bytes=buffer.slice(0,encoded.written)}else bytes=new Uint8Array(input.content);const metadata=parseFileEnrichMetadata({name:input.name,size:bytes.byteLength,...input.mediaType===undefined?{}:{mediaType:input.mediaType},...input.replace===undefined?{}:{replace:input.replace}},MAX_BYTES);const header=encodeURIComponent(JSON.stringify(metadata));if(new TextEncoder().encode(header).byteLength>METADATA_BYTES)throw invalid7();const result2=await send(path,{method:"POST",headers:{"content-type":"application/octet-stream","x-os-enrichment":header},body:bytes.buffer},"enrichment",context2,signal);if(result2.name!==metadata.name)throw unavailable2();return result2},context)},async get(id2){return operation((context,signal)=>send(idPath(id2),{method:"GET"},true,context,signal))},read};var ROUTINE_CONNECTION_CREDENTIALS_ENV="OS_ROUTINE_CONNECTION_CREDENTIALS";function parseRoutineConnectionNames(value){if(!Array.isArray(value)||value.some((name)=>typeof name!=="string"||!/^(gmail|airtable|dropbox|outlook|sharepoint)\/[a-z0-9][a-z0-9-]{0,62}$/.test(name))||new Set(value).size!==value.length)throw new Error("Invalid routine connections");return value}var connectionUuid=(v)=>typeof v==="string"&&/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(v);function runtimeConnection(lease){switch(lease.provider){case"outlook":return{id:`outlook/${lease.name}`,provider:lease.provider,name:lease.name,mailboxEmail:lease.mailboxEmail,accessToken:lease.accessToken,expiresAt:lease.expiresAt};case"sharepoint":return{id:`sharepoint/${lease.name}`,provider:lease.provider,name:lease.name,siteId:lease.siteId,siteUrl:lease.siteUrl,accessToken:lease.accessToken,expiresAt:lease.expiresAt};case"gmail":return{id:`gmail/${lease.name}`,provider:lease.provider,name:lease.name,accountEmail:lease.accountEmail,scopes:[...lease.scopes],accessToken:lease.accessToken,expiresAt:lease.expiresAt};case"airtable":return{id:`airtable/${lease.name}`,provider:lease.provider,name:lease.name,baseId:lease.baseId,accessToken:lease.accessToken,runExpiresAt:lease.runExpiresAt};case"dropbox":return{id:`dropbox/${lease.name}`,provider:lease.provider,name:lease.name,accountId:lease.accountId,access:lease.access,rootPath:lease.rootPath,scopes:[...lease.scopes],accessToken:lease.accessToken,expiresAt:lease.expiresAt}}}function parseConnectionLease(raw,now=Date.now()){const v=raw;if(!v||typeof v!=="object"||Array.isArray(v)||!connectionUuid(v.connectionId)||!connectionUuid(v.runId)||typeof v.name!=="string"||!/^[a-z0-9][a-z0-9-]{0,62}$/.test(v.name)||typeof v.accessToken!=="string"||!/^[A-Za-z0-9._~+/-]{1,8192}={0,2}$/.test(v.accessToken))throw new Error("Invalid connection credential");if(v.provider==="outlook"||v.provider==="sharepoint"){const targetValid=v.provider==="outlook"?Object.keys(v).sort().join(",")==="accessToken,connectionId,expiresAt,mailboxEmail,name,provider,runId"&&validMicrosoftMailbox(v.mailboxEmail):Object.keys(v).sort().join(",")==="accessToken,connectionId,expiresAt,name,provider,runId,siteId,siteUrl"&&typeof v.siteUrl==="string"&&canonicalSharePointSiteUrl(v.siteUrl)===v.siteUrl&&validSharePointSiteId(v.siteId,v.siteUrl);if(!targetValid||typeof v.expiresAt!=="string"||!Number.isFinite(Date.parse(v.expiresAt))||Date.parse(v.expiresAt)<=now||Date.parse(v.expiresAt)>now+3600000)throw new Error("Invalid connection credential");return v}if(v.provider==="gmail"){if(Object.keys(v).sort().join(",")!=="accessToken,accountEmail,connectionId,expiresAt,name,provider,runId,scopes"||typeof v.accountEmail!=="string"||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v.accountEmail)||!validGoogleScopes(v.scopes)||typeof v.expiresAt!=="string"||!Number.isFinite(Date.parse(v.expiresAt))||Date.parse(v.expiresAt)<=now||Date.parse(v.expiresAt)>now+3600000)throw new Error("Invalid connection credential");return v}if(v.provider==="airtable"&&Object.keys(v).sort().join(",")==="accessToken,baseId,connectionId,name,provider,runExpiresAt,runId"&&typeof v.baseId==="string"&&/^app[A-Za-z0-9]+$/.test(v.baseId)&&typeof v.runExpiresAt==="string"&&Number.isFinite(Date.parse(v.runExpiresAt))&&Date.parse(v.runExpiresAt)>now&&Date.parse(v.runExpiresAt)<=now+15*60000)return v;if(v.provider==="dropbox"&&Object.keys(v).sort().join(",")==="access,accessToken,accountId,connectionId,expiresAt,name,provider,rootPath,runId,scopes"&&typeof v.accountId==="string"&&/^dbid:[A-Za-z0-9_-]{1,128}$/.test(v.accountId)&&v.access==="full_dropbox"&&validDropboxRootPath(v.rootPath)&&validDropboxFileScopes(v.scopes)&&typeof v.expiresAt==="string"&&Number.isFinite(Date.parse(v.expiresAt))&&Date.parse(v.expiresAt)>now&&Date.parse(v.expiresAt)<=now+14400000)return v;throw new Error("Invalid connection credential")}class AirtableOperationError extends Error{effect;receipts;constructor(message,effect="unapplied",receipts=[]){super(message);this.effect=effect;this.receipts=receipts;this.name="AirtableOperationError"}}var recordId=(v)=>typeof v==="string"&&/^rec[A-Za-z0-9]+$/.test(v);var tableId=(v)=>typeof v==="string"&&/^tbl[A-Za-z0-9]+$/.test(v);function fail2(message){throw new AirtableOperationError(message)}function object3(v){if(!v||typeof v!=="object"||Array.isArray(v)||![null,Object.prototype].includes(Object.getPrototypeOf(v)))fail2("Invalid Airtable data");return v}function keys2(v,allowed,required=allowed){if(Object.keys(v).some((k)=>!allowed.includes(k))||required.some((k)=>!Object.hasOwn(v,k)))fail2("Invalid Airtable input")}function text3(v){return typeof v==="string"&&v.length>0&&v.length<=1024}function fields3(v,nonempty=false){const result2=object3(v);if(nonempty&&!Object.keys(result2).length||Object.keys(result2).some((k)=>!text3(k)))fail2("Invalid Airtable fields");try{return serializable(result2)}catch{return fail2("Invalid Airtable fields")}}function record2(v){const r=object3(v);if(!recordId(r.id)||r.createdTime!==undefined&&(typeof r.createdTime!=="string"||!Number.isFinite(Date.parse(r.createdTime))))fail2("Malformed Airtable record");return{id:r.id,...r.createdTime===undefined?{}:{createdTime:r.createdTime},fields:fields3(r.fields)}}function equal(a,b){if(a===b)return true;if(!a||!b||typeof a!=="object"||typeof b!=="object"||Array.isArray(a)!==Array.isArray(b))return false;const left=Object.keys(a),right=Object.keys(b);return left.length===right.length&&left.every((k)=>Object.hasOwn(b,k)&&equal(a[k],b[k]))}function createConnections(transport){return{async get(){throw new Error("Connection unavailable")},airtable(name){if(typeof name!=="string"||!/^[a-z0-9][a-z0-9-]{0,62}$/.test(name))fail2("Invalid Airtable connection name");const call=(operation2,input)=>transport(name,operation2,input);return{tables:{list:async()=>await call("tables.list",{})},records:{list:async(input)=>await call("records.list",input),get:async(input)=>await call("records.get",input),create:async(input)=>await call("records.create",input),update:async(input)=>await call("records.update",input),delete:async(input)=>await call("records.delete",input)}}}}}async function executeAirtableOperation(authority,operation2,raw,options={}){const{name,baseId,accessToken}=authority;if(!/^[a-z0-9][a-z0-9-]{0,62}$/.test(name)||!/^app[A-Za-z0-9]+$/.test(baseId)||!/^[A-Za-z0-9._~+/-]{1,8192}={0,2}$/.test(accessToken))fail2("Airtable connection unavailable");let input;try{input=object3(serializable(raw))}catch{return fail2("Invalid Airtable input")}const mutation=["records.create","records.update","records.delete"].includes(operation2);const receipt=(ids2)=>({provider:"airtable",connection:`airtable/${name}`,baseId,table:input.table,operation:operation2.slice(8),records:ids2.map((id2)=>({id:id2}))});async function request(path2,init={},write=false){let response;try{response=await(options.fetch??fetch)(`https://api.airtable.com/v0/${path2}`,{...init,headers:{authorization:`Bearer ${accessToken}`,"content-type":"application/json"},redirect:"manual",signal:options.signal?AbortSignal.any([options.signal,AbortSignal.timeout(15000)]):AbortSignal.timeout(15000)})}catch{throw new AirtableOperationError("Airtable request acknowledgment unavailable",write?"uncertain":"unapplied")}if(!response.ok){await response.body?.cancel().catch(()=>{});throw new AirtableOperationError("Airtable request rejected",write&&(response.status>=500||response.status===408||response.status<400)?"uncertain":"unapplied")}try{if(!response.headers.get("content-type")?.toLowerCase().includes("application/json"))throw new Error;const value=object3(await response.json());const safe=serializable(value);if(Object.hasOwn(value,"error")||JSON.stringify(safe).includes(accessToken))throw new Error;return value}catch{throw new AirtableOperationError("Malformed Airtable acknowledgment",write?"uncertain":"unapplied")}}if(operation2==="tables.list"){keys2(input,[]);const tables=[],seen=new Set;let offset;do{const query2=new URLSearchParams(offset?{offset}:{});const page=await request(`meta/bases/${baseId}/tables?${query2}`);if(!Array.isArray(page.tables))fail2("Malformed Airtable tables");for(const value of page.tables){const t=object3(value);if(!tableId(t.id)||!text3(t.name)||!text3(t.primaryFieldId)||!Array.isArray(t.fields)||tables.some((existing)=>existing.id===t.id))fail2("Malformed Airtable table");const metadata=t.fields.map((value2)=>{const f=object3(value2);if(typeof f.id!=="string"||!/^fld[A-Za-z0-9]+$/.test(f.id)||!text3(f.name)||!text3(f.type))fail2("Malformed Airtable field");return{id:f.id,name:f.name,type:f.type,...f.options===undefined?{}:{options:serializable(f.options)}}});if(!metadata.some((f)=>f.id===t.primaryFieldId)||new Set(metadata.map((f)=>f.id)).size!==metadata.length)fail2("Malformed Airtable fields");tables.push({id:t.id,name:t.name,primaryFieldId:t.primaryFieldId,fields:metadata})}offset=nextOffset(page.offset,seen)}while(offset);return tables}if(!text3(input.table)||input.table==="."||input.table==="..")fail2("Invalid Airtable table");if(mutation&&!tableId(input.table))fail2("Airtable writes require a stable table ID");const path=`${baseId}/${encodeURIComponent(input.table)}`;if(operation2==="records.get"){keys2(input,["table","id"]);if(!recordId(input.id))fail2("Invalid Airtable record ID");const result3=record2(await request(`${path}/${input.id}`));if(result3.id!==input.id)fail2("Malformed Airtable record");return result3}if(operation2==="records.list"){keys2(input,["table","fields"],["table"]);if(input.fields!==undefined&&(!Array.isArray(input.fields)||!input.fields.length||input.fields.some((f)=>!text3(f))||new Set(input.fields).size!==input.fields.length))fail2("Invalid Airtable field selection");const records2=[],ids2=new Set,seen=new Set;let offset;do{const query2=new URLSearchParams;for(const field of input.fields??[])query2.append("fields[]",field);if(offset)query2.set("offset",offset);const page=await request(`${path}?${query2}`);if(!Array.isArray(page.records))fail2("Malformed Airtable records");for(const value of page.records){const r=record2(value);if(ids2.has(r.id))fail2("Malformed Airtable pagination");ids2.add(r.id);records2.push(r)}offset=nextOffset(page.offset,seen)}while(offset);return records2}if(!mutation)fail2("Unsupported Airtable operation");keys2(input,["table","records"]);if(!Array.isArray(input.records)||!input.records.length||input.records.length>10)fail2("Invalid Airtable batch");const kind=operation2.slice(8),ids=new Set;const records=input.records.map((value)=>{const r=object3(value);keys2(r,kind==="create"?["fields"]:kind==="update"?["id","expected","set"]:["id","expected"]);if(kind==="create")return{fields:fields3(r.fields,true)};if(!recordId(r.id)||ids.has(r.id))fail2("Invalid Airtable batch record ID");ids.add(r.id);const set=kind==="update"?fields3(r.set,true):undefined;if(set&&Object.values(set).some((value2)=>value2===null))fail2("Airtable guard null cannot be an update value");return{id:r.id,expected:fields3(r.expected),...set?{set}:{}}});for(const r of records){if(!("id"in r))continue;const current=record2(await request(`${path}/${r.id}`));if(current.id!==r.id)fail2("Malformed Airtable record");for(const[key,value]of Object.entries(r.expected)){if(value===null?Object.hasOwn(current.fields,key):!Object.hasOwn(current.fields,key)||!equal(current.fields[key],value))fail2("Airtable reviewed values are stale")}}await options.beforeMutation?.();const query=new URLSearchParams;if(kind==="delete")for(const id2 of ids)query.append("records[]",id2);const result2=await request(`${path}${kind==="delete"?`?${query}`:""}`,{method:kind==="create"?"POST":kind==="update"?"PATCH":"DELETE",...kind==="delete"?{}:{body:JSON.stringify({records:records.map((r)=>("id"in r)?{id:r.id,fields:r.set}:r)})}},true);const acknowledged=[],returned=[];try{if(!Array.isArray(result2.records))throw new Error;for(const value of result2.records){const r=object3(value);if(!recordId(r.id)||acknowledged.includes(r.id)||kind!=="create"&&!ids.has(r.id)||kind==="delete"&&r.deleted!==true)throw new Error;acknowledged.push(r.id);if(kind!=="delete")returned.push(record2(r))}if(acknowledged.length!==records.length)throw new Error}catch{throw new AirtableOperationError("Incomplete Airtable mutation acknowledgment",acknowledged.length?"partial":"uncertain",acknowledged.length?[receipt(acknowledged)]:[])}return{receipt:receipt(acknowledged),...kind==="delete"?{}:{records:returned}}}function nextOffset(value,seen){if(value===undefined)return;if(!text3(value)||seen.has(value))fail2("Malformed Airtable pagination");seen.add(value);return value}var MANAGED_CONNECTION_CAPABILITY_ENV="OS_MANAGED_CONNECTION_CAPABILITY";function managedConnections(capability){const endpoint=new URL(capability.endpoint);if(endpoint.protocol!=="http:"||endpoint.hostname!=="127.0.0.1"||!endpoint.port||endpoint.pathname!=="/"||endpoint.search||endpoint.hash||endpoint.username||endpoint.password||!/^[0-9a-f-]{36}$/.test(capability.token))throw new AirtableOperationError("Airtable capability unavailable");const transport=async(name,operation2,input)=>{let safeInput;try{safeInput=serializable(input)}catch{safeInput=null}try{const response=await fetch(new URL("airtable",endpoint),{method:"POST",redirect:"error",headers:{authorization:`Bearer ${capability.token}`,"content-type":"application/json"},body:JSON.stringify({name,operation:operation2,input:safeInput}),signal:AbortSignal.timeout(125000)});const value=await response.json();if(!response.ok)throw new AirtableOperationError("Airtable operation failed; the execution retains its evidence",value.effect==="partial"||value.effect==="uncertain"?value.effect:"unapplied",value.receipts??[]);return value}catch(error){if(error instanceof AirtableOperationError)throw error;throw new AirtableOperationError("Airtable parent acknowledgment unavailable",["records.create","records.update","records.delete"].includes(operation2)?"uncertain":"unapplied")}};return createConnections(transport)}var observer;function observeLocalRoutineEffects(value){observer=value}async function reportLocalRoutineEffect(value){await observer?.(value)}var identityPattern=/^(gmail|airtable|dropbox|outlook|sharepoint)\/([a-z0-9][a-z0-9-]{0,62})$/;var workspacePattern=/^[a-z0-9][a-z0-9-]{0,62}$/;var providerNames={gmail:"Gmail",airtable:"Airtable",dropbox:"Dropbox",outlook:"Outlook",sharepoint:"SharePoint"};function parseConnectionFailureDetail(value){if(!value||typeof value!=="object"||Array.isArray(value))throw new Error("Invalid Connection failure");const detail=value;if(!["identity","identity,workspace"].includes(Object.keys(detail).sort().join(","))||typeof detail.identity!=="string"||!identityPattern.test(detail.identity)||detail.workspace!==undefined&&(typeof detail.workspace!=="string"||!workspacePattern.test(detail.workspace)))throw new Error("Invalid Connection failure");return{identity:detail.identity,...detail.workspace===undefined?{}:{workspace:detail.workspace}}}function connectionFailureMessage(value){const detail=parseConnectionFailureDetail(value);const[,provider,name]=identityPattern.exec(detail.identity);const first=`Couldn’t use ${providerNames[provider]??provider} connection ${name}.`;return detail.workspace?`${first}
|
|
37
37
|
|
|
38
38
|
Check it with:
|
|
39
39
|
os connection test --workspace ${detail.workspace} --connection ${detail.identity}`:`${first}
|
|
@@ -15,7 +15,7 @@ export type { GmailRuntimeConnection, AirtableRuntimeConnection, DropboxRuntimeC
|
|
|
15
15
|
export type { Connections } from '../../../shared/airtable-contract.js';
|
|
16
16
|
export declare const connections: import('../../../shared/airtable-contract.js').Connections;
|
|
17
17
|
export { DataOperationError } from '../../../shared/data-contract.js';
|
|
18
|
-
export type { DataRepository, DataErrorCode, DataValidationDetail, DataFieldExpectation, PublicValueDefinition, PublicField, CollectionSummary, CollectionSchema, QueryScalar, SelectionOptions, RecordSelection, RecordsQuery, DataValue, SelectedRecord, SelectionMetadata, RecordsResult, RecordsReadInput, RecordsReadResult, RecordsSearchOptions, RecordsSearchResult,
|
|
18
|
+
export type { DataRepository, DataErrorCode, DataValidationDetail, DataFieldExpectation, PublicValueDefinition, PublicField, CollectionSummary, CollectionSchema, QueryScalar, SelectionOptions, RecordSelection, RecordsQuery, DataValue, SelectedRecord, SelectionMetadata, RecordsResult, RecordsReadInput, RecordsReadResult, RecordsSearchOptions, RecordsSearchResult, RecordIdentity, RecordCreation, RecordUpdateSet, AppliedChanges, DataChangeSet, DataEffect, DataFailureDetail, DataFailureCauseCode, LocalDataFileAction } from '../../../shared/data-contract.js';
|
|
19
19
|
declare global {
|
|
20
20
|
namespace __OddingtonOS {
|
|
21
21
|
/** Import-free OS-generated metadata; no runtime namespace is created. */
|
|
@@ -95,6 +95,8 @@ export type SelectedRecord = {
|
|
|
95
95
|
$version: string;
|
|
96
96
|
[field: string]: DataValue;
|
|
97
97
|
} & {
|
|
98
|
+
/** Present only on an exact read that explicitly requests the body. */
|
|
99
|
+
$body?: string;
|
|
98
100
|
/** Present only on an expanded qualified link occurrence. */
|
|
99
101
|
$fragment?: string;
|
|
100
102
|
};
|
|
@@ -119,6 +121,9 @@ export type RecordsResult<Query extends RecordsQuery = RecordsQuery> = string ex
|
|
|
119
121
|
};
|
|
120
122
|
export type RecordIdentity = Pick<SelectedRecord, '$ref' | '$version'>;
|
|
121
123
|
export type RecordsReadInput = string | readonly string[];
|
|
124
|
+
export type RecordsReadOptions = {
|
|
125
|
+
body?: true;
|
|
126
|
+
};
|
|
122
127
|
export type RecordsReadResult = {
|
|
123
128
|
$meta: {
|
|
124
129
|
version: string;
|
|
@@ -155,49 +160,6 @@ export type AppliedChanges = {
|
|
|
155
160
|
updated: RecordIdentity[];
|
|
156
161
|
deleted: RecordIdentity[];
|
|
157
162
|
};
|
|
158
|
-
export type HistoryListOptions = {
|
|
159
|
-
limit?: number;
|
|
160
|
-
before?: string;
|
|
161
|
-
};
|
|
162
|
-
export type HistoryChangesOptions = {
|
|
163
|
-
collections?: string[];
|
|
164
|
-
refs?: string[];
|
|
165
|
-
from?: string;
|
|
166
|
-
through?: string;
|
|
167
|
-
limit?: number;
|
|
168
|
-
after?: string;
|
|
169
|
-
};
|
|
170
|
-
export type HistoryEntry = {
|
|
171
|
-
version: string;
|
|
172
|
-
publishedAt: string;
|
|
173
|
-
author: {
|
|
174
|
-
name: string;
|
|
175
|
-
email: string;
|
|
176
|
-
};
|
|
177
|
-
authoredAt: string;
|
|
178
|
-
committer: {
|
|
179
|
-
name: string;
|
|
180
|
-
email: string;
|
|
181
|
-
};
|
|
182
|
-
committedAt: string;
|
|
183
|
-
message: string;
|
|
184
|
-
created: string[];
|
|
185
|
-
updated: string[];
|
|
186
|
-
deleted: string[];
|
|
187
|
-
};
|
|
188
|
-
export type HistoryChange = Omit<HistoryEntry, 'created' | 'updated' | 'deleted'> & {
|
|
189
|
-
$ref: string;
|
|
190
|
-
change: 'created' | 'updated' | 'deleted';
|
|
191
|
-
before: SelectedRecord | null;
|
|
192
|
-
after: SelectedRecord | null;
|
|
193
|
-
};
|
|
194
|
-
export type HistoryChangesResult = {
|
|
195
|
-
$meta: {
|
|
196
|
-
through: string;
|
|
197
|
-
next?: string;
|
|
198
|
-
};
|
|
199
|
-
changes: HistoryChange[];
|
|
200
|
-
};
|
|
201
163
|
export interface DataChangeSet {
|
|
202
164
|
create(record: RecordCreation): void;
|
|
203
165
|
update(record: RecordIdentity, set: RecordUpdateSet): void;
|
|
@@ -216,16 +178,11 @@ export interface DataRepository {
|
|
|
216
178
|
all<Query extends RecordsQuery>(query: Query, options: {
|
|
217
179
|
maxRecords: number;
|
|
218
180
|
}): Promise<RecordsResult<Query>>;
|
|
219
|
-
read(ref: string): Promise<SelectedRecord | null>;
|
|
220
|
-
read(refs: readonly string[]): Promise<RecordsReadResult>;
|
|
221
|
-
read(input: RecordsReadInput): Promise<SelectedRecord | null | RecordsReadResult>;
|
|
181
|
+
read(ref: string, options?: RecordsReadOptions): Promise<SelectedRecord | null>;
|
|
182
|
+
read(refs: readonly string[], options?: RecordsReadOptions): Promise<RecordsReadResult>;
|
|
183
|
+
read(input: RecordsReadInput, options?: RecordsReadOptions): Promise<SelectedRecord | null | RecordsReadResult>;
|
|
222
184
|
search(query: string, options?: RecordsSearchOptions): Promise<RecordsSearchResult>;
|
|
223
185
|
};
|
|
224
|
-
history: {
|
|
225
|
-
list(options?: HistoryListOptions): Promise<HistoryEntry[]>;
|
|
226
|
-
at(instant: string): Promise<HistoryEntry | null>;
|
|
227
|
-
changes(options?: HistoryChangesOptions): Promise<HistoryChangesResult>;
|
|
228
|
-
};
|
|
229
186
|
changes(): DataChangeSet;
|
|
230
187
|
}
|
|
231
188
|
export type DataErrorCode = 'context_unavailable' | 'unauthenticated' | 'access_denied' | 'invalid_query' | 'request_too_large' | 'capacity' | 'unavailable' | 'invalid_change' | 'conflict' | 'apply_pending';
|