@userreason/cli 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,7 +15,13 @@ export declare const parseSetupCapabilities: Reader<Shape<{
15
15
  insert_footer: Reader<boolean>;
16
16
  source_review: Reader<boolean>;
17
17
  sample_read: Reader<boolean>;
18
+ onboarding_v2: Reader<boolean | undefined>;
18
19
  project_name: Reader<string | undefined>;
20
+ launcher: Reader<Shape<{
21
+ wizard_version: Reader<string>;
22
+ api_origin: Reader<string>;
23
+ registry: Reader<string | undefined>;
24
+ }> | undefined>;
19
25
  terminal: Reader<Shape<{
20
26
  platform: Reader<string>;
21
27
  app: Reader<string>;
@@ -122,6 +128,16 @@ declare const sourceState: Reader<Shape<{
122
128
  authorized_at: Reader<string | null>;
123
129
  expires_at: Reader<string>;
124
130
  error_code: Reader<"operation_failed" | "planning_unavailable" | "planning_paused" | "planning_daily_budget" | "planning_allowance_exhausted" | "planning_provider_unavailable" | "planning_policy_changed" | "planning_consent_expired" | "planning_input_budget" | "planning_invalid_output" | "planning_timeout" | "source_changed" | "source_unavailable" | "recommendations_no_source" | null>;
131
+ analysis_id: Reader<string | undefined>;
132
+ analysis_started_at: Reader<string | undefined>;
133
+ analysis_completed_at: Reader<string | undefined>;
134
+ deadline_at: Reader<string | undefined>;
135
+ timings: Reader<Shape<{
136
+ extraction_ms: Reader<number | undefined>;
137
+ consolidation_ms: Reader<number | undefined>;
138
+ authoring_ms: Reader<number | undefined>;
139
+ total_ms: Reader<number | undefined>;
140
+ }> | undefined>;
125
141
  }>>;
126
142
  export declare const parseSetupSourceManifest: Reader<Shape<{
127
143
  packet_digest: Reader<string>;
@@ -158,7 +174,13 @@ export declare const parseSetupSession: Reader<Shape<{
158
174
  insert_footer: Reader<boolean>;
159
175
  source_review: Reader<boolean>;
160
176
  sample_read: Reader<boolean>;
177
+ onboarding_v2: Reader<boolean | undefined>;
161
178
  project_name: Reader<string | undefined>;
179
+ launcher: Reader<Shape<{
180
+ wizard_version: Reader<string>;
181
+ api_origin: Reader<string>;
182
+ registry: Reader<string | undefined>;
183
+ }> | undefined>;
162
184
  terminal: Reader<Shape<{
163
185
  platform: Reader<string>;
164
186
  app: Reader<string>;
@@ -207,6 +229,16 @@ export declare const parseSetupSession: Reader<Shape<{
207
229
  authorized_at: Reader<string | null>;
208
230
  expires_at: Reader<string>;
209
231
  error_code: Reader<"operation_failed" | "planning_unavailable" | "planning_paused" | "planning_daily_budget" | "planning_allowance_exhausted" | "planning_provider_unavailable" | "planning_policy_changed" | "planning_consent_expired" | "planning_input_budget" | "planning_invalid_output" | "planning_timeout" | "source_changed" | "source_unavailable" | "recommendations_no_source" | null>;
232
+ analysis_id: Reader<string | undefined>;
233
+ analysis_started_at: Reader<string | undefined>;
234
+ analysis_completed_at: Reader<string | undefined>;
235
+ deadline_at: Reader<string | undefined>;
236
+ timings: Reader<Shape<{
237
+ extraction_ms: Reader<number | undefined>;
238
+ consolidation_ms: Reader<number | undefined>;
239
+ authoring_ms: Reader<number | undefined>;
240
+ total_ms: Reader<number | undefined>;
241
+ }> | undefined>;
210
242
  }> | null | undefined>;
211
243
  recommendation_digest: Reader<string | null | undefined>;
212
244
  selected_candidates: Reader<string[] | undefined>;
@@ -255,7 +287,13 @@ export declare const parseSetupStartInput: Reader<Shape<{
255
287
  insert_footer: Reader<boolean>;
256
288
  source_review: Reader<boolean>;
257
289
  sample_read: Reader<boolean>;
290
+ onboarding_v2: Reader<boolean | undefined>;
258
291
  project_name: Reader<string | undefined>;
292
+ launcher: Reader<Shape<{
293
+ wizard_version: Reader<string>;
294
+ api_origin: Reader<string>;
295
+ registry: Reader<string | undefined>;
296
+ }> | undefined>;
259
297
  terminal: Reader<Shape<{
260
298
  platform: Reader<string>;
261
299
  app: Reader<string>;
@@ -376,7 +414,13 @@ export declare const parseSetupSourceInfo: Reader<Shape<{
376
414
  insert_footer: Reader<boolean>;
377
415
  source_review: Reader<boolean>;
378
416
  sample_read: Reader<boolean>;
417
+ onboarding_v2: Reader<boolean | undefined>;
379
418
  project_name: Reader<string | undefined>;
419
+ launcher: Reader<Shape<{
420
+ wizard_version: Reader<string>;
421
+ api_origin: Reader<string>;
422
+ registry: Reader<string | undefined>;
423
+ }> | undefined>;
380
424
  terminal: Reader<Shape<{
381
425
  platform: Reader<string>;
382
426
  app: Reader<string>;
@@ -425,6 +469,16 @@ export declare const parseSetupSourceInfo: Reader<Shape<{
425
469
  authorized_at: Reader<string | null>;
426
470
  expires_at: Reader<string>;
427
471
  error_code: Reader<"operation_failed" | "planning_unavailable" | "planning_paused" | "planning_daily_budget" | "planning_allowance_exhausted" | "planning_provider_unavailable" | "planning_policy_changed" | "planning_consent_expired" | "planning_input_budget" | "planning_invalid_output" | "planning_timeout" | "source_changed" | "source_unavailable" | "recommendations_no_source" | null>;
472
+ analysis_id: Reader<string | undefined>;
473
+ analysis_started_at: Reader<string | undefined>;
474
+ analysis_completed_at: Reader<string | undefined>;
475
+ deadline_at: Reader<string | undefined>;
476
+ timings: Reader<Shape<{
477
+ extraction_ms: Reader<number | undefined>;
478
+ consolidation_ms: Reader<number | undefined>;
479
+ authoring_ms: Reader<number | undefined>;
480
+ total_ms: Reader<number | undefined>;
481
+ }> | undefined>;
428
482
  }> | null | undefined>;
429
483
  recommendation_digest: Reader<string | null | undefined>;
430
484
  selected_candidates: Reader<string[] | undefined>;
@@ -545,7 +599,13 @@ export declare const parseSetupClaimResult: Reader<Shape<{
545
599
  insert_footer: Reader<boolean>;
546
600
  source_review: Reader<boolean>;
547
601
  sample_read: Reader<boolean>;
602
+ onboarding_v2: Reader<boolean | undefined>;
548
603
  project_name: Reader<string | undefined>;
604
+ launcher: Reader<Shape<{
605
+ wizard_version: Reader<string>;
606
+ api_origin: Reader<string>;
607
+ registry: Reader<string | undefined>;
608
+ }> | undefined>;
549
609
  terminal: Reader<Shape<{
550
610
  platform: Reader<string>;
551
611
  app: Reader<string>;
@@ -594,6 +654,16 @@ export declare const parseSetupClaimResult: Reader<Shape<{
594
654
  authorized_at: Reader<string | null>;
595
655
  expires_at: Reader<string>;
596
656
  error_code: Reader<"operation_failed" | "planning_unavailable" | "planning_paused" | "planning_daily_budget" | "planning_allowance_exhausted" | "planning_provider_unavailable" | "planning_policy_changed" | "planning_consent_expired" | "planning_input_budget" | "planning_invalid_output" | "planning_timeout" | "source_changed" | "source_unavailable" | "recommendations_no_source" | null>;
657
+ analysis_id: Reader<string | undefined>;
658
+ analysis_started_at: Reader<string | undefined>;
659
+ analysis_completed_at: Reader<string | undefined>;
660
+ deadline_at: Reader<string | undefined>;
661
+ timings: Reader<Shape<{
662
+ extraction_ms: Reader<number | undefined>;
663
+ consolidation_ms: Reader<number | undefined>;
664
+ authoring_ms: Reader<number | undefined>;
665
+ total_ms: Reader<number | undefined>;
666
+ }> | undefined>;
597
667
  }> | null | undefined>;
598
668
  recommendation_digest: Reader<string | null | undefined>;
599
669
  selected_candidates: Reader<string[] | undefined>;
@@ -747,7 +817,13 @@ export declare const setupWireReaders: {
747
817
  insert_footer: Reader<boolean>;
748
818
  source_review: Reader<boolean>;
749
819
  sample_read: Reader<boolean>;
820
+ onboarding_v2: Reader<boolean | undefined>;
750
821
  project_name: Reader<string | undefined>;
822
+ launcher: Reader<Shape<{
823
+ wizard_version: Reader<string>;
824
+ api_origin: Reader<string>;
825
+ registry: Reader<string | undefined>;
826
+ }> | undefined>;
751
827
  terminal: Reader<Shape<{
752
828
  platform: Reader<string>;
753
829
  app: Reader<string>;
@@ -796,6 +872,16 @@ export declare const setupWireReaders: {
796
872
  authorized_at: Reader<string | null>;
797
873
  expires_at: Reader<string>;
798
874
  error_code: Reader<"operation_failed" | "planning_unavailable" | "planning_paused" | "planning_daily_budget" | "planning_allowance_exhausted" | "planning_provider_unavailable" | "planning_policy_changed" | "planning_consent_expired" | "planning_input_budget" | "planning_invalid_output" | "planning_timeout" | "source_changed" | "source_unavailable" | "recommendations_no_source" | null>;
875
+ analysis_id: Reader<string | undefined>;
876
+ analysis_started_at: Reader<string | undefined>;
877
+ analysis_completed_at: Reader<string | undefined>;
878
+ deadline_at: Reader<string | undefined>;
879
+ timings: Reader<Shape<{
880
+ extraction_ms: Reader<number | undefined>;
881
+ consolidation_ms: Reader<number | undefined>;
882
+ authoring_ms: Reader<number | undefined>;
883
+ total_ms: Reader<number | undefined>;
884
+ }> | undefined>;
799
885
  }> | null | undefined>;
800
886
  recommendation_digest: Reader<string | null | undefined>;
801
887
  selected_candidates: Reader<string[] | undefined>;
@@ -887,7 +973,13 @@ export declare const setupWireReaders: {
887
973
  insert_footer: Reader<boolean>;
888
974
  source_review: Reader<boolean>;
889
975
  sample_read: Reader<boolean>;
976
+ onboarding_v2: Reader<boolean | undefined>;
890
977
  project_name: Reader<string | undefined>;
978
+ launcher: Reader<Shape<{
979
+ wizard_version: Reader<string>;
980
+ api_origin: Reader<string>;
981
+ registry: Reader<string | undefined>;
982
+ }> | undefined>;
891
983
  terminal: Reader<Shape<{
892
984
  platform: Reader<string>;
893
985
  app: Reader<string>;
@@ -913,7 +1005,13 @@ export declare const setupWireReaders: {
913
1005
  insert_footer: Reader<boolean>;
914
1006
  source_review: Reader<boolean>;
915
1007
  sample_read: Reader<boolean>;
1008
+ onboarding_v2: Reader<boolean | undefined>;
916
1009
  project_name: Reader<string | undefined>;
1010
+ launcher: Reader<Shape<{
1011
+ wizard_version: Reader<string>;
1012
+ api_origin: Reader<string>;
1013
+ registry: Reader<string | undefined>;
1014
+ }> | undefined>;
917
1015
  terminal: Reader<Shape<{
918
1016
  platform: Reader<string>;
919
1017
  app: Reader<string>;
@@ -962,6 +1060,16 @@ export declare const setupWireReaders: {
962
1060
  authorized_at: Reader<string | null>;
963
1061
  expires_at: Reader<string>;
964
1062
  error_code: Reader<"operation_failed" | "planning_unavailable" | "planning_paused" | "planning_daily_budget" | "planning_allowance_exhausted" | "planning_provider_unavailable" | "planning_policy_changed" | "planning_consent_expired" | "planning_input_budget" | "planning_invalid_output" | "planning_timeout" | "source_changed" | "source_unavailable" | "recommendations_no_source" | null>;
1063
+ analysis_id: Reader<string | undefined>;
1064
+ analysis_started_at: Reader<string | undefined>;
1065
+ analysis_completed_at: Reader<string | undefined>;
1066
+ deadline_at: Reader<string | undefined>;
1067
+ timings: Reader<Shape<{
1068
+ extraction_ms: Reader<number | undefined>;
1069
+ consolidation_ms: Reader<number | undefined>;
1070
+ authoring_ms: Reader<number | undefined>;
1071
+ total_ms: Reader<number | undefined>;
1072
+ }> | undefined>;
965
1073
  }> | null | undefined>;
966
1074
  recommendation_digest: Reader<string | null | undefined>;
967
1075
  selected_candidates: Reader<string[] | undefined>;
@@ -1010,7 +1118,13 @@ export declare const setupWireReaders: {
1010
1118
  insert_footer: Reader<boolean>;
1011
1119
  source_review: Reader<boolean>;
1012
1120
  sample_read: Reader<boolean>;
1121
+ onboarding_v2: Reader<boolean | undefined>;
1013
1122
  project_name: Reader<string | undefined>;
1123
+ launcher: Reader<Shape<{
1124
+ wizard_version: Reader<string>;
1125
+ api_origin: Reader<string>;
1126
+ registry: Reader<string | undefined>;
1127
+ }> | undefined>;
1014
1128
  terminal: Reader<Shape<{
1015
1129
  platform: Reader<string>;
1016
1130
  app: Reader<string>;
@@ -1101,7 +1215,13 @@ export declare const setupWireReaders: {
1101
1215
  insert_footer: Reader<boolean>;
1102
1216
  source_review: Reader<boolean>;
1103
1217
  sample_read: Reader<boolean>;
1218
+ onboarding_v2: Reader<boolean | undefined>;
1104
1219
  project_name: Reader<string | undefined>;
1220
+ launcher: Reader<Shape<{
1221
+ wizard_version: Reader<string>;
1222
+ api_origin: Reader<string>;
1223
+ registry: Reader<string | undefined>;
1224
+ }> | undefined>;
1105
1225
  terminal: Reader<Shape<{
1106
1226
  platform: Reader<string>;
1107
1227
  app: Reader<string>;
@@ -1150,6 +1270,16 @@ export declare const setupWireReaders: {
1150
1270
  authorized_at: Reader<string | null>;
1151
1271
  expires_at: Reader<string>;
1152
1272
  error_code: Reader<"operation_failed" | "planning_unavailable" | "planning_paused" | "planning_daily_budget" | "planning_allowance_exhausted" | "planning_provider_unavailable" | "planning_policy_changed" | "planning_consent_expired" | "planning_input_budget" | "planning_invalid_output" | "planning_timeout" | "source_changed" | "source_unavailable" | "recommendations_no_source" | null>;
1273
+ analysis_id: Reader<string | undefined>;
1274
+ analysis_started_at: Reader<string | undefined>;
1275
+ analysis_completed_at: Reader<string | undefined>;
1276
+ deadline_at: Reader<string | undefined>;
1277
+ timings: Reader<Shape<{
1278
+ extraction_ms: Reader<number | undefined>;
1279
+ consolidation_ms: Reader<number | undefined>;
1280
+ authoring_ms: Reader<number | undefined>;
1281
+ total_ms: Reader<number | undefined>;
1282
+ }> | undefined>;
1153
1283
  }> | null | undefined>;
1154
1284
  recommendation_digest: Reader<string | null | undefined>;
1155
1285
  selected_candidates: Reader<string[] | undefined>;
@@ -54,6 +54,20 @@ const revision = refine(text(1, 19, /^[1-9][0-9]*$/), value => BigInt(value) <=
54
54
  const generation = integer(1, 2147483647);
55
55
  const shortText = value => text(1, 240, /^[^\u0000-\u001f\u007f]*$/)(typeof value === 'string' ? value.trim() : value);
56
56
  const identifier = text(1, 80, /^[A-Za-z0-9_-]+$/);
57
+ const canonicalOrigin = refine(text(1, 2048), value => { try {
58
+ const url = new URL(value);
59
+ return ['https:', 'http:'].includes(url.protocol) && !url.username && !url.password && !url.hostname.includes('*') && url.origin === value;
60
+ }
61
+ catch {
62
+ return false;
63
+ } });
64
+ const localRegistry = refine(text(1, 200), value => { try {
65
+ const url = new URL(value);
66
+ return url.protocol === 'http:' && ['127.0.0.1', 'localhost', '[::1]'].includes(url.hostname) && !url.username && !url.password && url.pathname === '/' && !url.search && !url.hash;
67
+ }
68
+ catch {
69
+ return false;
70
+ } });
57
71
  const relativePath = refine(text(1, 240), value => !value.startsWith('/') && !/[\\:\u0000-\u001f\u007f]/.test(value) && value.split('/').every(part => !['', '.', '..'].includes(part)));
58
72
  const scope = { schema_version: literal(1), setup_id: uuid };
59
73
  export const setupPhases = ['configuring', 'awaiting_local_approval', 'applying', 'ready_for_recommendations', 'analyzing', 'selecting_drafts', 'creating_drafts', 'agent_test', 'complete', 'cancelled', 'expired'];
@@ -62,8 +76,9 @@ const resultCodes = ['verified', 'already_present', 'skipped', 'review_required'
62
76
  const statuses = ['prepared', 'approved', 'leased', 'running', 'succeeded', 'failed', 'manual', 'cancelled', 'outcome_unknown'];
63
77
  export const parseSetupCapabilities = shape({
64
78
  framework: oneOf(['react', 'next', 'vue', 'vanilla']), package_manager: oneOf(['npm', 'pnpm', 'yarn']),
65
- install_packages: bool, initialize_sdk: bool, install_skill: bool, insert_footer: bool, source_review: bool, sample_read: bool,
79
+ install_packages: bool, initialize_sdk: bool, install_skill: bool, insert_footer: bool, source_review: bool, sample_read: bool, onboarding_v2: optional(bool),
66
80
  project_name: optional(refine(shortText, value => value.length <= 120 && !/[\/\\]/.test(value))),
81
+ launcher: optional(shape({ wizard_version: text(1, 80, /^\d+\.\d+\.\d+(?:-[A-Za-z0-9.-]+)?(?:\+[A-Za-z0-9.-]+)?$/), api_origin: canonicalOrigin, registry: optional(localRegistry) })),
67
82
  terminal: optional(shape({ platform: oneOf(['macos', 'windows', 'linux', 'other']), app: oneOf(['apple_terminal', 'iterm2', 'windows_terminal', 'vscode', 'cursor', 'warp', 'ghostty', 'wezterm', 'alacritty', 'kitty', 'generic']) })),
68
83
  });
69
84
  const choices = shape({ install_sdk: bool, install_skill: bool, footer_badge: bool });
@@ -98,14 +113,14 @@ export function parseSetupEffect(value) { return effect(value); }
98
113
  const sampleState = refine(shape({ status: oneOf(['not_started', 'waiting', 'received', 'skipped']), first_received_at: nullable(timestamp), latest_received_at: nullable(timestamp), latest_request_id: nullable(uuid) }), value => (value.first_received_at === null) === (value.latest_received_at === null) && (value.latest_received_at === null) === (value.latest_request_id === null) && (value.status !== 'received' || value.first_received_at !== null));
99
114
  const draftOutcome = refine(shape({ candidate_id: identifier, status: oneOf(['pending', 'succeeded', 'failed']), prompt_id: uuid, request_id: uuid, revision: nullable(revision), code: nullable(oneOf(resultCodes)) }), value => value.status !== 'succeeded' || value.revision !== null);
100
115
  const sourceErrors = ['planning_unavailable', 'planning_paused', 'planning_daily_budget', 'planning_allowance_exhausted', 'planning_provider_unavailable', 'planning_policy_changed', 'planning_consent_expired', 'planning_input_budget', 'planning_invalid_output', 'planning_timeout', 'source_changed', 'source_unavailable', 'recommendations_no_source', 'operation_failed'];
101
- const sourceState = refine(shape({ preparation_id: uuid, status: oneOf(['pending', 'approved', 'analyzing', 'ready', 'failed', 'skipped']), packet_digest: hash, provider_fingerprint: hash, authorized_at: nullable(timestamp), expires_at: timestamp, error_code: nullable(oneOf(sourceErrors)) }), value => (!['approved', 'analyzing', 'ready'].includes(value.status) || value.authorized_at !== null) && (value.authorized_at === null || Date.parse(value.expires_at) > Date.parse(value.authorized_at) && Date.parse(value.expires_at) - Date.parse(value.authorized_at) <= 600_000));
102
- const sourceFile = refine(shape({ path: relativePath, file_hash: hash, excerpt_hash: hash, bytes: integer(0, 12000), start_line: integer(1, Number.MAX_SAFE_INTEGER), end_line: integer(1, Number.MAX_SAFE_INTEGER) }), value => value.end_line >= value.start_line);
103
- export const parseSetupSourceManifest = refine(bounded(shape({ packet_digest: hash, snapshot_id: uuid, files: array(sourceFile, 0, 200, value => value.path), omitted_files: integer(0, 1000000), truncated: bool, git_included: literal(false) })), value => value.files.reduce((sum, file) => sum + file.bytes, 0) <= 12000);
116
+ const sourceState = refine(shape({ preparation_id: uuid, status: oneOf(['pending', 'approved', 'analyzing', 'ready', 'failed', 'skipped']), packet_digest: hash, provider_fingerprint: hash, authorized_at: nullable(timestamp), expires_at: timestamp, error_code: nullable(oneOf(sourceErrors)), analysis_id: optional(uuid), analysis_started_at: optional(timestamp), analysis_completed_at: optional(timestamp), deadline_at: optional(timestamp), timings: optional(shape({ extraction_ms: optional(integer(0, Number.MAX_SAFE_INTEGER)), consolidation_ms: optional(integer(0, Number.MAX_SAFE_INTEGER)), authoring_ms: optional(integer(0, Number.MAX_SAFE_INTEGER)), total_ms: optional(integer(0, Number.MAX_SAFE_INTEGER)) })) }), value => (!['approved', 'analyzing', 'ready'].includes(value.status) || value.authorized_at !== null) && (!value.deadline_at || Boolean(value.analysis_started_at && Date.parse(value.deadline_at) > Date.parse(value.analysis_started_at) && Date.parse(value.deadline_at) - Date.parse(value.analysis_started_at) <= 240000)) && (!value.analysis_completed_at || Boolean(value.analysis_started_at && Date.parse(value.analysis_completed_at) >= Date.parse(value.analysis_started_at))) && (value.authorized_at === null || Date.parse(value.expires_at) > Date.parse(value.authorized_at) && Date.parse(value.expires_at) - Date.parse(value.authorized_at) <= 600_000));
117
+ const sourceFile = refine(shape({ path: relativePath, file_hash: hash, excerpt_hash: hash, bytes: integer(0, 262144), start_line: integer(1, Number.MAX_SAFE_INTEGER), end_line: integer(1, Number.MAX_SAFE_INTEGER) }), value => value.end_line >= value.start_line);
118
+ export const parseSetupSourceManifest = refine(bounded(shape({ packet_digest: hash, snapshot_id: uuid, files: array(sourceFile, 0, 200, value => `${value.path}:${value.start_line}:${value.end_line}`), omitted_files: integer(0, 1000000), truncated: bool, git_included: literal(false) })), value => value.files.reduce((sum, file) => sum + file.bytes, 0) <= 262144);
104
119
  const sourcePackage = shape({ name: (value) => text(1, 100)(typeof value === 'string' ? value.trim() : value), version: (value) => text(1, 100)(typeof value === 'string' ? value.trim() : value) });
105
120
  const sourcePackages = array(sourcePackage, 0, 30, value => value.name);
106
121
  const evidencePath = refine(text(1, 500), value => !value.startsWith('/') && !value.includes('\\') && !value.split('/').some(part => ['', '.', '..'].includes(part)));
107
- const sourceEvidence = refine(shape({ kind: literal('local_source'), id: identifier, path: evidencePath, file_hash: hash, excerpt_hash: hash, snapshot_id: uuid, start_line: integer(1, Number.MAX_SAFE_INTEGER), end_line: integer(1, Number.MAX_SAFE_INTEGER), excerpt: text(0, 12000) }), value => value.end_line >= value.start_line && value.excerpt.split('\n').length === value.end_line - value.start_line + 1);
108
- const planningLimits = shape({ input_tokens: integer(256, 12000), output_tokens: integer(256, 4000), deadline_ms: integer(1000, 40000) });
122
+ const sourceEvidence = refine(shape({ kind: literal('local_source'), id: identifier, path: evidencePath, file_hash: hash, excerpt_hash: hash, snapshot_id: uuid, start_line: integer(1, Number.MAX_SAFE_INTEGER), end_line: integer(1, Number.MAX_SAFE_INTEGER), excerpt: text(0, 30000) }), value => value.end_line >= value.start_line && value.excerpt.split('\n').length === value.end_line - value.start_line + 1);
123
+ const planningLimits = shape({ input_tokens: integer(256, 262144), output_tokens: integer(256, 32768), deadline_ms: integer(1000, 240000) });
109
124
  const providerDestination = refine(text(1, 200), value => { try {
110
125
  const url = new URL(value);
111
126
  return url.protocol === 'https:' && !url.username && !url.password && !url.search && !url.hash;
@@ -149,7 +164,7 @@ export const parseSetupPollInput = shape(scope);
149
164
  export const parseSetupLocalPlanInput = bounded(shape({ ...scope, request_id: uuid, expected_revision: revision, plan: localPlan }));
150
165
  export const parseSetupSourceInfoInput = shape(scope);
151
166
  export const parseSetupSourcePlanInput = refine(bounded(shape({ ...scope, request_id: uuid, expected_revision: revision, manifest: parseSetupSourceManifest, packages: sourcePackages })), value => value.request_id === value.manifest.snapshot_id);
152
- export const parseSetupSourceUploadInput = refine(bounded(shape({ ...scope, preparation_id: uuid, project_fingerprint: hash, evidence: array(sourceEvidence, 0, 220, value => value.id) })), value => new Set(value.evidence.map(item => item.path)).size === value.evidence.length && Buffer.byteLength(JSON.stringify(value.evidence)) <= 12000 && value.evidence.every(item => item.snapshot_id === value.preparation_id));
167
+ export const parseSetupSourceUploadInput = refine(shape({ ...scope, preparation_id: uuid, project_fingerprint: hash, evidence: array(sourceEvidence, 0, 220, value => value.id) }), value => Buffer.byteLength(JSON.stringify(value)) <= 300000 && new Set(value.evidence.map(item => `${item.path}:${item.start_line}:${item.end_line}`)).size === value.evidence.length && Buffer.byteLength(JSON.stringify(value.evidence)) <= 262144 && value.evidence.every(item => item.snapshot_id === value.preparation_id));
153
168
  export const parseSetupSourceInfo = refine(bounded(shape({ schema_version: literal(1), session: parseSetupSession, preparation: nullable(shape({ preparation_id: uuid, manifest: parseSetupSourceManifest, packages: sourcePackages, configuration: planningConfiguration })) })), value => value.preparation === null || value.preparation.preparation_id === value.preparation.manifest.snapshot_id);
154
169
  export const parseSetupClaimInput = shape({ ...scope, request_id: uuid, executor_generation: generation });
155
170
  export const parseSetupClaimResult = bounded(shape({ schema_version: literal(1), command: nullable(command), session: parseSetupSession }));