@otto-code/client 0.8.9 → 0.8.12

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.
@@ -3,10 +3,10 @@ import type { z } from "zod";
3
3
  import type { ProjectGithubCloneProtocol } from "@otto-code/protocol/messages";
4
4
  import { type ClientCapability } from "@otto-code/protocol/client-capabilities";
5
5
  import { AgentRefreshedStatusPayloadSchema, CheckoutRenameBranchResponseSchema, RenameTerminalResponseSchema, RestartRequestedStatusPayloadSchema, ShutdownRequestedStatusPayloadSchema, DaemonUpdateResponseSchema, type ServerInfoStatusPayload } from "@otto-code/protocol/messages";
6
- import type { AgentStreamEventPayload, AgentSnapshotPayload, ProjectPlacementPayload, AgentPermissionResolvedMessage, CreateAgentRequestMessage, CreateOttoWorktreeRequest, CodeListFilesResponse, CodeSymbolLocation, CodeDefinitionLocation, CodeDefinitionStatus, CodeRenameApplyStatus, CodeRenameFileOutcome, CodeRenameUndoFile, CodeRenameUndoStatus, CodeHoverRange, CodeRenameEdit, CodeRenameFilePlan, LspLanguageState, LspRunningServer, CodeSolutionGetTreeResponse, CodeSolutionLoadProjectResponse, SolutionFormat, SolutionRef, SolutionTreeFolder, SolutionTreeProject, SolutionProjectNode, SolutionProjectStatus, SolutionPackageReference, FileCreateResult, FileDeleteResult, FileDownloadTokenResponse, FileEntryKind, FileEol, FileRenameResult, FileReplaceFileResult, FileReplaceRequest, FileReplaceResponse, FileSearchResultPayload, FileSearchSummary, FileUploadResponse, FileExplorerResponse, FileWatchEventPayload, FileWriteResult, FileRefineResult, FileRefineDocument, FileRefineReference, FetchAgentTimelineResponseMessage, AgentForkContextResponseMessage, GitSetupOptions, CheckoutStatusResponse, CheckoutCommitResponse, CheckoutGitCommitResponse, CheckoutGitCommitAgentResponse, CheckoutGitRollbackResponse, CheckoutGitFileHistoryResponse, CheckoutGitFileCommitDiffResponse, CheckoutGitFileBlameResponse, CheckoutGitFileOriginResponse, CheckoutGitGetOperationLogResponse, CheckoutMergeResponse, CheckoutMergeFromBaseResponse, CheckoutPullResponse, CheckoutPushResponse, CheckoutRefreshResponse, CheckoutPrCreateResponse, CheckoutPrMergeResponse, CheckoutPrMergeMethod, CheckoutGithubSetAutoMergeResponse, CheckoutGithubGetCheckDetailsResponse, PreviewListConfigResponse, PreviewStartResponse, PreviewBindTabResponse, PreviewStopResponse, CheckoutPrStatusResponse, PullRequestTimelineResponse, CheckoutSwitchBranchResponse, StashSaveResponse, StashPopResponse, StashListResponse, ValidateBranchResponse, BranchSuggestionsResponse, FileVersion, CheckoutCommit, ParsedDiffFile, WorkspaceRecoveryState, CheckoutForgeGetCheckDetailsResponse, CheckoutForgeSetAutoMergeResponse, ProjectCreateDirectoryResponse, FsFileWriteResult, FsFileWriteBinaryResult, GitHubSearchResponse, GitHubSearchRequest, ForgeSearchResponse, ForgeSearchRequest, GitHostingProviderId, HostingSearchRequest, HostingSearchResponse, HostingAuthStatusResponse, DirectorySuggestionsResponse, OttoWorktreeListResponse, OttoWorktreeArchiveResponse, ProjectIconResponse, ContextCategory, ContextPromptPreviewGetResponseMessage, ContextReportGetResponseMessage, ContextEdgeConvertResponseMessage, ContextFindingsFixResponseMessage, PersonalityMemoryListResponseMessage, PersonalityMemoryUpdateResponseMessage, PersonalityMemoryTransferResponseMessage, PersonalityMemoryStatsResponseMessage, ProjectKnowledgeListResponseMessage, ProjectKnowledgeGetResponseMessage, ProjectKnowledgeCreateResponseMessage, ProjectKnowledgeApplyResponseMessage, ProjectKnowledgeStatusResponseMessage, ProjectKnowledgeProjectApplyResponseMessage, ProjectKnowledgeReferenceApplyResponseMessage, ProjectKnowledgeRootApplyResponseMessage, ProjectKnowledgeDeleteResponseMessage, ProjectAddResponse, ProjectResolveWorkspaceForPathResponse, ProjectScaffoldGit, ProjectScaffoldProgress, ProjectScaffoldResponse, HostingListRepositoriesResponse, HostingListOwnersResponse, OpenProjectResponseMessage, ArchiveWorkspaceResponseMessage, WorkspaceArchivePreflightResponse, WorktreeBaseRefSetResponse, WorktreeReattachListResponse, WorktreeReattachResponse, WorktreeReattachTarget, WorkspaceSetupStatusResponseMessage, ListCommandsResponse, ListProviderFeaturesResponseMessage, ListProviderModelsResponseMessage, ListProviderModesResponseMessage, ListAvailableProvidersResponse, GetProvidersSnapshotResponseMessage, RefreshProvidersSnapshotResponseMessage, ProviderDiagnosticResponseMessage, ProviderUsageListResponseMessage, StatsActivityGetResponseMessage, StatsActivityResetResponseMessage, UsageLogGetResponseMessage, AgentContextGetUsageResponseMessage, DaemonGetStatusResponse, DaemonGetPairingOfferResponse, DiagnosticsResponse, AgentRewindResponseMessage, ListTerminalsResponse, CreateTerminalResponse, SubscribeTerminalResponse, SubscribeTerminalRequest, CloseItemsResponse, AttachmentsImagesClearResponse, AttachmentsImagesStatsResponse, HistoryAgentsClearArchivedResponse, HistoryAgentsStorageStatsResponse, KillTerminalResponse, CaptureTerminalResponse, TerminalCompatibilityDiagnosticResponse, TerminalInput, SessionInboundMessage, SessionOutboundMessage, SendAgentMessageRequest, AgentPromptDelivery, TasksSuggestedStartMode, OttoConfigRaw, OttoConfigRevision, WorkspaceCreateRequest } from "@otto-code/protocol/messages";
6
+ import type { AgentStreamEventPayload, AgentSnapshotPayload, ProjectPlacementPayload, AgentPermissionResolvedMessage, CreateAgentRequestMessage, CreateOttoWorktreeRequest, CodeListFilesResponse, CodeSymbolLocation, CodeDefinitionLocation, CodeDefinitionStatus, CodeRenameApplyStatus, CodeRenameFileOutcome, CodeRenameUndoFile, CodeRenameUndoStatus, CodeHoverRange, CodeRenameEdit, CodeRenameFilePlan, LspLanguageState, LspRunningServer, CodeSolutionGetTreeResponse, CodeSolutionLoadProjectResponse, SolutionFormat, SolutionRef, SolutionTreeFolder, SolutionTreeProject, SolutionProjectNode, SolutionProjectStatus, SolutionPackageReference, FileCreateResult, FileDeleteResult, FileDownloadTokenResponse, FileEntryKind, FileEol, FileRenameResult, FileReplaceFileResult, FileReplaceRequest, FileReplaceResponse, FileSearchResultPayload, FileSearchSummary, FileUploadResponse, FileExplorerResponse, FileWatchEventPayload, FileWriteResult, FileRefineResult, FileRefineDocument, FileRefineReference, FetchAgentTimelineResponseMessage, AgentForkContextResponseMessage, GitSetupOptions, CheckoutStatusResponse, CheckoutCommitResponse, CheckoutGitCommitResponse, CheckoutGitCommitAgentResponse, CheckoutGitRollbackResponse, CheckoutGitFileHistoryResponse, CheckoutGitFileCommitDiffResponse, CheckoutGitFileBlameResponse, CheckoutGitFileOriginResponse, CheckoutGitGetOperationLogResponse, CheckoutMergeResponse, CheckoutMergeFromBaseResponse, CheckoutPullResponse, CheckoutPushResponse, CheckoutRefreshResponse, CheckoutGitFetchResponse, CheckoutPrCreateResponse, CheckoutPrMergeResponse, CheckoutPrMergeMethod, CheckoutGithubSetAutoMergeResponse, CheckoutGithubGetCheckDetailsResponse, PreviewListConfigResponse, PreviewStartResponse, PreviewBindTabResponse, PreviewStopResponse, CheckoutPrStatusResponse, PullRequestTimelineResponse, CheckoutSwitchBranchResponse, StashSaveResponse, StashPopResponse, StashListResponse, KanbanBoardsListResponse, ProjectKanbanTarget, KanbanBoardGetResponse, KanbanCardMoveResponse, KanbanCardCreateResponse, KanbanTaskLinkResponse, ValidateBranchResponse, BranchSuggestionsResponse, FileVersion, CheckoutCommit, ParsedDiffFile, WorkspaceRecoveryState, CheckoutForgeGetCheckDetailsResponse, CheckoutForgeSetAutoMergeResponse, ProjectCreateDirectoryResponse, FsFileWriteResult, FsFileWriteBinaryResult, GitHubSearchResponse, GitHubSearchRequest, ForgeSearchResponse, ForgeSearchRequest, GitHostingProviderId, HostingSearchRequest, HostingSearchResponse, HostingAuthStatusResponse, DirectorySuggestionsResponse, OttoWorktreeListResponse, OttoWorktreeArchiveResponse, ProjectIconResponse, ContextCategory, ContextPromptPreviewGetResponseMessage, ContextReportGetResponseMessage, ContextEdgeConvertResponseMessage, ContextFindingsFixResponseMessage, PersonalityMemoryListResponseMessage, PersonalityMemoryUpdateResponseMessage, PersonalityMemoryTransferResponseMessage, PersonalityMemoryStatsResponseMessage, ProjectKnowledgeListResponseMessage, ProjectKnowledgeGetResponseMessage, ProjectKnowledgeCreateResponseMessage, ProjectKnowledgeApplyResponseMessage, ProjectKnowledgeStatusResponseMessage, ProjectKnowledgeProjectApplyResponseMessage, ProjectKnowledgeReferenceApplyResponseMessage, ProjectKnowledgeRootApplyResponseMessage, ProjectKnowledgeDeleteResponseMessage, ProjectAddResponse, ProjectResolveWorkspaceForPathResponse, ProjectScaffoldGit, ProjectScaffoldProgress, ProjectScaffoldResponse, HostingListRepositoriesResponse, HostingListOwnersResponse, OpenProjectResponseMessage, ArchiveWorkspaceResponseMessage, WorkspaceArchivePreflightResponse, WorktreeBaseRefSetResponse, WorktreeReattachListResponse, WorktreeReattachResponse, WorktreeReattachTarget, WorkspaceSetupStatusResponseMessage, ListCommandsResponse, ListProviderFeaturesResponseMessage, ListProviderModelsResponseMessage, ListProviderModesResponseMessage, ListAvailableProvidersResponse, GetProvidersSnapshotResponseMessage, RefreshProvidersSnapshotResponseMessage, ProviderDiagnosticResponseMessage, ProviderUsageListResponseMessage, StatsActivityGetResponseMessage, StatsActivityResetResponseMessage, UsageLogGetResponseMessage, AgentContextGetUsageResponseMessage, DaemonGetStatusResponse, DaemonGetPairingOfferResponse, DiagnosticsResponse, AgentRewindResponseMessage, ListTerminalsResponse, CreateTerminalResponse, SubscribeTerminalResponse, SubscribeTerminalRequest, CloseItemsResponse, AttachmentsImagesClearResponse, AttachmentsImagesStatsResponse, HistoryAgentsClearArchivedResponse, HistoryAgentsStorageStatsResponse, KillTerminalResponse, CaptureTerminalResponse, TerminalCompatibilityDiagnosticResponse, TerminalInput, SessionInboundMessage, SessionOutboundMessage, SendAgentMessageRequest, AgentPromptDelivery, TasksSuggestedStartMode, OttoConfigRaw, OttoConfigRevision, WorkspaceCreateRequest } from "@otto-code/protocol/messages";
7
7
  import type { AgentPermissionRequest, AgentPermissionResponse, AgentPersistenceHandle, AgentProviderNotice, AgentProvider, AgentSessionConfig } from "@otto-code/protocol/agent-types";
8
8
  import type { OrchestrationGraph, PromptTemplate, Run } from "@otto-code/protocol/orchestration";
9
- import type { BrainCatalogModel, BrainDiskUsage, BrainEvals, BrainHfSearchResult, BrainHostStatus, BrainInstalledModel, BrainInventoryModel, BrainJob, BrainLogsTailResponse, BrainModelBudgetGetResponse, BrainModelDeleteResponse, BrainModelLoadResponse, BrainModelProfileGetResponse, BrainModelProfileSetResponse, BrainModelRenameResetResponse, BrainModelRenameResponse, BrainNetworkInfo, BrainRemoteConfig, BrainRepoQuant, BrainRuntime, ConnectorsListToolsResponse, ConnectorsOauthAuthorizeResponse, ConnectorsOauthDisconnectResponse, CueMoment, MutableDaemonConfig, MutableDaemonConfigPatch, ProjectLink, SpeechSettingsOptions, SpeechTtsPreviewResult, SpeechTtsSpeakResult, SpeechTtsSpeakCancelResult, VisualizerVoiceCuesResult, AgentPersonalitiesGenerateProfileResult } from "@otto-code/protocol/messages";
9
+ import type { BrainCatalogModel, BrainDiskUsage, BrainEvals, BrainHfSearchResult, BrainHostStatus, BrainInstalledModel, BrainInventoryModel, BrainJob, BrainLogsTailResponse, BrainLogsWatchResponse, BrainModelBudgetGetResponse, BrainModelDeleteResponse, BrainModelLoadResponse, BrainModelProfileGetResponse, BrainModelProfileSetResponse, BrainModelRenameResetResponse, BrainModelRenameResponse, BrainNetworkInfo, BrainRemoteConfig, BrainRepoQuant, BrainRuntime, ConnectorsListToolsResponse, ConnectorsOauthAuthorizeResponse, ConnectorsOauthDisconnectResponse, CommunicationsGetOverviewResponse, CommunicationsInboxGetHomeResponse, CommunicationsInboxNotificationsAcknowledgeResponse, CommunicationsInboxSearchResponse, CommunicationsInboxSetFavoriteResponse, CommunicationsInboxGetPresenceResponse, CommunicationsInboxGetMessagesResponse, CommunicationsInboxSetPresenceResponse, CommunicationsInboxSetEnabledResponse, CommunicationsInboxSendMessageResponse, CommunicationsRoomGetResponse, CommunicationsRoomThreadGetResponse, CommunicationsRoomMessageSendResponse, CommunicationsRoomReactionSetResponse, IntegrationsAuthorizationGetOverviewResponse, IntegrationsAuthorizationGetMethodsResponse, IntegrationsAuthorizationStartBrowserResponse, IntegrationsZoomStartAuthorizationResponse, CueMoment, MutableDaemonConfig, MutableDaemonConfigPatch, ProjectLink, SpeechSettingsOptions, SpeechTtsPreviewResult, SpeechTtsSpeakResult, SpeechTtsSpeakCancelResult, VisualizerVoiceCuesResult, AgentPersonalitiesGenerateProfileResult } from "@otto-code/protocol/messages";
10
10
  import { type DaemonTransportFactory, type WebSocketFactory } from "./daemon-client-transport.js";
11
11
  import { type DaemonClientTrafficHotspot, type DaemonClientTrafficTotals } from "./daemon-client-runtime-metrics.js";
12
12
  import { type TerminalStreamEvent } from "./terminal-stream-router.js";
@@ -197,6 +197,7 @@ type CheckoutMergeFromBasePayload = CheckoutMergeFromBaseResponse["payload"];
197
197
  type CheckoutPullPayload = CheckoutPullResponse["payload"];
198
198
  type CheckoutPushPayload = CheckoutPushResponse["payload"];
199
199
  type CheckoutRefreshPayload = CheckoutRefreshResponse["payload"];
200
+ type CheckoutGitFetchPayload = CheckoutGitFetchResponse["payload"];
200
201
  type CheckoutPrCreatePayload = CheckoutPrCreateResponse["payload"];
201
202
  type CheckoutPrMergePayload = CheckoutPrMergeResponse["payload"];
202
203
  type CheckoutGithubSetAutoMergePayload = CheckoutGithubSetAutoMergeResponse["payload"];
@@ -1137,6 +1138,18 @@ export declare class DaemonClient {
1137
1138
  renameProject(projectId: string, customName: string | null, requestId?: string): Promise<{
1138
1139
  customName: string | null;
1139
1140
  }>;
1141
+ /**
1142
+ * Sets (or with a null target, clears) which tracking board a project shows
1143
+ * on the Kanban screen. The daemon normalizes what it stores - a pasted board
1144
+ * URL comes back as the parsed id - so the caller should render the returned
1145
+ * target rather than its own draft.
1146
+ */
1147
+ setKanbanProjectTarget(input: {
1148
+ projectId: string;
1149
+ target: ProjectKanbanTarget | null;
1150
+ }, requestId?: string): Promise<{
1151
+ target: ProjectKanbanTarget | null;
1152
+ }>;
1140
1153
  removeProject(projectId: string, requestId?: string): Promise<{
1141
1154
  removedWorkspaceIds: string[];
1142
1155
  }>;
@@ -1180,6 +1193,42 @@ export declare class DaemonClient {
1180
1193
  parentPath: string;
1181
1194
  name: string;
1182
1195
  }, requestId?: string): Promise<ProjectCreateDirectoryPayload>;
1196
+ /**
1197
+ * The provider-agnostic Kanban board surface. Each call names its provider
1198
+ * ("memory", "github", ...) - the daemon dispatches to the registered
1199
+ * KanbanProvider implementation and the wire never carries provider-native
1200
+ * identifiers beyond the opaque board/card/column ids.
1201
+ *
1202
+ * A project-scoped request is authoritative: the daemon resolves the
1203
+ * project's configured board target and overrides providerId from it. The
1204
+ * wire still carries providerId so older clients keep working; pass an inert
1205
+ * value (e.g. "github") when a project is supplied.
1206
+ */
1207
+ kanbanListBoards(input: {
1208
+ providerId: string;
1209
+ projectId?: string;
1210
+ projectKey?: string;
1211
+ }, requestId?: string): Promise<KanbanBoardsListResponse["payload"]>;
1212
+ kanbanGetBoard(providerId: string, boardId: string, requestId?: string): Promise<KanbanBoardGetResponse["payload"]>;
1213
+ kanbanMoveCard(input: {
1214
+ providerId: string;
1215
+ boardId: string;
1216
+ cardId: string;
1217
+ targetColumnId: string;
1218
+ }, requestId?: string): Promise<KanbanCardMoveResponse["payload"]>;
1219
+ kanbanCreateCard(input: {
1220
+ providerId: string;
1221
+ boardId: string;
1222
+ columnId?: string;
1223
+ title: string;
1224
+ body?: string;
1225
+ }, requestId?: string): Promise<KanbanCardCreateResponse["payload"]>;
1226
+ kanbanLinkTask(input: {
1227
+ providerId: string;
1228
+ boardId: string;
1229
+ externalId: string;
1230
+ columnId?: string;
1231
+ }, requestId?: string): Promise<KanbanTaskLinkResponse["payload"]>;
1183
1232
  getCommitFileDiff(cwd: string, sha: string, path: string, requestId?: string): Promise<{
1184
1233
  file: ParsedDiffFile | null;
1185
1234
  }>;
@@ -1324,6 +1373,7 @@ export declare class DaemonClient {
1324
1373
  checkoutPull(cwd: string, requestId?: string): Promise<CheckoutPullPayload>;
1325
1374
  checkoutPush(cwd: string, requestId?: string): Promise<CheckoutPushPayload>;
1326
1375
  checkoutRefresh(cwd: string, requestId?: string): Promise<CheckoutRefreshPayload>;
1376
+ checkoutGitFetch(cwd: string, requestId?: string): Promise<CheckoutGitFetchPayload>;
1327
1377
  checkoutPrCreate(cwd: string, input: {
1328
1378
  title?: string;
1329
1379
  body?: string;
@@ -1768,6 +1818,114 @@ export declare class DaemonClient {
1768
1818
  connectorsOauthAuthorize(connectorId: string, scope?: string, requestId?: string): Promise<ConnectorsOauthAuthorizeResponse["payload"]>;
1769
1819
  /** Drop a connector's stored authorization. */
1770
1820
  connectorsOauthDisconnect(connectorId: string, requestId?: string): Promise<ConnectorsOauthDisconnectResponse["payload"]>;
1821
+ /**
1822
+ * Read the daemon-owned, provider-neutral communications inbox projection.
1823
+ * Requires server_info.features.communications; callers own that one gate.
1824
+ */
1825
+ communicationsGetOverview(requestId?: string): Promise<CommunicationsGetOverviewResponse["payload"]["overview"]>;
1826
+ communicationsInboxGetHome(providerId: string, requestId?: string): Promise<CommunicationsInboxGetHomeResponse["payload"]["home"]>;
1827
+ communicationsInboxAcknowledgeNotifications(input: {
1828
+ providerId: string;
1829
+ notificationIds?: string[];
1830
+ conversationId?: string;
1831
+ clearAll?: boolean;
1832
+ }, requestId?: string): Promise<CommunicationsInboxNotificationsAcknowledgeResponse["payload"]["home"]>;
1833
+ communicationsInboxSearch(input: {
1834
+ providerId: string;
1835
+ query: string;
1836
+ }, requestId?: string): Promise<CommunicationsInboxSearchResponse["payload"]["results"]>;
1837
+ communicationsInboxSetFavorite(input: {
1838
+ providerId: string;
1839
+ conversationId: string;
1840
+ favorite: boolean;
1841
+ }, requestId?: string): Promise<CommunicationsInboxSetFavoriteResponse["payload"]["home"]>;
1842
+ communicationsInboxGetPresence(providerId: string, requestId?: string): Promise<CommunicationsInboxGetPresenceResponse["payload"]["presence"]>;
1843
+ communicationsInboxSetPresence(input: {
1844
+ providerId: string;
1845
+ status: "available" | "busy" | "do_not_disturb" | "away" | "out_of_office" | "unknown";
1846
+ }, requestId?: string): Promise<CommunicationsInboxSetPresenceResponse["payload"]["presence"]>;
1847
+ communicationsInboxSetEnabled(input: {
1848
+ providerId: string;
1849
+ enabled: boolean;
1850
+ }, requestId?: string): Promise<CommunicationsInboxSetEnabledResponse["payload"]["presence"]>;
1851
+ communicationsInboxGetMessages(input: {
1852
+ providerId: string;
1853
+ conversationId: string;
1854
+ }, requestId?: string): Promise<CommunicationsInboxGetMessagesResponse["payload"]["messages"]>;
1855
+ communicationsInboxSendMessage(input: {
1856
+ providerId: string;
1857
+ conversationId: string;
1858
+ text: string;
1859
+ }, requestId?: string): Promise<CommunicationsInboxSendMessageResponse["payload"]["message"]>;
1860
+ /** Requires server_info.features.communicationsRooms. */
1861
+ communicationsRoomGet(input: {
1862
+ providerId: string;
1863
+ conversationId: string;
1864
+ }, requestId?: string): Promise<CommunicationsRoomGetResponse["payload"]["room"]>;
1865
+ communicationsRoomThreadGet(input: {
1866
+ providerId: string;
1867
+ conversationId: string;
1868
+ parentMessageId: string;
1869
+ }, requestId?: string): Promise<CommunicationsRoomThreadGetResponse["payload"]["messages"]>;
1870
+ communicationsRoomMessageSend(input: {
1871
+ providerId: string;
1872
+ conversationId: string;
1873
+ text: string;
1874
+ parentMessageId?: string | null;
1875
+ }, requestId?: string): Promise<CommunicationsRoomMessageSendResponse["payload"]["message"]>;
1876
+ communicationsRoomReactionSet(input: {
1877
+ providerId: string;
1878
+ conversationId: string;
1879
+ messageId: string;
1880
+ emoji: string;
1881
+ active: boolean;
1882
+ }, requestId?: string): Promise<CommunicationsRoomReactionSetResponse["payload"]["message"]>;
1883
+ /**
1884
+ * Daemon-owned meeting transcript library. Requires
1885
+ * `server_info.features.meetingTranscripts`; callers own that capability gate.
1886
+ */
1887
+ meetingsTranscriptsList(requestId?: string): Promise<Extract<SessionOutboundMessage, {
1888
+ type: "meetings.transcripts.list.response";
1889
+ }>["payload"]["records"]>;
1890
+ meetingsTranscriptsCreate(input: {
1891
+ provider: string;
1892
+ title: string;
1893
+ content: string;
1894
+ occurredAt?: string;
1895
+ }, requestId?: string): Promise<Extract<SessionOutboundMessage, {
1896
+ type: "meetings.transcripts.create.response";
1897
+ }>["payload"]["record"]>;
1898
+ meetingsTranscriptsUpdate(input: {
1899
+ id: string;
1900
+ title?: string;
1901
+ content?: string;
1902
+ }, requestId?: string): Promise<Extract<SessionOutboundMessage, {
1903
+ type: "meetings.transcripts.update.response";
1904
+ }>["payload"]["record"]>;
1905
+ meetingsTranscriptsDelete(id: string, requestId?: string): Promise<boolean>;
1906
+ /**
1907
+ * Read daemon-owned connection metadata for reusable integration settings.
1908
+ * Requires server_info.features.integrationAuthorization; callers own that
1909
+ * one capability gate.
1910
+ */
1911
+ integrationsAuthorizationGetOverview(requestId?: string): Promise<IntegrationsAuthorizationGetOverviewResponse["payload"]["overview"]>;
1912
+ /**
1913
+ * List the daemon's nonsecret authorization choices for an integration.
1914
+ * Requires server_info.features.integrationAuthorization; callers own that
1915
+ * one capability gate.
1916
+ */
1917
+ integrationsAuthorizationGetMethods(integrationId?: string, requestId?: string): Promise<IntegrationsAuthorizationGetMethodsResponse["payload"]["methods"]>;
1918
+ /**
1919
+ * Starts a daemon-owned browser sign-in through a registered integration
1920
+ * driver. Requires server_info.features.integrationAuthorizationBrowserFlow;
1921
+ * callers own that one capability gate.
1922
+ */
1923
+ integrationsAuthorizationStartBrowser(input: {
1924
+ integrationId: string;
1925
+ connectionId: string;
1926
+ }, requestId?: string): Promise<IntegrationsAuthorizationStartBrowserResponse["payload"]>;
1927
+ /** Starts the daemon-owned Zoom Team Chat browser sign-in. */
1928
+ integrationsZoomStartAuthorization(requestId?: string): Promise<IntegrationsZoomStartAuthorizationResponse["payload"]>;
1771
1929
  /**
1772
1930
  * The brain's status. Pass `resources` only from a surface that renders the
1773
1931
  * live CPU/RAM/GPU numbers: it costs an `nvidia-smi` spawn on the brain, and
@@ -1787,10 +1945,10 @@ export declare class DaemonClient {
1787
1945
  brainModelsScan(requestId?: string): Promise<BrainInstalledModel[]>;
1788
1946
  brainCatalogList(requestId?: string): Promise<BrainCatalogModel[]>;
1789
1947
  brainRuntimeList(requestId?: string): Promise<BrainRuntime[]>;
1790
- brainModelsPull(model: string, componentsOrRequestId?: string[] | string, quantOrRequestId?: string): Promise<BrainJob>;
1948
+ brainModelsPull(model: string, componentsOrRequestId?: string[] | string, quantOrRequestId?: string, expectedBytes?: number): Promise<BrainJob>;
1791
1949
  brainHfSearch(query: string, limit?: number | null, requestId?: string): Promise<BrainHfSearchResult[]>;
1792
1950
  brainHfQuants(repo: string, requestId?: string): Promise<BrainRepoQuant[]>;
1793
- brainModelsAdd(repo: string, quant: string, components?: string[], requestId?: string): Promise<BrainJob>;
1951
+ brainModelsAdd(repo: string, quant: string, components?: string[], requestId?: string, expectedBytes?: number): Promise<BrainJob>;
1794
1952
  brainRuntimeInstall(build?: string | null, requestId?: string): Promise<BrainJob>;
1795
1953
  brainRuntimeRemove(name: string, requestId?: string): Promise<BrainJob>;
1796
1954
  brainCalibrate(model: string, requestId?: string): Promise<BrainJob>;
@@ -1845,6 +2003,15 @@ export declare class DaemonClient {
1845
2003
  brainModelRenameReset(modelId: string, requestId?: string): Promise<BrainModelRenameResetResponse["payload"]>;
1846
2004
  /** Tail the brain's llama-server log. */
1847
2005
  brainLogsTail(limit?: number | null, requestId?: string): Promise<BrainLogsTailResponse["payload"]>;
2006
+ /**
2007
+ * Turn the live Brain log feed on or off for this socket.
2008
+ *
2009
+ * Only meaningful against a daemon advertising `features.brainLogWatch`; older
2010
+ * daemons push every line regardless, and the request would go unrouted.
2011
+ * Watching is per socket, so this does not affect the same account's other
2012
+ * connected clients.
2013
+ */
2014
+ brainLogsWatch(watching: boolean, requestId?: string): Promise<BrainLogsWatchResponse["payload"]>;
1848
2015
  getSpeechSettingsOptions(requestId?: string): Promise<{
1849
2016
  requestId: string;
1850
2017
  options: SpeechSettingsOptions;
@@ -1757,6 +1757,27 @@ export class DaemonClient {
1757
1757
  }
1758
1758
  return { customName: payload.customName };
1759
1759
  }
1760
+ /**
1761
+ * Sets (or with a null target, clears) which tracking board a project shows
1762
+ * on the Kanban screen. The daemon normalizes what it stores - a pasted board
1763
+ * URL comes back as the parsed id - so the caller should render the returned
1764
+ * target rather than its own draft.
1765
+ */
1766
+ async setKanbanProjectTarget(input, requestId) {
1767
+ const payload = await this.sendCorrelatedSessionRequest({
1768
+ requestId,
1769
+ message: {
1770
+ type: "kanban.project.target.set.request",
1771
+ projectId: input.projectId,
1772
+ target: input.target,
1773
+ },
1774
+ responseType: "kanban.project.target.set.response",
1775
+ });
1776
+ if (!payload.accepted) {
1777
+ throw new Error(payload.error ?? "setKanbanProjectTarget rejected");
1778
+ }
1779
+ return { target: payload.target };
1780
+ }
1760
1781
  async removeProject(projectId, requestId) {
1761
1782
  const payload = await this.sendNamespacedCorrelatedSessionRequest({
1762
1783
  requestId,
@@ -2004,6 +2025,58 @@ export class DaemonClient {
2004
2025
  },
2005
2026
  });
2006
2027
  }
2028
+ /**
2029
+ * The provider-agnostic Kanban board surface. Each call names its provider
2030
+ * ("memory", "github", ...) - the daemon dispatches to the registered
2031
+ * KanbanProvider implementation and the wire never carries provider-native
2032
+ * identifiers beyond the opaque board/card/column ids.
2033
+ *
2034
+ * A project-scoped request is authoritative: the daemon resolves the
2035
+ * project's configured board target and overrides providerId from it. The
2036
+ * wire still carries providerId so older clients keep working; pass an inert
2037
+ * value (e.g. "github") when a project is supplied.
2038
+ */
2039
+ async kanbanListBoards(input, requestId) {
2040
+ return this.sendNamespacedCorrelatedSessionRequest({
2041
+ requestId,
2042
+ message: {
2043
+ type: "kanban.boards.list.request",
2044
+ providerId: input.providerId,
2045
+ ...(input.projectId ? { projectId: input.projectId } : {}),
2046
+ ...(input.projectKey ? { projectKey: input.projectKey } : {}),
2047
+ requestId: "",
2048
+ },
2049
+ timeout: 60000,
2050
+ });
2051
+ }
2052
+ async kanbanGetBoard(providerId, boardId, requestId) {
2053
+ return this.sendNamespacedCorrelatedSessionRequest({
2054
+ requestId,
2055
+ message: { type: "kanban.board.get.request", providerId, boardId, requestId: "" },
2056
+ timeout: 60000,
2057
+ });
2058
+ }
2059
+ async kanbanMoveCard(input, requestId) {
2060
+ return this.sendNamespacedCorrelatedSessionRequest({
2061
+ requestId,
2062
+ message: { ...input, type: "kanban.card.move.request", requestId: "" },
2063
+ timeout: 60000,
2064
+ });
2065
+ }
2066
+ async kanbanCreateCard(input, requestId) {
2067
+ return this.sendNamespacedCorrelatedSessionRequest({
2068
+ requestId,
2069
+ message: { ...input, type: "kanban.card.create.request", requestId: "" },
2070
+ timeout: 60000,
2071
+ });
2072
+ }
2073
+ async kanbanLinkTask(input, requestId) {
2074
+ return this.sendNamespacedCorrelatedSessionRequest({
2075
+ requestId,
2076
+ message: { ...input, type: "kanban.task.link.request", requestId: "" },
2077
+ timeout: 60000,
2078
+ });
2079
+ }
2007
2080
  async getCommitFileDiff(cwd, sha, path, requestId) {
2008
2081
  const payload = await this.sendNamespacedCorrelatedSessionRequest({
2009
2082
  requestId,
@@ -3140,6 +3213,16 @@ export class DaemonClient {
3140
3213
  responseType: "checkout.refresh.response",
3141
3214
  });
3142
3215
  }
3216
+ async checkoutGitFetch(cwd, requestId) {
3217
+ return this.sendCorrelatedSessionRequest({
3218
+ requestId,
3219
+ message: {
3220
+ type: "checkout.git.fetch.request",
3221
+ cwd,
3222
+ },
3223
+ responseType: "checkout.git.fetch.response",
3224
+ });
3225
+ }
3143
3226
  async checkoutPrCreate(cwd, input, requestId) {
3144
3227
  return this.sendCorrelatedSessionRequest({
3145
3228
  requestId,
@@ -4456,6 +4539,208 @@ export class DaemonClient {
4456
4539
  responseType: "connectors.oauth.disconnect.response",
4457
4540
  });
4458
4541
  }
4542
+ /**
4543
+ * Read the daemon-owned, provider-neutral communications inbox projection.
4544
+ * Requires server_info.features.communications; callers own that one gate.
4545
+ */
4546
+ async communicationsGetOverview(requestId) {
4547
+ const payload = await this.sendCorrelatedSessionRequest({
4548
+ requestId,
4549
+ message: { type: "communications.get_overview.request" },
4550
+ responseType: "communications.get_overview.response",
4551
+ });
4552
+ return payload.overview;
4553
+ }
4554
+ async communicationsInboxGetHome(providerId, requestId) {
4555
+ const payload = await this.sendCorrelatedSessionRequest({
4556
+ requestId,
4557
+ message: { type: "communications.inbox.get_home.request", providerId },
4558
+ responseType: "communications.inbox.get_home.response",
4559
+ });
4560
+ return payload.home;
4561
+ }
4562
+ async communicationsInboxAcknowledgeNotifications(input, requestId) {
4563
+ const payload = await this.sendCorrelatedSessionRequest({
4564
+ requestId,
4565
+ message: { type: "communications.inbox.notifications.acknowledge.request", ...input },
4566
+ responseType: "communications.inbox.notifications.acknowledge.response",
4567
+ });
4568
+ return payload.home;
4569
+ }
4570
+ async communicationsInboxSearch(input, requestId) {
4571
+ const payload = await this.sendCorrelatedSessionRequest({
4572
+ requestId,
4573
+ message: { type: "communications.inbox.search.request", ...input },
4574
+ responseType: "communications.inbox.search.response",
4575
+ });
4576
+ return payload.results;
4577
+ }
4578
+ async communicationsInboxSetFavorite(input, requestId) {
4579
+ const payload = await this.sendCorrelatedSessionRequest({
4580
+ requestId,
4581
+ message: { type: "communications.inbox.set_favorite.request", ...input },
4582
+ responseType: "communications.inbox.set_favorite.response",
4583
+ });
4584
+ return payload.home;
4585
+ }
4586
+ async communicationsInboxGetPresence(providerId, requestId) {
4587
+ const payload = await this.sendCorrelatedSessionRequest({
4588
+ requestId,
4589
+ message: { type: "communications.inbox.get_presence.request", providerId },
4590
+ responseType: "communications.inbox.get_presence.response",
4591
+ });
4592
+ return payload.presence;
4593
+ }
4594
+ async communicationsInboxSetPresence(input, requestId) {
4595
+ const payload = await this.sendCorrelatedSessionRequest({
4596
+ requestId,
4597
+ message: { type: "communications.inbox.set_presence.request", ...input },
4598
+ responseType: "communications.inbox.set_presence.response",
4599
+ });
4600
+ return payload.presence;
4601
+ }
4602
+ async communicationsInboxSetEnabled(input, requestId) {
4603
+ const payload = await this.sendCorrelatedSessionRequest({
4604
+ requestId,
4605
+ message: { type: "communications.inbox.set_enabled.request", ...input },
4606
+ responseType: "communications.inbox.set_enabled.response",
4607
+ });
4608
+ return payload.presence;
4609
+ }
4610
+ async communicationsInboxGetMessages(input, requestId) {
4611
+ const payload = await this.sendCorrelatedSessionRequest({
4612
+ requestId,
4613
+ message: { type: "communications.inbox.get_messages.request", ...input },
4614
+ responseType: "communications.inbox.get_messages.response",
4615
+ });
4616
+ return payload.messages;
4617
+ }
4618
+ async communicationsInboxSendMessage(input, requestId) {
4619
+ const payload = await this.sendCorrelatedSessionRequest({
4620
+ requestId,
4621
+ message: { type: "communications.inbox.send_message.request", ...input },
4622
+ responseType: "communications.inbox.send_message.response",
4623
+ });
4624
+ return payload.message;
4625
+ }
4626
+ /** Requires server_info.features.communicationsRooms. */
4627
+ async communicationsRoomGet(input, requestId) {
4628
+ const payload = await this.sendCorrelatedSessionRequest({
4629
+ requestId,
4630
+ message: { type: "communications.room.get.request", ...input },
4631
+ responseType: "communications.room.get.response",
4632
+ });
4633
+ return payload.room;
4634
+ }
4635
+ async communicationsRoomThreadGet(input, requestId) {
4636
+ const payload = await this.sendCorrelatedSessionRequest({
4637
+ requestId,
4638
+ message: { type: "communications.room.thread.get.request", ...input },
4639
+ responseType: "communications.room.thread.get.response",
4640
+ });
4641
+ return payload.messages;
4642
+ }
4643
+ async communicationsRoomMessageSend(input, requestId) {
4644
+ const payload = await this.sendCorrelatedSessionRequest({
4645
+ requestId,
4646
+ message: { type: "communications.room.message.send.request", ...input },
4647
+ responseType: "communications.room.message.send.response",
4648
+ });
4649
+ return payload.message;
4650
+ }
4651
+ async communicationsRoomReactionSet(input, requestId) {
4652
+ const payload = await this.sendCorrelatedSessionRequest({
4653
+ requestId,
4654
+ message: { type: "communications.room.reaction.set.request", ...input },
4655
+ responseType: "communications.room.reaction.set.response",
4656
+ });
4657
+ return payload.message;
4658
+ }
4659
+ /**
4660
+ * Daemon-owned meeting transcript library. Requires
4661
+ * `server_info.features.meetingTranscripts`; callers own that capability gate.
4662
+ */
4663
+ async meetingsTranscriptsList(requestId) {
4664
+ const payload = await this.sendCorrelatedSessionRequest({
4665
+ requestId,
4666
+ message: { type: "meetings.transcripts.list.request" },
4667
+ responseType: "meetings.transcripts.list.response",
4668
+ });
4669
+ return payload.records;
4670
+ }
4671
+ async meetingsTranscriptsCreate(input, requestId) {
4672
+ const payload = await this.sendCorrelatedSessionRequest({
4673
+ requestId,
4674
+ message: { type: "meetings.transcripts.create.request", ...input },
4675
+ responseType: "meetings.transcripts.create.response",
4676
+ });
4677
+ return payload.record;
4678
+ }
4679
+ async meetingsTranscriptsUpdate(input, requestId) {
4680
+ const payload = await this.sendCorrelatedSessionRequest({
4681
+ requestId,
4682
+ message: { type: "meetings.transcripts.update.request", ...input },
4683
+ responseType: "meetings.transcripts.update.response",
4684
+ });
4685
+ return payload.record;
4686
+ }
4687
+ async meetingsTranscriptsDelete(id, requestId) {
4688
+ const payload = await this.sendCorrelatedSessionRequest({
4689
+ requestId,
4690
+ message: { type: "meetings.transcripts.delete.request", id },
4691
+ responseType: "meetings.transcripts.delete.response",
4692
+ });
4693
+ return payload.deleted;
4694
+ }
4695
+ /**
4696
+ * Read daemon-owned connection metadata for reusable integration settings.
4697
+ * Requires server_info.features.integrationAuthorization; callers own that
4698
+ * one capability gate.
4699
+ */
4700
+ async integrationsAuthorizationGetOverview(requestId) {
4701
+ const payload = await this.sendCorrelatedSessionRequest({
4702
+ requestId,
4703
+ message: { type: "integrations.authorization.get_overview.request" },
4704
+ responseType: "integrations.authorization.get_overview.response",
4705
+ });
4706
+ return payload.overview;
4707
+ }
4708
+ /**
4709
+ * List the daemon's nonsecret authorization choices for an integration.
4710
+ * Requires server_info.features.integrationAuthorization; callers own that
4711
+ * one capability gate.
4712
+ */
4713
+ async integrationsAuthorizationGetMethods(integrationId, requestId) {
4714
+ const payload = await this.sendCorrelatedSessionRequest({
4715
+ requestId,
4716
+ message: {
4717
+ type: "integrations.authorization.get_methods.request",
4718
+ ...(integrationId ? { integrationId } : {}),
4719
+ },
4720
+ responseType: "integrations.authorization.get_methods.response",
4721
+ });
4722
+ return payload.methods;
4723
+ }
4724
+ /**
4725
+ * Starts a daemon-owned browser sign-in through a registered integration
4726
+ * driver. Requires server_info.features.integrationAuthorizationBrowserFlow;
4727
+ * callers own that one capability gate.
4728
+ */
4729
+ async integrationsAuthorizationStartBrowser(input, requestId) {
4730
+ return this.sendCorrelatedSessionRequest({
4731
+ requestId,
4732
+ message: { type: "integrations.authorization.start_browser.request", ...input },
4733
+ responseType: "integrations.authorization.start_browser.response",
4734
+ });
4735
+ }
4736
+ /** Starts the daemon-owned Zoom Team Chat browser sign-in. */
4737
+ async integrationsZoomStartAuthorization(requestId) {
4738
+ return this.sendCorrelatedSessionRequest({
4739
+ requestId,
4740
+ message: { type: "integrations.zoom.start_authorization.request" },
4741
+ responseType: "integrations.zoom.start_authorization.response",
4742
+ });
4743
+ }
4459
4744
  /**
4460
4745
  * The brain's status. Pass `resources` only from a surface that renders the
4461
4746
  * live CPU/RAM/GPU numbers: it costs an `nvidia-smi` spawn on the brain, and
@@ -4600,7 +4885,7 @@ export class DaemonClient {
4600
4885
  }
4601
4886
  return payload.runtimes;
4602
4887
  }
4603
- async brainModelsPull(model, componentsOrRequestId, quantOrRequestId) {
4888
+ async brainModelsPull(model, componentsOrRequestId, quantOrRequestId, expectedBytes) {
4604
4889
  const components = Array.isArray(componentsOrRequestId) ? componentsOrRequestId : undefined;
4605
4890
  const quant = Array.isArray(componentsOrRequestId) ? quantOrRequestId : undefined;
4606
4891
  const correlationId = typeof componentsOrRequestId === "string" ? componentsOrRequestId : undefined;
@@ -4611,6 +4896,7 @@ export class DaemonClient {
4611
4896
  model,
4612
4897
  ...(components ? { components } : {}),
4613
4898
  ...(quant ? { quant } : {}),
4899
+ ...(expectedBytes !== undefined ? { expectedBytes } : {}),
4614
4900
  },
4615
4901
  responseType: "brain.models.pull.response",
4616
4902
  });
@@ -4638,10 +4924,16 @@ export class DaemonClient {
4638
4924
  }
4639
4925
  return payload.quants;
4640
4926
  }
4641
- async brainModelsAdd(repo, quant, components, requestId) {
4927
+ async brainModelsAdd(repo, quant, components, requestId, expectedBytes) {
4642
4928
  const payload = await this.sendCorrelatedSessionRequest({
4643
4929
  requestId,
4644
- message: { type: "brain.models.add.request", repo, quant, components },
4930
+ message: {
4931
+ type: "brain.models.add.request",
4932
+ repo,
4933
+ quant,
4934
+ components,
4935
+ ...(expectedBytes !== undefined ? { expectedBytes } : {}),
4936
+ },
4645
4937
  responseType: "brain.models.add.response",
4646
4938
  });
4647
4939
  return unwrapBrainJob(payload);
@@ -4862,6 +5154,21 @@ export class DaemonClient {
4862
5154
  }
4863
5155
  return payload;
4864
5156
  }
5157
+ /**
5158
+ * Turn the live Brain log feed on or off for this socket.
5159
+ *
5160
+ * Only meaningful against a daemon advertising `features.brainLogWatch`; older
5161
+ * daemons push every line regardless, and the request would go unrouted.
5162
+ * Watching is per socket, so this does not affect the same account's other
5163
+ * connected clients.
5164
+ */
5165
+ async brainLogsWatch(watching, requestId) {
5166
+ return this.sendCorrelatedSessionRequest({
5167
+ requestId,
5168
+ message: { type: "brain.logs.watch.request", watching },
5169
+ responseType: "brain.logs.watch.response",
5170
+ });
5171
+ }
4865
5172
  async getSpeechSettingsOptions(requestId) {
4866
5173
  return this.sendNamespacedCorrelatedSessionRequest({
4867
5174
  requestId,
@@ -5797,6 +6104,7 @@ export class DaemonClient {
5797
6104
  // The daemon gates project.updated.notification on this (session.ts),
5798
6105
  // so dropping it silently kills cross-session project renames.
5799
6106
  [CLIENT_CAPS.projectUpdates]: true,
6107
+ [CLIENT_CAPS.communicationsPresenceUpdates]: true,
5800
6108
  ...this.config.capabilities,
5801
6109
  },
5802
6110
  ...(this.config.appVersion ? { appVersion: this.config.appVersion } : {}),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@otto-code/client",
3
- "version": "0.8.9",
3
+ "version": "0.8.12",
4
4
  "description": "Otto client SDK package",
5
5
  "license": "AGPL-3.0-or-later",
6
6
  "files": [
@@ -36,8 +36,8 @@
36
36
  "test": "vitest run"
37
37
  },
38
38
  "dependencies": {
39
- "@otto-code/protocol": "0.8.9",
40
- "@otto-code/relay": "0.8.9",
39
+ "@otto-code/protocol": "0.8.12",
40
+ "@otto-code/relay": "0.8.12",
41
41
  "zod": "^4.4.3"
42
42
  },
43
43
  "devDependencies": {