orizu 0.5.26 → 0.5.28

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 (164) hide show
  1. package/README.md +19 -0
  2. package/dist/artifacts-git-runtime.d.ts +34 -0
  3. package/dist/artifacts-git-runtime.d.ts.map +1 -0
  4. package/dist/artifacts-git-runtime.js +312 -0
  5. package/dist/cloudflare-artifacts-git-remote.d.ts +5 -0
  6. package/dist/cloudflare-artifacts-git-remote.d.ts.map +1 -0
  7. package/dist/cloudflare-artifacts-git-remote.js +21 -0
  8. package/dist/dataset-transfer-download.d.ts +2 -0
  9. package/dist/dataset-transfer-download.d.ts.map +1 -0
  10. package/dist/dataset-transfer-download.js +66 -0
  11. package/dist/dataset-transfer-policy.d.ts +2 -0
  12. package/dist/dataset-transfer-policy.d.ts.map +1 -0
  13. package/dist/dataset-transfer-policy.js +8 -0
  14. package/dist/dataset-transfer-upload.d.ts +42 -0
  15. package/dist/dataset-transfer-upload.d.ts.map +1 -0
  16. package/dist/dataset-transfer-upload.js +110 -0
  17. package/dist/git-credential.d.ts.map +1 -1
  18. package/dist/git-credential.js +1 -1
  19. package/dist/git-recovery-environment.d.ts +1 -0
  20. package/dist/git-recovery-environment.d.ts.map +1 -1
  21. package/dist/git-recovery-environment.js +1 -1
  22. package/dist/help.d.ts.map +1 -1
  23. package/dist/help.js +44 -11
  24. package/dist/hosted-boot.d.ts +75 -2
  25. package/dist/hosted-boot.d.ts.map +1 -1
  26. package/dist/hosted-boot.js +585 -102
  27. package/dist/hosted-bootstrap.d.ts +2 -0
  28. package/dist/hosted-bootstrap.d.ts.map +1 -1
  29. package/dist/hosted-bootstrap.js +12 -3
  30. package/dist/hosted-harness-opencode.d.ts +8 -9
  31. package/dist/hosted-harness-opencode.d.ts.map +1 -1
  32. package/dist/hosted-harness-opencode.js +126 -24
  33. package/dist/hosted-harness.d.ts +3 -0
  34. package/dist/hosted-harness.d.ts.map +1 -1
  35. package/dist/hosted-harness.js +4 -1
  36. package/dist/hosted-harvest.d.ts +30 -9
  37. package/dist/hosted-harvest.d.ts.map +1 -1
  38. package/dist/hosted-harvest.js +222 -28
  39. package/dist/hosted-loop-lifecycle.d.ts +15 -3
  40. package/dist/hosted-loop-lifecycle.d.ts.map +1 -1
  41. package/dist/hosted-loop-lifecycle.js +6 -4
  42. package/dist/hosted-loop.d.ts +47 -7
  43. package/dist/hosted-loop.d.ts.map +1 -1
  44. package/dist/hosted-loop.js +310 -64
  45. package/dist/hosted-question-limits.d.ts +7 -0
  46. package/dist/hosted-question-limits.d.ts.map +1 -0
  47. package/dist/hosted-question-limits.js +6 -0
  48. package/dist/hosted-question.d.ts +27 -0
  49. package/dist/hosted-question.d.ts.map +1 -0
  50. package/dist/hosted-question.js +118 -0
  51. package/dist/hosted-run-event-sink.d.ts +10 -5
  52. package/dist/hosted-run-event-sink.d.ts.map +1 -1
  53. package/dist/hosted-run-event-sink.js +12 -8
  54. package/dist/hosted-runtime-assets.d.ts +16 -7
  55. package/dist/hosted-runtime-assets.d.ts.map +1 -1
  56. package/dist/hosted-runtime-assets.js +40 -12
  57. package/dist/hosted-session-cli.d.ts.map +1 -1
  58. package/dist/hosted-session-cli.js +10 -19
  59. package/dist/http.d.ts +1 -1
  60. package/dist/http.d.ts.map +1 -1
  61. package/dist/http.js +10 -4
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +113 -92
  64. package/dist/instruction-set-gepa-launch.d.ts +1 -1
  65. package/dist/instruction-set-gepa-launch.d.ts.map +1 -1
  66. package/dist/instruction-set-gepa-launch.js +5 -3
  67. package/dist/instruction-set-loader.d.ts.map +1 -1
  68. package/dist/instruction-set-loader.js +63 -2
  69. package/dist/instruction-set-lock/index.d.ts +51 -0
  70. package/dist/instruction-set-lock/index.d.ts.map +1 -0
  71. package/dist/instruction-set-lock/index.js +459 -0
  72. package/dist/instruction-set-lock/schema.v1.d.ts +136 -0
  73. package/dist/instruction-set-lock/schema.v1.d.ts.map +1 -0
  74. package/dist/instruction-set-lock/schema.v1.js +155 -0
  75. package/dist/instruction-set-provenance.d.ts +26 -0
  76. package/dist/instruction-set-provenance.d.ts.map +1 -0
  77. package/dist/instruction-set-provenance.js +68 -0
  78. package/dist/instruction-set-sync/helpers.d.ts +22 -0
  79. package/dist/instruction-set-sync/helpers.d.ts.map +1 -0
  80. package/dist/instruction-set-sync/helpers.js +677 -0
  81. package/dist/instruction-set-sync/index.d.ts +60 -0
  82. package/dist/instruction-set-sync/index.d.ts.map +1 -0
  83. package/dist/instruction-set-sync/index.js +689 -0
  84. package/dist/instruction-set-update/index.d.ts +42 -0
  85. package/dist/instruction-set-update/index.d.ts.map +1 -0
  86. package/dist/instruction-set-update/index.js +445 -0
  87. package/dist/instruction-set-verify/index.d.ts +27 -0
  88. package/dist/instruction-set-verify/index.d.ts.map +1 -0
  89. package/dist/instruction-set-verify/index.js +865 -0
  90. package/dist/instruction-sets-cli.d.ts +1 -4
  91. package/dist/instruction-sets-cli.d.ts.map +1 -1
  92. package/dist/instruction-sets-cli.js +220 -109
  93. package/dist/model-config-fields.d.ts +35 -0
  94. package/dist/model-config-fields.d.ts.map +1 -0
  95. package/dist/model-config-fields.js +28 -0
  96. package/dist/optimizations-list-cli.d.ts.map +1 -1
  97. package/dist/optimizations-list-cli.js +7 -4
  98. package/dist/score-format.d.ts +2 -0
  99. package/dist/score-format.d.ts.map +1 -0
  100. package/dist/score-format.js +18 -0
  101. package/dist/workbench-repo-contract.d.ts +65 -0
  102. package/dist/workbench-repo-contract.d.ts.map +1 -0
  103. package/dist/workbench-repo-contract.js +250 -0
  104. package/dist/workspace-bootstrap-job.d.ts +45 -0
  105. package/dist/workspace-bootstrap-job.d.ts.map +1 -0
  106. package/dist/workspace-bootstrap-job.js +431 -0
  107. package/dist/workspace-bootstrap-seed.d.ts +74 -0
  108. package/dist/workspace-bootstrap-seed.d.ts.map +1 -0
  109. package/dist/workspace-bootstrap-seed.js +209 -0
  110. package/package.json +4 -3
  111. package/src/artifacts-git-runtime.ts +360 -0
  112. package/src/cloudflare-artifacts-git-remote.ts +24 -0
  113. package/src/dataset-transfer-download.ts +61 -0
  114. package/src/dataset-transfer-policy.ts +8 -0
  115. package/src/dataset-transfer-upload.ts +145 -0
  116. package/src/git-credential.ts +1 -2
  117. package/src/git-recovery-environment.ts +1 -1
  118. package/src/help.ts +44 -11
  119. package/src/hosted-boot.ts +644 -109
  120. package/src/hosted-bootstrap.ts +14 -3
  121. package/src/hosted-harness-opencode.ts +130 -28
  122. package/src/hosted-harness.ts +4 -1
  123. package/src/hosted-harvest.ts +258 -33
  124. package/src/hosted-loop-lifecycle.ts +19 -5
  125. package/src/hosted-loop.ts +340 -68
  126. package/src/hosted-question-limits.ts +6 -0
  127. package/src/hosted-question.ts +145 -0
  128. package/src/hosted-run-event-sink.ts +24 -12
  129. package/src/hosted-runtime-assets.ts +51 -11
  130. package/src/hosted-session-cli.ts +10 -24
  131. package/src/http.ts +10 -4
  132. package/src/index.ts +108 -134
  133. package/src/instruction-set-gepa-launch.ts +4 -4
  134. package/src/instruction-set-loader.ts +53 -2
  135. package/src/instruction-set-lock/index.ts +561 -0
  136. package/src/instruction-set-lock/schema.v1.json +141 -0
  137. package/src/instruction-set-lock/schema.v1.ts +155 -0
  138. package/src/instruction-set-provenance.ts +89 -0
  139. package/src/instruction-set-sync/helpers.ts +707 -0
  140. package/src/instruction-set-sync/index.ts +791 -0
  141. package/src/instruction-set-update/index.ts +488 -0
  142. package/src/instruction-set-verify/index.ts +1067 -0
  143. package/src/instruction-sets-cli.ts +226 -114
  144. package/src/model-config-fields.ts +31 -0
  145. package/src/optimizations-list-cli.ts +7 -4
  146. package/src/score-format.ts +16 -0
  147. package/src/workbench-repo-contract.ts +314 -0
  148. package/src/workspace-bootstrap-job.ts +611 -0
  149. package/src/workspace-bootstrap-seed.ts +350 -0
  150. package/vendor/orizu-gepa/src/orizu_gepa_connector/instruction_set_loader.py +46 -2
  151. package/vendor/skills/orizu/SKILL.md +4 -2
  152. package/vendor/skills/orizu/flows/promote.md +4 -0
  153. package/vendor/skills/orizu/references/assess-and-plan.md +1 -1
  154. package/vendor/skills/orizu/references/authority-map.md +1 -1
  155. package/vendor/skills/orizu/references/cli-reference.md +151 -35
  156. package/vendor/skills/orizu/references/instructions-after-prompts.md +3 -3
  157. package/vendor/skills/orizu/references/migrate-existing-gepa-setup.md +5 -6
  158. package/vendor/skills/orizu/references/migrate-hand-rolled-instruction-layout.md +252 -0
  159. package/vendor/skills/orizu/references/optimization-reports.md +5 -4
  160. package/vendor/skills/orizu/references/optimization-with-gepa.md +1 -1
  161. package/vendor/skills/orizu/references/orizu-in-your-codebase.md +195 -0
  162. package/vendor/skills/orizu/references/primer.md +4 -2
  163. package/vendor/skills/orizu/references/prompt-control-plane.md +33 -29
  164. package/vendor/skills/orizu/references/vocabulary.md +1 -1
package/dist/index.js CHANGED
@@ -16,13 +16,13 @@ import { parseDatasetFile } from './file-parser.js';
16
16
  import { streamJsonlRowChunks } from './jsonl-stream.js';
17
17
  import { parseDatasetReference } from './dataset-download.js';
18
18
  import { editDatasetRows as runEditDatasetRows } from './dataset-edit-rows.js';
19
- import { ensureDatasetUploadSnapshot } from './dataset-upload-snapshot.js';
20
19
  import { extractErrorMessage } from './error-response.js';
21
20
  import { describeLogoutHttpFailure, describeLogoutTransportFailure, } from './logout-diagnostic.js';
22
21
  import { parseGlobalFlags } from './global-flags.js';
23
22
  import { shouldUseHeadlessLogin, waitForHeadlessAuthorization } from './headless-login.js';
24
23
  import { getCapabilities, renderHelpForArgs, renderRootHelp } from './help.js';
25
24
  import { runLocalAppPreview } from './preview-runtime.js';
25
+ import { formatScoreForCli } from './score-format.js';
26
26
  import { readAssignmentManifestJsonlFile } from './task-assignment-manifest.js';
27
27
  import { assertSecureTokenTransport, authedFetch, captureAuthenticatedRequestContext, credentialRequestRedirectPolicy, getBaseUrl, resolveLoginBaseUrl, setGlobalFlags, } from './http.js';
28
28
  import { computeSkillContentHash, getSkillInstallPath, getSkillTargetStatus, getTargetForAgent, installSkillTarget, isSkillInstallAgent, isSkillInstallTarget, resolveSkillSource, SKILL_INSTALL_AGENTS, SKILL_INSTALL_TARGETS, targetNeedsOverwrite, } from './skill-installer.js';
@@ -54,6 +54,7 @@ import { workspaceSyncCommand } from './workspace-sync.js';
54
54
  import { runGitCredentialInvocation } from './git-credential.js';
55
55
  import { instructionSetsCommand, syncToDisk } from './instruction-sets-cli.js';
56
56
  export { loadInstructionSet } from './instruction-set-loader.js';
57
+ import { noSubmitScorerOutput, provenanceRequestFields, resolveInstructionSetProvenance } from './instruction-set-provenance.js';
57
58
  import { runnerInputInstructionSet, runnerInputPrompt, runnerInstructionSetSyncSet } from './runner-instruction-set-contract.js';
58
59
  import { pushPromptDraft } from './prompt-draft-push.js';
59
60
  import { readMarkdownReportInput } from './markdown-report-input.js';
@@ -130,6 +131,31 @@ function getArg(name) {
130
131
  }
131
132
  return cliArgs[index + 1];
132
133
  }
134
+ function instructionSetProvenanceFields(project) {
135
+ for (const flag of ['--instructions', '--instructions-root']) {
136
+ if (cliArgs.some(argument => argument.startsWith(`${flag}=`))) {
137
+ throw new Error(`instruction_set_option_equals_form:${flag}`);
138
+ }
139
+ const index = cliArgs.indexOf(flag);
140
+ if (index !== -1) {
141
+ const value = cliArgs[index + 1];
142
+ if (!value || value.startsWith('-')) {
143
+ throw new Error(`instruction_set_option_value_missing:${flag}`);
144
+ }
145
+ }
146
+ }
147
+ const specifier = getArg('--instructions');
148
+ const root = getArg('--instructions-root');
149
+ if (root && !specifier)
150
+ throw new Error('instruction_set_option_orphan_root:--instructions-root');
151
+ if (!specifier)
152
+ return {};
153
+ return provenanceRequestFields(resolveInstructionSetProvenance({
154
+ specifier,
155
+ root: root || '.',
156
+ project,
157
+ }));
158
+ }
133
159
  function getArchiveListStatus(command) {
134
160
  const status = getArg('--status') || 'active';
135
161
  if (!['active', 'archived', 'all'].includes(status)) {
@@ -880,9 +906,13 @@ async function showScorerDetail() {
880
906
  const scorerId = getPositionalArg(2);
881
907
  const project = getArg('--project') || await resolveProjectSlug(null);
882
908
  if (!scorerId) {
883
- throw new Error('Usage: orizu scorers detail <scorer-id-or-name> --project <team/project> [--json]');
909
+ throw new Error('Usage: orizu scorers detail <scorer-id-or-name> --project <team/project> [--profile-version <id>] [--json]');
884
910
  }
885
- const response = await authedFetch(`/api/cli/scorers/${encodeURIComponent(scorerId)}?project=${encodeURIComponent(project)}`);
911
+ const scorerParams = new URLSearchParams({ project });
912
+ const profileVersionId = getArg('--profile-version');
913
+ if (profileVersionId)
914
+ scorerParams.set('profileVersionId', profileVersionId);
915
+ const response = await authedFetch(`/api/cli/scorers/${encodeURIComponent(scorerId)}?${scorerParams.toString()}`);
886
916
  if (!response.ok) {
887
917
  throw new Error(`Failed to fetch scorer: ${await response.text()}`);
888
918
  }
@@ -894,6 +924,44 @@ async function showScorerDetail() {
894
924
  const scorer = data.scorer;
895
925
  printLine(`${sanitizeTerminalText(String(scorer?.name || scorerId))}`);
896
926
  printLine(`Metric: ${sanitizeTerminalText(String(scorer?.metricLabel || 'Score'))}`);
927
+ const scoreRuns = Array.isArray(scorer?.scoreRuns) ? scorer.scoreRuns : [];
928
+ for (const value of scoreRuns) {
929
+ if (!value || typeof value !== 'object')
930
+ continue;
931
+ const scoreRun = value;
932
+ const formattedScore = formatScoreForCli(scoreRun.scoreValue, scoreRun.scoreFormat);
933
+ printLine(`Score run ${sanitizeTerminalText(String(scoreRun.id || '?'))}: ${sanitizeTerminalText(formattedScore)} (Profile Version ${sanitizeTerminalText(String(scoreRun.profileVersionId || '—'))})`);
934
+ }
935
+ }
936
+ async function listRuns() {
937
+ const project = getArg('--project') || await resolveProjectSlug(null);
938
+ const params = new URLSearchParams({ project });
939
+ const profileVersionId = getArg('--profile-version');
940
+ const promptVersionId = getArg('--prompt-version');
941
+ const limit = getArg('--limit');
942
+ if (profileVersionId)
943
+ params.set('profileVersionId', profileVersionId);
944
+ if (promptVersionId)
945
+ params.set('promptVersionId', promptVersionId);
946
+ if (limit)
947
+ params.set('limit', limit);
948
+ const response = await authedFetch(`/api/cli/runs?${params.toString()}`);
949
+ if (!response.ok)
950
+ throw new Error(`Failed to fetch runs: ${await response.text()}`);
951
+ const data = await parseJsonResponse(response, 'Runs list');
952
+ if (hasJsonFlag()) {
953
+ printJson(data);
954
+ return;
955
+ }
956
+ for (const run of data.runs) {
957
+ printLine([
958
+ sanitizeTerminalText(String(run.id ?? '?')),
959
+ `prompt ${sanitizeTerminalText(String(run.promptVersionId ?? '—'))}`,
960
+ `split ${sanitizeTerminalText(String(run.splitName ?? '—'))}`,
961
+ `score ${sanitizeTerminalText(formatScoreForCli(run.aggregateScore, 'number'))}`,
962
+ `Profile Version ${sanitizeTerminalText(String(run.profileVersionId ?? '—'))}`,
963
+ ].join(' | '));
964
+ }
897
965
  }
898
966
  async function setScorerLabel() {
899
967
  const scorerName = getPositionalArg(3);
@@ -1300,6 +1368,7 @@ async function submitRunResults() {
1300
1368
  judgeVersionId: getArg('--judge-version') || undefined,
1301
1369
  judgeRunnerVersionId: getArg('--judge-runner-version') || undefined,
1302
1370
  resultsJsonl,
1371
+ ...instructionSetProvenanceFields(project),
1303
1372
  }),
1304
1373
  });
1305
1374
  if (!response.ok) {
@@ -1338,6 +1407,7 @@ async function submitScoreResults() {
1338
1407
  headers: { 'Content-Type': 'application/json' },
1339
1408
  body: JSON.stringify({
1340
1409
  ...aggregatePayload,
1410
+ ...instructionSetProvenanceFields(project),
1341
1411
  scorerVersionId,
1342
1412
  subjectPromptVersionId: subjectPromptVersionId || undefined,
1343
1413
  datasetVersionId: getArg('--dataset-version') || undefined,
@@ -1458,6 +1528,8 @@ async function execScorer() {
1458
1528
  !splitName) {
1459
1529
  throw new Error('Usage: orizu scorers exec --scorer-version <id> (--subject-version <prompt-version-id> | --optimization-run <id> --candidate <id>) --dataset-version <id> --split-set <id> --split <name> [--subject-results <jsonl>] [--dependency-score-run <alias=id>] [--dependency-results <alias=path>] [--no-submit] [--out <score.json>] [--project <team/project>] [--json]');
1460
1530
  }
1531
+ const instructionSetProvenance = instructionSetProvenanceFields(project);
1532
+ const isNoSubmit = hasArg('--no-submit');
1461
1533
  const response = await authedFetch(`/api/cli/scorers/exec?project=${encodeURIComponent(project)}`, {
1462
1534
  method: 'POST',
1463
1535
  headers: { 'Content-Type': 'application/json' },
@@ -1469,22 +1541,28 @@ async function execScorer() {
1469
1541
  datasetVersionId,
1470
1542
  splitSetId,
1471
1543
  splitName,
1472
- submit: !hasArg('--no-submit'),
1544
+ submit: !isNoSubmit,
1473
1545
  reuseExisting: !hasArg('--no-reuse-existing'),
1474
1546
  subjectResultsJsonl: readOptionalJsonlFile(getArg('--subject-results') || getArg('--outputs')),
1475
1547
  dependencyScoreRunIds: parseAliasAssignments(getArg('--dependency-score-run') || getArg('--dependency-score-runs')),
1476
1548
  dependencyResultsJsonl: readDependencyResultAssignments(getArg('--dependency-results')),
1549
+ ...instructionSetProvenance,
1477
1550
  }),
1478
1551
  });
1479
1552
  if (!response.ok) {
1480
1553
  throw new Error(`Failed to execute scorer: ${await response.text()}`);
1481
1554
  }
1482
1555
  const data = await parseJsonResponse(response, 'Scorer exec');
1556
+ const noSubmitOutput = isNoSubmit
1557
+ ? noSubmitScorerOutput(data, instructionSetProvenance)
1558
+ : null;
1483
1559
  if (outPath) {
1484
- writeFileSync(expandHomePath(outPath), `${JSON.stringify(data.scoreResult || data, null, 2)}\n`);
1560
+ const output = noSubmitOutput ?? data.scoreResult ?? data;
1561
+ writeFileSync(expandHomePath(outPath), `${JSON.stringify(output, null, 2)}\n`);
1485
1562
  }
1486
1563
  if (hasJsonFlag()) {
1487
- printJson(data);
1564
+ const output = noSubmitOutput ?? data;
1565
+ printJson(output);
1488
1566
  return;
1489
1567
  }
1490
1568
  const scoreRun = isRecord(data.scoreRun) ? data.scoreRun : null;
@@ -1512,6 +1590,9 @@ async function execScorer() {
1512
1590
  else {
1513
1591
  printLine(`Executed scorer ${sanitizeTerminalText(scorerVersionId)} (${formatPercent(numberFromUnknown(scoreValue))})${provenanceSuffix}`);
1514
1592
  }
1593
+ if (isNoSubmit && Object.keys(instructionSetProvenance).length > 0) {
1594
+ printLine(`Provenance: ${sanitizeTerminalText(String(instructionSetProvenance['orizu.instruction_set.id']))} / ${sanitizeTerminalText(String(instructionSetProvenance['orizu.profile_version.id']))} / ${sanitizeTerminalText(String(instructionSetProvenance['orizu.instruction_set.digest']))}`);
1595
+ }
1515
1596
  if (outPath) {
1516
1597
  printLine(`Wrote scorer result to ${sanitizeTerminalText(outPath)}`);
1517
1598
  }
@@ -3849,88 +3930,22 @@ async function changeTeamMemberRole() {
3849
3930
  }
3850
3931
  printLine(`Updated ${sanitizeTerminalText(member.email)} role to ${sanitizeTerminalText(role)}`);
3851
3932
  }
3852
- async function createDatasetFromRows(project, name, sourceType, rows, readmeMarkdown = null) {
3853
- const response = await authedFetch('/api/cli/datasets/upload', {
3854
- method: 'POST',
3855
- headers: {
3856
- 'Content-Type': 'application/json',
3857
- },
3858
- body: JSON.stringify({
3859
- projectSlug: project,
3860
- name,
3861
- rows,
3862
- sourceType,
3863
- ...(readmeMarkdown !== null ? { readmeMarkdown } : {}),
3864
- }),
3865
- });
3866
- if (!response.ok) {
3867
- const body = await parseJsonResponse(response, 'Dataset upload');
3868
- throw new Error(`Upload failed: ${body.error}`);
3869
- }
3870
- return parseJsonResponse(response, 'Dataset upload');
3871
- }
3872
3933
  async function uploadJsonlDatasetInChunks(file, project, datasetName, readmeMarkdown = null) {
3873
- let dataset = null;
3874
- let totalUploaded = 0;
3875
- let chunkIndex = 0;
3876
- const chunks = streamJsonlRowChunks(file)[Symbol.asyncIterator]();
3877
- while (true) {
3878
- let nextChunk;
3879
- try {
3880
- nextChunk = await chunks.next();
3881
- }
3882
- catch (error) {
3883
- const message = error instanceof Error ? error.message : String(error);
3884
- if (!dataset) {
3885
- throw new Error(message);
3886
- }
3887
- throw new Error(`Upload stopped while reading the next JSONL chunk: ${message}\n` +
3888
- `Dataset ${sanitizeTerminalText(dataset.name)} (${sanitizeTerminalText(dataset.id)}) was created and ${totalUploaded} rows were uploaded. ` +
3889
- `Fix the file, remove the first ${totalUploaded} rows, and run ` +
3890
- `orizu datasets append --dataset ${dataset.id} --file <remaining-file>.`);
3891
- }
3892
- if (nextChunk.done) {
3893
- break;
3894
- }
3895
- const chunk = nextChunk.value;
3896
- chunkIndex += 1;
3897
- printLine(`Uploading chunk ${chunkIndex} (${chunk.length} rows)...`);
3898
- try {
3899
- if (!dataset) {
3900
- const data = await createDatasetFromRows(project, datasetName, 'jsonl', chunk, readmeMarkdown);
3901
- dataset = data.dataset;
3902
- totalUploaded = data.dataset.rowCount;
3903
- continue;
3904
- }
3905
- const data = await appendChunk(dataset.id, chunk);
3906
- totalUploaded += data.appendedCount;
3907
- dataset = {
3908
- ...dataset,
3909
- rowCount: data.dataset.rowCount,
3910
- };
3911
- }
3912
- catch (error) {
3913
- const message = error instanceof Error ? error.message : String(error);
3914
- if (!dataset) {
3915
- throw new Error(message);
3916
- }
3917
- throw new Error(`Chunk ${chunkIndex} failed: ${message}\n` +
3918
- `Dataset ${dataset.name} (${dataset.id}) was created and ${totalUploaded} rows were uploaded. ` +
3919
- `To retry, remove the first ${totalUploaded} rows from your file and run ` +
3920
- `orizu datasets append --dataset ${dataset.id} --file <remaining-file>.`);
3921
- }
3922
- }
3923
- if (!dataset) {
3924
- throw new Error('Dataset file contains no rows');
3925
- }
3926
- const version = await ensureDatasetUploadSnapshot(dataset, hasJsonFlag(), requestDatasetVersionSnapshot);
3934
+ const { transferDatasetUpload } = await import('./dataset-transfer-upload.js');
3935
+ const { data, version } = await transferDatasetUpload({
3936
+ project, name: datasetName, source: { kind: 'jsonl', file }, readmeMarkdown,
3937
+ json: hasJsonFlag(),
3938
+ // JSON mode reserves stderr for structured recovery failures as well.
3939
+ onChunk: (index, count) => { if (!hasJsonFlag())
3940
+ printLine(`Uploading chunk ${index} (${count} rows)...`); },
3941
+ });
3942
+ const dataset = data.dataset;
3927
3943
  if (hasJsonFlag())
3928
3944
  return printJson({ dataset_id: dataset.id, dataset, dataset_version_id: version.datasetVersion.id });
3929
3945
  printLine(`Uploaded dataset ${sanitizeTerminalText(dataset.name)} (${sanitizeTerminalText(dataset.id)}) with ${dataset.rowCount} rows.`);
3930
3946
  printLine(`Created dataset version ${sanitizeTerminalText(version.datasetVersion.id)}.`);
3931
- if (dataset.url) {
3947
+ if (dataset.url)
3932
3948
  printLine(`View dataset: ${formatTerminalLink(dataset.url)}`);
3933
- }
3934
3949
  }
3935
3950
  async function uploadDataset() {
3936
3951
  const projectArg = getArg('--project');
@@ -3949,8 +3964,11 @@ async function uploadDataset() {
3949
3964
  return;
3950
3965
  }
3951
3966
  const { rows, sourceType } = parseDatasetFile(file);
3952
- const data = await createDatasetFromRows(project, datasetName, sourceType, rows, readmeMarkdown);
3953
- const version = await ensureDatasetUploadSnapshot(data.dataset, hasJsonFlag(), requestDatasetVersionSnapshot);
3967
+ const { transferDatasetUpload } = await import('./dataset-transfer-upload.js');
3968
+ const { data, version } = await transferDatasetUpload({
3969
+ project, name: datasetName, source: { kind: 'rows', rows, sourceType }, readmeMarkdown,
3970
+ json: hasJsonFlag(), onChunk: () => { },
3971
+ });
3954
3972
  if (hasJsonFlag())
3955
3973
  return printJson({ dataset_id: data.dataset.id, dataset: data.dataset, dataset_version_id: version.datasetVersion.id });
3956
3974
  printLine(`Uploaded dataset ${sanitizeTerminalText(data.dataset.name)} (${sanitizeTerminalText(data.dataset.id)}) with ${data.dataset.rowCount} rows.`);
@@ -3972,8 +3990,11 @@ async function pushDataset() {
3972
3990
  const project = await resolveProjectSlug(projectArg);
3973
3991
  const datasetName = name || basename(file);
3974
3992
  const { rows, sourceType } = parseDatasetFile(file);
3975
- const data = await createDatasetFromRows(project, datasetName, sourceType, rows, readmeMarkdown);
3976
- const version = await ensureDatasetUploadSnapshot(data.dataset, hasJsonFlag(), requestDatasetVersionSnapshot);
3993
+ const { transferDatasetUpload } = await import('./dataset-transfer-upload.js');
3994
+ const { data, version } = await transferDatasetUpload({
3995
+ project, name: datasetName, source: { kind: 'rows', rows, sourceType }, readmeMarkdown,
3996
+ json: hasJsonFlag(), onChunk: () => { },
3997
+ });
3977
3998
  if (hasJsonFlag()) {
3978
3999
  const payload = {
3979
4000
  dataset_id: data.dataset.id,
@@ -4052,15 +4073,11 @@ async function downloadDataset() {
4052
4073
  const selected = await selectDatasetInteractively(projectArg);
4053
4074
  datasetId = selected.datasetId;
4054
4075
  }
4055
- const response = await authedFetch(`/api/cli/datasets/${encodeURIComponent(datasetId)}/download?format=${encodeURIComponent(format)}`);
4056
- if (!response.ok) {
4057
- throw new Error(`Download failed: ${await response.text()}`);
4058
- }
4059
4076
  const filename = outPathArg
4060
4077
  ? expandHomePath(outPathArg)
4061
4078
  : `${datasetId}.${format}`;
4062
- const bytes = new Uint8Array(await response.arrayBuffer());
4063
- writeFileSync(filename, bytes);
4079
+ const { transferDatasetDownload } = await import('./dataset-transfer-download.js');
4080
+ await transferDatasetDownload(datasetId, format, filename);
4064
4081
  if (hasJsonFlag()) {
4065
4082
  printJson({ datasetId, format, savedTo: filename });
4066
4083
  return;
@@ -4837,6 +4854,10 @@ export async function main(rawArgs = process.argv.slice(2)) {
4837
4854
  await submitRunResults();
4838
4855
  return;
4839
4856
  }
4857
+ if (command === 'runs' && subcommand === 'list') {
4858
+ await listRuns();
4859
+ return;
4860
+ }
4840
4861
  if (command === 'scores' && subcommand === 'submit') {
4841
4862
  await submitScoreResults();
4842
4863
  return;
@@ -1,3 +1,3 @@
1
- /** Resolve the same production-or-default tuple served for a model identity. */
1
+ /** Resolve the requested Profile's Production tuple for optimization. */
2
2
  export declare function resolveGepaInstructionSetProfileVersion(instructionSetName: string, modelConfigIdentity: string, project: string): Promise<string>;
3
3
  //# sourceMappingURL=instruction-set-gepa-launch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"instruction-set-gepa-launch.d.ts","sourceRoot":"","sources":["../src/instruction-set-gepa-launch.ts"],"names":[],"mappings":"AAaA,gFAAgF;AAChF,wBAAsB,uCAAuC,CAC3D,kBAAkB,EAAE,MAAM,EAC1B,mBAAmB,EAAE,MAAM,EAC3B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CASjB"}
1
+ {"version":3,"file":"instruction-set-gepa-launch.d.ts","sourceRoot":"","sources":["../src/instruction-set-gepa-launch.ts"],"names":[],"mappings":"AAYA,yEAAyE;AACzE,wBAAsB,uCAAuC,CAC3D,kBAAkB,EAAE,MAAM,EAC1B,mBAAmB,EAAE,MAAM,EAC3B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAUjB"}
@@ -1,6 +1,6 @@
1
1
  import { authedFetch } from './http.js';
2
2
  import { parseJsonResponse } from './json-response.js';
3
- /** Resolve the same production-or-default tuple served for a model identity. */
3
+ /** Resolve the requested Profile's Production tuple for optimization. */
4
4
  export async function resolveGepaInstructionSetProfileVersion(instructionSetName, modelConfigIdentity, project) {
5
5
  const response = await authedFetch(`/api/cli/instruction-sets/${encodeURIComponent(instructionSetName)}?project=${encodeURIComponent(project)}`);
6
6
  if (!response.ok)
@@ -8,8 +8,10 @@ export async function resolveGepaInstructionSetProfileVersion(instructionSetName
8
8
  const payload = await parseJsonResponse(response, 'Instruction set resolution');
9
9
  const instructionSet = payload.instructionSet;
10
10
  const profile = instructionSet?.profiles?.find(candidate => candidate.modelConfigIdentity === modelConfigIdentity);
11
- const profileVersionId = profile?.production?.profileVersionId || instructionSet?.default?.profileVersionId;
11
+ if (!profile)
12
+ throw new Error(`instruction_set_profile_not_found: ${modelConfigIdentity}`);
13
+ const profileVersionId = profile.production?.profileVersionId;
12
14
  if (!profileVersionId)
13
- throw new Error('instruction_set_profile_version_unresolvable');
15
+ throw new Error(`instruction_set_profile_not_promoted: ${modelConfigIdentity}`);
14
16
  return profileVersionId;
15
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"instruction-set-loader.d.ts","sourceRoot":"","sources":["../src/instruction-set-loader.ts"],"names":[],"mappings":"AAGA,qBAAa,yBAA0B,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAClC;AA2DD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBvH"}
1
+ {"version":3,"file":"instruction-set-loader.d.ts","sourceRoot":"","sources":["../src/instruction-set-loader.ts"],"names":[],"mappings":"AAGA,qBAAa,yBAA0B,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM;CAClC;AA2GD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBvH"}
@@ -8,6 +8,7 @@ export class InstructionSetLoaderError extends Error {
8
8
  this.name = 'InstructionSetLoaderError';
9
9
  }
10
10
  }
11
+ const LEGACY_LOADER_RETIRED = 'instruction_set_legacy_loader_retired: this tree was synced by the paved path; see docs/cli.md#migrating-the-legacy-sync-layout';
11
12
  function inside(root, candidate) { return candidate === root || candidate.startsWith(`${root}${sep}`); }
12
13
  function manifestMatchesReference(candidate, reference) {
13
14
  try {
@@ -18,6 +19,46 @@ function manifestMatchesReference(candidate, reference) {
18
19
  return false;
19
20
  }
20
21
  }
22
+ function pavedTreeMatchesDisplayName(directoryRoot, reference) {
23
+ const setsRoots = [
24
+ resolve(directoryRoot, 'orizu', 'instruction-sets'),
25
+ resolve(directoryRoot, 'instruction-sets'),
26
+ ];
27
+ for (const setsRoot of setsRoots) {
28
+ try {
29
+ for (const setEntry of readdirSync(setsRoot, { withFileTypes: true })) {
30
+ if (!setEntry.isDirectory())
31
+ continue;
32
+ const setRoot = realpathSync(resolve(setsRoot, setEntry.name));
33
+ if (!inside(directoryRoot, setRoot))
34
+ continue;
35
+ for (const profileEntry of readdirSync(setRoot, { withFileTypes: true })) {
36
+ if (!profileEntry.isDirectory())
37
+ continue;
38
+ const profileRoot = realpathSync(resolve(setRoot, profileEntry.name));
39
+ if (!inside(directoryRoot, profileRoot))
40
+ continue;
41
+ for (const versionEntry of readdirSync(profileRoot, { withFileTypes: true })) {
42
+ if (!versionEntry.isDirectory() || !/^v[1-9][0-9]*$/u.test(versionEntry.name))
43
+ continue;
44
+ try {
45
+ const manifest = JSON.parse(readFileSync(resolve(profileRoot, versionEntry.name, 'manifest.json'), 'utf8'));
46
+ if (manifest.instructionSetName === reference || manifest.instructionSetSlug === reference)
47
+ return true;
48
+ }
49
+ catch {
50
+ // Inspect another paved Version.
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ catch {
57
+ // Inspect the other paved root.
58
+ }
59
+ }
60
+ return false;
61
+ }
21
62
  function resolveSetRoot(directory, reference) {
22
63
  let directoryRoot;
23
64
  try {
@@ -26,6 +67,21 @@ function resolveSetRoot(directory, reference) {
26
67
  catch {
27
68
  throw new InstructionSetLoaderError('instruction_set_not_synced');
28
69
  }
70
+ const pavedCandidates = [
71
+ resolve(directoryRoot, 'orizu', 'instruction-sets', reference),
72
+ resolve(directoryRoot, 'instruction-sets', reference),
73
+ ];
74
+ if (pavedCandidates.some(candidate => {
75
+ try {
76
+ return inside(directoryRoot, realpathSync(candidate)) && statSync(candidate).isDirectory();
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ }) || (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/u.test(reference)
82
+ && pavedTreeMatchesDisplayName(directoryRoot, reference))) {
83
+ throw new InstructionSetLoaderError(LEGACY_LOADER_RETIRED);
84
+ }
29
85
  const direct = resolve(directoryRoot, reference);
30
86
  try {
31
87
  if (inside(directoryRoot, direct) && existsSync(direct) && statSync(direct).isDirectory()) {
@@ -80,8 +136,13 @@ export function loadInstructionSet(directory, name, modelConfigIdentity) {
80
136
  throw new InstructionSetLoaderError('instruction_set_manifest_version_unsupported');
81
137
  if (manifest.filteredTo && !manifest.filteredTo.includes(modelConfigIdentity))
82
138
  throw new InstructionSetLoaderError('instruction_set_profile_not_synced');
83
- const selected = manifest.profiles.find(profile => profile.modelConfigIdentity === modelConfigIdentity)?.production || manifest.default;
84
- const result = {};
139
+ const profile = manifest.profiles.find(profile => profile.modelConfigIdentity === modelConfigIdentity);
140
+ if (!profile)
141
+ throw new InstructionSetLoaderError('instruction_set_profile_not_found');
142
+ if (!profile.production)
143
+ throw new InstructionSetLoaderError('instruction_set_profile_not_promoted');
144
+ const selected = profile.production;
145
+ const result = Object.create(null);
85
146
  for (const key of manifest.shape) {
86
147
  if (selected.pinnedComponents?.[key])
87
148
  throw new InstructionSetLoaderError('instruction_set_component_unavailable');
@@ -0,0 +1,51 @@
1
+ export interface SyncedVersionLock {
2
+ profileVersionId: string;
3
+ versionNumber: number;
4
+ digest: string;
5
+ components: Record<string, string>;
6
+ syncedAt: string;
7
+ }
8
+ export interface ProfileLock {
9
+ modelConfigIdentity?: string;
10
+ production: string | null;
11
+ versions: Record<string, SyncedVersionLock>;
12
+ }
13
+ export interface InstructionSetLock {
14
+ instructionSetId: string;
15
+ default: string;
16
+ profiles: Record<string, ProfileLock>;
17
+ }
18
+ export interface InstructionSetLockV1 {
19
+ lockfileVersion: 1;
20
+ project: string;
21
+ instructionSets: Record<string, InstructionSetLock>;
22
+ helpers?: Record<string, string>;
23
+ pins?: string[];
24
+ }
25
+ export type LockParseErrorCode = 'lock_invalid_json' | 'lock_unsupported_version' | 'lock_production_not_a_version' | `lock_component_key_unsafe:${string}` | `lock_component_key_reserved:${string}` | `lock_helper_path_invalid:${string}` | `lock_set_slug_invalid:${string}` | `lock_profile_slug_invalid:${string}` | `lock_default_slug_invalid:${string}` | `lock_instruction_set_id_duplicate:${string}` | `lock_profile_version_id_duplicate:${string}` | `instruction_set_lock_component_key_collision:${string},${string}` | `instruction_set_lock_helper_path_collision:${string},${string}` | `lock_schema_violation:${string}` | `lock_pin_invalid:${string}:${SpecifierParseErrorCode}`;
26
+ export declare class LockParseError extends Error {
27
+ readonly code: LockParseErrorCode;
28
+ readonly path?: string;
29
+ constructor(code: LockParseErrorCode, path?: string);
30
+ }
31
+ export type SpecifierParseErrorCode = 'specifier_empty' | 'specifier_invalid_set' | 'specifier_profile_missing' | 'specifier_invalid_profile' | 'specifier_version_without_profile' | 'specifier_invalid_version';
32
+ export declare class SpecifierParseError extends Error {
33
+ readonly code: SpecifierParseErrorCode;
34
+ constructor(code: SpecifierParseErrorCode);
35
+ }
36
+ export interface ParsedSpecifier {
37
+ set: string;
38
+ profile?: string;
39
+ versionNumber?: number;
40
+ }
41
+ export declare const INSTRUCTION_SET_SLUG: RegExp;
42
+ export declare const INSTRUCTION_SET_PROFILE_SLUG: RegExp;
43
+ export declare const INSTRUCTION_SET_COMPONENT_KEY: RegExp;
44
+ export declare const INSTRUCTION_SET_HELPER_PATH: RegExp;
45
+ export declare const MAX_VERSION_NUMBER = 2147483647;
46
+ export declare function windowsPathIdentity(value: string): string;
47
+ export declare function validateInstructionSetComponentKeys(componentKeys: string[], pathPrefix?: string, rejectWindowsReserved?: boolean): void;
48
+ export declare function parseLock(text: string): InstructionSetLockV1;
49
+ export declare function serializeLock(lock: InstructionSetLockV1): string;
50
+ export declare function parseSpecifier(text: string): ParsedSpecifier;
51
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/instruction-set-lock/index.ts"],"names":[],"mappings":"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"}