@otto-code/protocol 0.6.5 → 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();
@@ -2401,6 +2406,57 @@ export const CheckoutGitRollbackRequestSchema = z.object({
2401
2406
  allowWithRunningAgents: z.boolean().optional(),
2402
2407
  requestId: z.string(),
2403
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
+ });
2404
2460
  export const CheckoutMergeRequestSchema = z.object({
2405
2461
  type: z.literal("checkout_merge_request"),
2406
2462
  cwd: z.string(),
@@ -3105,6 +3161,10 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
3105
3161
  CheckoutGitCommitAgentRequestSchema,
3106
3162
  CheckoutGitRollbackRequestSchema,
3107
3163
  CheckoutGitGetOperationLogRequestSchema,
3164
+ CheckoutGitFileHistoryRequestSchema,
3165
+ CheckoutGitFileCommitDiffRequestSchema,
3166
+ CheckoutGitFileBlameRequestSchema,
3167
+ CheckoutGitFileOriginRequestSchema,
3108
3168
  RunsGetSnapshotRequestSchema,
3109
3169
  RunsGateRespondRequestSchema,
3110
3170
  RunsCancelRequestSchema,
@@ -3428,6 +3488,12 @@ export const ServerInfoStatusPayloadSchema = z
3428
3488
  checkoutGitRollback: z.boolean().optional(),
3429
3489
  // COMPAT(checkoutGitLog): added in v0.5.1, drop the gate when daemon floor >= v0.5.1.
3430
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(),
3431
3497
  // COMPAT(agentTeams): added in v0.5.2, drop the gate when daemon floor >= v0.5.2.
3432
3498
  agentTeams: z.boolean().optional(),
3433
3499
  // COMPAT(modelTierOverrides): added in v0.5.2, drop the gate when daemon floor >= v0.5.2.
@@ -4645,6 +4711,116 @@ export const CheckoutGitRollbackResponseSchema = z.object({
4645
4711
  requestId: z.string(),
4646
4712
  }),
4647
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
+ });
4648
4824
  export const CheckoutMergeResponseSchema = z.object({
4649
4825
  type: z.literal("checkout_merge_response"),
4650
4826
  payload: z.object({
@@ -5707,6 +5883,10 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
5707
5883
  CheckoutGitRollbackResponseSchema,
5708
5884
  CheckoutGitGetOperationLogResponseSchema,
5709
5885
  CheckoutGitLogAppendedNotificationSchema,
5886
+ CheckoutGitFileHistoryResponseSchema,
5887
+ CheckoutGitFileCommitDiffResponseSchema,
5888
+ CheckoutGitFileBlameResponseSchema,
5889
+ CheckoutGitFileOriginResponseSchema,
5710
5890
  RunsGetSnapshotResponseSchema,
5711
5891
  RunsUpdatedNotificationSchema,
5712
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>>>;
@@ -3666,6 +3667,7 @@ export declare const WSOutboundMessageSchema: {
3666
3667
  voiceCues: import("zod").ZodOptional<import("zod").ZodObject<{
3667
3668
  join: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3668
3669
  thinking: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3670
+ waiting: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3669
3671
  done: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3670
3672
  }, import("zod/v4/core").$loose>>;
3671
3673
  }, import("zod/v4/core").$loose>>>;
@@ -3751,6 +3753,7 @@ export declare const WSOutboundMessageSchema: {
3751
3753
  cues: import("zod").ZodOptional<import("zod").ZodObject<{
3752
3754
  join: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3753
3755
  thinking: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3756
+ waiting: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3754
3757
  done: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
3755
3758
  }, import("zod/v4/core").$loose>>;
3756
3759
  error: import("zod").ZodOptional<import("zod").ZodString>;
@@ -4816,6 +4819,156 @@ export declare const WSOutboundMessageSchema: {
4816
4819
  text: import("zod").ZodString;
4817
4820
  }, import("zod/v4/core").$strip>>;
4818
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>;
4819
4972
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
4820
4973
  type: import("zod").ZodLiteral<"runs.get_snapshot.response">;
4821
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.5",
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": [