orizu 0.5.39 → 0.5.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +77 -0
  2. package/dist/dataset-clone-workflow.d.ts +11 -0
  3. package/dist/dataset-clone-workflow.d.ts.map +1 -0
  4. package/dist/dataset-clone-workflow.js +100 -0
  5. package/dist/dataset-commands.d.ts +3 -1
  6. package/dist/dataset-commands.d.ts.map +1 -1
  7. package/dist/dataset-commands.js +107 -91
  8. package/dist/dataset-delete-workflow.d.ts +4 -0
  9. package/dist/dataset-delete-workflow.d.ts.map +1 -0
  10. package/dist/dataset-delete-workflow.js +75 -0
  11. package/dist/dataset-lock-workflow.d.ts +12 -0
  12. package/dist/dataset-lock-workflow.d.ts.map +1 -0
  13. package/dist/dataset-lock-workflow.js +76 -0
  14. package/dist/dataset-readme-workflow.d.ts +13 -0
  15. package/dist/dataset-readme-workflow.d.ts.map +1 -0
  16. package/dist/dataset-readme-workflow.js +82 -0
  17. package/dist/dataset-row-workflow.d.ts +14 -0
  18. package/dist/dataset-row-workflow.d.ts.map +1 -0
  19. package/dist/dataset-row-workflow.js +202 -0
  20. package/dist/dataset-split-reads.d.ts +28 -0
  21. package/dist/dataset-split-reads.d.ts.map +1 -0
  22. package/dist/dataset-split-reads.js +47 -0
  23. package/dist/dataset-transfer-upload.d.ts +2 -6
  24. package/dist/dataset-transfer-upload.d.ts.map +1 -1
  25. package/dist/dataset-transfer-upload.js +9 -2
  26. package/dist/dataset-upload-snapshot.d.ts.map +1 -1
  27. package/dist/dataset-upload-snapshot.js +7 -1
  28. package/dist/dataset-version-workflow.d.ts +24 -0
  29. package/dist/dataset-version-workflow.d.ts.map +1 -0
  30. package/dist/dataset-version-workflow.js +99 -0
  31. package/dist/feedback-cli.js +3 -3
  32. package/dist/help.d.ts.map +1 -1
  33. package/dist/help.js +29 -3
  34. package/dist/hosted-boot.d.ts +1 -0
  35. package/dist/hosted-boot.d.ts.map +1 -1
  36. package/dist/hosted-boot.js +17 -0
  37. package/dist/hosted-harness-opencode.d.ts +5 -6
  38. package/dist/hosted-harness-opencode.d.ts.map +1 -1
  39. package/dist/hosted-harness-opencode.js +73 -59
  40. package/dist/hosted-loop-lifecycle.d.ts +6 -11
  41. package/dist/hosted-loop-lifecycle.d.ts.map +1 -1
  42. package/dist/hosted-loop-lifecycle.js +6 -11
  43. package/dist/hosted-loop.d.ts +9 -0
  44. package/dist/hosted-loop.d.ts.map +1 -1
  45. package/dist/hosted-loop.js +19 -10
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +11 -3
  48. package/dist/instruction-delivery.d.ts +14 -0
  49. package/dist/instruction-delivery.d.ts.map +1 -0
  50. package/dist/instruction-delivery.js +103 -0
  51. package/dist/instruction-set-sync/index.d.ts +17 -0
  52. package/dist/instruction-set-sync/index.d.ts.map +1 -1
  53. package/dist/instruction-set-sync/index.js +44 -17
  54. package/dist/instruction-set-update/index.d.ts +2 -2
  55. package/dist/instruction-set-update/index.d.ts.map +1 -1
  56. package/dist/instruction-set-update/index.js +2 -2
  57. package/dist/instruction-sets-cli.d.ts.map +1 -1
  58. package/dist/instruction-sets-cli.js +19 -27
  59. package/dist/json-response.d.ts +1 -0
  60. package/dist/json-response.d.ts.map +1 -1
  61. package/dist/json-response.js +7 -0
  62. package/dist/last-error-record.d.ts +4 -2
  63. package/dist/last-error-record.d.ts.map +1 -1
  64. package/dist/last-error-record.js +10 -68
  65. package/dist/last-error-workflow.d.ts +4 -0
  66. package/dist/last-error-workflow.d.ts.map +1 -0
  67. package/dist/last-error-workflow.js +78 -0
  68. package/dist/preview-runtime.d.ts +2 -2
  69. package/dist/preview-runtime.d.ts.map +1 -1
  70. package/dist/preview-runtime.js +37 -7
  71. package/dist/task-commands.d.ts.map +1 -1
  72. package/dist/task-commands.js +9 -16
  73. package/dist/task-export-workflow.d.ts +4 -0
  74. package/dist/task-export-workflow.d.ts.map +1 -0
  75. package/dist/task-export-workflow.js +46 -0
  76. package/dist/task-report-workflow.d.ts +47 -0
  77. package/dist/task-report-workflow.d.ts.map +1 -0
  78. package/dist/task-report-workflow.js +160 -0
  79. package/dist/workbench-cli.js +1 -1
  80. package/package.json +1 -1
  81. package/src/dataset-clone-workflow.ts +100 -0
  82. package/src/dataset-commands.ts +95 -142
  83. package/src/dataset-delete-workflow.ts +72 -0
  84. package/src/dataset-lock-workflow.ts +74 -0
  85. package/src/dataset-readme-workflow.ts +80 -0
  86. package/src/dataset-row-workflow.ts +248 -0
  87. package/src/dataset-split-reads.ts +43 -0
  88. package/src/dataset-transfer-upload.ts +12 -5
  89. package/src/dataset-upload-snapshot.ts +8 -1
  90. package/src/dataset-version-workflow.ts +105 -0
  91. package/src/feedback-cli.ts +4 -4
  92. package/src/help.ts +29 -3
  93. package/src/hosted-boot.ts +16 -1
  94. package/src/hosted-harness-opencode.ts +74 -72
  95. package/src/hosted-loop-lifecycle.ts +6 -11
  96. package/src/hosted-loop.ts +20 -10
  97. package/src/hosted-model-cache.d.mts +2 -0
  98. package/src/hosted-model-cache.mjs +53 -0
  99. package/src/index.ts +12 -2
  100. package/src/instruction-delivery.ts +123 -0
  101. package/src/instruction-set-sync/index.ts +61 -14
  102. package/src/instruction-set-update/index.ts +4 -3
  103. package/src/instruction-sets-cli.ts +19 -27
  104. package/src/json-response.ts +8 -0
  105. package/src/last-error-record.ts +11 -85
  106. package/src/last-error-workflow.ts +121 -0
  107. package/src/preview-runtime.ts +40 -10
  108. package/src/task-commands.ts +9 -43
  109. package/src/task-export-workflow.ts +56 -0
  110. package/src/task-report-workflow.ts +179 -0
  111. package/src/workbench-cli.ts +1 -1
  112. package/vendor/skills/orizu/references/cli-reference.md +34 -0
  113. package/vendor/skills/orizu/references/dataset-design.md +1 -1
  114. package/dist/dataset-edit-rows.d.ts +0 -10
  115. package/dist/dataset-edit-rows.d.ts.map +0 -1
  116. package/dist/dataset-edit-rows.js +0 -90
  117. package/src/dataset-edit-rows.ts +0 -124
@@ -0,0 +1,12 @@
1
+ import { Schema } from 'effect';
2
+ declare const LockedDataset: Schema.Struct<{
3
+ readonly id: Schema.String;
4
+ readonly name: Schema.String;
5
+ readonly rowCount: Schema.Number;
6
+ readonly lockedAt: Schema.String;
7
+ readonly lockedBy: Schema.NullOr<Schema.String>;
8
+ }>;
9
+ export type LockedDataset = typeof LockedDataset.Type;
10
+ export declare function lockDataset(datasetId: string, reason: string | null): Promise<LockedDataset>;
11
+ export {};
12
+ //# sourceMappingURL=dataset-lock-workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset-lock-workflow.d.ts","sourceRoot":"","sources":["../src/dataset-lock-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,MAAM,EAAE,MAAM,QAAQ,CAAA;AAU5D,QAAA,MAAM,aAAa;;;;;;EAMjB,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;AAmDrD,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAIlG"}
@@ -0,0 +1,76 @@
1
+ import { Cause, Effect, Exit, Result, Schema } from 'effect';
2
+ import { datasetTransferTimeoutMs } from './dataset-transfer-policy.js';
3
+ import { authedFetch } from './http.js';
4
+ import { parseJsonResponse } from './json-response.js';
5
+ // Loaded only through `await import(...)` from dataset-commands, like append.
6
+ const MAY_BE_LOCKED = 'The dataset may already be locked: running `orizu datasets lock` again is safe and shows its current state.';
7
+ const LockedDataset = Schema.Struct({
8
+ id: Schema.String,
9
+ name: Schema.String,
10
+ rowCount: Schema.Number,
11
+ lockedAt: Schema.String,
12
+ lockedBy: Schema.NullOr(Schema.String),
13
+ });
14
+ const LockReply = Schema.Struct({ dataset: LockedDataset });
15
+ // A refusal (4xx) means nothing was locked. After any other failure once the
16
+ // request was sent, the lock may have committed; locking again is harmless.
17
+ class LockFailure extends Error {
18
+ mayBeLocked;
19
+ constructor(message, mayBeLocked) {
20
+ super(message);
21
+ this.mayBeLocked = mayBeLocked;
22
+ }
23
+ }
24
+ function lockRequest(datasetId, reason, timeoutMs) {
25
+ return Effect.suspend(() => {
26
+ let sent = false;
27
+ let timedOut = false;
28
+ return Effect.tryPromise({
29
+ try: async (signal) => {
30
+ const request = new AbortController();
31
+ const abort = () => request.abort();
32
+ const timer = setTimeout(() => { timedOut = true; request.abort(); }, timeoutMs);
33
+ if (signal.aborted)
34
+ abort();
35
+ else
36
+ signal.addEventListener('abort', abort, { once: true });
37
+ try {
38
+ const response = await authedFetch(`/api/cli/datasets/${encodeURIComponent(datasetId)}/lock`, {
39
+ method: 'POST',
40
+ headers: { 'Content-Type': 'application/json' },
41
+ body: JSON.stringify(reason ? { reason } : {}),
42
+ signal: request.signal,
43
+ }, () => { sent = true; });
44
+ if (!response.ok) {
45
+ throw new LockFailure(`Lock failed: ${await response.text()}`, response.status < 400 || response.status >= 500);
46
+ }
47
+ const data = await parseJsonResponse(response, 'Dataset lock');
48
+ const decoded = Schema.decodeUnknownResult(LockReply)(data);
49
+ if (Result.isFailure(decoded)) {
50
+ throw new LockFailure(`Dataset lock returned an unexpected response (status ${response.status}).`, true);
51
+ }
52
+ return decoded.success.dataset;
53
+ }
54
+ finally {
55
+ clearTimeout(timer);
56
+ signal.removeEventListener('abort', abort);
57
+ request.abort();
58
+ }
59
+ },
60
+ catch: cause => {
61
+ if (timedOut)
62
+ return new LockFailure('DATASET_TRANSFER_TIMEOUT: Dataset lock exceeded its deadline', true);
63
+ if (cause instanceof LockFailure)
64
+ return cause;
65
+ return new LockFailure(cause instanceof Error ? cause.message : String(cause), sent);
66
+ },
67
+ });
68
+ }).pipe(Effect.mapError(failure => new Error(failure.mayBeLocked ? `${failure.message}\n${MAY_BE_LOCKED}` : failure.message)));
69
+ }
70
+ // Nothing to clean up, so signals keep Node's default handling.
71
+ export async function lockDataset(datasetId, reason) {
72
+ const exit = await Effect.runPromiseExit(lockRequest(datasetId, reason, datasetTransferTimeoutMs()));
73
+ if (Exit.isSuccess(exit))
74
+ return exit.value;
75
+ throw Cause.squash(exit.cause);
76
+ }
@@ -0,0 +1,13 @@
1
+ import { Schema } from 'effect';
2
+ declare const SaveReply: Schema.Struct<{
3
+ readonly version: Schema.Struct<{
4
+ readonly id: Schema.String;
5
+ readonly dataset_id: Schema.String;
6
+ readonly version_num: Schema.Number;
7
+ readonly created_at: Schema.String;
8
+ }>;
9
+ }>;
10
+ export type SavedReadmeVersion = typeof SaveReply.Type['version'];
11
+ export declare function saveDatasetReadme(datasetId: string, markdown: string): Promise<SavedReadmeVersion>;
12
+ export {};
13
+ //# sourceMappingURL=dataset-readme-workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset-readme-workflow.d.ts","sourceRoot":"","sources":["../src/dataset-readme-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,MAAM,EAAE,MAAM,QAAQ,CAAA;AAW5D,QAAA,MAAM,SAAS;;;;;;;EAOb,CAAA;AAEF,MAAM,MAAM,kBAAkB,GAAG,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;AAuDjE,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAIxG"}
@@ -0,0 +1,82 @@
1
+ import { Cause, Effect, Exit, Result, Schema } from 'effect';
2
+ import { datasetTransferTimeoutMs } from './dataset-transfer-policy.js';
3
+ import { authedFetch } from './http.js';
4
+ import { parseJsonResponse } from './json-response.js';
5
+ // Loaded only through `await import(...)` from dataset-commands, like delete.
6
+ const MAY_BE_SAVED = "The README may already be saved as a new version: check the dataset's README tab before saving again.";
7
+ const SAVED_AT_SAME_TIME = 'Another README save for this dataset happened at the same time, so yours was not saved. Run the command again to save it as the next version.';
8
+ const SaveReply = Schema.Struct({
9
+ version: Schema.Struct({
10
+ id: Schema.String,
11
+ dataset_id: Schema.String,
12
+ version_num: Schema.Number,
13
+ created_at: Schema.String,
14
+ }),
15
+ });
16
+ // A refusal (4xx) means nothing was saved. After any other failure once the
17
+ // request was sent, a new version may exist; saving again would add another.
18
+ class SaveFailure extends Error {
19
+ mayBeSaved;
20
+ constructor(message, mayBeSaved) {
21
+ super(message);
22
+ this.mayBeSaved = mayBeSaved;
23
+ }
24
+ }
25
+ function saveRequest(datasetId, markdown, timeoutMs) {
26
+ return Effect.suspend(() => {
27
+ let sent = false;
28
+ let timedOut = false;
29
+ return Effect.tryPromise({
30
+ try: async (signal) => {
31
+ const request = new AbortController();
32
+ const abort = () => request.abort();
33
+ const timer = setTimeout(() => { timedOut = true; request.abort(); }, timeoutMs);
34
+ if (signal.aborted)
35
+ abort();
36
+ else
37
+ signal.addEventListener('abort', abort, { once: true });
38
+ try {
39
+ const response = await authedFetch(`/api/cli/datasets/${encodeURIComponent(datasetId)}/readme`, {
40
+ method: 'POST',
41
+ headers: { 'Content-Type': 'application/json' },
42
+ body: JSON.stringify({ markdown }),
43
+ signal: request.signal,
44
+ }, () => { sent = true; });
45
+ if (!response.ok) {
46
+ const message = `Failed to save dataset README: ${await response.text()}`;
47
+ // The unique version number refused a save that lost a race.
48
+ if (response.status === 409)
49
+ throw new SaveFailure(`${message}\n${SAVED_AT_SAME_TIME}`, false);
50
+ throw new SaveFailure(message, response.status < 400 || response.status >= 500);
51
+ }
52
+ const data = await parseJsonResponse(response, 'Dataset README save');
53
+ const decoded = Schema.decodeUnknownResult(SaveReply)(data);
54
+ if (Result.isFailure(decoded)) {
55
+ throw new SaveFailure(`Dataset README save returned an unexpected response (status ${response.status}).`, true);
56
+ }
57
+ return decoded.success.version;
58
+ }
59
+ finally {
60
+ clearTimeout(timer);
61
+ signal.removeEventListener('abort', abort);
62
+ request.abort();
63
+ }
64
+ },
65
+ catch: cause => {
66
+ if (timedOut)
67
+ return new SaveFailure('DATASET_TRANSFER_TIMEOUT: README save exceeded its deadline', sent);
68
+ if (cause instanceof SaveFailure)
69
+ return cause;
70
+ return new SaveFailure(cause instanceof Error ? cause.message : String(cause), sent);
71
+ },
72
+ });
73
+ }).pipe(Effect.mapError(failure => new Error(failure.mayBeSaved ? `${failure.message}\n${MAY_BE_SAVED}` : failure.message)));
74
+ }
75
+ // One request, never retried: a retry after an unknown outcome could add a
76
+ // duplicate version.
77
+ export async function saveDatasetReadme(datasetId, markdown) {
78
+ const exit = await Effect.runPromiseExit(saveRequest(datasetId, markdown, datasetTransferTimeoutMs()));
79
+ if (Exit.isSuccess(exit))
80
+ return exit.value;
81
+ throw Cause.squash(exit.cause);
82
+ }
@@ -0,0 +1,14 @@
1
+ export interface DatasetRowsOptions {
2
+ datasetId: string;
3
+ json: boolean;
4
+ printJson: (value: Record<string, unknown>) => void;
5
+ printLine: (value: string) => void;
6
+ sanitize: (value: string) => string;
7
+ }
8
+ export declare function editDatasetRows(options: DatasetRowsOptions & {
9
+ file: string;
10
+ }): Promise<0 | 130 | 143>;
11
+ export declare function deleteDatasetRows(options: DatasetRowsOptions & {
12
+ rowIds: string[];
13
+ }): Promise<0 | 130 | 143>;
14
+ //# sourceMappingURL=dataset-row-workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset-row-workflow.d.ts","sourceRoot":"","sources":["../src/dataset-row-workflow.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACnD,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;CACpC;AA+MD,wBAAgB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAEtG;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG;IAAE,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAE5G"}
@@ -0,0 +1,202 @@
1
+ import { Cause, Effect, Exit, Result, Schema } from 'effect';
2
+ import { datasetTransferTimeoutMs } from './dataset-transfer-policy.js';
3
+ import { extractErrorMessage } from './error-response.js';
4
+ import { parseDatasetFile } from './file-parser.js';
5
+ import { authedFetch } from './http.js';
6
+ import { parseJsonResponse } from './json-response.js';
7
+ // Loaded only through `await import(...)` from dataset-commands, like append.
8
+ const MAX_REQUEST_BYTES = 3 * 1024 * 1024;
9
+ const MAX_CHUNK_ROWS = 10;
10
+ const EMPTY_REQUEST_BYTES = Buffer.byteLength('{"rows":[]}', 'utf8');
11
+ class RowsRequestFailure extends Error {
12
+ outcome;
13
+ _tag = 'RowsRequestFailure';
14
+ constructor(message, outcome) {
15
+ super(message);
16
+ this.outcome = outcome;
17
+ }
18
+ }
19
+ const Dataset = Schema.Struct({ id: Schema.String, name: Schema.String, rowCount: Schema.Number });
20
+ const EditAcknowledgement = Schema.Struct({ dataset: Dataset, updatedCount: Schema.Number });
21
+ function normalizeRows(rows) {
22
+ if (rows.length === 0) {
23
+ throw new Error('Dataset edit file must contain at least one row');
24
+ }
25
+ const seenRowIds = new Set();
26
+ return rows.map((row, index) => {
27
+ const rowId = typeof row.id === 'string' ? row.id.trim() : '';
28
+ if (!rowId) {
29
+ throw new Error(`Dataset edit file rows[${index}] must include a non-empty string id`);
30
+ }
31
+ if (seenRowIds.has(rowId)) {
32
+ throw new Error(`Dataset edit file rows[${index}].id duplicates a previous row id`);
33
+ }
34
+ seenRowIds.add(rowId);
35
+ return { ...row, id: rowId };
36
+ });
37
+ }
38
+ function chunkRows(rows, sanitize) {
39
+ const chunks = [];
40
+ let currentChunk = [];
41
+ let currentBytes = EMPTY_REQUEST_BYTES;
42
+ for (const row of rows) {
43
+ const rowBytes = Buffer.byteLength(JSON.stringify(row), 'utf8');
44
+ const framedRowBytes = rowBytes + (currentChunk.length > 0 ? 1 : 0);
45
+ if (currentChunk.length > 0 &&
46
+ (currentChunk.length >= MAX_CHUNK_ROWS || currentBytes + framedRowBytes > MAX_REQUEST_BYTES)) {
47
+ chunks.push(currentChunk);
48
+ currentChunk = [];
49
+ currentBytes = EMPTY_REQUEST_BYTES;
50
+ }
51
+ const singleRowRequestBytes = EMPTY_REQUEST_BYTES + rowBytes;
52
+ if (singleRowRequestBytes > MAX_REQUEST_BYTES) {
53
+ throw new Error(`Dataset edit row ${sanitize(row.id)} is ${singleRowRequestBytes} bytes, ` +
54
+ `which exceeds the ${MAX_REQUEST_BYTES}-byte edit request limit`);
55
+ }
56
+ currentChunk.push(row);
57
+ currentBytes += rowBytes + (currentChunk.length > 1 ? 1 : 0);
58
+ }
59
+ if (currentChunk.length > 0)
60
+ chunks.push(currentChunk);
61
+ return chunks;
62
+ }
63
+ // One rows request with a deadline that covers the whole reply. A deadline,
64
+ // a lost connection or a broken reply after sending is an unknown outcome.
65
+ function rowsRequest(datasetId, method, body, label, timeoutMs, read) {
66
+ return Effect.suspend(() => {
67
+ let sent = false;
68
+ let timedOut = false;
69
+ return Effect.tryPromise({
70
+ try: async (signal) => {
71
+ const request = new AbortController();
72
+ const abort = () => request.abort();
73
+ const timer = setTimeout(() => { timedOut = true; request.abort(); }, timeoutMs);
74
+ if (signal.aborted)
75
+ abort();
76
+ else
77
+ signal.addEventListener('abort', abort, { once: true });
78
+ try {
79
+ const response = await authedFetch(`/api/cli/datasets/${encodeURIComponent(datasetId)}/rows`, {
80
+ method,
81
+ headers: { 'Content-Type': 'application/json' },
82
+ body: JSON.stringify(body),
83
+ signal: request.signal,
84
+ }, () => { sent = true; });
85
+ return await read(response);
86
+ }
87
+ finally {
88
+ clearTimeout(timer);
89
+ signal.removeEventListener('abort', abort);
90
+ request.abort();
91
+ }
92
+ },
93
+ catch: cause => {
94
+ if (timedOut) {
95
+ return sent
96
+ ? new RowsRequestFailure(`DATASET_TRANSFER_TIMEOUT: ${label} exceeded its deadline`, 'unknown')
97
+ : new RowsRequestFailure(`DATASET_TRANSFER_TIMEOUT: ${label} exceeded its deadline before the request was sent`, 'not_sent');
98
+ }
99
+ if (cause instanceof RowsRequestFailure)
100
+ return cause;
101
+ return new RowsRequestFailure(cause instanceof Error ? cause.message : String(cause), sent ? 'unknown' : 'not_sent');
102
+ },
103
+ });
104
+ });
105
+ }
106
+ function refusalOutcome(status) {
107
+ return status >= 400 && status < 500 ? 'rejected' : 'unknown';
108
+ }
109
+ function editProgram(options, timeoutMs) {
110
+ return Effect.gen(function* () {
111
+ const chunks = yield* Effect.try({
112
+ try: () => chunkRows(normalizeRows(parseDatasetFile(options.file).rows), options.sanitize),
113
+ catch: cause => cause,
114
+ });
115
+ let totalUpdated = 0;
116
+ // normalizeRows refuses an empty file, so the loop always sets this.
117
+ let lastResult;
118
+ for (let index = 0; index < chunks.length; index += 1) {
119
+ const chunk = chunks[index];
120
+ if (!options.json && chunks.length > 1) {
121
+ options.printLine(`Updating chunk ${index + 1}/${chunks.length} (${chunk.length} rows)...`);
122
+ }
123
+ const acknowledged = yield* Effect.result(rowsRequest(options.datasetId, 'PATCH', { rows: chunk }, 'Dataset row edit', timeoutMs, async (response) => {
124
+ if (!response.ok) {
125
+ throw new RowsRequestFailure(`HTTP ${response.status}: ${await extractErrorMessage(response)}`, refusalOutcome(response.status));
126
+ }
127
+ const data = await response.json();
128
+ const decoded = Schema.decodeUnknownResult(EditAcknowledgement)(data);
129
+ if (Result.isFailure(decoded)) {
130
+ throw new RowsRequestFailure(`Server returned an unreadable acknowledgement for a ${chunk.length}-row chunk`, 'unknown');
131
+ }
132
+ if (!Number.isInteger(decoded.success.updatedCount) || decoded.success.updatedCount !== chunk.length) {
133
+ throw new RowsRequestFailure(`Server reported ${String(decoded.success.updatedCount)} updated rows for a ${chunk.length}-row chunk`, 'unknown');
134
+ }
135
+ return decoded.success;
136
+ }));
137
+ if (Result.isFailure(acknowledged)) {
138
+ const { message, outcome } = acknowledged.failure;
139
+ const advice = outcome === 'unknown'
140
+ ? 'This chunk may already be applied: check these rows in the dataset before retrying.'
141
+ : 'Retry with a file containing only the remaining row edits.';
142
+ return yield* Effect.fail(new Error(`Chunk ${index + 1}/${chunks.length} failed: ${message}\n` +
143
+ `${totalUpdated} rows from ${index} chunk(s) were already updated. ${advice}`));
144
+ }
145
+ totalUpdated += acknowledged.success.updatedCount;
146
+ lastResult = acknowledged.success;
147
+ }
148
+ if (options.json) {
149
+ options.printJson({ dataset: lastResult.dataset, updatedCount: totalUpdated });
150
+ return;
151
+ }
152
+ options.printLine(`Updated ${totalUpdated} rows in dataset ${options.sanitize(lastResult.dataset.name)} ` +
153
+ `(${options.sanitize(lastResult.dataset.id)}). Current row count: ${lastResult.dataset.rowCount}`);
154
+ });
155
+ }
156
+ function deleteProgram(options, timeoutMs) {
157
+ return Effect.gen(function* () {
158
+ const deleted = yield* rowsRequest(options.datasetId, 'DELETE', { rowIds: options.rowIds }, 'Dataset row removal', timeoutMs, async (response) => {
159
+ if (!response.ok) {
160
+ throw new RowsRequestFailure(await response.text(), refusalOutcome(response.status));
161
+ }
162
+ return parseJsonResponse(response, 'Dataset delete rows');
163
+ }).pipe(Effect.mapError(({ message, outcome }) => new Error(`Delete rows failed: ${message}` +
164
+ (outcome === 'unknown' ? '\nThe rows may already be removed: check the dataset before retrying.' : ''))));
165
+ if (options.json) {
166
+ options.printJson({ dataset: deleted.dataset, deletedCount: deleted.deletedCount });
167
+ return;
168
+ }
169
+ options.printLine(`Deleted ${deleted.deletedCount} rows from dataset ${options.sanitize(deleted.dataset.name)} (${options.sanitize(deleted.dataset.id)}). New row count: ${deleted.dataset.rowCount}`);
170
+ });
171
+ }
172
+ // Ctrl-C or SIGTERM aborts the request in flight. Returns the exit code for
173
+ // an interruption; other failures throw their original error.
174
+ async function runRowsCommand(name, program) {
175
+ const timeoutMs = datasetTransferTimeoutMs();
176
+ const controller = new AbortController();
177
+ let interrupted;
178
+ const interrupt = () => { interrupted ??= 130; controller.abort(); };
179
+ const terminate = () => { interrupted ??= 143; controller.abort(); };
180
+ process.on('SIGINT', interrupt);
181
+ process.on('SIGTERM', terminate);
182
+ try {
183
+ const exit = await Effect.runPromiseExit(program(timeoutMs), { signal: controller.signal });
184
+ if (interrupted !== undefined) {
185
+ process.stderr.write(`${name} interrupted. The request in flight may already be applied: check the dataset before retrying.\n`);
186
+ return interrupted;
187
+ }
188
+ if (Exit.isFailure(exit))
189
+ throw Cause.squash(exit.cause);
190
+ return 0;
191
+ }
192
+ finally {
193
+ process.removeListener('SIGINT', interrupt);
194
+ process.removeListener('SIGTERM', terminate);
195
+ }
196
+ }
197
+ export function editDatasetRows(options) {
198
+ return runRowsCommand('Dataset row edit', timeoutMs => editProgram(options, timeoutMs));
199
+ }
200
+ export function deleteDatasetRows(options) {
201
+ return runRowsCommand('Dataset row removal', timeoutMs => deleteProgram(options, timeoutMs));
202
+ }
@@ -0,0 +1,28 @@
1
+ export declare function listDatasetSplits(versionId: string): Promise<{
2
+ readonly dataset_version_id: string;
3
+ readonly split_sets: readonly {
4
+ readonly id: string;
5
+ readonly name: string;
6
+ readonly strategy: string;
7
+ readonly seed: number | null;
8
+ readonly partitions: readonly {
9
+ readonly name: string;
10
+ readonly row_count: number;
11
+ }[];
12
+ }[];
13
+ }>;
14
+ export declare function showDatasetSplit(setId: string): Promise<{
15
+ readonly split_set_id: string;
16
+ readonly dataset_version_id: string;
17
+ readonly name: string;
18
+ readonly strategy: string;
19
+ readonly seed: number | null;
20
+ readonly metadata: unknown;
21
+ readonly partitions: readonly {
22
+ readonly name: string;
23
+ readonly row_ids: readonly string[];
24
+ readonly metadata: unknown;
25
+ }[];
26
+ }>;
27
+ export declare function downloadPinnedDatasetSplit(versionId: string, setId: string, split: string, format: string, filename: string): Promise<void>;
28
+ //# sourceMappingURL=dataset-split-reads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset-split-reads.d.ts","sourceRoot":"","sources":["../src/dataset-split-reads.ts"],"names":[],"mappings":"AA6BA,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM;;;;;;;;;;;;GAA+H;AAClL,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM;;;;;;;;;;;;GAA4G;AAE1J,wBAAsB,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBAUjI"}
@@ -0,0 +1,47 @@
1
+ import { Effect, Result, Schema } from 'effect';
2
+ import { writeFileSync } from 'node:fs';
3
+ import { authedFetch } from './http.js';
4
+ import { extractErrorMessage } from './error-response.js';
5
+ import { datasetTransferTimeoutMs } from './dataset-transfer-policy.js';
6
+ const SplitExport = Schema.Struct({
7
+ split_set_id: Schema.String, dataset_version_id: Schema.String,
8
+ name: Schema.String, strategy: Schema.String, seed: Schema.NullOr(Schema.Number), metadata: Schema.Unknown,
9
+ partitions: Schema.Array(Schema.Struct({ name: Schema.String, row_ids: Schema.Array(Schema.String), metadata: Schema.Unknown })),
10
+ });
11
+ const SplitList = Schema.Struct({
12
+ dataset_version_id: Schema.String,
13
+ split_sets: Schema.Array(Schema.Struct({ id: Schema.String, name: Schema.String, strategy: Schema.String, seed: Schema.NullOr(Schema.Number), partitions: Schema.Array(Schema.Struct({ name: Schema.String, row_count: Schema.Number })) })),
14
+ });
15
+ async function read(path, decode) {
16
+ const result = await Effect.runPromise(Effect.result(Effect.tryPromise({
17
+ try: async (signal) => {
18
+ const response = await authedFetch(path, { signal });
19
+ if (!response.ok)
20
+ throw new Error(await extractErrorMessage(response));
21
+ try {
22
+ return decode(await response.json());
23
+ }
24
+ catch (cause) {
25
+ throw new Error('Dataset split response is incomplete or unreadable', { cause });
26
+ }
27
+ }, catch: cause => cause instanceof Error ? cause : new Error('Dataset split read failed', { cause }),
28
+ }).pipe(Effect.timeoutOrElse({ duration: datasetTransferTimeoutMs(), orElse: () => Effect.fail(new Error('Dataset split read exceeded its deadline')) }))));
29
+ if (Result.isFailure(result))
30
+ throw result.failure;
31
+ return result.success;
32
+ }
33
+ export function listDatasetSplits(versionId) { return read(`/api/cli/dataset-versions/${encodeURIComponent(versionId)}/split-sets`, Schema.decodeUnknownSync(SplitList)); }
34
+ export function showDatasetSplit(setId) { return read(`/api/cli/split-sets/${encodeURIComponent(setId)}`, Schema.decodeUnknownSync(SplitExport)); }
35
+ export async function downloadPinnedDatasetSplit(versionId, setId, split, format, filename) {
36
+ const query = new URLSearchParams({ split_set: setId, split, format });
37
+ const result = await Effect.runPromise(Effect.result(Effect.tryPromise({
38
+ try: async (signal) => {
39
+ const response = await authedFetch(`/api/cli/dataset-versions/${encodeURIComponent(versionId)}/download?${query}`, { signal });
40
+ if (!response.ok)
41
+ throw new Error(`Download failed: ${await extractErrorMessage(response)}`);
42
+ return new Uint8Array(await response.arrayBuffer());
43
+ }, catch: cause => cause instanceof Error ? cause : new Error('Dataset split download failed', { cause }),
44
+ }).pipe(Effect.timeoutOrElse({ duration: datasetTransferTimeoutMs(), orElse: () => Effect.fail(new Error('Dataset split download exceeded its deadline')) }), Effect.flatMap(bytes => Effect.try({ try: () => writeFileSync(filename, bytes, { mode: 0o600 }), catch: cause => new Error('Could not save dataset split download', { cause }) })))));
45
+ if (Result.isFailure(result))
46
+ throw result.failure;
47
+ }
@@ -1,3 +1,4 @@
1
+ import { type DatasetVersionResponse } from './dataset-version-workflow.js';
1
2
  export interface DatasetUploadResponse {
2
3
  dataset: {
3
4
  id: string;
@@ -12,11 +13,6 @@ export interface DatasetUploadResponse {
12
13
  created_at: string;
13
14
  } | null;
14
15
  }
15
- interface DatasetSnapshot {
16
- datasetVersion: {
17
- id: string;
18
- };
19
- }
20
16
  type UploadRows = Array<Record<string, unknown>>;
21
17
  type UploadSource = {
22
18
  kind: 'jsonl';
@@ -36,7 +32,7 @@ export interface DatasetUploadOptions {
36
32
  }
37
33
  export declare function transferDatasetUpload(options: DatasetUploadOptions): Promise<{
38
34
  data: DatasetUploadResponse;
39
- version: DatasetSnapshot;
35
+ version: DatasetVersionResponse;
40
36
  }>;
41
37
  export {};
42
38
  //# sourceMappingURL=dataset-transfer-upload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-transfer-upload.d.ts","sourceRoot":"","sources":["../src/dataset-transfer-upload.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACzF,aAAa,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAC/E;AAED,UAAU,eAAe;IAAG,cAAc,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;AAE5D,KAAK,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAChD,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,CAAA;AAE9H,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,YAAY,CAAA;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;CACnD;AAoHD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC,CAEvI"}
1
+ {"version":3,"file":"dataset-transfer-upload.d.ts","sourceRoot":"","sources":["../src/dataset-transfer-upload.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsD,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AAM/H,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACzF,aAAa,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAC/E;AAGD,KAAK,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAChD,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,CAAA;AAE9H,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,YAAY,CAAA;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;CACnD;AA2HD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,sBAAsB,CAAA;CAAE,CAAC,CAE9I"}
@@ -1,6 +1,7 @@
1
1
  import { Context, Effect, Layer, Result } from 'effect';
2
2
  import { ensureDatasetUploadSnapshot } from './dataset-upload-snapshot.js';
3
3
  import { datasetTransferTimeoutMs } from './dataset-transfer-policy.js';
4
+ import { datasetVersionSnapshot } from './dataset-version-workflow.js';
4
5
  import { extractErrorMessage } from './error-response.js';
5
6
  import { authedFetch } from './http.js';
6
7
  import { parseJsonResponse, sanitizeTerminalText } from './json-response.js';
@@ -18,6 +19,12 @@ class DatasetInputFailure extends Error {
18
19
  constructor(cause) { super(cause instanceof Error ? cause.message : String(cause), { cause }); }
19
20
  }
20
21
  const DatasetUploadApi = Context.Service('orizu/DatasetUploadApi');
22
+ // authedFetch raises this code only when it sent nothing, or after the server
23
+ // answered 401 (it writes nothing) and the stored credentials changed, so it
24
+ // refused to replay. Either way nothing was written (ORI-2431).
25
+ function isAuthContextChange(cause) {
26
+ return cause instanceof Error && cause.message.startsWith('ORIZU_AUTH_CONTEXT_CHANGED:');
27
+ }
21
28
  // Only the existing authentication client's rejected-token refresh may replay a
22
29
  // request. No transient/transport retries belong around these non-idempotent writes.
23
30
  function post(path, body, context, prefix, timeoutMs) {
@@ -34,7 +41,7 @@ function post(path, body, context, prefix, timeoutMs) {
34
41
  }
35
42
  return await parseJsonResponse(response, context);
36
43
  },
37
- catch: cause => cause instanceof DatasetWriteFailure ? cause : new DatasetWriteFailure(cause instanceof Error ? cause.message : String(cause), requestStarted ? 'unknown' : 'rejected', { cause }),
44
+ catch: cause => cause instanceof DatasetWriteFailure ? cause : new DatasetWriteFailure(cause instanceof Error ? cause.message : String(cause), requestStarted && !isAuthContextChange(cause) ? 'unknown' : 'rejected', { cause }),
38
45
  }).pipe(Effect.timeoutOrElse({
39
46
  duration: timeoutMs,
40
47
  orElse: () => Effect.fail(new DatasetWriteFailure(`DATASET_TRANSFER_TIMEOUT: ${context} exceeded its deadline`, requestStarted ? 'unknown' : 'rejected')),
@@ -49,7 +56,7 @@ function liveUploadApi(options) {
49
56
  ...(options.readmeMarkdown !== null ? { readmeMarkdown: options.readmeMarkdown } : {}),
50
57
  }, 'Dataset upload', 'Upload failed', timeoutMs),
51
58
  append: (id, rows) => post(`/api/cli/datasets/${encodeURIComponent(id)}/rows`, { rows }, 'Dataset append', 'Append failed', timeoutMs),
52
- snapshot: id => post(`/api/cli/datasets/${encodeURIComponent(id)}/versions`, {}, 'Dataset version create', 'Failed to create dataset version', timeoutMs),
59
+ snapshot: id => datasetVersionSnapshot(id, {}, timeoutMs),
53
60
  });
54
61
  }
55
62
  async function expectedPromise(program) {
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-upload-snapshot.d.ts","sourceRoot":"","sources":["../src/dataset-upload-snapshot.ts"],"names":[],"mappings":"AAAA,UAAU,uBAAuB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,sBAAsB;IAC9B,cAAc,EAAE;QACd,EAAE,EAAE,MAAM,CAAA;KACX,CAAA;CACF;AAED,wBAAsB,2BAA2B,CAAC,CAAC,SAAS,sBAAsB,EAChF,OAAO,EAAE,uBAAuB,EAChC,UAAU,EAAE,OAAO,EACnB,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAChD,OAAO,CAAC,CAAC,CAAC,CAwBZ"}
1
+ {"version":3,"file":"dataset-upload-snapshot.d.ts","sourceRoot":"","sources":["../src/dataset-upload-snapshot.ts"],"names":[],"mappings":"AAEA,UAAU,uBAAuB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,sBAAsB;IAC9B,cAAc,EAAE;QACd,EAAE,EAAE,MAAM,CAAA;KACX,CAAA;CACF;AAED,wBAAsB,2BAA2B,CAAC,CAAC,SAAS,sBAAsB,EAChF,OAAO,EAAE,uBAAuB,EAChC,UAAU,EAAE,OAAO,EACnB,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAChD,OAAO,CAAC,CAAC,CAAC,CA6BZ"}
@@ -1,3 +1,4 @@
1
+ import { DatasetVersionFailure, VERSION_MAY_BE_CREATED } from './dataset-version-workflow.js';
1
2
  export async function ensureDatasetUploadSnapshot(dataset, jsonOutput, createSnapshot) {
2
3
  try {
3
4
  return await createSnapshot(dataset.id);
@@ -5,6 +6,8 @@ export async function ensureDatasetUploadSnapshot(dataset, jsonOutput, createSna
5
6
  catch (error) {
6
7
  const detail = error instanceof Error ? error.message : String(error);
7
8
  const retryCommand = `orizu datasets versions create --dataset ${dataset.id}`;
9
+ // After an unclear outcome the version may exist; check before retrying.
10
+ const mayBeCreated = error instanceof DatasetVersionFailure && error.mayBeCreated;
8
11
  if (jsonOutput) {
9
12
  throw new Error(JSON.stringify({
10
13
  error: 'Dataset upload completed but dataset version creation failed',
@@ -13,10 +16,13 @@ export async function ensureDatasetUploadSnapshot(dataset, jsonOutput, createSna
13
16
  dataset_id: dataset.id,
14
17
  dataset_version_id: null,
15
18
  retry_command: retryCommand,
19
+ ...(mayBeCreated ? { may_be_created: true } : {}),
16
20
  }));
17
21
  }
18
22
  throw new Error(`Dataset upload completed but dataset version creation failed: ${detail}\n` +
19
23
  `Dataset ${dataset.name} (${dataset.id}) was created with ${dataset.rowCount} rows. ` +
20
- `Retry only the snapshot step with: ${retryCommand}`);
24
+ (mayBeCreated
25
+ ? `${VERSION_MAY_BE_CREATED} If it is not there, create it with: ${retryCommand}`
26
+ : `Retry only the snapshot step with: ${retryCommand}`));
21
27
  }
22
28
  }
@@ -0,0 +1,24 @@
1
+ import { Effect, Schema } from 'effect';
2
+ export declare const VERSION_MAY_BE_CREATED = "The version may already be created: check the dataset's versions in the web app before creating it again.";
3
+ declare const CreateReply: Schema.Struct<{
4
+ readonly datasetVersion: Schema.Struct<{
5
+ readonly id: Schema.NonEmptyString;
6
+ readonly rowCount: Schema.Number;
7
+ readonly artifactFormat: Schema.optional<Schema.String>;
8
+ readonly artifactStoragePath: Schema.optional<Schema.String>;
9
+ }>;
10
+ }>;
11
+ export type DatasetVersionResponse = typeof CreateReply.Type;
12
+ export interface DatasetVersionRequest {
13
+ versionLabel?: string | null;
14
+ readmeMarkdown?: string | null;
15
+ }
16
+ export declare class DatasetVersionFailure extends Error {
17
+ readonly mayBeCreated: boolean;
18
+ readonly _tag = "DatasetVersionFailure";
19
+ constructor(message: string, mayBeCreated: boolean);
20
+ }
21
+ export declare function datasetVersionSnapshot(datasetId: string, options: DatasetVersionRequest, timeoutMs: number): Effect.Effect<DatasetVersionResponse, DatasetVersionFailure>;
22
+ export declare function createDatasetVersionSnapshot(datasetId: string, options: DatasetVersionRequest): Promise<DatasetVersionResponse>;
23
+ export {};
24
+ //# sourceMappingURL=dataset-version-workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset-version-workflow.d.ts","sourceRoot":"","sources":["../src/dataset-version-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAgB,MAAM,EAAE,MAAM,QAAQ,CAAA;AAS5D,eAAO,MAAM,sBAAsB,8GAA8G,CAAA;AAIjJ,QAAA,MAAM,WAAW;;;;;;;EAOf,CAAA;AAEF,MAAM,MAAM,sBAAsB,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA;AAE5D,MAAM,WAAW,qBAAqB;IACpC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAMD,qBAAa,qBAAsB,SAAQ,KAAK;IAEjB,QAAQ,CAAC,YAAY,EAAE,OAAO;IAD3D,QAAQ,CAAC,IAAI,2BAA0B;gBAC3B,OAAO,EAAE,MAAM,EAAW,YAAY,EAAE,OAAO;CAC5D;AAaD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,qBAAqB,CAAC,CA+CzK;AAED,wBAAsB,4BAA4B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAMrI"}