@oneharness/sdk 0.28.7 → 0.29.0

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.
@@ -47,7 +47,6 @@ export interface ConfigReport {
47
47
  * The files consulted, in layering order (user first, project last).
48
48
  */
49
49
  config_files: string[];
50
- denied_tools: Field2;
51
50
  /**
52
51
  * Per-key provenance for the top-level `[env]`.
53
52
  */
@@ -71,7 +70,6 @@ export interface ConfigReport {
71
70
  [k: string]: Field3;
72
71
  };
73
72
  history_pointer_file: Field3;
74
- hooks: Field11;
75
73
  load_mcp: Field;
76
74
  load_skills: Field;
77
75
  max_parallel: Field9;
@@ -87,6 +85,7 @@ export interface ConfigReport {
87
85
  schema_version: string;
88
86
  server_overloaded_max_retries: Field8;
89
87
  stream: Field1;
88
+ sync: SyncPolicyReport;
90
89
  system: Field3;
91
90
  timeout: Field5;
92
91
  tool_set: Field6;
@@ -153,13 +152,9 @@ export interface HarnessReport {
153
152
  apps?: Field | null | undefined;
154
153
  args: Field2;
155
154
  bin: Field3;
156
- denied_tools: Field2;
157
155
  env: {
158
156
  [k: string]: Field3;
159
157
  };
160
- hooks: {
161
- [k: string]: unknown;
162
- };
163
158
  model: Field3;
164
159
  /**
165
160
  * The resolved `model_catalog_refresh_seconds` (`3600` by default),
@@ -172,9 +167,6 @@ export interface HarnessReport {
172
167
  */
173
168
  plugins?: Field | null | undefined;
174
169
  reasoning: Field3;
175
- settings: {
176
- [k: string]: unknown;
177
- };
178
170
  /**
179
171
  * The resolved `shared_model_catalog` (`true` by default), present only
180
172
  * for `codex`.
@@ -214,7 +206,6 @@ export interface VariantReport {
214
206
  apps?: Field | null | undefined;
215
207
  args: Field2;
216
208
  bin: Field3;
217
- denied_tools: Field2;
218
209
  env: {
219
210
  [k: string]: Field3;
220
211
  };
@@ -222,9 +213,6 @@ export interface VariantReport {
222
213
  env_from: {
223
214
  [k: string]: Field3;
224
215
  };
225
- hooks: {
226
- [k: string]: unknown;
227
- };
228
216
  model: Field3;
229
217
  /**
230
218
  * The `model_catalog_refresh_seconds` a launch of this variant resolves
@@ -239,9 +227,6 @@ export interface VariantReport {
239
227
  */
240
228
  plugins?: Field | null | undefined;
241
229
  reasoning: Field3;
242
- settings: {
243
- [k: string]: unknown;
244
- };
245
230
  /**
246
231
  * The `shared_model_catalog` a launch of this variant resolves to: the
247
232
  * variant's own, else its harness's, else `true`. Present only for `codex`.
@@ -250,49 +235,6 @@ export interface VariantReport {
250
235
  unset_env: Field2;
251
236
  [k: string]: unknown;
252
237
  }
253
- /**
254
- * One resolved field in the `oneharness config` report: the effective value
255
- * plus where it came from (a config file path, or [`DEFAULT_SOURCE`]). Both
256
- * are `null` when the field is unset everywhere and has no built-in default.
257
- */
258
- export interface Field11 {
259
- source: string | null;
260
- value: HookEntry[] | null;
261
- [k: string]: unknown;
262
- }
263
- /**
264
- * One `[[hooks]]` entry: a pre-tool gate installed into each targeted harness.
265
- * The `command` may contain `{harness}`, replaced with the harness id when the
266
- * hook is built (so one entry can route `mygate hook {harness}` to every CLI).
267
- */
268
- export interface HookEntry {
269
- /**
270
- * The command the harness runs before a tool call. `{harness}` is
271
- * substituted with the harness id. Required and non-empty.
272
- */
273
- command: string;
274
- /**
275
- * Restrict this entry to these harness ids; absent means every harness
276
- * being synced.
277
- */
278
- harnesses: string[] | null;
279
- /**
280
- * Tool-name matcher in the harness's dialect (most read it as a regex);
281
- * applied to every targeted harness as written. Absent means match-all.
282
- */
283
- matcher: string | null;
284
- /**
285
- * Identity for plugin-delivered harnesses (Goose, OpenCode) and Copilot's
286
- * per-owner file, so two tools' hooks never collide. Defaults to
287
- * `oneharness`.
288
- */
289
- plugin_name: string | null;
290
- /**
291
- * Timeout in seconds, for the harnesses whose hook schema carries one
292
- * (Goose, Crush); ignored by the others.
293
- */
294
- timeout: number | null;
295
- }
296
238
  /**
297
239
  * One resolved field in the `oneharness config` report: the effective value
298
240
  * plus where it came from (a config file path, or [`DEFAULT_SOURCE`]). Both
@@ -372,6 +314,97 @@ export interface Field1 {
372
314
  value: boolean | null;
373
315
  [k: string]: unknown;
374
316
  }
317
+ /**
318
+ * The `[sync]` section, mirroring the file's shape, each value with its
319
+ * provenance: what `oneharness sync` writes into each harness's files.
320
+ */
321
+ export interface SyncPolicyReport {
322
+ allowed_tools: Field2;
323
+ denied_tools: Field2;
324
+ /**
325
+ * Per-harness sync policy (`[sync.harness.<id>]`), with provenance,
326
+ * keyed by the registry's id.
327
+ */
328
+ harness: {
329
+ [k: string]: SyncHarnessPolicyReport;
330
+ };
331
+ hooks: Field11;
332
+ [k: string]: unknown;
333
+ }
334
+ /**
335
+ * One harness's `[sync.harness.<id>]` policy, with provenance.
336
+ */
337
+ export interface SyncHarnessPolicyReport {
338
+ allowed_tools: Field2;
339
+ denied_tools: Field2;
340
+ hooks: {
341
+ [k: string]: unknown;
342
+ };
343
+ settings: {
344
+ [k: string]: unknown;
345
+ };
346
+ variant: {
347
+ [k: string]: SyncVariantPolicyReport;
348
+ };
349
+ [k: string]: unknown;
350
+ }
351
+ /**
352
+ * One variant's `[sync.harness.<id>.variant.<name>]` policy, with provenance.
353
+ */
354
+ export interface SyncVariantPolicyReport {
355
+ allowed_tools: Field2;
356
+ denied_tools: Field2;
357
+ hooks: {
358
+ [k: string]: unknown;
359
+ };
360
+ settings: {
361
+ [k: string]: unknown;
362
+ };
363
+ [k: string]: unknown;
364
+ }
365
+ /**
366
+ * One resolved field in the `oneharness config` report: the effective value
367
+ * plus where it came from (a config file path, or [`DEFAULT_SOURCE`]). Both
368
+ * are `null` when the field is unset everywhere and has no built-in default.
369
+ */
370
+ export interface Field11 {
371
+ source: string | null;
372
+ value: HookEntry[] | null;
373
+ [k: string]: unknown;
374
+ }
375
+ /**
376
+ * One `[[sync.hooks]]` entry: a pre-tool gate installed into each targeted harness.
377
+ * The `command` may contain `{harness}`, replaced with the harness id when the
378
+ * hook is built (so one entry can route `mygate hook {harness}` to every CLI).
379
+ */
380
+ export interface HookEntry {
381
+ /**
382
+ * The command the harness runs before a tool call. `{harness}` is
383
+ * substituted with the harness id. Required and non-empty.
384
+ */
385
+ command: string;
386
+ /**
387
+ * Restrict this entry to these harness ids; absent means every harness
388
+ * being synced.
389
+ */
390
+ harnesses: string[] | null;
391
+ /**
392
+ * Tool-name matcher in the harness's dialect (most read it as a regex);
393
+ * applied to every targeted harness as written. Absent means match-all.
394
+ */
395
+ matcher: string | null;
396
+ /**
397
+ * Identity for plugin-delivered harnesses (Goose, OpenCode) and Copilot's
398
+ * per-owner file, so two tools' hooks never collide. Defaults to
399
+ * `oneharness`.
400
+ */
401
+ plugin_name: string | null;
402
+ /**
403
+ * Timeout in seconds, for the harnesses whose hook schema carries one
404
+ * (Goose, Crush); ignored by the others.
405
+ */
406
+ timeout: number | null;
407
+ }
375
408
  /**
376
409
  * One resolved field in the `oneharness config` report: the effective value
377
410
  * plus where it came from (a config file path, or [`DEFAULT_SOURCE`]). Both
@@ -17628,9 +17628,6 @@
17628
17628
  "type": "string"
17629
17629
  }
17630
17630
  },
17631
- "denied_tools": {
17632
- "$ref": "#/$defs/Field2"
17633
- },
17634
17631
  "env": {
17635
17632
  "description": "Per-key provenance for the top-level `[env]`.",
17636
17633
  "type": "object",
@@ -17667,9 +17664,6 @@
17667
17664
  "history_pointer_file": {
17668
17665
  "$ref": "#/$defs/Field3"
17669
17666
  },
17670
- "hooks": {
17671
- "$ref": "#/$defs/Field11"
17672
- },
17673
17667
  "load_mcp": {
17674
17668
  "$ref": "#/$defs/Field"
17675
17669
  },
@@ -17720,6 +17714,10 @@
17720
17714
  "description": "Whether config asks every `run` to stream (`--stream` / ONEHARNESS_STREAM);\ndefaults to false, the built-in buffered report.",
17721
17715
  "$ref": "#/$defs/Field"
17722
17716
  },
17717
+ "sync": {
17718
+ "description": "The `[sync]` section, mirroring the file's shape, each value with its\nprovenance: what `oneharness sync` writes into each harness's files.",
17719
+ "$ref": "#/$defs/SyncPolicyReport"
17720
+ },
17723
17721
  "system": {
17724
17722
  "$ref": "#/$defs/Field3"
17725
17723
  },
@@ -17760,8 +17758,7 @@
17760
17758
  "history_pointer_file",
17761
17759
  "history_labels",
17762
17760
  "allowed_tools",
17763
- "denied_tools",
17764
- "hooks",
17761
+ "sync",
17765
17762
  "env",
17766
17763
  "harness"
17767
17764
  ],
@@ -18122,19 +18119,12 @@
18122
18119
  "bin": {
18123
18120
  "$ref": "#/$defs/Field3"
18124
18121
  },
18125
- "denied_tools": {
18126
- "$ref": "#/$defs/Field2"
18127
- },
18128
18122
  "env": {
18129
18123
  "type": "object",
18130
18124
  "additionalProperties": {
18131
18125
  "$ref": "#/$defs/Field3"
18132
18126
  }
18133
18127
  },
18134
- "hooks": {
18135
- "type": "object",
18136
- "additionalProperties": true
18137
- },
18138
18128
  "model": {
18139
18129
  "$ref": "#/$defs/Field3"
18140
18130
  },
@@ -18163,10 +18153,6 @@
18163
18153
  "reasoning": {
18164
18154
  "$ref": "#/$defs/Field3"
18165
18155
  },
18166
- "settings": {
18167
- "type": "object",
18168
- "additionalProperties": true
18169
- },
18170
18156
  "shared_model_catalog": {
18171
18157
  "description": "The resolved `shared_model_catalog` (`true` by default), present only\nfor `codex`.",
18172
18158
  "anyOf": [
@@ -18191,15 +18177,12 @@
18191
18177
  "bin",
18192
18178
  "args",
18193
18179
  "allowed_tools",
18194
- "denied_tools",
18195
- "hooks",
18196
- "settings",
18197
18180
  "env",
18198
18181
  "variant"
18199
18182
  ]
18200
18183
  },
18201
18184
  "HookEntry": {
18202
- "description": "One `[[hooks]]` entry: a pre-tool gate installed into each targeted harness.\nThe `command` may contain `{harness}`, replaced with the harness id when the\nhook is built (so one entry can route `mygate hook {harness}` to every CLI).",
18185
+ "description": "One `[[sync.hooks]]` entry: a pre-tool gate installed into each targeted harness.\nThe `command` may contain `{harness}`, replaced with the harness id when the\nhook is built (so one entry can route `mygate hook {harness}` to every CLI).",
18203
18186
  "type": "object",
18204
18187
  "properties": {
18205
18188
  "command": {
@@ -18319,6 +18302,93 @@
18319
18302
  }
18320
18303
  ]
18321
18304
  },
18305
+ "SyncHarnessPolicyReport": {
18306
+ "description": "One harness's `[sync.harness.<id>]` policy, with provenance.",
18307
+ "type": "object",
18308
+ "properties": {
18309
+ "allowed_tools": {
18310
+ "$ref": "#/$defs/Field2"
18311
+ },
18312
+ "denied_tools": {
18313
+ "$ref": "#/$defs/Field2"
18314
+ },
18315
+ "hooks": {
18316
+ "type": "object",
18317
+ "additionalProperties": true
18318
+ },
18319
+ "settings": {
18320
+ "type": "object",
18321
+ "additionalProperties": true
18322
+ },
18323
+ "variant": {
18324
+ "type": "object",
18325
+ "additionalProperties": {
18326
+ "$ref": "#/$defs/SyncVariantPolicyReport"
18327
+ }
18328
+ }
18329
+ },
18330
+ "required": [
18331
+ "allowed_tools",
18332
+ "denied_tools",
18333
+ "hooks",
18334
+ "settings",
18335
+ "variant"
18336
+ ]
18337
+ },
18338
+ "SyncPolicyReport": {
18339
+ "description": "The `[sync]` section of the `config` report: every sync-policy field, in\nthe file's own shape, with provenance.",
18340
+ "type": "object",
18341
+ "properties": {
18342
+ "allowed_tools": {
18343
+ "$ref": "#/$defs/Field2"
18344
+ },
18345
+ "denied_tools": {
18346
+ "$ref": "#/$defs/Field2"
18347
+ },
18348
+ "harness": {
18349
+ "description": "Per-harness sync policy (`[sync.harness.<id>]`), with provenance,\nkeyed by the registry's id.",
18350
+ "type": "object",
18351
+ "additionalProperties": {
18352
+ "$ref": "#/$defs/SyncHarnessPolicyReport"
18353
+ }
18354
+ },
18355
+ "hooks": {
18356
+ "$ref": "#/$defs/Field11"
18357
+ }
18358
+ },
18359
+ "required": [
18360
+ "allowed_tools",
18361
+ "denied_tools",
18362
+ "hooks",
18363
+ "harness"
18364
+ ]
18365
+ },
18366
+ "SyncVariantPolicyReport": {
18367
+ "description": "One variant's `[sync.harness.<id>.variant.<name>]` policy, with provenance.",
18368
+ "type": "object",
18369
+ "properties": {
18370
+ "allowed_tools": {
18371
+ "$ref": "#/$defs/Field2"
18372
+ },
18373
+ "denied_tools": {
18374
+ "$ref": "#/$defs/Field2"
18375
+ },
18376
+ "hooks": {
18377
+ "type": "object",
18378
+ "additionalProperties": true
18379
+ },
18380
+ "settings": {
18381
+ "type": "object",
18382
+ "additionalProperties": true
18383
+ }
18384
+ },
18385
+ "required": [
18386
+ "allowed_tools",
18387
+ "denied_tools",
18388
+ "hooks",
18389
+ "settings"
18390
+ ]
18391
+ },
18322
18392
  "ToolClass": {
18323
18393
  "description": "A harness-agnostic class of built-in tool a turn may load (`tool_set`).",
18324
18394
  "oneOf": [
@@ -18379,9 +18449,6 @@
18379
18449
  "bin": {
18380
18450
  "$ref": "#/$defs/Field3"
18381
18451
  },
18382
- "denied_tools": {
18383
- "$ref": "#/$defs/Field2"
18384
- },
18385
18452
  "env": {
18386
18453
  "type": "object",
18387
18454
  "additionalProperties": {
@@ -18397,10 +18464,6 @@
18397
18464
  "$ref": "#/$defs/Field3"
18398
18465
  }
18399
18466
  },
18400
- "hooks": {
18401
- "type": "object",
18402
- "additionalProperties": true
18403
- },
18404
18467
  "model": {
18405
18468
  "$ref": "#/$defs/Field3"
18406
18469
  },
@@ -18429,10 +18492,6 @@
18429
18492
  "reasoning": {
18430
18493
  "$ref": "#/$defs/Field3"
18431
18494
  },
18432
- "settings": {
18433
- "type": "object",
18434
- "additionalProperties": true
18435
- },
18436
18495
  "shared_model_catalog": {
18437
18496
  "description": "The `shared_model_catalog` a launch of this variant resolves to: the\nvariant's own, else its harness's, else `true`. Present only for `codex`.",
18438
18497
  "anyOf": [
@@ -18454,9 +18513,6 @@
18454
18513
  "bin",
18455
18514
  "args",
18456
18515
  "allowed_tools",
18457
- "denied_tools",
18458
- "hooks",
18459
- "settings",
18460
18516
  "env_file",
18461
18517
  "env_from",
18462
18518
  "unset_env",
@@ -18564,7 +18620,7 @@
18564
18620
  ]
18565
18621
  },
18566
18622
  "HookFileResult": {
18567
- "description": "One installed `[[hooks]]` file.",
18623
+ "description": "One installed `[[sync.hooks]]` file.",
18568
18624
  "type": "object",
18569
18625
  "properties": {
18570
18626
  "file": {
@@ -18640,7 +18696,7 @@
18640
18696
  "type": "string"
18641
18697
  },
18642
18698
  "hooks": {
18643
- "description": "Normalized `[[hooks]]` files installed into this harness (a Goose hook\nwrites two). Empty when no `[[hooks]]` entry targets it.",
18699
+ "description": "Normalized `[[sync.hooks]]` files installed into this harness (a Goose hook\nwrites two). Empty when no `[[sync.hooks]]` entry targets it.",
18644
18700
  "type": "array",
18645
18701
  "items": {
18646
18702
  "$ref": "#/$defs/HookFileResult"
@@ -18657,7 +18713,7 @@
18657
18713
  "$ref": "#/$defs/SyncStatus"
18658
18714
  },
18659
18715
  "unmapped": {
18660
- "description": "Top-level settings that have no mapping for this harness (e.g. a\ntop-level `allowed_tools` while the harness has no allow-list concept)\n— visible here and warned on stderr, never silently dropped.",
18716
+ "description": "Top-level settings that have no mapping for this harness (e.g. a\n`[sync] allowed_tools` while the harness has no allow-list concept)\n— visible here and warned on stderr, never silently dropped.",
18661
18717
  "type": "array",
18662
18718
  "items": {
18663
18719
  "type": "string"
@@ -56,8 +56,8 @@ export interface SyncResult {
56
56
  file: string | null;
57
57
  harness: string;
58
58
  /**
59
- * Normalized `[[hooks]]` files installed into this harness (a Goose hook
60
- * writes two). Empty when no `[[hooks]]` entry targets it.
59
+ * Normalized `[[sync.hooks]]` files installed into this harness (a Goose hook
60
+ * writes two). Empty when no `[[sync.hooks]]` entry targets it.
61
61
  */
62
62
  hooks: HookFileResult[];
63
63
  /**
@@ -69,7 +69,7 @@ export interface SyncResult {
69
69
  status: SyncStatus;
70
70
  /**
71
71
  * Top-level settings that have no mapping for this harness (e.g. a
72
- * top-level `allowed_tools` while the harness has no allow-list concept)
72
+ * `[sync] allowed_tools` while the harness has no allow-list concept)
73
73
  * — visible here and warned on stderr, never silently dropped.
74
74
  */
75
75
  unmapped: string[];
@@ -99,7 +99,7 @@ export interface RuleChange {
99
99
  [k: string]: unknown;
100
100
  }
101
101
  /**
102
- * One installed `[[hooks]]` file.
102
+ * One installed `[[sync.hooks]]` file.
103
103
  */
104
104
  export interface HookFileResult {
105
105
  file: string;
@@ -2,7 +2,7 @@ import { z } from "zod";
2
2
  import type { CompactOptions } from "./compact-options.js";
3
3
  import type { CompactOutcome, CompactStatus } from "./compact-outcome.js";
4
4
  import type { ConfigOptions } from "./config-options.js";
5
- import type { AppServerMode, ConfigReport, Field, Field10, Field11, Field12, Field2, Field3, Field4, Field5, Field6, Field7, Field8, Field9, HarnessReport, HookEntry, VariantReport } from "./config-report.js";
5
+ import type { AppServerMode, ConfigReport, Field, Field10, Field11, Field12, Field2, Field3, Field4, Field5, Field6, Field7, Field8, Field9, HarnessReport, HookEntry, SyncHarnessPolicyReport, SyncPolicyReport, SyncVariantPolicyReport, VariantReport } from "./config-report.js";
6
6
  import type { ActionEvent, AppServerReport, BatchReport, ControlEvent, ControlReason, ControlReport, ControlVerb, Diagnostic, ExecutionTelemetry, FailureKind, FallThrough, FallThroughReason, FallbackReport, RunReport, RunResult, RunWork, SessionReport, Setting, Status, TimingSource, ToolCallStatus, Usage, UtcInstant } from "./contracts.js";
7
7
  import type { DetectOptions } from "./detect-options.js";
8
8
  import type { DetectInfo, DetectReport } from "./detection.js";
@@ -145,10 +145,13 @@ export declare const SessionPhaseSchema: z.ZodType<SessionPhase>;
145
145
  export declare const SessionReportSchema: z.ZodType<SessionReport>;
146
146
  export declare const SettingSchema: z.ZodType<Setting>;
147
147
  export declare const StatusSchema: z.ZodType<Status>;
148
+ export declare const SyncHarnessPolicyReportSchema: z.ZodType<SyncHarnessPolicyReport>;
148
149
  export declare const SyncOptionsSchema: z.ZodType<SyncOptions>;
150
+ export declare const SyncPolicyReportSchema: z.ZodType<SyncPolicyReport>;
149
151
  export declare const SyncReportSchema: z.ZodType<SyncReport>;
150
152
  export declare const SyncResultSchema: z.ZodType<SyncResult>;
151
153
  export declare const SyncStatusSchema: z.ZodType<SyncStatus>;
154
+ export declare const SyncVariantPolicyReportSchema: z.ZodType<SyncVariantPolicyReport>;
152
155
  export declare const TimingSourceSchema: z.ZodType<TimingSource>;
153
156
  export declare const ToolCallStatusSchema: z.ZodType<ToolCallStatus>;
154
157
  export declare const ToolClassSchema: z.ZodType<ToolClass>;
@@ -93,7 +93,6 @@ export const ConfigReportSchema = z.looseObject({
93
93
  auto_compact_tokens: z.lazy(() => Field5Schema).refine((value) => value !== undefined, { message: "Required" }),
94
94
  bypass: z.lazy(() => FieldSchema).refine((value) => value !== undefined, { message: "Required" }),
95
95
  config_files: z.array(z.string()).refine((value) => value !== undefined, { message: "Required" }),
96
- denied_tools: z.lazy(() => Field2Schema).refine((value) => value !== undefined, { message: "Required" }),
97
96
  env: z
98
97
  .record(z.string(), z.lazy(() => Field3Schema))
99
98
  .refine((value) => value !== undefined, { message: "Required" }),
@@ -108,7 +107,6 @@ export const ConfigReportSchema = z.looseObject({
108
107
  .record(z.string(), z.lazy(() => Field3Schema))
109
108
  .refine((value) => value !== undefined, { message: "Required" }),
110
109
  history_pointer_file: z.lazy(() => Field3Schema).refine((value) => value !== undefined, { message: "Required" }),
111
- hooks: z.lazy(() => Field11Schema).refine((value) => value !== undefined, { message: "Required" }),
112
110
  load_mcp: z.lazy(() => FieldSchema).refine((value) => value !== undefined, { message: "Required" }),
113
111
  load_skills: z.lazy(() => FieldSchema).refine((value) => value !== undefined, { message: "Required" }),
114
112
  max_parallel: z.lazy(() => Field9Schema).refine((value) => value !== undefined, { message: "Required" }),
@@ -126,6 +124,7 @@ export const ConfigReportSchema = z.looseObject({
126
124
  .lazy(() => Field8Schema)
127
125
  .refine((value) => value !== undefined, { message: "Required" }),
128
126
  stream: z.lazy(() => FieldSchema).refine((value) => value !== undefined, { message: "Required" }),
127
+ sync: z.lazy(() => SyncPolicyReportSchema).refine((value) => value !== undefined, { message: "Required" }),
129
128
  system: z.lazy(() => Field3Schema).refine((value) => value !== undefined, { message: "Required" }),
130
129
  timeout: z.lazy(() => Field5Schema).refine((value) => value !== undefined, { message: "Required" }),
131
130
  tool_set: z.lazy(() => Field6Schema).refine((value) => value !== undefined, { message: "Required" }),
@@ -381,16 +380,13 @@ export const HarnessReportSchema = z.looseObject({
381
380
  apps: z.union([z.lazy(() => FieldSchema), z.null()]).optional(),
382
381
  args: z.lazy(() => Field2Schema).refine((value) => value !== undefined, { message: "Required" }),
383
382
  bin: z.lazy(() => Field3Schema).refine((value) => value !== undefined, { message: "Required" }),
384
- denied_tools: z.lazy(() => Field2Schema).refine((value) => value !== undefined, { message: "Required" }),
385
383
  env: z
386
384
  .record(z.string(), z.lazy(() => Field3Schema))
387
385
  .refine((value) => value !== undefined, { message: "Required" }),
388
- hooks: z.looseObject({}).refine((value) => value !== undefined, { message: "Required" }),
389
386
  model: z.lazy(() => Field3Schema).refine((value) => value !== undefined, { message: "Required" }),
390
387
  model_catalog_refresh_seconds: z.union([z.lazy(() => Field5Schema), z.null()]).optional(),
391
388
  plugins: z.union([z.lazy(() => FieldSchema), z.null()]).optional(),
392
389
  reasoning: z.lazy(() => Field3Schema).refine((value) => value !== undefined, { message: "Required" }),
393
- settings: z.looseObject({}).refine((value) => value !== undefined, { message: "Required" }),
394
390
  shared_model_catalog: z.union([z.lazy(() => FieldSchema), z.null()]).optional(),
395
391
  variant: z
396
392
  .record(z.string(), z.lazy(() => VariantReportSchema))
@@ -3051,6 +3047,15 @@ export const StatusSchema = z.union([
3051
3047
  z.literal("skipped"),
3052
3048
  z.literal("planned"),
3053
3049
  ]);
3050
+ export const SyncHarnessPolicyReportSchema = z.looseObject({
3051
+ allowed_tools: z.lazy(() => Field2Schema).refine((value) => value !== undefined, { message: "Required" }),
3052
+ denied_tools: z.lazy(() => Field2Schema).refine((value) => value !== undefined, { message: "Required" }),
3053
+ hooks: z.looseObject({}).refine((value) => value !== undefined, { message: "Required" }),
3054
+ settings: z.looseObject({}).refine((value) => value !== undefined, { message: "Required" }),
3055
+ variant: z
3056
+ .record(z.string(), z.lazy(() => SyncVariantPolicyReportSchema))
3057
+ .refine((value) => value !== undefined, { message: "Required" }),
3058
+ });
3054
3059
  export const SyncOptionsSchema = z.strictObject({
3055
3060
  check: z.boolean().optional(),
3056
3061
  config: z.array(z.string()).optional(),
@@ -3060,6 +3065,14 @@ export const SyncOptionsSchema = z.strictObject({
3060
3065
  harnesses: z.array(z.string()).optional(),
3061
3066
  noConfig: z.boolean().optional(),
3062
3067
  });
3068
+ export const SyncPolicyReportSchema = z.looseObject({
3069
+ allowed_tools: z.lazy(() => Field2Schema).refine((value) => value !== undefined, { message: "Required" }),
3070
+ denied_tools: z.lazy(() => Field2Schema).refine((value) => value !== undefined, { message: "Required" }),
3071
+ harness: z
3072
+ .record(z.string(), z.lazy(() => SyncHarnessPolicyReportSchema))
3073
+ .refine((value) => value !== undefined, { message: "Required" }),
3074
+ hooks: z.lazy(() => Field11Schema).refine((value) => value !== undefined, { message: "Required" }),
3075
+ });
3063
3076
  export const SyncReportSchema = z.looseObject({
3064
3077
  check: z.boolean().refine((value) => value !== undefined, { message: "Required" }),
3065
3078
  config_files: z.array(z.string()).refine((value) => value !== undefined, { message: "Required" }),
@@ -3083,6 +3096,12 @@ export const SyncStatusSchema = z.union([
3083
3096
  z.literal("unchanged"),
3084
3097
  z.literal("skipped"),
3085
3098
  ]);
3099
+ export const SyncVariantPolicyReportSchema = z.looseObject({
3100
+ allowed_tools: z.lazy(() => Field2Schema).refine((value) => value !== undefined, { message: "Required" }),
3101
+ denied_tools: z.lazy(() => Field2Schema).refine((value) => value !== undefined, { message: "Required" }),
3102
+ hooks: z.looseObject({}).refine((value) => value !== undefined, { message: "Required" }),
3103
+ settings: z.looseObject({}).refine((value) => value !== undefined, { message: "Required" }),
3104
+ });
3086
3105
  export const TimingSourceSchema = z.union([
3087
3106
  z.literal("provider_measured"),
3088
3107
  z.literal("stdout_observed"),
@@ -3222,7 +3241,6 @@ export const VariantReportSchema = z.looseObject({
3222
3241
  apps: z.union([z.lazy(() => FieldSchema), z.null()]).optional(),
3223
3242
  args: z.lazy(() => Field2Schema).refine((value) => value !== undefined, { message: "Required" }),
3224
3243
  bin: z.lazy(() => Field3Schema).refine((value) => value !== undefined, { message: "Required" }),
3225
- denied_tools: z.lazy(() => Field2Schema).refine((value) => value !== undefined, { message: "Required" }),
3226
3244
  env: z
3227
3245
  .record(z.string(), z.lazy(() => Field3Schema))
3228
3246
  .refine((value) => value !== undefined, { message: "Required" }),
@@ -3230,12 +3248,10 @@ export const VariantReportSchema = z.looseObject({
3230
3248
  env_from: z
3231
3249
  .record(z.string(), z.lazy(() => Field3Schema))
3232
3250
  .refine((value) => value !== undefined, { message: "Required" }),
3233
- hooks: z.looseObject({}).refine((value) => value !== undefined, { message: "Required" }),
3234
3251
  model: z.lazy(() => Field3Schema).refine((value) => value !== undefined, { message: "Required" }),
3235
3252
  model_catalog_refresh_seconds: z.union([z.lazy(() => Field5Schema), z.null()]).optional(),
3236
3253
  plugins: z.union([z.lazy(() => FieldSchema), z.null()]).optional(),
3237
3254
  reasoning: z.lazy(() => Field3Schema).refine((value) => value !== undefined, { message: "Required" }),
3238
- settings: z.looseObject({}).refine((value) => value !== undefined, { message: "Required" }),
3239
3255
  shared_model_catalog: z.union([z.lazy(() => FieldSchema), z.null()]).optional(),
3240
3256
  unset_env: z.lazy(() => Field2Schema).refine((value) => value !== undefined, { message: "Required" }),
3241
3257
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oneharness/sdk",
3
- "version": "0.28.7",
3
+ "version": "0.29.0",
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.28.7",
22
+ "oneharness-cli": "0.29.0",
23
23
  "zod": "^4.4.3"
24
24
  }
25
25
  }