@otto-code/protocol 0.8.5 → 0.8.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
@@ -608,6 +608,15 @@ export const MutableDaemonConfigSchema = z
608
608
  attachmentImageMaxAgeDays: z.number().int().min(0).default(30),
609
609
  attachmentImageMaxTotalMb: z.number().int().min(0).default(512),
610
610
  enableTerminalAgentHooks: z.boolean().default(false),
611
+ // Gated by server_info.features.terminalTitleSettings. The daemon owns
612
+ // title policy because terminals can be created from any connected client.
613
+ terminalTitleMode: z.enum(["auto", "default"]).optional(),
614
+ terminalTitleIncludePaths: z.boolean().optional(),
615
+ // Windows-only preference for ordinary interactive terminals. Absent keeps
616
+ // the operating system's normal default shell on every platform.
617
+ defaultTerminalShell: z
618
+ .enum(["command-prompt", "windows-powershell", "powershell-7"])
619
+ .optional(),
611
620
  appendSystemPrompt: z.string().default(""),
612
621
  terminalProfiles: z.array(TerminalProfileSchema).optional(),
613
622
  // Absent on daemons without the speechSettings feature.
@@ -681,6 +690,11 @@ export const MutableDaemonConfigPatchSchema = z
681
690
  attachmentImageMaxAgeDays: z.number().int().min(0).optional(),
682
691
  attachmentImageMaxTotalMb: z.number().int().min(0).optional(),
683
692
  enableTerminalAgentHooks: z.boolean().optional(),
693
+ terminalTitleMode: z.enum(["auto", "default"]).optional(),
694
+ terminalTitleIncludePaths: z.boolean().optional(),
695
+ defaultTerminalShell: z
696
+ .enum(["command-prompt", "windows-powershell", "powershell-7"])
697
+ .optional(),
684
698
  appendSystemPrompt: z.string().optional(),
685
699
  terminalProfiles: z.array(TerminalProfileSchema).optional(),
686
700
  // Gated by server_info features.speechSettings; every field is optional so
@@ -1561,6 +1575,10 @@ export const BrainCapabilitiesSchema = z
1561
1575
  liveInference: z.boolean().default(false),
1562
1576
  /** Whether writes are permitted right now (the brain's allowRemoteConfig). */
1563
1577
  writable: z.boolean().default(false),
1578
+ /** The remote brain owns benchmark jobs and can list/cancel them. */
1579
+ jobs: z.boolean().default(false),
1580
+ /** The brain can ask its owning daemon to restart it. */
1581
+ restart: z.boolean().default(false),
1564
1582
  })
1565
1583
  .passthrough();
1566
1584
  // The brain's host status, as the daemon derives it: liveness plus the fields
@@ -2707,6 +2725,11 @@ export const ProjectListRequestMessageSchema = z.object({
2707
2725
  type: z.literal("project.list.request"),
2708
2726
  requestId: z.string(),
2709
2727
  });
2728
+ export const ProjectResolveWorkspaceForPathRequestSchema = z.object({
2729
+ type: z.literal("project.resolveWorkspaceForPath.request"),
2730
+ requestId: z.string(),
2731
+ path: z.string(),
2732
+ });
2710
2733
  export const FetchAgentHistoryRequestMessageSchema = z.object({
2711
2734
  type: z.literal("fetch_agent_history_request"),
2712
2735
  requestId: z.string(),
@@ -3706,6 +3729,9 @@ export const ContextReportSchema = z.object({
3706
3729
  // is a z.enum travelling daemon->client, so a new member would make a new
3707
3730
  // daemon's report unparseable by an older client.
3708
3731
  personalityMemoryTokens: z.number().optional(),
3732
+ // COMPAT(projectKnowledge): additive; repo-owned knowledge is folded into
3733
+ // otto_injected, while this field keeps its recurring cost inspectable.
3734
+ projectKnowledgeTokens: z.number().optional(),
3709
3735
  });
3710
3736
  // Pushed with the full current report whenever a watched context file changes.
3711
3737
  // Full-report reconciliation, same idiom as suggested_tasks_changed.
@@ -3773,6 +3799,226 @@ export const ContextPromptPreviewGetResponseMessageSchema = z.object({
3773
3799
  preview: ContextPromptPreviewSchema.nullable(),
3774
3800
  }),
3775
3801
  });
3802
+ // Repo-owned project knowledge is canonical Markdown under `.otto/knowledge`,
3803
+ // with daemon-owned writes so worktrees resolve to one store and every truth
3804
+ // change retains its timeline evidence.
3805
+ export const ProjectKnowledgeKindSchema = z.enum([
3806
+ "decision",
3807
+ "constraint",
3808
+ "requirement",
3809
+ "architecture",
3810
+ "project",
3811
+ "reference",
3812
+ ]);
3813
+ export const ProjectKnowledgeStatusSchema = z.enum(["proposed", "confirmed", "superseded"]);
3814
+ export const ProjectDeliveryStatusSchema = z.enum([
3815
+ "charter",
3816
+ "in_build",
3817
+ "partial",
3818
+ "blocked",
3819
+ "complete",
3820
+ "reference",
3821
+ "deferred",
3822
+ "cancelled",
3823
+ ]);
3824
+ export const ProjectReferenceDispositionSchema = z.enum([
3825
+ "unevaluated",
3826
+ "read",
3827
+ "adopted",
3828
+ "rejected",
3829
+ "dependency",
3830
+ ]);
3831
+ export const ProjectProgressSchema = z.object({
3832
+ completed: z.number().int().nonnegative(),
3833
+ total: z.number().int().positive(),
3834
+ unit: z.string().min(1).max(48),
3835
+ });
3836
+ export const ProjectKnowledgeRecordSchema = z.object({
3837
+ id: z.string(),
3838
+ kind: ProjectKnowledgeKindSchema,
3839
+ title: z.string(),
3840
+ statement: z.string(),
3841
+ statementDigest: z.string().optional(),
3842
+ evidence: z.string().optional(),
3843
+ tags: z.array(z.string()),
3844
+ status: ProjectKnowledgeStatusSchema,
3845
+ deliveryStatus: ProjectDeliveryStatusSchema.optional(),
3846
+ progress: ProjectProgressSchema.optional(),
3847
+ referenceDisposition: ProjectReferenceDispositionSchema.optional(),
3848
+ sourceUrl: z.string().optional(),
3849
+ createdAt: z.string(),
3850
+ updatedAt: z.string(),
3851
+ provenance: z
3852
+ .array(z.object({
3853
+ text: z.string(),
3854
+ recordedAt: z.string(),
3855
+ source: z.string().optional(),
3856
+ kind: z.string().optional(),
3857
+ affects: z.array(z.string()).optional(),
3858
+ }))
3859
+ .optional(),
3860
+ path: z.string().optional(),
3861
+ });
3862
+ export const ProjectKnowledgeFindingSchema = z.object({
3863
+ kind: z.enum(["stale", "overlapping_tags", "overlapping_statement"]),
3864
+ recordId: z.string(),
3865
+ relatedRecordId: z.string().optional(),
3866
+ message: z.string(),
3867
+ });
3868
+ export const ProjectKnowledgeRootPageSchema = z.object({
3869
+ slug: z.string(),
3870
+ title: z.string(),
3871
+ path: z.string(),
3872
+ body: z.string(),
3873
+ });
3874
+ export const ProjectKnowledgeListRequestMessageSchema = z.object({
3875
+ type: z.literal("project.knowledge.list.request"),
3876
+ requestId: z.string(),
3877
+ workspaceId: z.string(),
3878
+ });
3879
+ export const ProjectKnowledgeListResponseMessageSchema = z.object({
3880
+ type: z.literal("project.knowledge.list.response"),
3881
+ payload: z.object({
3882
+ requestId: z.string(),
3883
+ records: z.array(ProjectKnowledgeRecordSchema),
3884
+ rootPages: z.array(ProjectKnowledgeRootPageSchema).optional(),
3885
+ findings: z.array(ProjectKnowledgeFindingSchema),
3886
+ brief: z.string(),
3887
+ briefTokens: z.number(),
3888
+ includedIds: z.array(z.string()),
3889
+ omittedCount: z.number(),
3890
+ }),
3891
+ });
3892
+ export const ProjectKnowledgeGetRequestMessageSchema = z.object({
3893
+ type: z.literal("project.knowledge.get.request"),
3894
+ requestId: z.string(),
3895
+ workspaceId: z.string(),
3896
+ id: z.string(),
3897
+ });
3898
+ export const ProjectKnowledgeGetResponseMessageSchema = z.object({
3899
+ type: z.literal("project.knowledge.get.response"),
3900
+ payload: z.object({ requestId: z.string(), record: ProjectKnowledgeRecordSchema.nullable() }),
3901
+ });
3902
+ export const ProjectKnowledgeCreateRequestMessageSchema = z.object({
3903
+ type: z.literal("project.knowledge.create.request"),
3904
+ requestId: z.string(),
3905
+ workspaceId: z.string(),
3906
+ id: z.string().optional(),
3907
+ kind: ProjectKnowledgeKindSchema,
3908
+ title: z.string().max(160),
3909
+ statement: z.string(),
3910
+ evidence: z.string().optional(),
3911
+ tags: z.array(z.string().max(48)).max(32).optional(),
3912
+ affects: z.array(z.string()).optional(),
3913
+ status: ProjectKnowledgeStatusSchema.optional(),
3914
+ deliveryStatus: ProjectDeliveryStatusSchema.optional(),
3915
+ progress: ProjectProgressSchema.optional(),
3916
+ referenceDisposition: ProjectReferenceDispositionSchema.optional(),
3917
+ sourceUrl: z.string().optional(),
3918
+ });
3919
+ export const ProjectKnowledgeCreateResponseMessageSchema = z.object({
3920
+ type: z.literal("project.knowledge.create.response"),
3921
+ payload: z.object({ requestId: z.string(), record: ProjectKnowledgeRecordSchema }),
3922
+ });
3923
+ export const ProjectKnowledgeApplyRequestMessageSchema = z.object({
3924
+ type: z.literal("project.knowledge.apply.request"),
3925
+ requestId: z.string(),
3926
+ workspaceId: z.string(),
3927
+ id: z.string(),
3928
+ title: z.string().max(160).optional(),
3929
+ statement: z.string().optional(),
3930
+ evidence: z.string().optional(),
3931
+ provenanceText: z.string().optional(),
3932
+ provenanceSource: z.string().max(160).optional(),
3933
+ provenanceAffects: z.array(z.string()).optional(),
3934
+ expectedUpdatedAt: z.string().optional(),
3935
+ });
3936
+ export const ProjectKnowledgeApplyResponseMessageSchema = z.object({
3937
+ type: z.literal("project.knowledge.apply.response"),
3938
+ payload: z.object({
3939
+ requestId: z.string(),
3940
+ record: ProjectKnowledgeRecordSchema.nullable(),
3941
+ error: z.string().optional(),
3942
+ }),
3943
+ });
3944
+ export const ProjectKnowledgeStatusRequestMessageSchema = z.object({
3945
+ type: z.literal("project.knowledge.status.request"),
3946
+ requestId: z.string(),
3947
+ workspaceId: z.string(),
3948
+ id: z.string(),
3949
+ status: ProjectKnowledgeStatusSchema,
3950
+ reason: z.string().optional(),
3951
+ });
3952
+ export const ProjectKnowledgeStatusResponseMessageSchema = z.object({
3953
+ type: z.literal("project.knowledge.status.response"),
3954
+ payload: z.object({ requestId: z.string(), record: ProjectKnowledgeRecordSchema.nullable() }),
3955
+ });
3956
+ export const ProjectKnowledgeProjectApplyRequestMessageSchema = z.object({
3957
+ type: z.literal("project.knowledge.project.apply.request"),
3958
+ requestId: z.string(),
3959
+ workspaceId: z.string(),
3960
+ id: z.string(),
3961
+ deliveryStatus: ProjectDeliveryStatusSchema.optional(),
3962
+ progress: ProjectProgressSchema.nullable().optional(),
3963
+ reason: z.string(),
3964
+ expectedUpdatedAt: z.string().optional(),
3965
+ });
3966
+ export const ProjectKnowledgeProjectApplyResponseMessageSchema = z.object({
3967
+ type: z.literal("project.knowledge.project.apply.response"),
3968
+ payload: z.object({
3969
+ requestId: z.string(),
3970
+ record: ProjectKnowledgeRecordSchema.nullable(),
3971
+ error: z.string().optional(),
3972
+ }),
3973
+ });
3974
+ export const ProjectKnowledgeReferenceApplyRequestMessageSchema = z.object({
3975
+ type: z.literal("project.knowledge.reference.apply.request"),
3976
+ requestId: z.string(),
3977
+ workspaceId: z.string(),
3978
+ id: z.string(),
3979
+ disposition: ProjectReferenceDispositionSchema.optional(),
3980
+ sourceUrl: z.string().nullable().optional(),
3981
+ reason: z.string(),
3982
+ expectedUpdatedAt: z.string().optional(),
3983
+ });
3984
+ export const ProjectKnowledgeReferenceApplyResponseMessageSchema = z.object({
3985
+ type: z.literal("project.knowledge.reference.apply.response"),
3986
+ payload: z.object({
3987
+ requestId: z.string(),
3988
+ record: ProjectKnowledgeRecordSchema.nullable(),
3989
+ error: z.string().optional(),
3990
+ }),
3991
+ });
3992
+ export const ProjectKnowledgeRootApplyRequestMessageSchema = z.object({
3993
+ type: z.literal("project.knowledge.root.apply.request"),
3994
+ requestId: z.string(),
3995
+ workspaceId: z.string(),
3996
+ slug: z.string(),
3997
+ body: z.string(),
3998
+ });
3999
+ export const ProjectKnowledgeRootApplyResponseMessageSchema = z.object({
4000
+ type: z.literal("project.knowledge.root.apply.response"),
4001
+ payload: z.object({
4002
+ requestId: z.string(),
4003
+ page: ProjectKnowledgeRootPageSchema.nullable(),
4004
+ }),
4005
+ });
4006
+ export const ProjectKnowledgeDeleteRequestMessageSchema = z.object({
4007
+ type: z.literal("project.knowledge.delete.request"),
4008
+ requestId: z.string(),
4009
+ workspaceId: z.string(),
4010
+ id: z.string(),
4011
+ reason: z.string(),
4012
+ expectedUpdatedAt: z.string().optional(),
4013
+ });
4014
+ export const ProjectKnowledgeDeleteResponseMessageSchema = z.object({
4015
+ type: z.literal("project.knowledge.delete.response"),
4016
+ payload: z.object({
4017
+ requestId: z.string(),
4018
+ deleted: z.boolean(),
4019
+ error: z.string().optional(),
4020
+ }),
4021
+ });
3776
4022
  // Converts one edge between "always loaded" and "link only". Server-side
3777
4023
  // because the parent file may live outside the workspace root.
3778
4024
  export const ContextEdgeConvertRequestMessageSchema = z.object({
@@ -5787,6 +6033,9 @@ export const RenameTerminalRequestSchema = z.object({
5787
6033
  type: z.literal("terminal.rename.request"),
5788
6034
  terminalId: z.string(),
5789
6035
  title: z.string(),
6036
+ // COMPAT(terminalTitleSettings): old daemons ignore this field and retain
6037
+ // their existing rename behavior.
6038
+ clear: z.boolean().optional(),
5790
6039
  requestId: z.string(),
5791
6040
  });
5792
6041
  export const StartWorkspaceScriptRequestSchema = z.object({
@@ -5904,6 +6153,7 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
5904
6153
  FetchRecentProviderSessionsRequestMessageSchema,
5905
6154
  FetchWorkspacesRequestMessageSchema,
5906
6155
  ProjectListRequestMessageSchema,
6156
+ ProjectResolveWorkspaceForPathRequestSchema,
5907
6157
  FetchAgentRequestMessageSchema,
5908
6158
  DeleteAgentRequestMessageSchema,
5909
6159
  ArchiveAgentRequestMessageSchema,
@@ -5992,6 +6242,15 @@ export const SessionInboundMessageSchema = z.discriminatedUnion("type", [
5992
6242
  StatsActivityGetRequestMessageSchema,
5993
6243
  ContextReportGetRequestMessageSchema,
5994
6244
  ContextPromptPreviewGetRequestMessageSchema,
6245
+ ProjectKnowledgeListRequestMessageSchema,
6246
+ ProjectKnowledgeGetRequestMessageSchema,
6247
+ ProjectKnowledgeCreateRequestMessageSchema,
6248
+ ProjectKnowledgeApplyRequestMessageSchema,
6249
+ ProjectKnowledgeStatusRequestMessageSchema,
6250
+ ProjectKnowledgeProjectApplyRequestMessageSchema,
6251
+ ProjectKnowledgeReferenceApplyRequestMessageSchema,
6252
+ ProjectKnowledgeRootApplyRequestMessageSchema,
6253
+ ProjectKnowledgeDeleteRequestMessageSchema,
5995
6254
  ContextEdgeConvertRequestMessageSchema,
5996
6255
  ContextFindingsFixRequestMessageSchema,
5997
6256
  PersonalityMemoryListRequestMessageSchema,
@@ -6327,6 +6586,15 @@ export const ServerInfoStatusPayloadSchema = z
6327
6586
  serverId: z.string().trim().min(1),
6328
6587
  hostname: ServerInfoHostnameSchema.optional(),
6329
6588
  version: ServerInfoVersionSchema.optional(),
6589
+ // The daemon's OS and detected interactive shells. Optional so older hosts
6590
+ // remain parseable; only Windows hosts advertise terminalShells.
6591
+ platform: z.string().optional(),
6592
+ terminalShells: z
6593
+ .array(z.object({
6594
+ id: z.enum(["command-prompt", "windows-powershell", "powershell-7"]),
6595
+ label: z.string(),
6596
+ }))
6597
+ .optional(),
6330
6598
  // COMPAT(desktopManaged): added in v0.1.X, remove optional parsing after 2027-01-16.
6331
6599
  desktopManaged: z.boolean().optional(),
6332
6600
  capabilities: ServerCapabilitiesFromUnknownSchema.optional(),
@@ -6348,6 +6616,8 @@ export const ServerInfoStatusPayloadSchema = z
6348
6616
  daemonStatusRpc: z.boolean().optional(),
6349
6617
  // COMPAT(terminalRestoreModes): added in v0.1.81, remove gate after 2026-11-23.
6350
6618
  "terminal-restore-modes": z.boolean().optional(),
6619
+ // COMPAT(terminalTitleSettings): added in v0.8.5, remove gate after 2027-02-07.
6620
+ terminalTitleSettings: z.boolean().optional(),
6351
6621
  // COMPAT(rewind): added in v0.1.X, drop the gate when floor >= v0.1.X.
6352
6622
  rewind: z.boolean().optional(),
6353
6623
  // COMPAT(checkoutRefresh): added in v0.1.86, remove gate after 2026-11-29.
@@ -6493,6 +6763,8 @@ export const ServerInfoStatusPayloadSchema = z
6493
6763
  // client-side fallback could read.
6494
6764
  // COMPAT(personalityMemory): added in v0.7.0, drop the gate when daemon floor >= v0.7.0.
6495
6765
  personalityMemory: z.boolean().optional(),
6766
+ // COMPAT(projectKnowledge): added in v0.8.5, drop the gate when daemon floor >= v0.8.5.
6767
+ projectKnowledge: z.boolean().optional(),
6496
6768
  // Script discovery - the daemon scans a workspace for the Scripts its
6497
6769
  // project files already declare (package.json scripts, and later
6498
6770
  // Makefile targets, .NET launch profiles) and serves them from
@@ -7327,6 +7599,13 @@ export const ProjectListResponseMessageSchema = z.object({
7327
7599
  projects: z.array(WorkspaceProjectDescriptorPayloadSchema),
7328
7600
  }),
7329
7601
  });
7602
+ export const ProjectResolveWorkspaceForPathResponseSchema = z.object({
7603
+ type: z.literal("project.resolveWorkspaceForPath.response"),
7604
+ payload: z.object({
7605
+ requestId: z.string(),
7606
+ workspaceId: z.string().nullable(),
7607
+ }),
7608
+ });
7330
7609
  export const ScriptStatusUpdateMessageSchema = z.object({
7331
7610
  type: z.literal("script_status_update"),
7332
7611
  payload: z.object({
@@ -10396,6 +10675,7 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
10396
10675
  WorkspaceUpdateMessageSchema,
10397
10676
  ProjectUpdateMessageSchema,
10398
10677
  ProjectListResponseMessageSchema,
10678
+ ProjectResolveWorkspaceForPathResponseSchema,
10399
10679
  ScriptStatusUpdateMessageSchema,
10400
10680
  WorkspaceSetupProgressMessageSchema,
10401
10681
  WorkspaceSetupStatusResponseMessageSchema,
@@ -10644,6 +10924,15 @@ export const SessionOutboundMessageSchema = z.discriminatedUnion("type", [
10644
10924
  StatsActivityGetResponseMessageSchema,
10645
10925
  ContextReportGetResponseMessageSchema,
10646
10926
  ContextPromptPreviewGetResponseMessageSchema,
10927
+ ProjectKnowledgeListResponseMessageSchema,
10928
+ ProjectKnowledgeGetResponseMessageSchema,
10929
+ ProjectKnowledgeCreateResponseMessageSchema,
10930
+ ProjectKnowledgeApplyResponseMessageSchema,
10931
+ ProjectKnowledgeStatusResponseMessageSchema,
10932
+ ProjectKnowledgeProjectApplyResponseMessageSchema,
10933
+ ProjectKnowledgeReferenceApplyResponseMessageSchema,
10934
+ ProjectKnowledgeRootApplyResponseMessageSchema,
10935
+ ProjectKnowledgeDeleteResponseMessageSchema,
10647
10936
  ContextEdgeConvertResponseMessageSchema,
10648
10937
  ContextFindingsFixResponseMessageSchema,
10649
10938
  PersonalityMemoryListResponseMessageSchema,