@zocomputer/system-api 0.2.0 → 0.3.1

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.
@@ -29,6 +29,7 @@ declare function readToken(): Promise<string>;
29
29
  interface FetchExportOptions {
30
30
  readonly timeoutMs?: number;
31
31
  readonly maxBytes?: number;
32
+ readonly cachedBytes?: Uint8Array;
32
33
  }
33
34
  declare function fetchExport(baseUrl: URL, workspace: string, catalog: string | undefined, token: string, options?: FetchExportOptions): Promise<Uint8Array>;
34
35
  /**
@@ -18,7 +18,7 @@
18
18
  import { createHash } from "node:crypto";
19
19
  import { realpathSync } from "node:fs";
20
20
  import { existsSync, readFileSync, readdirSync } from "node:fs";
21
- import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
21
+ import { lstat, mkdir, readFile, rename, rm, writeFile, } from "node:fs/promises";
22
22
  import { dirname, join, resolve } from "node:path";
23
23
  import { argv } from "node:process";
24
24
  import { fileURLToPath } from "node:url";
@@ -33,11 +33,11 @@ class CliError extends Error {
33
33
  */
34
34
  const MAX_EXPORT_BYTES = 4 * 1024 * 1024;
35
35
  /**
36
- * Client deadline for the export request. The service bounds its own work at 90s
36
+ * Client deadline for the export request. The service bounds its own work at 210s
37
37
  * (MAX_REQUEST_SECONDS); this leaves margin for the round trip, but a truly
38
38
  * stalled endpoint can never hang the CLI forever.
39
39
  */
40
- const EXPORT_TIMEOUT_MS = 120_000;
40
+ const EXPORT_TIMEOUT_MS = 240_000;
41
41
  function parseArgs(argv) {
42
42
  const flags = new Map();
43
43
  let check = false;
@@ -131,10 +131,16 @@ async function fetchExport(baseUrl, workspace, catalog, token, options = {}) {
131
131
  endpoint.searchParams.set("workspace_id", workspace);
132
132
  if (catalog !== undefined)
133
133
  endpoint.searchParams.set("catalog", catalog);
134
+ const cached = options.cachedBytes;
135
+ const etag = cached && cached.byteLength <= maxBytes ? `"${digest(cached)}"` : undefined;
134
136
  let response;
135
137
  try {
136
138
  response = await fetch(endpoint, {
137
- headers: { authorization: `Bearer ${token}`, accept: "application/json" },
139
+ headers: {
140
+ authorization: `Bearer ${token}`,
141
+ accept: "application/json",
142
+ ...(etag ? { "If-None-Match": etag } : {}),
143
+ },
138
144
  redirect: "manual",
139
145
  signal: AbortSignal.timeout(timeoutMs),
140
146
  });
@@ -147,8 +153,15 @@ async function fetchExport(baseUrl, workspace, catalog, token, options = {}) {
147
153
  // With redirect:"manual", undici surfaces a 3xx as an opaque redirect: refuse
148
154
  // it rather than let fetch resend the Authorization header to a new origin.
149
155
  if (response.type === "opaqueredirect" ||
150
- (response.status >= 300 && response.status < 400))
156
+ (response.status >= 300 && response.status < 400 && response.status !== 304))
151
157
  throw new CliError("catalog export endpoint returned a redirect; refusing to follow it");
158
+ if (response.status === 304) {
159
+ if (cached === undefined ||
160
+ etag === undefined ||
161
+ response.headers.get("etag") !== etag)
162
+ throw new CliError("catalog export returned 304 without matching saved bytes");
163
+ return cached;
164
+ }
152
165
  if (!response.ok)
153
166
  throw new CliError(`catalog export request failed with HTTP ${response.status}`);
154
167
  return readBounded(response, maxBytes);
@@ -288,7 +301,12 @@ async function runGenerate(args) {
288
301
  const baseUrl = validateBaseUrl(args.baseUrl);
289
302
  if (args.workspace === undefined || args.workspace === "")
290
303
  throw new CliError("--workspace <id> is required when fetching from --base-url");
291
- schemaBytes = await fetchExport(baseUrl, args.workspace, args.catalog, await readToken());
304
+ const savedPath = join(resolve(args.out), "schema.json");
305
+ const savedStat = await lstat(savedPath).catch(() => undefined);
306
+ const savedBytes = savedStat?.isFile() && savedStat.size <= MAX_EXPORT_BYTES
307
+ ? new Uint8Array(await readFile(savedPath))
308
+ : undefined;
309
+ schemaBytes = await fetchExport(baseUrl, args.workspace, args.catalog, await readToken(), { cachedBytes: savedBytes });
292
310
  }
293
311
  // generateBundle snapshots schemaBytes and derives the model internally, so the
294
312
  // emitted types and persisted schema.json always come from one immutable source.
@@ -43,7 +43,7 @@ export const catalog = defineCatalog({
43
43
  "zo.agent.list_messages": {
44
44
  defaultVersion: 1,
45
45
  versions: {
46
- 1: { digest: "sha256:a8e34e154f63267fa02c162d32cd887f95eeac983693ea1c6570c6504ebe202d" },
46
+ 1: { digest: "sha256:983f22ac6e48618bb3290155e3d7723ae1be7e885f78f9135f3ee0f37e5d0d16" },
47
47
  },
48
48
  },
49
49
  "zo.agent.send": {
@@ -61,25 +61,25 @@ export const catalog = defineCatalog({
61
61
  "zo.agent_session.get": {
62
62
  defaultVersion: 1,
63
63
  versions: {
64
- 1: { digest: "sha256:fa7d4538f2a14134318196e18081aca325cd991851561a50071e92808becdb1f" },
64
+ 1: { digest: "sha256:c9a0287765cc63f5c2681159cfbf66c1546a423fd3fdb2c21684169de7f29680" },
65
65
  },
66
66
  },
67
67
  "zo.agent_session.history": {
68
68
  defaultVersion: 1,
69
69
  versions: {
70
- 1: { digest: "sha256:1d5dc59be3ce5b5186b4f3675283d0a87ff4aed46374e2d419defefaa85e2758" },
70
+ 1: { digest: "sha256:0ec9eeab9cf92d991c5586cbb00eb01a9c56a9b0f81b1b3b8d372e2e70b9419a" },
71
71
  },
72
72
  },
73
73
  "zo.agent_session.list": {
74
74
  defaultVersion: 1,
75
75
  versions: {
76
- 1: { digest: "sha256:ccad299f85ad1e29daa8630f04f7844e9db5aff02940dbb700cb173bf25017a1" },
76
+ 1: { digest: "sha256:77d2dc953e6259fb131c0d2e219299589c4fbfdab41f4db90140108e91e661ca" },
77
77
  },
78
78
  },
79
79
  "zo.agent_session.list_workspace": {
80
80
  defaultVersion: 1,
81
81
  versions: {
82
- 1: { digest: "sha256:0c0023c827285b09c4e7fbb9d001c89faca96ee293d769568d77baf63885b0a2" },
82
+ 1: { digest: "sha256:332ee8b48ca75d74d5e09e4b71c030bca6ad9c3950b1d02ce532dfbb041116db" },
83
83
  },
84
84
  },
85
85
  "zo.billing.list_rates": {
@@ -127,13 +127,13 @@ export const catalog = defineCatalog({
127
127
  "zo.connection.get": {
128
128
  defaultVersion: 1,
129
129
  versions: {
130
- 1: { digest: "sha256:5ca6347217eba21af2b37e1830df0252e5d4115a3f7ee4f9357bed5e11280861" },
130
+ 1: { digest: "sha256:888acd2e1feba5b19c1905857e5125329737f23ec450b85a4d63e1879b585cf2" },
131
131
  },
132
132
  },
133
133
  "zo.connection.list": {
134
134
  defaultVersion: 1,
135
135
  versions: {
136
- 1: { digest: "sha256:92aca1c5160f58db8d84f380e55f271730a7159e4ca3d2bddde8462adba18a30" },
136
+ 1: { digest: "sha256:980544a4939be631e0b12a1930bd7fa07266ee893055cb2187a97e75e791c6d7" },
137
137
  },
138
138
  },
139
139
  "zo.connection.register_resource": {
@@ -309,13 +309,13 @@ export const catalog = defineCatalog({
309
309
  "zo.function.get": {
310
310
  defaultVersion: 1,
311
311
  versions: {
312
- 1: { digest: "sha256:8fefdcc1440b09264f2c0b0a31ef8f3cefb5f2fe79f0166341e7537addf89819" },
312
+ 1: { digest: "sha256:a7003bbcae500ade1da64eb0f61f5442119a59ec2ab0c8c402c9627b3d1dfffb" },
313
313
  },
314
314
  },
315
315
  "zo.function.get_run": {
316
316
  defaultVersion: 1,
317
317
  versions: {
318
- 1: { digest: "sha256:2505ec5258453629ea98a3d70911387096dbbd4c2f68d5c2c24ee5f32746eaca" },
318
+ 1: { digest: "sha256:e2ffa72539a3742262be01ce613f5da85c900f4d2c1a30358fbf3d08b6bc6ba0" },
319
319
  },
320
320
  },
321
321
  "zo.function.invoke": {
@@ -333,7 +333,7 @@ export const catalog = defineCatalog({
333
333
  "zo.function.list_runs": {
334
334
  defaultVersion: 1,
335
335
  versions: {
336
- 1: { digest: "sha256:5afb66f0e9685192469f0fda5db8ea0cf49cf1a645ab23d22a03bc8698c8a7b4" },
336
+ 1: { digest: "sha256:4c4ca436fc7e5ef58880efeace4433508105f2f749b9609eb799609ffd648fa2" },
337
337
  },
338
338
  },
339
339
  "zo.function.publish_contract": {
@@ -471,13 +471,25 @@ export const catalog = defineCatalog({
471
471
  "zo.message.get": {
472
472
  defaultVersion: 1,
473
473
  versions: {
474
- 1: { digest: "sha256:aadcb480b26c475386eb47a4694a413a0b118969638cd9bfd9d9e5d68b5f758e" },
474
+ 1: { digest: "sha256:ac04dbbd2642ad79c98bfd056cdef95a2db7538415dba5987ffc4adb2e4868dd" },
475
+ },
476
+ },
477
+ "zo.model.generate_text": {
478
+ defaultVersion: 1,
479
+ versions: {
480
+ 1: { digest: "sha256:3b53f6bc7b92dbda22ad01a97d1c69baaf567234ef35d364297f96c979bca184" },
481
+ },
482
+ },
483
+ "zo.model.list": {
484
+ defaultVersion: 1,
485
+ versions: {
486
+ 1: { digest: "sha256:33b88b18e759ba942f7bf344798e5f693926666a1bc2947b75b1c1cc6e1a8fbc" },
475
487
  },
476
488
  },
477
489
  "zo.oauth_app.create": {
478
490
  defaultVersion: 1,
479
491
  versions: {
480
- 1: { digest: "sha256:36487e5b7a08bfe7fb60077cbdf001f9e49bcdad39180a2f39f4f338198d23ce" },
492
+ 1: { digest: "sha256:d9216f3b7e1c6aa991dfd4572f88a4eff1f97e0bbd08bcaa9b28827d7536a828" },
481
493
  },
482
494
  },
483
495
  "zo.oauth_app.delete": {
@@ -501,7 +513,7 @@ export const catalog = defineCatalog({
501
513
  "zo.oauth_app.update": {
502
514
  defaultVersion: 1,
503
515
  versions: {
504
- 1: { digest: "sha256:f5478f52aaa077c985cab0e10a44a13c9ac72d6dedac67d6974ef831e5aded61" },
516
+ 1: { digest: "sha256:4b2d3c01b760b5007430f546a25fc645ad587fcc8aac0aacaf61bfcdab6c3d1f" },
505
517
  },
506
518
  },
507
519
  "zo.quota.get": {
@@ -721,7 +733,7 @@ export const catalog = defineCatalog({
721
733
  "zo.website.create": {
722
734
  defaultVersion: 1,
723
735
  versions: {
724
- 1: { digest: "sha256:8c7b48e80e39d01eb6fa121ba0a2688deba2f2ba7396dee8e3f583d7f6c884ff" },
736
+ 1: { digest: "sha256:1a383ed93cdc7acb59c8937a36be01157a90dba7923afc6ffc8304a5080475f2" },
725
737
  },
726
738
  },
727
739
  "zo.website.delete": {
@@ -733,19 +745,19 @@ export const catalog = defineCatalog({
733
745
  "zo.website.get": {
734
746
  defaultVersion: 1,
735
747
  versions: {
736
- 1: { digest: "sha256:e95171ac43bb4bf95e277a4c6777ee8061c728feb119cbfc2354dc45dfb82d49" },
748
+ 1: { digest: "sha256:2ecc0a4426f4cb62d99e7953c7cc2905417f1a97996ed79ad8b2fa5e539aea9c" },
737
749
  },
738
750
  },
739
751
  "zo.website.list": {
740
752
  defaultVersion: 1,
741
753
  versions: {
742
- 1: { digest: "sha256:1acce33b16bd903d94f40273da1785d694f99444facb40e166a061190db1bb74" },
754
+ 1: { digest: "sha256:a4c5d48b532bc4a9323278889bc14679b58e50f189225e2b191408b16cf0e5b2" },
743
755
  },
744
756
  },
745
757
  "zo.website.update": {
746
758
  defaultVersion: 1,
747
759
  versions: {
748
- 1: { digest: "sha256:99ad2a085bd283d6fee339a8c3c1adf1414065e7f0a5714f0292ba352c9d7655" },
760
+ 1: { digest: "sha256:954824c368536054d6b91ed7131afba47b09abd1e5f9cacfc7a89479f2f37133" },
749
761
  },
750
762
  },
751
763
  "zo.website_route.create": {
@@ -823,7 +835,7 @@ export const catalog = defineCatalog({
823
835
  "zo.workflow.get_run": {
824
836
  defaultVersion: 1,
825
837
  versions: {
826
- 1: { digest: "sha256:00478ddd31dbeb45aa4fd30e09eddfd5bec875dbf9257e5a412f51d54cc06e53" },
838
+ 1: { digest: "sha256:3064b3976db41d34bcabbdc4d709195eb7cb0fa9e5b3dfd7b55cf682e91720ab" },
827
839
  },
828
840
  },
829
841
  "zo.workflow.invoke": {
@@ -841,7 +853,7 @@ export const catalog = defineCatalog({
841
853
  "zo.workflow.list_runs": {
842
854
  defaultVersion: 1,
843
855
  versions: {
844
- 1: { digest: "sha256:aceef50f9aa81c86aee06efb7adfa831673879888d32e4e3b57ab16387f6cbee" },
856
+ 1: { digest: "sha256:ac1c9dc13fa389ef7a7458da1b2d7a749e7532264aa9f17c14028806fe7be968" },
845
857
  },
846
858
  },
847
859
  "zo.workflow.publish": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "generatorVersion": "0.1.0",
3
- "schemaDigest": "sha256:72a660c4863ad100211dacc6ed13014d46a5311230b0e648e2870e2d4c3f0be4",
4
- "bundleDigest": "sha256:de6be59967662af94952484e0c7aaa593df24fbe49b8bf15c25685e00f5194c4",
3
+ "schemaDigest": "sha256:5efcff731683bd222f815032f63155a41134ba7ed47b8b63caa7736a2e5950a3",
4
+ "bundleDigest": "sha256:40f79e00f48091e3d1f779cea67334314930fe718bc9ce549b2385ea29c2a16e",
5
5
  "actions": [
6
6
  {
7
7
  "action": "zo.activity.list",
@@ -36,7 +36,7 @@
36
36
  {
37
37
  "action": "zo.agent.list_messages",
38
38
  "version": 1,
39
- "digest": "sha256:a8e34e154f63267fa02c162d32cd887f95eeac983693ea1c6570c6504ebe202d"
39
+ "digest": "sha256:983f22ac6e48618bb3290155e3d7723ae1be7e885f78f9135f3ee0f37e5d0d16"
40
40
  },
41
41
  {
42
42
  "action": "zo.agent.send",
@@ -51,22 +51,22 @@
51
51
  {
52
52
  "action": "zo.agent_session.get",
53
53
  "version": 1,
54
- "digest": "sha256:fa7d4538f2a14134318196e18081aca325cd991851561a50071e92808becdb1f"
54
+ "digest": "sha256:c9a0287765cc63f5c2681159cfbf66c1546a423fd3fdb2c21684169de7f29680"
55
55
  },
56
56
  {
57
57
  "action": "zo.agent_session.history",
58
58
  "version": 1,
59
- "digest": "sha256:1d5dc59be3ce5b5186b4f3675283d0a87ff4aed46374e2d419defefaa85e2758"
59
+ "digest": "sha256:0ec9eeab9cf92d991c5586cbb00eb01a9c56a9b0f81b1b3b8d372e2e70b9419a"
60
60
  },
61
61
  {
62
62
  "action": "zo.agent_session.list",
63
63
  "version": 1,
64
- "digest": "sha256:ccad299f85ad1e29daa8630f04f7844e9db5aff02940dbb700cb173bf25017a1"
64
+ "digest": "sha256:77d2dc953e6259fb131c0d2e219299589c4fbfdab41f4db90140108e91e661ca"
65
65
  },
66
66
  {
67
67
  "action": "zo.agent_session.list_workspace",
68
68
  "version": 1,
69
- "digest": "sha256:0c0023c827285b09c4e7fbb9d001c89faca96ee293d769568d77baf63885b0a2"
69
+ "digest": "sha256:332ee8b48ca75d74d5e09e4b71c030bca6ad9c3950b1d02ce532dfbb041116db"
70
70
  },
71
71
  {
72
72
  "action": "zo.billing.list_rates",
@@ -106,12 +106,12 @@
106
106
  {
107
107
  "action": "zo.connection.get",
108
108
  "version": 1,
109
- "digest": "sha256:5ca6347217eba21af2b37e1830df0252e5d4115a3f7ee4f9357bed5e11280861"
109
+ "digest": "sha256:888acd2e1feba5b19c1905857e5125329737f23ec450b85a4d63e1879b585cf2"
110
110
  },
111
111
  {
112
112
  "action": "zo.connection.list",
113
113
  "version": 1,
114
- "digest": "sha256:92aca1c5160f58db8d84f380e55f271730a7159e4ca3d2bddde8462adba18a30"
114
+ "digest": "sha256:980544a4939be631e0b12a1930bd7fa07266ee893055cb2187a97e75e791c6d7"
115
115
  },
116
116
  {
117
117
  "action": "zo.connection.register_resource",
@@ -266,12 +266,12 @@
266
266
  {
267
267
  "action": "zo.function.get",
268
268
  "version": 1,
269
- "digest": "sha256:8fefdcc1440b09264f2c0b0a31ef8f3cefb5f2fe79f0166341e7537addf89819"
269
+ "digest": "sha256:a7003bbcae500ade1da64eb0f61f5442119a59ec2ab0c8c402c9627b3d1dfffb"
270
270
  },
271
271
  {
272
272
  "action": "zo.function.get_run",
273
273
  "version": 1,
274
- "digest": "sha256:2505ec5258453629ea98a3d70911387096dbbd4c2f68d5c2c24ee5f32746eaca"
274
+ "digest": "sha256:e2ffa72539a3742262be01ce613f5da85c900f4d2c1a30358fbf3d08b6bc6ba0"
275
275
  },
276
276
  {
277
277
  "action": "zo.function.invoke",
@@ -286,7 +286,7 @@
286
286
  {
287
287
  "action": "zo.function.list_runs",
288
288
  "version": 1,
289
- "digest": "sha256:5afb66f0e9685192469f0fda5db8ea0cf49cf1a645ab23d22a03bc8698c8a7b4"
289
+ "digest": "sha256:4c4ca436fc7e5ef58880efeace4433508105f2f749b9609eb799609ffd648fa2"
290
290
  },
291
291
  {
292
292
  "action": "zo.function.publish_contract",
@@ -401,12 +401,22 @@
401
401
  {
402
402
  "action": "zo.message.get",
403
403
  "version": 1,
404
- "digest": "sha256:aadcb480b26c475386eb47a4694a413a0b118969638cd9bfd9d9e5d68b5f758e"
404
+ "digest": "sha256:ac04dbbd2642ad79c98bfd056cdef95a2db7538415dba5987ffc4adb2e4868dd"
405
+ },
406
+ {
407
+ "action": "zo.model.generate_text",
408
+ "version": 1,
409
+ "digest": "sha256:3b53f6bc7b92dbda22ad01a97d1c69baaf567234ef35d364297f96c979bca184"
410
+ },
411
+ {
412
+ "action": "zo.model.list",
413
+ "version": 1,
414
+ "digest": "sha256:33b88b18e759ba942f7bf344798e5f693926666a1bc2947b75b1c1cc6e1a8fbc"
405
415
  },
406
416
  {
407
417
  "action": "zo.oauth_app.create",
408
418
  "version": 1,
409
- "digest": "sha256:36487e5b7a08bfe7fb60077cbdf001f9e49bcdad39180a2f39f4f338198d23ce"
419
+ "digest": "sha256:d9216f3b7e1c6aa991dfd4572f88a4eff1f97e0bbd08bcaa9b28827d7536a828"
410
420
  },
411
421
  {
412
422
  "action": "zo.oauth_app.delete",
@@ -426,7 +436,7 @@
426
436
  {
427
437
  "action": "zo.oauth_app.update",
428
438
  "version": 1,
429
- "digest": "sha256:f5478f52aaa077c985cab0e10a44a13c9ac72d6dedac67d6974ef831e5aded61"
439
+ "digest": "sha256:4b2d3c01b760b5007430f546a25fc645ad587fcc8aac0aacaf61bfcdab6c3d1f"
430
440
  },
431
441
  {
432
442
  "action": "zo.quota.get",
@@ -626,7 +636,7 @@
626
636
  {
627
637
  "action": "zo.website.create",
628
638
  "version": 1,
629
- "digest": "sha256:8c7b48e80e39d01eb6fa121ba0a2688deba2f2ba7396dee8e3f583d7f6c884ff"
639
+ "digest": "sha256:1a383ed93cdc7acb59c8937a36be01157a90dba7923afc6ffc8304a5080475f2"
630
640
  },
631
641
  {
632
642
  "action": "zo.website.delete",
@@ -636,17 +646,17 @@
636
646
  {
637
647
  "action": "zo.website.get",
638
648
  "version": 1,
639
- "digest": "sha256:e95171ac43bb4bf95e277a4c6777ee8061c728feb119cbfc2354dc45dfb82d49"
649
+ "digest": "sha256:2ecc0a4426f4cb62d99e7953c7cc2905417f1a97996ed79ad8b2fa5e539aea9c"
640
650
  },
641
651
  {
642
652
  "action": "zo.website.list",
643
653
  "version": 1,
644
- "digest": "sha256:1acce33b16bd903d94f40273da1785d694f99444facb40e166a061190db1bb74"
654
+ "digest": "sha256:a4c5d48b532bc4a9323278889bc14679b58e50f189225e2b191408b16cf0e5b2"
645
655
  },
646
656
  {
647
657
  "action": "zo.website.update",
648
658
  "version": 1,
649
- "digest": "sha256:99ad2a085bd283d6fee339a8c3c1adf1414065e7f0a5714f0292ba352c9d7655"
659
+ "digest": "sha256:954824c368536054d6b91ed7131afba47b09abd1e5f9cacfc7a89479f2f37133"
650
660
  },
651
661
  {
652
662
  "action": "zo.website_route.create",
@@ -711,7 +721,7 @@
711
721
  {
712
722
  "action": "zo.workflow.get_run",
713
723
  "version": 1,
714
- "digest": "sha256:00478ddd31dbeb45aa4fd30e09eddfd5bec875dbf9257e5a412f51d54cc06e53"
724
+ "digest": "sha256:3064b3976db41d34bcabbdc4d709195eb7cb0fa9e5b3dfd7b55cf682e91720ab"
715
725
  },
716
726
  {
717
727
  "action": "zo.workflow.invoke",
@@ -726,7 +736,7 @@
726
736
  {
727
737
  "action": "zo.workflow.list_runs",
728
738
  "version": 1,
729
- "digest": "sha256:aceef50f9aa81c86aee06efb7adfa831673879888d32e4e3b57ab16387f6cbee"
739
+ "digest": "sha256:ac1c9dc13fa389ef7a7458da1b2d7a749e7532264aa9f17c14028806fe7be968"
730
740
  },
731
741
  {
732
742
  "action": "zo.workflow.publish",