@oneharness/sdk 0.20.0 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,7 +11,7 @@ const checked: RunReport = RunReportSchema.parse(report);
11
11
  console.log(checked.results[0]?.text, checked.results[0]?.usage.input_tokens);
12
12
  ```
13
13
 
14
- The client covers every verb the CLI exposes, so nothing needs a hand-built command line: `run`, `runMock`, `runStream`, `list`, `detect`, `config`, `sync`, `init`, `usage`, `gate`, `mock`, `interrupt`, `history`, `historyList`, `historyWatch`, `historyClear`, `historyMigrate`, and `historyPointers`. That coverage is gated, not asserted here. `runMock` uses the deterministic responder shipped in the CLI; see [Testing patterns](../../docs/testing-patterns.md). Both streaming methods return async iterators:
14
+ The client covers every verb the CLI exposes, so nothing needs a hand-built command line: `run`, `runMock`, `runStream`, `list`, `detect`, `config`, `sync`, `init`, `usage`, `gate`, `mock`, `interrupt`, `history`, `historyList`, `historyWatch`, `historyClear`, `historyMigrate`, `historyReindex`, and `historyPointers`. That coverage is gated, not asserted here. `runMock` uses the deterministic responder shipped in the CLI; see [Testing patterns](../../docs/testing-patterns.md). Both streaming methods return async iterators:
15
15
 
16
16
  ```ts
17
17
  for await (const envelope of oneharness.runStream({
@@ -35,7 +35,7 @@ Breaking or returning from either iterator terminates its oneharness subprocess.
35
35
 
36
36
  `null` usage fields mean the harness did not report the value; zero remains a real measured zero. String-valued harness/model/event identifiers should be treated as open sets for forward compatibility. `history` and `historyWatch` raise the exported `HistoryNotFoundError` when a session, record, or watch cursor cannot be resolved.
37
37
 
38
- Named exports include `RunOptionsSchema`, `HistoryLookupSchema`, `HistoryListOptionsSchema`, `HistoryWatchOptionsSchema`, `RunReportSchema`, `RunStreamEnvelopeSchema`, `RunResultSchema`, `ActionEventSchema`, `UsageSchema`, `HistoryRecordSchema`, `HistoryStreamEnvelopeSchema`, `HistoryRecordsSchema`, `HistoryListSchema`, `HistorySessionSummarySchema`, `ListReportSchema`, `HarnessInfoSchema`, and the registry/detection enum and object schemas. `RunStreamEnvelope` and `HistoryStreamEnvelope` are also exported TypeScript types for consumers building JSONL clients. Each schema's `z.infer` type is compile-time checked against its generated TypeScript type.
38
+ Every contract the CLI reads or prints is exported as a Zod schema named after its generated TypeScript type plus `Schema` (`RunReport` → `RunReportSchema`), generated from the same Rust wire types. Each schema's `z.infer` type is compile-time checked against its generated TypeScript type.
39
39
 
40
40
  Output objects accept and preserve unknown fields. That deliberate loose-object behavior lets an older SDK validate a newer additive CLI response without erasing fields before an application can inspect them. Known fields are still validated recursively. The input schemas `RunOptionsSchema`, `HistoryLookupSchema`, `HistoryListOptionsSchema`, and `HistoryWatchOptionsSchema` are deliberately strict instead: unknown input keys are rejected because this SDK version cannot forward an option it does not understand, which also catches misspellings. Every method validates its input before spawning the CLI.
41
41
 
@@ -1,4 +1,10 @@
1
- export type FlagKind = "positional" | "value" | "repeated" | "switch" | "key-value" | "trailing";
1
+ export type FlagKind = "positional" | "value" | "repeated" | "switch" | "key-value" | "trailing" | "window";
2
+ /** The three spellings a `window` binding renders exactly one of. */
3
+ export type WindowFlags = {
4
+ readonly days: string;
5
+ readonly since: string;
6
+ readonly allTime: string;
7
+ };
2
8
  /**
3
9
  * What both members of a suppressed pair rendering an argument means.
4
10
  *
@@ -17,6 +23,8 @@ export type OptionBinding = {
17
23
  readonly unless: string | null;
18
24
  /** Only present beside an `unless`, which it says how to resolve. */
19
25
  readonly unless_resolution?: UnlessResolution;
26
+ /** Only present on a `window` binding: the flag each window renders. */
27
+ readonly window?: WindowFlags;
20
28
  };
21
29
  /** How a verb's stdout reaches a caller. */
22
30
  export type StdoutShape = "json" | "jsonl" | "text";
@@ -836,10 +844,10 @@ export declare const CAPABILITIES: {
836
844
  readonly method: "history";
837
845
  readonly argv: readonly ["history", "show"];
838
846
  readonly options: "history_lookup";
839
- readonly output: "history_records";
847
+ readonly output: "history_show_entries";
840
848
  readonly stdout: "json";
841
849
  readonly stdin: false;
842
- readonly rust: "oneharness_core::io::history::read_session";
850
+ readonly rust: "oneharness_core::io::history::read_session_display";
843
851
  readonly always: readonly ["--compact", "--format", "json"];
844
852
  readonly bindings: readonly [{
845
853
  readonly option: "session";
@@ -868,6 +876,16 @@ export declare const CAPABILITIES: {
868
876
  readonly flag: "--all-projects";
869
877
  readonly kind: "switch";
870
878
  readonly unless: null;
879
+ }, {
880
+ readonly option: "window";
881
+ readonly flag: "";
882
+ readonly kind: "window";
883
+ readonly unless: null;
884
+ readonly window: {
885
+ readonly days: "--days";
886
+ readonly since: "--since";
887
+ readonly allTime: "--all-time";
888
+ };
871
889
  }, {
872
890
  readonly option: "historyDir";
873
891
  readonly flag: "--history-dir";
@@ -912,6 +930,16 @@ export declare const CAPABILITIES: {
912
930
  readonly flag: "--all-projects";
913
931
  readonly kind: "switch";
914
932
  readonly unless: null;
933
+ }, {
934
+ readonly option: "window";
935
+ readonly flag: "";
936
+ readonly kind: "window";
937
+ readonly unless: null;
938
+ readonly window: {
939
+ readonly days: "--days";
940
+ readonly since: "--since";
941
+ readonly allTime: "--all-time";
942
+ };
915
943
  }, {
916
944
  readonly option: "historyDir";
917
945
  readonly flag: "--history-dir";
@@ -944,7 +972,8 @@ export declare const CAPABILITIES: {
944
972
  readonly option: "after";
945
973
  readonly flag: "--after";
946
974
  readonly kind: "value";
947
- readonly unless: null;
975
+ readonly unless: "window";
976
+ readonly unless_resolution: "refuse";
948
977
  }, {
949
978
  readonly option: "labels";
950
979
  readonly flag: "--label";
@@ -981,6 +1010,16 @@ export declare const CAPABILITIES: {
981
1010
  readonly flag: "--events";
982
1011
  readonly kind: "switch";
983
1012
  readonly unless: null;
1013
+ }, {
1014
+ readonly option: "window";
1015
+ readonly flag: "";
1016
+ readonly kind: "window";
1017
+ readonly unless: null;
1018
+ readonly window: {
1019
+ readonly days: "--days";
1020
+ readonly since: "--since";
1021
+ readonly allTime: "--all-time";
1022
+ };
984
1023
  }, {
985
1024
  readonly option: "config";
986
1025
  readonly flag: "--config";
@@ -1067,6 +1106,34 @@ export declare const CAPABILITIES: {
1067
1106
  }];
1068
1107
  readonly uncovered: readonly [];
1069
1108
  };
1109
+ readonly historyReindex: {
1110
+ readonly method: "historyReindex";
1111
+ readonly argv: readonly ["history", "reindex"];
1112
+ readonly options: "history_reindex_options";
1113
+ readonly output: "history_reindex_report";
1114
+ readonly stdout: "json";
1115
+ readonly stdin: false;
1116
+ readonly rust: "oneharness_core::io::history::reindex";
1117
+ readonly always: readonly ["--compact", "--format", "json"];
1118
+ readonly bindings: readonly [{
1119
+ readonly option: "historyDir";
1120
+ readonly flag: "--history-dir";
1121
+ readonly kind: "value";
1122
+ readonly unless: null;
1123
+ }, {
1124
+ readonly option: "config";
1125
+ readonly flag: "--config";
1126
+ readonly kind: "repeated";
1127
+ readonly unless: "noConfig";
1128
+ readonly unless_resolution: "refuse";
1129
+ }, {
1130
+ readonly option: "noConfig";
1131
+ readonly flag: "--no-config";
1132
+ readonly kind: "switch";
1133
+ readonly unless: null;
1134
+ }];
1135
+ readonly uncovered: readonly [];
1136
+ };
1070
1137
  readonly historyPointers: {
1071
1138
  readonly method: "historyPointers";
1072
1139
  readonly argv: readonly ["history", "pointers"];
@@ -941,10 +941,10 @@ export const CAPABILITIES = {
941
941
  method: "history",
942
942
  argv: ["history", "show"],
943
943
  options: "history_lookup",
944
- output: "history_records",
944
+ output: "history_show_entries",
945
945
  stdout: "json",
946
946
  stdin: false,
947
- rust: "oneharness_core::io::history::read_session",
947
+ rust: "oneharness_core::io::history::read_session_display",
948
948
  always: ["--compact", "--format", "json"],
949
949
  bindings: [
950
950
  {
@@ -979,6 +979,17 @@ export const CAPABILITIES = {
979
979
  kind: "switch",
980
980
  unless: null,
981
981
  },
982
+ {
983
+ option: "window",
984
+ flag: "",
985
+ kind: "window",
986
+ unless: null,
987
+ window: {
988
+ days: "--days",
989
+ since: "--since",
990
+ allTime: "--all-time",
991
+ },
992
+ },
982
993
  {
983
994
  option: "historyDir",
984
995
  flag: "--history-dir",
@@ -1030,6 +1041,17 @@ export const CAPABILITIES = {
1030
1041
  kind: "switch",
1031
1042
  unless: null,
1032
1043
  },
1044
+ {
1045
+ option: "window",
1046
+ flag: "",
1047
+ kind: "window",
1048
+ unless: null,
1049
+ window: {
1050
+ days: "--days",
1051
+ since: "--since",
1052
+ allTime: "--all-time",
1053
+ },
1054
+ },
1033
1055
  {
1034
1056
  option: "historyDir",
1035
1057
  flag: "--history-dir",
@@ -1066,7 +1088,8 @@ export const CAPABILITIES = {
1066
1088
  option: "after",
1067
1089
  flag: "--after",
1068
1090
  kind: "value",
1069
- unless: null,
1091
+ unless: "window",
1092
+ unless_resolution: "refuse",
1070
1093
  },
1071
1094
  {
1072
1095
  option: "labels",
@@ -1111,6 +1134,17 @@ export const CAPABILITIES = {
1111
1134
  kind: "switch",
1112
1135
  unless: null,
1113
1136
  },
1137
+ {
1138
+ option: "window",
1139
+ flag: "",
1140
+ kind: "window",
1141
+ unless: null,
1142
+ window: {
1143
+ days: "--days",
1144
+ since: "--since",
1145
+ allTime: "--all-time",
1146
+ },
1147
+ },
1114
1148
  {
1115
1149
  option: "config",
1116
1150
  flag: "--config",
@@ -1210,6 +1244,38 @@ export const CAPABILITIES = {
1210
1244
  ],
1211
1245
  uncovered: [],
1212
1246
  },
1247
+ historyReindex: {
1248
+ method: "historyReindex",
1249
+ argv: ["history", "reindex"],
1250
+ options: "history_reindex_options",
1251
+ output: "history_reindex_report",
1252
+ stdout: "json",
1253
+ stdin: false,
1254
+ rust: "oneharness_core::io::history::reindex",
1255
+ always: ["--compact", "--format", "json"],
1256
+ bindings: [
1257
+ {
1258
+ option: "historyDir",
1259
+ flag: "--history-dir",
1260
+ kind: "value",
1261
+ unless: null,
1262
+ },
1263
+ {
1264
+ option: "config",
1265
+ flag: "--config",
1266
+ kind: "repeated",
1267
+ unless: "noConfig",
1268
+ unless_resolution: "refuse",
1269
+ },
1270
+ {
1271
+ option: "noConfig",
1272
+ flag: "--no-config",
1273
+ kind: "switch",
1274
+ unless: null,
1275
+ },
1276
+ ],
1277
+ uncovered: [],
1278
+ },
1213
1279
  historyPointers: {
1214
1280
  method: "historyPointers",
1215
1281
  argv: ["history", "pointers"],
@@ -1,3 +1,22 @@
1
+ /**
2
+ * Which dates of the index a listing reads.
3
+ *
4
+ * It is also the one value an SDK history lookup, listing or watch takes as
5
+ * its `window`, so "from this date" and "from the beginning" cannot both be
6
+ * stated. On the wire it is externally tagged in camelCase —
7
+ * `{"recent": {"days": 3}}`, `{"since": "2026-01-05"}`, or `"allTime"` — and
8
+ * renders to the CLI's `--days`, `--since` or `--all-time`.
9
+ */
10
+ export type HistoryWindow = {
11
+ recent: {
12
+ /**
13
+ * How many UTC days, today included; at least one.
14
+ */
15
+ days: number;
16
+ };
17
+ } | {
18
+ since: string;
19
+ } | "allTime";
1
20
  /**
2
21
  * Options accepted by `OneHarness.historyList()` in the published Node SDK.
3
22
  */
@@ -19,4 +38,10 @@ export interface HistoryListOptions {
19
38
  * Narrow to one configured harness identity (`claude-code:work`).
20
39
  */
21
40
  variant?: string | undefined;
41
+ /**
42
+ * Which dates of the index to read: the last `days` UTC days, from a
43
+ * UTC date on, or all time (every dated segment plus the legacy index an
44
+ * older oneharness kept). Omitted, the last 7 UTC days.
45
+ */
46
+ window?: HistoryWindow | null | undefined;
22
47
  }
@@ -24,6 +24,25 @@
24
24
  * non-empty.
25
25
  */
26
26
  export type HistoryLookup = HistoryLookupByLast | HistoryLookupBySession;
27
+ /**
28
+ * Which dates of the index a listing reads.
29
+ *
30
+ * It is also the one value an SDK history lookup, listing or watch takes as
31
+ * its `window`, so "from this date" and "from the beginning" cannot both be
32
+ * stated. On the wire it is externally tagged in camelCase —
33
+ * `{"recent": {"days": 3}}`, `{"since": "2026-01-05"}`, or `"allTime"` — and
34
+ * renders to the CLI's `--days`, `--since` or `--all-time`.
35
+ */
36
+ export type HistoryWindow = {
37
+ recent: {
38
+ /**
39
+ * How many UTC days, today included; at least one.
40
+ */
41
+ days: number;
42
+ };
43
+ } | {
44
+ since: string;
45
+ } | "allTime";
27
46
  /**
28
47
  * Select the most recent session.
29
48
  */
@@ -57,6 +76,12 @@ export interface HistoryLookupByLast {
57
76
  * than invalid, so `{"session": "", "last": true}` stays accepted.
58
77
  */
59
78
  session?: string | undefined;
79
+ /**
80
+ * Which dates of the index to read: the last `days` UTC days, from a
81
+ * UTC date on, or all time (every dated segment plus the legacy index an
82
+ * older oneharness kept). Omitted, the last 7 UTC days.
83
+ */
84
+ window?: HistoryWindow | null | undefined;
60
85
  }
61
86
  /**
62
87
  * Select the session named by `session`.
@@ -91,4 +116,10 @@ export interface HistoryLookupBySession {
91
116
  * the name that selects, so it must be non-empty.
92
117
  */
93
118
  session: string;
119
+ /**
120
+ * Which dates of the index to read: the last `days` UTC days, from a
121
+ * UTC date on, or all time (every dated segment plus the legacy index an
122
+ * older oneharness kept). Omitted, the last 7 UTC days.
123
+ */
124
+ window?: HistoryWindow | null | undefined;
94
125
  }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Options accepted by the language SDKs' `historyReindex()`.
3
+ */
4
+ export interface HistoryReindexOptions {
5
+ /**
6
+ * Load configuration from exactly these files, in order, skipping
7
+ * user/project discovery; each later file overrides the earlier ones.
8
+ */
9
+ config?: string[] | undefined;
10
+ historyDir?: string | undefined;
11
+ /**
12
+ * Ignore every configuration file and `ONEHARNESS_*` override. `true`
13
+ * beside a non-empty `config` is refused before anything runs.
14
+ */
15
+ noConfig?: boolean | undefined;
16
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The `oneharness history reindex` output contract.
3
+ */
4
+ export interface HistoryReindexReport {
5
+ /**
6
+ * The sum of `segments[].added`.
7
+ */
8
+ entries_added: number;
9
+ /**
10
+ * How many session files were read.
11
+ */
12
+ files_read: number;
13
+ /**
14
+ * One row per segment this run appended to, in file-name order; a
15
+ * segment that already held every entry is not listed.
16
+ */
17
+ segments: SegmentReindexSummary[];
18
+ /**
19
+ * Every session file (or project directory) that could not be read,
20
+ * with why. The rest are indexed regardless.
21
+ */
22
+ unreadable: UnreadableSessionFile[];
23
+ [k: string]: unknown;
24
+ }
25
+ /**
26
+ * What [`reindex`] appended to one segment.
27
+ */
28
+ export interface SegmentReindexSummary {
29
+ /**
30
+ * How many entries this run appended to it.
31
+ */
32
+ added: number;
33
+ /**
34
+ * The segment's path, as a display string.
35
+ */
36
+ path: string;
37
+ /**
38
+ * The segment's file name (`runs-YYYY-MM-DD.ndjson` or
39
+ * `events-YYYY-MM-DD.ndjson`).
40
+ */
41
+ segment: string;
42
+ [k: string]: unknown;
43
+ }
44
+ /**
45
+ * A session file [`reindex`] could not read.
46
+ */
47
+ export interface UnreadableSessionFile {
48
+ /**
49
+ * Why it could not be read, as the operating system said it.
50
+ */
51
+ error: string;
52
+ path: string;
53
+ [k: string]: unknown;
54
+ }
@@ -0,0 +1,2 @@
1
+ /* Generated from oneharness-core. Do not edit. */
2
+ export {};
@@ -1,4 +1,66 @@
1
- export type HistoryRecord = {
1
+ /**
2
+ * One entry of `history show`'s answer: a finished run's record, or a run still
3
+ * in flight.
4
+ */
5
+ export type HistoryShowEntry = (({
6
+ error?: null | undefined;
7
+ [k: string]: unknown;
8
+ } | ({
9
+ error: string;
10
+ schema_version?: "1.3" | "1.4" | "1.5" | "1.6" | "1.7" | "1.8" | "1.9" | undefined;
11
+ [k: string]: unknown;
12
+ } & ({
13
+ status?: "nonzero" | "timeout" | "cancelled" | "spawn-error" | "skipped" | undefined;
14
+ [k: string]: unknown;
15
+ } | {
16
+ failure_kind: "tool_deferred";
17
+ [k: string]: unknown;
18
+ }))) & ({
19
+ work?: null | undefined;
20
+ [k: string]: unknown;
21
+ } | {
22
+ schema_version?: "1.7" | "1.8" | "1.9" | undefined;
23
+ status?: "nonzero" | "timeout" | "cancelled" | undefined;
24
+ work: "done" | "none";
25
+ [k: string]: unknown;
26
+ }) & ({
27
+ observed_model?: null | undefined;
28
+ [k: string]: unknown;
29
+ } | {
30
+ observed_model: string;
31
+ schema_version?: "1.8" | "1.9" | undefined;
32
+ [k: string]: unknown;
33
+ }) & ({
34
+ status?: "ok" | "nonzero" | "timeout" | "spawn-error" | "skipped" | "planned" | undefined;
35
+ [k: string]: unknown;
36
+ } | {
37
+ schema_version?: "1.4" | "1.5" | "1.6" | "1.7" | "1.8" | "1.9" | undefined;
38
+ [k: string]: unknown;
39
+ }) & (({
40
+ failure_kind?: "auth" | "rate_limit" | "model_not_found" | "quota" | "tool_deferred" | "untrusted_directory" | "input_too_large" | "model_mismatch" | "server_overloaded" | null;
41
+ [k: string]: unknown;
42
+ } | {
43
+ schema_version?: "1.5" | "1.6" | "1.7" | "1.8" | "1.9" | undefined;
44
+ [k: string]: unknown;
45
+ }) & ({
46
+ failure_kind?: "auth" | "rate_limit" | "model_not_found" | "quota" | "session_not_found" | "tool_deferred" | "model_mismatch" | "server_overloaded" | null;
47
+ [k: string]: unknown;
48
+ } | {
49
+ schema_version?: "1.6" | "1.7" | "1.8" | "1.9" | undefined;
50
+ [k: string]: unknown;
51
+ }) & ({
52
+ failure_kind?: "auth" | "rate_limit" | "model_not_found" | "quota" | "session_not_found" | "tool_deferred" | "untrusted_directory" | "input_too_large" | "server_overloaded" | null;
53
+ [k: string]: unknown;
54
+ } | {
55
+ schema_version?: "1.8" | "1.9" | undefined;
56
+ [k: string]: unknown;
57
+ }) & ({
58
+ failure_kind?: "auth" | "rate_limit" | "model_not_found" | "quota" | "session_not_found" | "tool_deferred" | "untrusted_directory" | "input_too_large" | "model_mismatch" | null;
59
+ [k: string]: unknown;
60
+ } | {
61
+ schema_version?: "1.9" | undefined;
62
+ [k: string]: unknown;
63
+ })) & ({
2
64
  duration_ms: number;
3
65
  /**
4
66
  * Best-effort normalized failure text for a run that did not succeed: the
@@ -1255,7 +1317,7 @@ export type HistoryRecord = {
1255
1317
  */
1256
1318
  work?: RunWork | null | undefined;
1257
1319
  [k: string]: unknown;
1258
- };
1320
+ })) | IncompleteHistoryRun;
1259
1321
  export type ToolCallStatus = "completed" | "failed" | "timeout" | "interrupted";
1260
1322
  /**
1261
1323
  * How a normalized tool interval was obtained.
@@ -1298,65 +1360,7 @@ export type Status = "ok" | "nonzero" | "timeout" | "cancelled" | "spawn-error"
1298
1360
  * [billed]: crate::domain::signals::Usage::reports_billed_work
1299
1361
  */
1300
1362
  export type RunWork = "done" | "none";
1301
- export type HistoryRecords = (({
1302
- error?: null | undefined;
1303
- [k: string]: unknown;
1304
- } | ({
1305
- error: string;
1306
- schema_version?: "1.3" | "1.4" | "1.5" | "1.6" | "1.7" | "1.8" | "1.9" | undefined;
1307
- [k: string]: unknown;
1308
- } & ({
1309
- status?: "nonzero" | "timeout" | "cancelled" | "spawn-error" | "skipped" | undefined;
1310
- [k: string]: unknown;
1311
- } | {
1312
- failure_kind: "tool_deferred";
1313
- [k: string]: unknown;
1314
- }))) & ({
1315
- work?: null | undefined;
1316
- [k: string]: unknown;
1317
- } | {
1318
- schema_version?: "1.7" | "1.8" | "1.9" | undefined;
1319
- status?: "nonzero" | "timeout" | "cancelled" | undefined;
1320
- work: "done" | "none";
1321
- [k: string]: unknown;
1322
- }) & ({
1323
- observed_model?: null | undefined;
1324
- [k: string]: unknown;
1325
- } | {
1326
- observed_model: string;
1327
- schema_version?: "1.8" | "1.9" | undefined;
1328
- [k: string]: unknown;
1329
- }) & ({
1330
- status?: "ok" | "nonzero" | "timeout" | "spawn-error" | "skipped" | "planned" | undefined;
1331
- [k: string]: unknown;
1332
- } | {
1333
- schema_version?: "1.4" | "1.5" | "1.6" | "1.7" | "1.8" | "1.9" | undefined;
1334
- [k: string]: unknown;
1335
- }) & (({
1336
- failure_kind?: "auth" | "rate_limit" | "model_not_found" | "quota" | "tool_deferred" | "untrusted_directory" | "input_too_large" | "model_mismatch" | "server_overloaded" | null;
1337
- [k: string]: unknown;
1338
- } | {
1339
- schema_version?: "1.5" | "1.6" | "1.7" | "1.8" | "1.9" | undefined;
1340
- [k: string]: unknown;
1341
- }) & ({
1342
- failure_kind?: "auth" | "rate_limit" | "model_not_found" | "quota" | "session_not_found" | "tool_deferred" | "model_mismatch" | "server_overloaded" | null;
1343
- [k: string]: unknown;
1344
- } | {
1345
- schema_version?: "1.6" | "1.7" | "1.8" | "1.9" | undefined;
1346
- [k: string]: unknown;
1347
- }) & ({
1348
- failure_kind?: "auth" | "rate_limit" | "model_not_found" | "quota" | "session_not_found" | "tool_deferred" | "untrusted_directory" | "input_too_large" | "server_overloaded" | null;
1349
- [k: string]: unknown;
1350
- } | {
1351
- schema_version?: "1.8" | "1.9" | undefined;
1352
- [k: string]: unknown;
1353
- }) & ({
1354
- failure_kind?: "auth" | "rate_limit" | "model_not_found" | "quota" | "session_not_found" | "tool_deferred" | "untrusted_directory" | "input_too_large" | "model_mismatch" | null;
1355
- [k: string]: unknown;
1356
- } | {
1357
- schema_version?: "1.9" | undefined;
1358
- [k: string]: unknown;
1359
- })) & HistoryRecord)[];
1363
+ export type HistoryShowEntries = HistoryShowEntry[];
1360
1364
  /**
1361
1365
  * One normalized action a harness took, harness-agnostic so a single consumer
1362
1366
  * assertion works across harnesses. Every field is always serialized (null when
@@ -1753,3 +1757,27 @@ export interface Usage8 {
1753
1757
  output_tokens: number | null;
1754
1758
  [k: string]: unknown;
1755
1759
  }
1760
+ /**
1761
+ * A run that has published events but no closing record yet.
1762
+ */
1763
+ export interface IncompleteHistoryRun {
1764
+ /**
1765
+ * The events published so far, in `index` order; never empty.
1766
+ *
1767
+ * @minItems 1
1768
+ */
1769
+ events: ActionEvent[];
1770
+ /**
1771
+ * The harness the event lines name.
1772
+ */
1773
+ harness: string;
1774
+ /**
1775
+ * The id the run's closing record will carry as its `history_id`.
1776
+ */
1777
+ run_id: string;
1778
+ /**
1779
+ * Always `incomplete`: what tells this entry apart from a record.
1780
+ */
1781
+ type: "incomplete";
1782
+ [k: string]: unknown;
1783
+ }
@@ -0,0 +1,2 @@
1
+ /* Generated from oneharness-core. Do not edit. */
2
+ export {};
@@ -1,3 +1,22 @@
1
+ /**
2
+ * Which dates of the index a listing reads.
3
+ *
4
+ * It is also the one value an SDK history lookup, listing or watch takes as
5
+ * its `window`, so "from this date" and "from the beginning" cannot both be
6
+ * stated. On the wire it is externally tagged in camelCase —
7
+ * `{"recent": {"days": 3}}`, `{"since": "2026-01-05"}`, or `"allTime"` — and
8
+ * renders to the CLI's `--days`, `--since` or `--all-time`.
9
+ */
10
+ export type HistoryWindow = {
11
+ recent: {
12
+ /**
13
+ * How many UTC days, today included; at least one.
14
+ */
15
+ days: number;
16
+ };
17
+ } | {
18
+ since: string;
19
+ } | "allTime";
1
20
  /**
2
21
  * Options accepted by the language SDKs' continuous history iterators.
3
22
  *
@@ -32,6 +51,13 @@ export interface HistoryWatchOptions {
32
51
  * Narrow to one configured harness identity (`claude-code:work`).
33
52
  */
34
53
  variant?: string | undefined;
54
+ /**
55
+ * Where the watch starts when no `after` cursor is given: the beginning
56
+ * of the last `days` UTC days, of a UTC date, or of all time (the legacy
57
+ * index an older oneharness kept included). Omitted, the current UTC
58
+ * day. Refused beside `after`, the other answer to where a watch begins.
59
+ */
60
+ window?: HistoryWindow | null | undefined;
35
61
  }
36
62
  export interface HistoryLabels {
37
63
  [k: string]: string;