@otto-code/protocol 0.6.4 → 0.6.6

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/dist/messages.js CHANGED
@@ -199,20 +199,25 @@ const AgentPersonalityVoiceSchema = z
199
199
  name: z.string().min(1),
200
200
  })
201
201
  .passthrough();
202
- // The three Visualizer lifecycle moments a personality voice-cue line can
203
- // belong to. Protocol owns this vocabulary — the daemon's cue generator, the
204
- // personality editor, and the Visualizer playback hook all import it from here.
205
- export const CUE_MOMENTS = ["join", "thinking", "done"];
202
+ // The Visualizer lifecycle moments a personality voice-cue line can belong to.
203
+ // Protocol owns this vocabulary — the daemon's cue generator, the personality
204
+ // editor, and the Visualizer playback hook all import it from here.
205
+ // "waiting" is the parent's turn ending while its observed sub-agents are still
206
+ // running; it DEFERS "done" rather than replacing it (see docs/visualizer.md).
207
+ export const CUE_MOMENTS = ["join", "thinking", "waiting", "done"];
206
208
  // Pre-generated (and user-editable) spoken "voice cue" lines for the personality
207
- // — a few short variations for each of three Visualizer moments (its node joins
208
- // the graph, first starts thinking, completes). Stored on the personality so
209
- // they're deterministic and hand-tunable in the editor; the Visualizer reads
210
- // them directly (no runtime generation). All groups optional/loose — a
211
- // personality may have none, or only some. See docs/visualizer.md "Voice cues".
209
+ // — a few short variations for each Visualizer moment (its node joins the graph,
210
+ // first starts thinking, finishes its turn but waits on sub-agents, completes).
211
+ // Stored on the personality so they're deterministic and hand-tunable in the
212
+ // editor; the Visualizer reads them directly (no runtime generation). All groups
213
+ // optional/loose — a personality may have none, or only some (personalities
214
+ // authored before "waiting" existed simply stay silent for that moment).
215
+ // See docs/visualizer.md "Voice cues".
212
216
  const AgentPersonalityVoiceCuesSchema = z
213
217
  .object({
214
218
  join: z.array(z.string()).optional(),
215
219
  thinking: z.array(z.string()).optional(),
220
+ waiting: z.array(z.string()).optional(),
216
221
  done: z.array(z.string()).optional(),
217
222
  })
218
223
  .passthrough();
@@ -315,6 +320,29 @@ export const ModelTierOverrideSchema = z
315
320
  tier: ModelTierSchema,
316
321
  })
317
322
  .passthrough();
323
+ // A remembered provider endpoint: a base URL together with the credential it
324
+ // was saved with, so pointing a provider back at a previous endpoint is one
325
+ // pick instead of re-typing the key. Entries are scoped by the connection
326
+ // env-var pair they belong to (OPENAI_BASE_URL/OPENAI_API_KEY vs
327
+ // ANTHROPIC_BASE_URL/ANTHROPIC_AUTH_TOKEN), which is exactly what the provider
328
+ // settings sheet keys its dropdown off — so every openai-compatible provider
329
+ // entry on the host shares one pool, and Claude-compatible entries share
330
+ // another. Deliberately `z.string()` rather than an enum: a future env-var
331
+ // family must not make old entries unparseable.
332
+ export const SavedProviderEndpointSchema = z
333
+ .object({
334
+ /** Stable identity, `${baseUrlKey}::${baseUrl}` — dedupes on re-save. */
335
+ id: z.string().min(1),
336
+ baseUrlKey: z.string().min(1),
337
+ apiKeyKey: z.string().min(1),
338
+ baseUrl: z.string().min(1),
339
+ apiKey: z.string().default(""),
340
+ /** User-facing name; the UI falls back to the URL when absent. */
341
+ label: z.string().optional(),
342
+ /** Epoch ms of the last save, used to order the dropdown newest-first. */
343
+ savedAt: z.number().optional(),
344
+ })
345
+ .passthrough();
318
346
  export const MutableDaemonConfigSchema = z
319
347
  .object({
320
348
  mcp: z
@@ -327,6 +355,8 @@ export const MutableDaemonConfigSchema = z
327
355
  toolGroups: z.array(z.enum(OTTO_TOOL_GROUPS)).optional(),
328
356
  })
329
357
  .passthrough(),
358
+ // Defaults off, matching the daemon's own resolution — browser tools are an
359
+ // explicit opt-in, so an omitted section must never read as on.
330
360
  browserTools: MutableBrowserToolsConfigSchema.default({ enabled: false }),
331
361
  // Daemon-wide agent behavior toggles (Claude-tier capabilities). Defaults to
332
362
  // all-on so a new client parsing an old daemon's config sees today's behavior.
@@ -361,6 +391,11 @@ export const MutableDaemonConfigSchema = z
361
391
  // Gated by the modelTierOverrides feature; defaults empty so a new client
362
392
  // parsing an old daemon's config still sees a well-formed array.
363
393
  modelTierOverrides: z.array(ModelTierOverrideSchema).default([]),
394
+ // Per-host remembered provider endpoints (base URL + credential), pooled by
395
+ // env-var family. Gated by the savedProviderEndpoints feature; defaults
396
+ // empty so a new client parsing an old daemon's config still sees a
397
+ // well-formed array.
398
+ savedProviderEndpoints: z.array(SavedProviderEndpointSchema).default([]),
364
399
  })
365
400
  .passthrough();
366
401
  export const MutableDaemonConfigPatchSchema = z
@@ -396,6 +431,9 @@ export const MutableDaemonConfigPatchSchema = z
396
431
  // Gated by server_info features.modelTierOverrides. Replaces the full array
397
432
  // (read-modify-write), so removing an entry clears that model's tag.
398
433
  modelTierOverrides: z.array(ModelTierOverrideSchema).optional(),
434
+ // Gated by server_info features.savedProviderEndpoints. Replaces the full
435
+ // array (read-modify-write), so forgetting an endpoint drops it from disk.
436
+ savedProviderEndpoints: z.array(SavedProviderEndpointSchema).optional(),
399
437
  })
400
438
  .partial()
401
439
  .passthrough();
@@ -2368,6 +2406,57 @@ export const CheckoutGitRollbackRequestSchema = z.object({
2368
2406
  allowWithRunningAgents: z.boolean().optional(),
2369
2407
  requestId: z.string(),
2370
2408
  });
2409
+ // ── Git file investigation (local git, no hosting provider) ─────────────────
2410
+ // History / per-commit diff / blame / origin commit for one file or one line
2411
+ // range within it. Everything below is plain local git: it works in a repo with
2412
+ // no remote and no forge connection, and it is provider-neutral by construction
2413
+ // (it inspects the repo, not an agent), so there is no per-provider rollout to
2414
+ // look for. Gated by server_info.features.checkoutGitFileHistory.
2415
+ // Commits that touched a file, newest first. Whole-file mode follows renames;
2416
+ // passing startLine/endLine switches to `git log -L` for that range instead.
2417
+ export const CheckoutGitFileHistoryRequestSchema = z.object({
2418
+ type: z.literal("checkout.git.get_file_history.request"),
2419
+ cwd: z.string(),
2420
+ // Repo-relative path, as the file is named today.
2421
+ path: z.string(),
2422
+ limit: z.number().int().positive().optional(),
2423
+ offset: z.number().int().nonnegative().optional(),
2424
+ // 1-based inclusive line range. Both or neither.
2425
+ startLine: z.number().int().positive().optional(),
2426
+ endLine: z.number().int().positive().optional(),
2427
+ requestId: z.string(),
2428
+ });
2429
+ // What a single commit did to a single file, as a unified diff. `path` must be
2430
+ // the file's name *at that commit* (history entries carry it) or the pathspec
2431
+ // misses across a rename.
2432
+ export const CheckoutGitFileCommitDiffRequestSchema = z.object({
2433
+ type: z.literal("checkout.git.get_file_commit_diff.request"),
2434
+ cwd: z.string(),
2435
+ path: z.string(),
2436
+ sha: z.string(),
2437
+ ignoreWhitespace: z.boolean().optional(),
2438
+ requestId: z.string(),
2439
+ });
2440
+ // One page of blame. Always paged — blaming a large file whole would block the
2441
+ // daemon — so the client walks the file a page at a time.
2442
+ export const CheckoutGitFileBlameRequestSchema = z.object({
2443
+ type: z.literal("checkout.git.get_file_blame.request"),
2444
+ cwd: z.string(),
2445
+ path: z.string(),
2446
+ startLine: z.number().int().positive().optional(),
2447
+ lineCount: z.number().int().positive().optional(),
2448
+ // Blame at a specific commit instead of the working tree.
2449
+ sha: z.string().optional(),
2450
+ requestId: z.string(),
2451
+ });
2452
+ // The commit that first added the file ("who originally wrote this"), following
2453
+ // renames so a moved file reports its true origin.
2454
+ export const CheckoutGitFileOriginRequestSchema = z.object({
2455
+ type: z.literal("checkout.git.get_file_origin.request"),
2456
+ cwd: z.string(),
2457
+ path: z.string(),
2458
+ requestId: z.string(),
2459
+ });
2371
2460
  export const CheckoutMergeRequestSchema = z.object({
2372
2461
  type: z.literal("checkout_merge_request"),
2373
2462
  cwd: z.string(),
@@ -3072,6 +3161,10 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
3072
3161
  CheckoutGitCommitAgentRequestSchema,
3073
3162
  CheckoutGitRollbackRequestSchema,
3074
3163
  CheckoutGitGetOperationLogRequestSchema,
3164
+ CheckoutGitFileHistoryRequestSchema,
3165
+ CheckoutGitFileCommitDiffRequestSchema,
3166
+ CheckoutGitFileBlameRequestSchema,
3167
+ CheckoutGitFileOriginRequestSchema,
3075
3168
  RunsGetSnapshotRequestSchema,
3076
3169
  RunsGateRespondRequestSchema,
3077
3170
  RunsCancelRequestSchema,
@@ -3395,10 +3488,18 @@ export const ServerInfoStatusPayloadSchema = z
3395
3488
  checkoutGitRollback: z.boolean().optional(),
3396
3489
  // COMPAT(checkoutGitLog): added in v0.5.1, drop the gate when daemon floor >= v0.5.1.
3397
3490
  checkoutGitLog: z.boolean().optional(),
3491
+ // Local-git file investigation: history, per-commit diff, blame, origin
3492
+ // commit — for a whole file or a line range. No forge connection needed
3493
+ // and no per-provider rollout; it is git, so every provider gets it at
3494
+ // once.
3495
+ // COMPAT(checkoutGitFileHistory): added in v0.6.6, drop the gate when daemon floor >= v0.6.6.
3496
+ checkoutGitFileHistory: z.boolean().optional(),
3398
3497
  // COMPAT(agentTeams): added in v0.5.2, drop the gate when daemon floor >= v0.5.2.
3399
3498
  agentTeams: z.boolean().optional(),
3400
3499
  // COMPAT(modelTierOverrides): added in v0.5.2, drop the gate when daemon floor >= v0.5.2.
3401
3500
  modelTierOverrides: z.boolean().optional(),
3501
+ // COMPAT(savedProviderEndpoints): added in v0.6.5, drop the gate when daemon floor >= v0.6.5.
3502
+ savedProviderEndpoints: z.boolean().optional(),
3402
3503
  // COMPAT(agentOrchestration): added in v0.5.3, drop the gate when daemon floor >= v0.5.3.
3403
3504
  agentOrchestration: z.boolean().optional(),
3404
3505
  // COMPAT(activityStats): added in v0.5.3, drop the gate when daemon floor >= v0.5.3.
@@ -4610,6 +4711,116 @@ export const CheckoutGitRollbackResponseSchema = z.object({
4610
4711
  requestId: z.string(),
4611
4712
  }),
4612
4713
  });
4714
+ // ── Git file investigation responses ────────────────────────────────────────
4715
+ // A structured failure any of the four file-investigation RPCs can report. They
4716
+ // are pure reads, so the failure modes are narrow: not a repo, path/revision
4717
+ // rejected, or git itself refused.
4718
+ export const CheckoutGitFileErrorSchema = z.discriminatedUnion("kind", [
4719
+ z.object({
4720
+ kind: z.literal("not_git_repo"),
4721
+ }),
4722
+ z.object({
4723
+ kind: z.literal("invalid_path"),
4724
+ detail: z.string(),
4725
+ }),
4726
+ z.object({
4727
+ kind: z.literal("git_failed"),
4728
+ detail: z.string(),
4729
+ }),
4730
+ ]);
4731
+ export const GitFileHistoryEntrySchema = z.object({
4732
+ sha: z.string(),
4733
+ shortSha: z.string(),
4734
+ subject: z.string(),
4735
+ body: z.string(),
4736
+ authorName: z.string(),
4737
+ authorEmail: z.string(),
4738
+ // Unix seconds.
4739
+ authoredAt: z.number(),
4740
+ committerName: z.string(),
4741
+ committedAt: z.number(),
4742
+ // The file's name at this commit — differs from the requested path across a
4743
+ // rename. Diff requests must echo this one back, not the current name.
4744
+ path: z.string(),
4745
+ previousPath: z.string().optional(),
4746
+ // Single-letter git status (A/M/D/R/C).
4747
+ changeKind: z.string().optional(),
4748
+ isMerge: z.boolean(),
4749
+ // Parent object names, so a diff view can name the revision it is comparing
4750
+ // against instead of writing "<sha>^". Empty for a root commit.
4751
+ parentShas: z.array(z.string()).optional(),
4752
+ });
4753
+ export const CheckoutGitFileHistoryResponseSchema = z.object({
4754
+ type: z.literal("checkout.git.get_file_history.response"),
4755
+ payload: z.object({
4756
+ cwd: z.string(),
4757
+ path: z.string(),
4758
+ entries: z.array(GitFileHistoryEntrySchema),
4759
+ hasMore: z.boolean(),
4760
+ error: CheckoutGitFileErrorSchema.nullable(),
4761
+ requestId: z.string(),
4762
+ }),
4763
+ });
4764
+ export const CheckoutGitFileCommitDiffResponseSchema = z.object({
4765
+ type: z.literal("checkout.git.get_file_commit_diff.response"),
4766
+ payload: z.object({
4767
+ cwd: z.string(),
4768
+ path: z.string(),
4769
+ sha: z.string(),
4770
+ diff: z.string(),
4771
+ // Highlighted/parsed form of the same diff, when it parsed cleanly.
4772
+ structured: z.array(ParsedDiffFileSchema).optional(),
4773
+ // The file's previous revision — the diff's left-hand side, and the honest
4774
+ // label for it. Absent when this revision created the file.
4775
+ previousSha: z.string().optional(),
4776
+ previousPath: z.string().optional(),
4777
+ truncated: z.boolean(),
4778
+ error: CheckoutGitFileErrorSchema.nullable(),
4779
+ requestId: z.string(),
4780
+ }),
4781
+ });
4782
+ export const GitBlameLineSchema = z.object({
4783
+ line: z.number(),
4784
+ sha: z.string(),
4785
+ originalLine: z.number(),
4786
+ });
4787
+ // Blame commit metadata is deduped by sha rather than inlined per line: a
4788
+ // thousand-line page usually references a handful of commits.
4789
+ export const GitBlameCommitSchema = z.object({
4790
+ sha: z.string(),
4791
+ shortSha: z.string(),
4792
+ summary: z.string(),
4793
+ authorName: z.string(),
4794
+ authorEmail: z.string(),
4795
+ authoredAt: z.number(),
4796
+ path: z.string().optional(),
4797
+ });
4798
+ export const CheckoutGitFileBlameResponseSchema = z.object({
4799
+ type: z.literal("checkout.git.get_file_blame.response"),
4800
+ payload: z.object({
4801
+ cwd: z.string(),
4802
+ path: z.string(),
4803
+ lines: z.array(GitBlameLineSchema),
4804
+ commits: z.array(GitBlameCommitSchema),
4805
+ startLine: z.number(),
4806
+ endLine: z.number(),
4807
+ reachedEndOfFile: z.boolean(),
4808
+ error: CheckoutGitFileErrorSchema.nullable(),
4809
+ requestId: z.string(),
4810
+ }),
4811
+ });
4812
+ export const CheckoutGitFileOriginResponseSchema = z.object({
4813
+ type: z.literal("checkout.git.get_file_origin.response"),
4814
+ payload: z.object({
4815
+ cwd: z.string(),
4816
+ path: z.string(),
4817
+ // Null when the file has no commit history (never committed, or a shallow
4818
+ // clone that does not reach its creation).
4819
+ entry: GitFileHistoryEntrySchema.nullable(),
4820
+ error: CheckoutGitFileErrorSchema.nullable(),
4821
+ requestId: z.string(),
4822
+ }),
4823
+ });
4613
4824
  export const CheckoutMergeResponseSchema = z.object({
4614
4825
  type: z.literal("checkout_merge_response"),
4615
4826
  payload: z.object({
@@ -5672,6 +5883,10 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
5672
5883
  CheckoutGitRollbackResponseSchema,
5673
5884
  CheckoutGitGetOperationLogResponseSchema,
5674
5885
  CheckoutGitLogAppendedNotificationSchema,
5886
+ CheckoutGitFileHistoryResponseSchema,
5887
+ CheckoutGitFileCommitDiffResponseSchema,
5888
+ CheckoutGitFileBlameResponseSchema,
5889
+ CheckoutGitFileOriginResponseSchema,
5675
5890
  RunsGetSnapshotResponseSchema,
5676
5891
  RunsUpdatedNotificationSchema,
5677
5892
  RunsGateRespondResponseSchema,
@@ -3511,6 +3511,7 @@ export declare const WSOutboundMessageSchema: {
3511
3511
  voiceCues: import("zod").ZodOptional<import("zod").ZodObject<{
3512
3512
  join: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3513
3513
  thinking: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3514
+ waiting: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3514
3515
  done: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3515
3516
  }, import("zod/v4/core").$loose>>;
3516
3517
  }, import("zod/v4/core").$loose>>>;
@@ -3533,6 +3534,15 @@ export declare const WSOutboundMessageSchema: {
3533
3534
  modelId: import("zod").ZodString;
3534
3535
  tier: import("zod").ZodType<import("../agent-types.js").ModelTier, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").ModelTier, unknown>>;
3535
3536
  }, import("zod/v4/core").$loose>>>;
3537
+ savedProviderEndpoints: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
3538
+ id: import("zod").ZodString;
3539
+ baseUrlKey: import("zod").ZodString;
3540
+ apiKeyKey: import("zod").ZodString;
3541
+ baseUrl: import("zod").ZodString;
3542
+ apiKey: import("zod").ZodDefault<import("zod").ZodString>;
3543
+ label: import("zod").ZodOptional<import("zod").ZodString>;
3544
+ savedAt: import("zod").ZodOptional<import("zod").ZodNumber>;
3545
+ }, import("zod/v4/core").$loose>>>;
3536
3546
  }, import("zod/v4/core").$loose>;
3537
3547
  }, import("zod/v4/core").$loose>;
3538
3548
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
@@ -3657,6 +3667,7 @@ export declare const WSOutboundMessageSchema: {
3657
3667
  voiceCues: import("zod").ZodOptional<import("zod").ZodObject<{
3658
3668
  join: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3659
3669
  thinking: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3670
+ waiting: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3660
3671
  done: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3661
3672
  }, import("zod/v4/core").$loose>>;
3662
3673
  }, import("zod/v4/core").$loose>>>;
@@ -3679,6 +3690,15 @@ export declare const WSOutboundMessageSchema: {
3679
3690
  modelId: import("zod").ZodString;
3680
3691
  tier: import("zod").ZodType<import("../agent-types.js").ModelTier, unknown, import("zod/v4/core").$ZodTypeInternals<import("../agent-types.js").ModelTier, unknown>>;
3681
3692
  }, import("zod/v4/core").$loose>>>;
3693
+ savedProviderEndpoints: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
3694
+ id: import("zod").ZodString;
3695
+ baseUrlKey: import("zod").ZodString;
3696
+ apiKeyKey: import("zod").ZodString;
3697
+ baseUrl: import("zod").ZodString;
3698
+ apiKey: import("zod").ZodDefault<import("zod").ZodString>;
3699
+ label: import("zod").ZodOptional<import("zod").ZodString>;
3700
+ savedAt: import("zod").ZodOptional<import("zod").ZodNumber>;
3701
+ }, import("zod/v4/core").$loose>>>;
3682
3702
  }, import("zod/v4/core").$loose>;
3683
3703
  }, import("zod/v4/core").$loose>;
3684
3704
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
@@ -3733,6 +3753,7 @@ export declare const WSOutboundMessageSchema: {
3733
3753
  cues: import("zod").ZodOptional<import("zod").ZodObject<{
3734
3754
  join: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3735
3755
  thinking: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3756
+ waiting: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3736
3757
  done: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3737
3758
  }, import("zod/v4/core").$loose>>;
3738
3759
  error: import("zod").ZodOptional<import("zod").ZodString>;
@@ -4798,6 +4819,156 @@ export declare const WSOutboundMessageSchema: {
4798
4819
  text: import("zod").ZodString;
4799
4820
  }, import("zod/v4/core").$strip>>;
4800
4821
  }, import("zod/v4/core").$strip>;
4822
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4823
+ type: import("zod").ZodLiteral<"checkout.git.get_file_history.response">;
4824
+ payload: import("zod").ZodObject<{
4825
+ cwd: import("zod").ZodString;
4826
+ path: import("zod").ZodString;
4827
+ entries: import("zod").ZodArray<import("zod").ZodObject<{
4828
+ sha: import("zod").ZodString;
4829
+ shortSha: import("zod").ZodString;
4830
+ subject: import("zod").ZodString;
4831
+ body: import("zod").ZodString;
4832
+ authorName: import("zod").ZodString;
4833
+ authorEmail: import("zod").ZodString;
4834
+ authoredAt: import("zod").ZodNumber;
4835
+ committerName: import("zod").ZodString;
4836
+ committedAt: import("zod").ZodNumber;
4837
+ path: import("zod").ZodString;
4838
+ previousPath: import("zod").ZodOptional<import("zod").ZodString>;
4839
+ changeKind: import("zod").ZodOptional<import("zod").ZodString>;
4840
+ isMerge: import("zod").ZodBoolean;
4841
+ parentShas: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
4842
+ }, import("zod/v4/core").$strip>>;
4843
+ hasMore: import("zod").ZodBoolean;
4844
+ error: import("zod").ZodNullable<import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
4845
+ kind: import("zod").ZodLiteral<"not_git_repo">;
4846
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4847
+ kind: import("zod").ZodLiteral<"invalid_path">;
4848
+ detail: import("zod").ZodString;
4849
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4850
+ kind: import("zod").ZodLiteral<"git_failed">;
4851
+ detail: import("zod").ZodString;
4852
+ }, import("zod/v4/core").$strip>], "kind">>;
4853
+ requestId: import("zod").ZodString;
4854
+ }, import("zod/v4/core").$strip>;
4855
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4856
+ type: import("zod").ZodLiteral<"checkout.git.get_file_commit_diff.response">;
4857
+ payload: import("zod").ZodObject<{
4858
+ cwd: import("zod").ZodString;
4859
+ path: import("zod").ZodString;
4860
+ sha: import("zod").ZodString;
4861
+ diff: import("zod").ZodString;
4862
+ structured: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
4863
+ path: import("zod").ZodString;
4864
+ isNew: import("zod").ZodBoolean;
4865
+ isDeleted: import("zod").ZodBoolean;
4866
+ additions: import("zod").ZodNumber;
4867
+ deletions: import("zod").ZodNumber;
4868
+ hunks: import("zod").ZodArray<import("zod").ZodObject<{
4869
+ oldStart: import("zod").ZodNumber;
4870
+ oldCount: import("zod").ZodNumber;
4871
+ newStart: import("zod").ZodNumber;
4872
+ newCount: import("zod").ZodNumber;
4873
+ lines: import("zod").ZodArray<import("zod").ZodObject<{
4874
+ type: import("zod").ZodEnum<{
4875
+ context: "context";
4876
+ add: "add";
4877
+ remove: "remove";
4878
+ header: "header";
4879
+ }>;
4880
+ content: import("zod").ZodString;
4881
+ tokens: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
4882
+ text: import("zod").ZodString;
4883
+ style: import("zod").ZodNullable<import("zod").ZodString>;
4884
+ }, import("zod/v4/core").$strip>>>;
4885
+ }, import("zod/v4/core").$strip>>;
4886
+ }, import("zod/v4/core").$strip>>;
4887
+ status: import("zod").ZodOptional<import("zod").ZodEnum<{
4888
+ ok: "ok";
4889
+ too_large: "too_large";
4890
+ binary: "binary";
4891
+ }>>;
4892
+ }, import("zod/v4/core").$strip>>>;
4893
+ previousSha: import("zod").ZodOptional<import("zod").ZodString>;
4894
+ previousPath: import("zod").ZodOptional<import("zod").ZodString>;
4895
+ truncated: import("zod").ZodBoolean;
4896
+ error: import("zod").ZodNullable<import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
4897
+ kind: import("zod").ZodLiteral<"not_git_repo">;
4898
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4899
+ kind: import("zod").ZodLiteral<"invalid_path">;
4900
+ detail: import("zod").ZodString;
4901
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4902
+ kind: import("zod").ZodLiteral<"git_failed">;
4903
+ detail: import("zod").ZodString;
4904
+ }, import("zod/v4/core").$strip>], "kind">>;
4905
+ requestId: import("zod").ZodString;
4906
+ }, import("zod/v4/core").$strip>;
4907
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4908
+ type: import("zod").ZodLiteral<"checkout.git.get_file_blame.response">;
4909
+ payload: import("zod").ZodObject<{
4910
+ cwd: import("zod").ZodString;
4911
+ path: import("zod").ZodString;
4912
+ lines: import("zod").ZodArray<import("zod").ZodObject<{
4913
+ line: import("zod").ZodNumber;
4914
+ sha: import("zod").ZodString;
4915
+ originalLine: import("zod").ZodNumber;
4916
+ }, import("zod/v4/core").$strip>>;
4917
+ commits: import("zod").ZodArray<import("zod").ZodObject<{
4918
+ sha: import("zod").ZodString;
4919
+ shortSha: import("zod").ZodString;
4920
+ summary: import("zod").ZodString;
4921
+ authorName: import("zod").ZodString;
4922
+ authorEmail: import("zod").ZodString;
4923
+ authoredAt: import("zod").ZodNumber;
4924
+ path: import("zod").ZodOptional<import("zod").ZodString>;
4925
+ }, import("zod/v4/core").$strip>>;
4926
+ startLine: import("zod").ZodNumber;
4927
+ endLine: import("zod").ZodNumber;
4928
+ reachedEndOfFile: import("zod").ZodBoolean;
4929
+ error: import("zod").ZodNullable<import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
4930
+ kind: import("zod").ZodLiteral<"not_git_repo">;
4931
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4932
+ kind: import("zod").ZodLiteral<"invalid_path">;
4933
+ detail: import("zod").ZodString;
4934
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4935
+ kind: import("zod").ZodLiteral<"git_failed">;
4936
+ detail: import("zod").ZodString;
4937
+ }, import("zod/v4/core").$strip>], "kind">>;
4938
+ requestId: import("zod").ZodString;
4939
+ }, import("zod/v4/core").$strip>;
4940
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4941
+ type: import("zod").ZodLiteral<"checkout.git.get_file_origin.response">;
4942
+ payload: import("zod").ZodObject<{
4943
+ cwd: import("zod").ZodString;
4944
+ path: import("zod").ZodString;
4945
+ entry: import("zod").ZodNullable<import("zod").ZodObject<{
4946
+ sha: import("zod").ZodString;
4947
+ shortSha: import("zod").ZodString;
4948
+ subject: import("zod").ZodString;
4949
+ body: import("zod").ZodString;
4950
+ authorName: import("zod").ZodString;
4951
+ authorEmail: import("zod").ZodString;
4952
+ authoredAt: import("zod").ZodNumber;
4953
+ committerName: import("zod").ZodString;
4954
+ committedAt: import("zod").ZodNumber;
4955
+ path: import("zod").ZodString;
4956
+ previousPath: import("zod").ZodOptional<import("zod").ZodString>;
4957
+ changeKind: import("zod").ZodOptional<import("zod").ZodString>;
4958
+ isMerge: import("zod").ZodBoolean;
4959
+ parentShas: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
4960
+ }, import("zod/v4/core").$strip>>;
4961
+ error: import("zod").ZodNullable<import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
4962
+ kind: import("zod").ZodLiteral<"not_git_repo">;
4963
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4964
+ kind: import("zod").ZodLiteral<"invalid_path">;
4965
+ detail: import("zod").ZodString;
4966
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4967
+ kind: import("zod").ZodLiteral<"git_failed">;
4968
+ detail: import("zod").ZodString;
4969
+ }, import("zod/v4/core").$strip>], "kind">>;
4970
+ requestId: import("zod").ZodString;
4971
+ }, import("zod/v4/core").$strip>;
4801
4972
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4802
4973
  type: import("zod").ZodLiteral<"runs.get_snapshot.response">;
4803
4974
  payload: import("zod").ZodObject<{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@otto-code/protocol",
3
- "version": "0.6.4",
3
+ "version": "0.6.6",
4
4
  "description": "Otto shared protocol schemas and wire types",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "files": [