@oneharness/sdk 0.5.9 → 0.5.10

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.
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import type { ActionEvent, BatchReport, FailureKind, FallThrough, FallbackReport, OutputFormat, RunReport, RunResult, SessionReport, Status, ToolCallStatus, Usage } from "./contracts.js";
2
+ import type { ActionEvent, BatchReport, FailureKind, FallThrough, FallbackReport, OutputFormat, RunReport, RunResult, SessionReport, Status, TimingSource, ToolCallStatus, Usage } from "./contracts.js";
3
3
  import type { DetectInfo, DetectReport } from "./detection.js";
4
4
  import type { HistoryRecord } from "./history.js";
5
5
  import type { HistoryLine } from "./history-line.js";
@@ -49,6 +49,7 @@ export declare const RunStreamEnvelopeSchema: z.ZodType<RunStreamEnvelope>;
49
49
  export declare const SessionPhaseSchema: z.ZodType<SessionPhase>;
50
50
  export declare const SessionReportSchema: z.ZodType<SessionReport>;
51
51
  export declare const StatusSchema: z.ZodType<Status>;
52
+ export declare const TimingSourceSchema: z.ZodType<TimingSource>;
52
53
  export declare const ToolCallStatusSchema: z.ZodType<ToolCallStatus>;
53
54
  export declare const UsageSchema: z.ZodType<Usage>;
54
55
  export declare const VariantInfoSchema: z.ZodType<VariantInfo>;
@@ -15,6 +15,7 @@ export const ActionEventSchema = z.looseObject({
15
15
  status: z
16
16
  .union([z.lazy(() => ToolCallStatusSchema), z.null()])
17
17
  .refine((value) => value !== undefined, { message: "Required" }),
18
+ timing_source: z.union([z.lazy(() => TimingSourceSchema), z.null()]).optional(),
18
19
  tool_call_id: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
19
20
  });
20
21
  export const BatchReportSchema = z.looseObject({
@@ -78,39 +79,28 @@ export const HarnessInfoSchema = z.looseObject({
78
79
  sync_file: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
79
80
  variants: z.array(z.lazy(() => VariantInfoSchema)).refine((value) => value !== undefined, { message: "Required" }),
80
81
  });
81
- export const HistoryEventLineSchema = z.looseObject({
82
- event: z.lazy(() => ActionEventSchema).refine((value) => value !== undefined, { message: "Required" }),
83
- harness: z.string().refine((value) => value !== undefined, { message: "Required" }),
84
- harness_id: z.union([z.string(), z.null()]).optional(),
85
- run_id: z
86
- .string()
87
- .min(36)
88
- .regex(new RegExp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "u"))
89
- .refine((value) => [...value].length <= 36, { message: "Too long: expected at most 36 characters" })
90
- .refine((value) => value !== undefined, { message: "Required" }),
91
- schema_version: z
92
- .union([z.literal("1.0"), z.literal("1.1")])
93
- .refine((value) => value !== undefined, { message: "Required" }),
94
- variant: z.union([z.string(), z.null()]).optional(),
95
- });
96
- export const HistoryLabelsSchema = z.record(z
97
- .string()
98
- .regex(new RegExp("^[A-Za-z0-9]", "u"))
99
- .refine((value) => [...value].length <= 64, { message: "Too long: expected at most 64 characters" })
100
- .refine((value) => !new RegExp("[^A-Za-z0-9._-]", "u").test(value), {
101
- message: "Invalid string: must not contain [^A-Za-z0-9._-]",
102
- }), z
103
- .string()
104
- .min(1)
105
- .refine((value) => [...value].length <= 256, { message: "Too long: expected at most 256 characters" })
106
- .refine((value) => !new RegExp("[\\u0000-\\u001f\\u007f-\\u009f]", "u").test(value), {
107
- message: "Invalid string: must not contain [\\u0000-\\u001f\\u007f-\\u009f]",
108
- }));
109
- export const HistoryLineSchema = z.union([
82
+ export const HistoryEventLineSchema = z.union([
110
83
  z.looseObject({
111
84
  event: z.lazy(() => ActionEventSchema).refine((value) => value !== undefined, { message: "Required" }),
112
85
  harness: z.string().refine((value) => value !== undefined, { message: "Required" }),
113
86
  harness_id: z.union([z.string(), z.null()]).optional(),
87
+ run_id: z
88
+ .string()
89
+ .min(36)
90
+ .regex(new RegExp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "u"))
91
+ .refine((value) => [...value].length <= 36, { message: "Too long: expected at most 36 characters" })
92
+ .refine((value) => value !== undefined, { message: "Required" }),
93
+ schema_version: z.literal("1.2").refine((value) => value !== undefined, { message: "Required" }),
94
+ variant: z.union([z.string(), z.null()]).optional(),
95
+ }),
96
+ z.looseObject({
97
+ event: z
98
+ .intersection(z.lazy(() => ActionEventSchema), z.looseObject({
99
+ timing_source: z.never().optional(),
100
+ }))
101
+ .refine((value) => value !== undefined, { message: "Required" }),
102
+ harness: z.string().refine((value) => value !== undefined, { message: "Required" }),
103
+ harness_id: z.union([z.string(), z.null()]).optional(),
114
104
  run_id: z
115
105
  .string()
116
106
  .min(36)
@@ -120,9 +110,59 @@ export const HistoryLineSchema = z.union([
120
110
  schema_version: z
121
111
  .union([z.literal("1.0"), z.literal("1.1")])
122
112
  .refine((value) => value !== undefined, { message: "Required" }),
123
- type: z.literal("event").refine((value) => value !== undefined, { message: "Required" }),
124
113
  variant: z.union([z.string(), z.null()]).optional(),
125
114
  }),
115
+ ]);
116
+ export const HistoryLabelsSchema = z.record(z
117
+ .string()
118
+ .regex(new RegExp("^[A-Za-z0-9]", "u"))
119
+ .refine((value) => [...value].length <= 64, { message: "Too long: expected at most 64 characters" })
120
+ .refine((value) => !new RegExp("[^A-Za-z0-9._-]", "u").test(value), {
121
+ message: "Invalid string: must not contain [^A-Za-z0-9._-]",
122
+ }), z
123
+ .string()
124
+ .min(1)
125
+ .refine((value) => [...value].length <= 256, { message: "Too long: expected at most 256 characters" })
126
+ .refine((value) => !new RegExp("[\\u0000-\\u001f\\u007f-\\u009f]", "u").test(value), {
127
+ message: "Invalid string: must not contain [\\u0000-\\u001f\\u007f-\\u009f]",
128
+ }));
129
+ export const HistoryLineSchema = z.union([
130
+ z.union([
131
+ z.looseObject({
132
+ event: z.lazy(() => ActionEventSchema).refine((value) => value !== undefined, { message: "Required" }),
133
+ harness: z.string().refine((value) => value !== undefined, { message: "Required" }),
134
+ harness_id: z.union([z.string(), z.null()]).optional(),
135
+ run_id: z
136
+ .string()
137
+ .min(36)
138
+ .regex(new RegExp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "u"))
139
+ .refine((value) => [...value].length <= 36, { message: "Too long: expected at most 36 characters" })
140
+ .refine((value) => value !== undefined, { message: "Required" }),
141
+ schema_version: z.literal("1.2").refine((value) => value !== undefined, { message: "Required" }),
142
+ type: z.literal("event").refine((value) => value !== undefined, { message: "Required" }),
143
+ variant: z.union([z.string(), z.null()]).optional(),
144
+ }),
145
+ z.looseObject({
146
+ event: z
147
+ .intersection(z.lazy(() => ActionEventSchema), z.looseObject({
148
+ timing_source: z.never().optional(),
149
+ }))
150
+ .refine((value) => value !== undefined, { message: "Required" }),
151
+ harness: z.string().refine((value) => value !== undefined, { message: "Required" }),
152
+ harness_id: z.union([z.string(), z.null()]).optional(),
153
+ run_id: z
154
+ .string()
155
+ .min(36)
156
+ .regex(new RegExp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "u"))
157
+ .refine((value) => [...value].length <= 36, { message: "Too long: expected at most 36 characters" })
158
+ .refine((value) => value !== undefined, { message: "Required" }),
159
+ schema_version: z
160
+ .union([z.literal("1.0"), z.literal("1.1")])
161
+ .refine((value) => value !== undefined, { message: "Required" }),
162
+ type: z.literal("event").refine((value) => value !== undefined, { message: "Required" }),
163
+ variant: z.union([z.string(), z.null()]).optional(),
164
+ }),
165
+ ]),
126
166
  z.union([
127
167
  z.looseObject({
128
168
  duration_ms: z
@@ -149,13 +189,14 @@ export const HistoryLineSchema = z.union([
149
189
  .gte(0)
150
190
  .refine((value) => value !== undefined, { message: "Required" }),
151
191
  name: z.string().refine((value) => value !== undefined, { message: "Required" }),
192
+ observed_tool_ms: z.never().optional(),
152
193
  permission_mode: z
153
194
  .lazy(() => PermissionModeSchema)
154
195
  .refine((value) => value !== undefined, { message: "Required" }),
155
196
  project: z.string().refine((value) => value !== undefined, { message: "Required" }),
156
197
  prompt: z.string().refine((value) => value !== undefined, { message: "Required" }),
157
198
  schema_version: z
158
- .union([z.literal("1.0"), z.literal("1.1")])
199
+ .union([z.literal("1.0"), z.literal("1.1"), z.literal("1.2")])
159
200
  .refine((value) => value !== undefined, { message: "Required" }),
160
201
  session: z.string().refine((value) => value !== undefined, { message: "Required" }),
161
202
  session_id: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
@@ -203,13 +244,14 @@ export const HistoryLineSchema = z.union([
203
244
  .gte(0)
204
245
  .refine((value) => value !== undefined, { message: "Required" }),
205
246
  name: z.string().refine((value) => value !== undefined, { message: "Required" }),
247
+ observed_tool_ms: z.never().optional(),
206
248
  permission_mode: z
207
249
  .lazy(() => PermissionModeSchema)
208
250
  .refine((value) => value !== undefined, { message: "Required" }),
209
251
  project: z.string().refine((value) => value !== undefined, { message: "Required" }),
210
252
  prompt: z.string().refine((value) => value !== undefined, { message: "Required" }),
211
253
  schema_version: z
212
- .union([z.literal("1.0"), z.literal("1.1")])
254
+ .union([z.literal("1.0"), z.literal("1.1"), z.literal("1.2")])
213
255
  .refine((value) => value !== undefined, { message: "Required" }),
214
256
  session: z.string().refine((value) => value !== undefined, { message: "Required" }),
215
257
  session_id: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
@@ -232,6 +274,51 @@ export const HistoryLineSchema = z.union([
232
274
  usage: z.lazy(() => UsageSchema).refine((value) => value !== undefined, { message: "Required" }),
233
275
  variant: z.union([z.string(), z.null()]).optional(),
234
276
  }),
277
+ z.looseObject({
278
+ duration_ms: z
279
+ .int()
280
+ .gte(0)
281
+ .refine((value) => value !== undefined, { message: "Required" }),
282
+ exit_code: z.union([z.int(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
283
+ failure_kind: z
284
+ .union([z.lazy(() => FailureKindSchema), z.null()])
285
+ .refine((value) => value !== undefined, { message: "Required" }),
286
+ finished_at: z.null().refine((value) => value !== undefined, { message: "Required" }),
287
+ harness: z.string().refine((value) => value !== undefined, { message: "Required" }),
288
+ harness_id: z.union([z.string(), z.null()]).optional(),
289
+ history_id: z
290
+ .string()
291
+ .min(36)
292
+ .regex(new RegExp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "u"))
293
+ .refine((value) => [...value].length <= 36, { message: "Too long: expected at most 36 characters" })
294
+ .refine((value) => value !== undefined, { message: "Required" }),
295
+ labels: z.lazy(() => HistoryLabelsSchema).optional(),
296
+ model: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
297
+ model_ms: z.never().optional(),
298
+ name: z.string().refine((value) => value !== undefined, { message: "Required" }),
299
+ observed_tool_ms: z
300
+ .int()
301
+ .gte(0)
302
+ .refine((value) => value !== undefined, { message: "Required" }),
303
+ permission_mode: z
304
+ .lazy(() => PermissionModeSchema)
305
+ .refine((value) => value !== undefined, { message: "Required" }),
306
+ project: z.string().refine((value) => value !== undefined, { message: "Required" }),
307
+ prompt: z.string().refine((value) => value !== undefined, { message: "Required" }),
308
+ schema_version: z.literal("1.2").refine((value) => value !== undefined, { message: "Required" }),
309
+ session: z.string().refine((value) => value !== undefined, { message: "Required" }),
310
+ session_id: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
311
+ started_at: z.never().optional(),
312
+ status: z.lazy(() => StatusSchema).refine((value) => value !== undefined, { message: "Required" }),
313
+ text: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
314
+ text_source: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
315
+ time_to_first_token_ms: z.never().optional(),
316
+ timestamp: z.string().refine((value) => value !== undefined, { message: "Required" }),
317
+ tool_ms: z.never().optional(),
318
+ type: z.literal("run").refine((value) => value !== undefined, { message: "Required" }),
319
+ usage: z.lazy(() => UsageSchema).refine((value) => value !== undefined, { message: "Required" }),
320
+ variant: z.union([z.string(), z.null()]).optional(),
321
+ }),
235
322
  z.looseObject({
236
323
  duration_ms: z.union([z.int().gte(0), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
237
324
  exit_code: z.union([z.int(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
@@ -251,13 +338,14 @@ export const HistoryLineSchema = z.union([
251
338
  model: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
252
339
  model_ms: z.never().optional(),
253
340
  name: z.string().refine((value) => value !== undefined, { message: "Required" }),
341
+ observed_tool_ms: z.never().optional(),
254
342
  permission_mode: z
255
343
  .lazy(() => PermissionModeSchema)
256
344
  .refine((value) => value !== undefined, { message: "Required" }),
257
345
  project: z.string().refine((value) => value !== undefined, { message: "Required" }),
258
346
  prompt: z.string().refine((value) => value !== undefined, { message: "Required" }),
259
347
  schema_version: z
260
- .union([z.literal("1.0"), z.literal("1.1")])
348
+ .union([z.literal("1.0"), z.literal("1.1"), z.literal("1.2")])
261
349
  .refine((value) => value !== undefined, { message: "Required" }),
262
350
  session: z.string().refine((value) => value !== undefined, { message: "Required" }),
263
351
  session_id: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
@@ -383,6 +471,113 @@ export const HistoryRecordSchema = z.union([
383
471
  .gte(0)
384
472
  .refine((value) => value !== undefined, { message: "Required" }),
385
473
  name: z.string().refine((value) => value !== undefined, { message: "Required" }),
474
+ observed_tool_ms: z.never().optional(),
475
+ permission_mode: z.lazy(() => PermissionModeSchema).refine((value) => value !== undefined, { message: "Required" }),
476
+ project: z.string().refine((value) => value !== undefined, { message: "Required" }),
477
+ prompt: z.string().refine((value) => value !== undefined, { message: "Required" }),
478
+ schema_version: z.literal("1.2").refine((value) => value !== undefined, { message: "Required" }),
479
+ session: z.string().refine((value) => value !== undefined, { message: "Required" }),
480
+ session_id: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
481
+ started_at: z
482
+ .string()
483
+ .min(1)
484
+ .refine((value) => value !== undefined, { message: "Required" }),
485
+ status: z.lazy(() => StatusSchema).refine((value) => value !== undefined, { message: "Required" }),
486
+ text: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
487
+ text_source: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
488
+ time_to_first_token_ms: z.union([z.int().gte(0), z.null()]).optional(),
489
+ timestamp: z.string().refine((value) => value !== undefined, { message: "Required" }),
490
+ tool_ms: z
491
+ .int()
492
+ .gte(0)
493
+ .refine((value) => value !== undefined, { message: "Required" }),
494
+ usage: z.lazy(() => UsageSchema).refine((value) => value !== undefined, { message: "Required" }),
495
+ variant: z.union([z.string(), z.null()]).optional(),
496
+ }),
497
+ z.looseObject({
498
+ duration_ms: z
499
+ .int()
500
+ .gte(0)
501
+ .refine((value) => value !== undefined, { message: "Required" }),
502
+ events: z
503
+ .union([
504
+ z.array(z.intersection(z.union([
505
+ z.intersection(z.lazy(() => ActionEventSchema), z.looseObject({
506
+ duration_ms: z
507
+ .int()
508
+ .gte(0)
509
+ .refine((value) => value !== undefined, { message: "Required" }),
510
+ finished_at: z.string().refine((value) => value !== undefined, { message: "Required" }),
511
+ kind: z.literal("tool_call").refine((value) => value !== undefined, { message: "Required" }),
512
+ started_at: z.string().refine((value) => value !== undefined, { message: "Required" }),
513
+ status: z.literal("completed").refine((value) => value !== undefined, { message: "Required" }),
514
+ tool_call_id: z
515
+ .string()
516
+ .min(1)
517
+ .refine((value) => value !== undefined, { message: "Required" }),
518
+ })),
519
+ z.intersection(z.lazy(() => ActionEventSchema), z.looseObject({
520
+ duration_ms: z
521
+ .int()
522
+ .gte(0)
523
+ .refine((value) => value !== undefined, { message: "Required" }),
524
+ finished_at: z.string().refine((value) => value !== undefined, { message: "Required" }),
525
+ kind: z.literal("tool_call").refine((value) => value !== undefined, { message: "Required" }),
526
+ started_at: z.string().refine((value) => value !== undefined, { message: "Required" }),
527
+ status: z.literal("failed").refine((value) => value !== undefined, { message: "Required" }),
528
+ tool_call_id: z
529
+ .string()
530
+ .min(1)
531
+ .refine((value) => value !== undefined, { message: "Required" }),
532
+ })),
533
+ z.intersection(z.lazy(() => ActionEventSchema), z.looseObject({
534
+ kind: z.literal("tool_call").refine((value) => value !== undefined, { message: "Required" }),
535
+ started_at: z.string().refine((value) => value !== undefined, { message: "Required" }),
536
+ status: z.literal("timeout").refine((value) => value !== undefined, { message: "Required" }),
537
+ tool_call_id: z
538
+ .string()
539
+ .min(1)
540
+ .refine((value) => value !== undefined, { message: "Required" }),
541
+ })),
542
+ z.intersection(z.lazy(() => ActionEventSchema), z.looseObject({
543
+ kind: z.literal("tool_call").refine((value) => value !== undefined, { message: "Required" }),
544
+ started_at: z.string().refine((value) => value !== undefined, { message: "Required" }),
545
+ status: z.literal("interrupted").refine((value) => value !== undefined, { message: "Required" }),
546
+ tool_call_id: z
547
+ .string()
548
+ .min(1)
549
+ .refine((value) => value !== undefined, { message: "Required" }),
550
+ })),
551
+ z.intersection(z.lazy(() => ActionEventSchema), z.looseObject({
552
+ kind: z.literal("tool_result").optional(),
553
+ })),
554
+ ]), z.looseObject({
555
+ timing_source: z.never().optional(),
556
+ }))),
557
+ z.null(),
558
+ ])
559
+ .refine((value) => value !== undefined, { message: "Required" }),
560
+ exit_code: z.union([z.int(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
561
+ failure_kind: z
562
+ .union([z.lazy(() => FailureKindSchema), z.null()])
563
+ .refine((value) => value !== undefined, { message: "Required" }),
564
+ finished_at: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
565
+ harness: z.string().refine((value) => value !== undefined, { message: "Required" }),
566
+ harness_id: z.string().optional(),
567
+ history_id: z
568
+ .string()
569
+ .min(36)
570
+ .regex(new RegExp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "u"))
571
+ .refine((value) => [...value].length <= 36, { message: "Too long: expected at most 36 characters" })
572
+ .refine((value) => value !== undefined, { message: "Required" }),
573
+ labels: z.lazy(() => HistoryLabelsSchema).optional(),
574
+ model: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
575
+ model_ms: z
576
+ .int()
577
+ .gte(0)
578
+ .refine((value) => value !== undefined, { message: "Required" }),
579
+ name: z.string().refine((value) => value !== undefined, { message: "Required" }),
580
+ observed_tool_ms: z.never().optional(),
386
581
  permission_mode: z.lazy(() => PermissionModeSchema).refine((value) => value !== undefined, { message: "Required" }),
387
582
  project: z.string().refine((value) => value !== undefined, { message: "Required" }),
388
583
  prompt: z.string().refine((value) => value !== undefined, { message: "Required" }),
@@ -412,7 +607,7 @@ export const HistoryRecordSchema = z.union([
412
607
  .refine((value) => value !== undefined, { message: "Required" }),
413
608
  events: z
414
609
  .union([
415
- z.array(z.union([
610
+ z.array(z.intersection(z.union([
416
611
  z.intersection(z.lazy(() => ActionEventSchema), z.looseObject({
417
612
  duration_ms: z
418
613
  .int()
@@ -462,7 +657,9 @@ export const HistoryRecordSchema = z.union([
462
657
  z.intersection(z.lazy(() => ActionEventSchema), z.looseObject({
463
658
  kind: z.literal("tool_result").optional(),
464
659
  })),
465
- ])),
660
+ ]), z.looseObject({
661
+ timing_source: z.never().optional(),
662
+ }))),
466
663
  z.null(),
467
664
  ])
468
665
  .refine((value) => value !== undefined, { message: "Required" }),
@@ -486,6 +683,7 @@ export const HistoryRecordSchema = z.union([
486
683
  .gte(0)
487
684
  .refine((value) => value !== undefined, { message: "Required" }),
488
685
  name: z.string().refine((value) => value !== undefined, { message: "Required" }),
686
+ observed_tool_ms: z.never().optional(),
489
687
  permission_mode: z.lazy(() => PermissionModeSchema).refine((value) => value !== undefined, { message: "Required" }),
490
688
  project: z.string().refine((value) => value !== undefined, { message: "Required" }),
491
689
  prompt: z.string().refine((value) => value !== undefined, { message: "Required" }),
@@ -547,6 +745,110 @@ export const HistoryRecordSchema = z.union([
547
745
  model: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
548
746
  model_ms: z.never().optional(),
549
747
  name: z.string().refine((value) => value !== undefined, { message: "Required" }),
748
+ observed_tool_ms: z.never().optional(),
749
+ permission_mode: z.lazy(() => PermissionModeSchema).refine((value) => value !== undefined, { message: "Required" }),
750
+ project: z.string().refine((value) => value !== undefined, { message: "Required" }),
751
+ prompt: z.string().refine((value) => value !== undefined, { message: "Required" }),
752
+ schema_version: z.literal("1.2").refine((value) => value !== undefined, { message: "Required" }),
753
+ session: z.string().refine((value) => value !== undefined, { message: "Required" }),
754
+ session_id: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
755
+ started_at: z.never().optional(),
756
+ status: z.lazy(() => StatusSchema).refine((value) => value !== undefined, { message: "Required" }),
757
+ text: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
758
+ text_source: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
759
+ time_to_first_token_ms: z.never().optional(),
760
+ timestamp: z.string().refine((value) => value !== undefined, { message: "Required" }),
761
+ tool_ms: z.never().optional(),
762
+ usage: z.lazy(() => UsageSchema).refine((value) => value !== undefined, { message: "Required" }),
763
+ variant: z.union([z.string(), z.null()]).optional(),
764
+ }),
765
+ z.looseObject({
766
+ duration_ms: z
767
+ .int()
768
+ .gte(0)
769
+ .refine((value) => value !== undefined, { message: "Required" }),
770
+ events: z
771
+ .union([z.array(z.lazy(() => ActionEventSchema)), z.null()])
772
+ .refine((value) => value !== undefined, { message: "Required" }),
773
+ exit_code: z.union([z.int(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
774
+ failure_kind: z
775
+ .union([z.lazy(() => FailureKindSchema), z.null()])
776
+ .refine((value) => value !== undefined, { message: "Required" }),
777
+ finished_at: z.null().refine((value) => value !== undefined, { message: "Required" }),
778
+ harness: z.string().refine((value) => value !== undefined, { message: "Required" }),
779
+ harness_id: z.string().refine((value) => value !== undefined, { message: "Required" }),
780
+ history_id: z
781
+ .string()
782
+ .min(36)
783
+ .regex(new RegExp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "u"))
784
+ .refine((value) => [...value].length <= 36, { message: "Too long: expected at most 36 characters" })
785
+ .refine((value) => value !== undefined, { message: "Required" }),
786
+ labels: z.lazy(() => HistoryLabelsSchema).optional(),
787
+ model: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
788
+ model_ms: z.never().optional(),
789
+ name: z.string().refine((value) => value !== undefined, { message: "Required" }),
790
+ observed_tool_ms: z
791
+ .int()
792
+ .gte(0)
793
+ .refine((value) => value !== undefined, { message: "Required" }),
794
+ permission_mode: z.lazy(() => PermissionModeSchema).refine((value) => value !== undefined, { message: "Required" }),
795
+ project: z.string().refine((value) => value !== undefined, { message: "Required" }),
796
+ prompt: z.string().refine((value) => value !== undefined, { message: "Required" }),
797
+ schema_version: z.literal("1.2").refine((value) => value !== undefined, { message: "Required" }),
798
+ session: z.string().refine((value) => value !== undefined, { message: "Required" }),
799
+ session_id: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
800
+ started_at: z.never().optional(),
801
+ status: z.lazy(() => StatusSchema).refine((value) => value !== undefined, { message: "Required" }),
802
+ text: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
803
+ text_source: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
804
+ time_to_first_token_ms: z.never().optional(),
805
+ timestamp: z.string().refine((value) => value !== undefined, { message: "Required" }),
806
+ tool_ms: z.never().optional(),
807
+ usage: z.lazy(() => UsageSchema).refine((value) => value !== undefined, { message: "Required" }),
808
+ variant: z.union([z.string(), z.null()]).optional(),
809
+ }),
810
+ z.looseObject({
811
+ duration_ms: z.union([z.int().gte(0), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
812
+ events: z
813
+ .union([
814
+ z.array(z.intersection(z.looseObject({
815
+ duration_ms: z.null().optional(),
816
+ finished_at: z.null().optional(),
817
+ index: z
818
+ .int()
819
+ .gte(0)
820
+ .refine((value) => value !== undefined, { message: "Required" }),
821
+ input: z.unknown().refine((value) => value !== undefined, { message: "Required" }),
822
+ kind: z.string().refine((value) => value !== undefined, { message: "Required" }),
823
+ name: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
824
+ output: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
825
+ started_at: z.null().optional(),
826
+ status: z.null().optional(),
827
+ tool_call_id: z.union([z.string(), z.null()]).optional(),
828
+ }), z.looseObject({
829
+ timing_source: z.never().optional(),
830
+ }))),
831
+ z.null(),
832
+ ])
833
+ .refine((value) => value !== undefined, { message: "Required" }),
834
+ exit_code: z.union([z.int(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
835
+ failure_kind: z
836
+ .union([z.lazy(() => FailureKindSchema), z.null()])
837
+ .refine((value) => value !== undefined, { message: "Required" }),
838
+ finished_at: z.null().refine((value) => value !== undefined, { message: "Required" }),
839
+ harness: z.string().refine((value) => value !== undefined, { message: "Required" }),
840
+ harness_id: z.string().optional(),
841
+ history_id: z
842
+ .string()
843
+ .min(36)
844
+ .regex(new RegExp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "u"))
845
+ .refine((value) => [...value].length <= 36, { message: "Too long: expected at most 36 characters" })
846
+ .refine((value) => value !== undefined, { message: "Required" }),
847
+ labels: z.lazy(() => HistoryLabelsSchema).optional(),
848
+ model: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
849
+ model_ms: z.never().optional(),
850
+ name: z.string().refine((value) => value !== undefined, { message: "Required" }),
851
+ observed_tool_ms: z.never().optional(),
550
852
  permission_mode: z.lazy(() => PermissionModeSchema).refine((value) => value !== undefined, { message: "Required" }),
551
853
  project: z.string().refine((value) => value !== undefined, { message: "Required" }),
552
854
  prompt: z.string().refine((value) => value !== undefined, { message: "Required" }),
@@ -567,7 +869,7 @@ export const HistoryRecordSchema = z.union([
567
869
  duration_ms: z.union([z.int().gte(0), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
568
870
  events: z
569
871
  .union([
570
- z.array(z.looseObject({
872
+ z.array(z.intersection(z.looseObject({
571
873
  duration_ms: z.null().optional(),
572
874
  finished_at: z.null().optional(),
573
875
  index: z
@@ -581,7 +883,9 @@ export const HistoryRecordSchema = z.union([
581
883
  started_at: z.null().optional(),
582
884
  status: z.null().optional(),
583
885
  tool_call_id: z.union([z.string(), z.null()]).optional(),
584
- })),
886
+ }), z.looseObject({
887
+ timing_source: z.never().optional(),
888
+ }))),
585
889
  z.null(),
586
890
  ])
587
891
  .refine((value) => value !== undefined, { message: "Required" }),
@@ -602,6 +906,7 @@ export const HistoryRecordSchema = z.union([
602
906
  model: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
603
907
  model_ms: z.never().optional(),
604
908
  name: z.string().refine((value) => value !== undefined, { message: "Required" }),
909
+ observed_tool_ms: z.never().optional(),
605
910
  permission_mode: z.lazy(() => PermissionModeSchema).refine((value) => value !== undefined, { message: "Required" }),
606
911
  project: z.string().refine((value) => value !== undefined, { message: "Required" }),
607
912
  prompt: z.string().refine((value) => value !== undefined, { message: "Required" }),
@@ -652,6 +957,7 @@ export const HistoryRecordSchema = z.union([
652
957
  model: z.union([z.string(), z.null()]).refine((value) => value !== undefined, { message: "Required" }),
653
958
  model_ms: z.union([z.int().gte(0), z.null()]).optional(),
654
959
  name: z.string().refine((value) => value !== undefined, { message: "Required" }),
960
+ observed_tool_ms: z.union([z.int().gte(0), z.null()]).optional(),
655
961
  permission_mode: z.lazy(() => PermissionModeSchema).refine((value) => value !== undefined, { message: "Required" }),
656
962
  project: z.string().refine((value) => value !== undefined, { message: "Required" }),
657
963
  prompt: z.string().refine((value) => value !== undefined, { message: "Required" }),
@@ -842,6 +1148,10 @@ export const StatusSchema = z.union([
842
1148
  z.literal("skipped"),
843
1149
  z.literal("planned"),
844
1150
  ]);
1151
+ export const TimingSourceSchema = z.union([
1152
+ z.literal("provider_measured"),
1153
+ z.literal("stdout_observed"),
1154
+ ]);
845
1155
  export const ToolCallStatusSchema = z.union([
846
1156
  z.literal("completed"),
847
1157
  z.literal("failed"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneharness/sdk",
3
- "version": "0.5.9",
3
+ "version": "0.5.10",
4
4
  "description": "Typed Node.js SDK for oneharness",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -19,7 +19,7 @@
19
19
  "node": ">=20"
20
20
  },
21
21
  "dependencies": {
22
- "oneharness-cli": "0.5.9",
22
+ "oneharness-cli": "0.5.10",
23
23
  "zod": "^4.4.3"
24
24
  }
25
25
  }