@camerontaylor/paseo-client 0.11.0-beta.1.fork.1 → 0.11.1-fork.1

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.
@@ -6,7 +6,7 @@ import type { SessionEventSubscription } from "@camerontaylor/paseo-protocol/mes
6
6
  import type { ClientCapability } from "@camerontaylor/paseo-protocol/client-capabilities";
7
7
  import type { AgentAttentionNotificationPayload } from "@camerontaylor/paseo-protocol/agent-attention-notification";
8
8
  import { AgentRefreshedStatusPayloadSchema, CheckoutRenameBranchResponseSchema, CheckoutBaseRefSetResponseSchema, RenameTerminalResponseSchema, RestartRequestedStatusPayloadSchema, ShutdownRequestedStatusPayloadSchema, DaemonUpdateResponseSchema, type ActiveTurnBehavior, type ServerInfoStatusPayload } from "@camerontaylor/paseo-protocol/messages";
9
- import type { AgentStreamEventPayload, AgentSnapshotPayload, ProjectPlacementPayload, AgentPermissionResolvedMessage, CreateAgentRequestMessage, CreatePaseoWorktreeRequest, FileDownloadTokenResponse, FileUploadResponse, FileExplorerResponse, FileVersion, FileWriteResult, FetchAgentTimelineResponseMessage, AgentForkContextResponseMessage, GitSetupOptions, CheckoutStatusResponse, CheckoutCommit, ParsedDiffFile, CheckoutCommitResponse, CheckoutMergeResponse, CheckoutMergeFromBaseResponse, CheckoutPullResponse, CheckoutPushResponse, CheckoutRefreshResponse, CheckoutPrCreateResponse, CheckoutPrMergeResponse, CheckoutPrMergeMethod, CheckoutForgeSetAutoMergeResponse, CheckoutGithubSetAutoMergeResponse, CheckoutForgeGetCheckDetailsResponse, CheckoutGithubGetCheckDetailsResponse, CheckoutPrStatusResponse, PullRequestTimelineResponse, CheckoutSwitchBranchResponse, StashSaveResponse, StashPopResponse, StashListResponse, ValidateBranchResponse, BranchSuggestionsResponse, ForgeSearchResponse, ForgeSearchRequest, GitHubSearchResponse, GitHubSearchRequest, DirectorySuggestionsResponse, PaseoWorktreeListResponse, PaseoWorktreeArchiveResponse, ProjectIconSource, ProjectIconResponse, ProjectIconGetResponse, ProjectAddResponse, ProjectCreateDirectoryResponse, OpenProjectResponseMessage, WorkspaceGithubSearchRepositoriesResponse, ProjectGithubCloneProtocol, ProjectGithubCloneResponse, ArchiveWorkspaceResponseMessage, WorkspaceSetupStatusResponseMessage, ListCommandsResponse, ListProviderFeaturesResponseMessage, ListProviderModelsResponseMessage, ListProviderModesResponseMessage, ListAvailableProvidersResponse, GetProvidersSnapshotResponseMessage, RefreshProvidersSnapshotResponseMessage, ProviderDiagnosticResponseMessage, ProviderUsageListResponseMessage, UsageListReportsResponseMessage, DaemonGetStatusResponse, DaemonGetPairingOfferResponse, DaemonConfigReloadResponse, DiagnosticsResponse, AgentRewindResponseMessage, ListTerminalsResponse, CreateTerminalResponse, SubscribeTerminalResponse, SubscribeTerminalRequest, CloseItemsResponse, KillTerminalResponse, CaptureTerminalResponse, TerminalInput, SessionInboundMessage, SessionOutboundMessage, SendAgentMessageRequest, PaseoConfigRaw, PaseoConfigRevision, WorkspaceCreateRequest, WorkspaceRecoveryState, PluginListItem, PluginLogEntry, PluginSourceStatusItem, PluginSourceUpdateItem, PluginUpdateSelection, PluginUpdateProposal, PluginUpdatePreview, PluginUpdateResult, AgentSkillSelection, AgentSkillsStatus, AgentSkillsSaveResult } from "@camerontaylor/paseo-protocol/messages";
9
+ import type { AgentStreamEventPayload, AgentSnapshotPayload, ProjectPlacementPayload, AgentPermissionResolvedMessage, CreateAgentRequestMessage, CreatePaseoWorktreeRequest, FileDownloadTokenResponse, FileUploadResponse, FileExplorerResponse, FileVersion, FileWriteResult, FetchAgentTimelineResponseMessage, AgentForkContextResponseMessage, GitSetupOptions, CheckoutStatusResponse, CheckoutCommit, ParsedDiffFile, CheckoutCommitResponse, CheckoutMergeResponse, CheckoutMergeFromBaseResponse, CheckoutPullResponse, CheckoutPushResponse, CheckoutRefreshResponse, CheckoutPrCreateResponse, CheckoutPrMergeResponse, CheckoutPrMergeMethod, CheckoutForgeSetAutoMergeResponse, CheckoutGithubSetAutoMergeResponse, CheckoutForgeGetCheckDetailsResponse, CheckoutGithubGetCheckDetailsResponse, CheckoutPrStatusResponse, PullRequestTimelineResponse, CheckoutSwitchBranchResponse, StashSaveResponse, StashPopResponse, StashListResponse, ValidateBranchResponse, BranchSuggestionsResponse, ForgeSearchResponse, ForgeSearchRequest, GitHubSearchResponse, GitHubSearchRequest, DirectorySuggestionsResponse, PaseoWorktreeListResponse, PaseoWorktreeArchiveResponse, ProjectIconSource, ProjectIconResponse, ProjectIconGetResponse, ProjectAddResponse, ProjectCreateDirectoryResponse, OpenProjectResponseMessage, WorkspaceGithubSearchRepositoriesResponse, ProjectGithubCloneProtocol, ProjectGithubCloneResponse, ArchiveWorkspaceResponseMessage, WorkspaceSetupStatusResponseMessage, ListCommandsResponse, ListProviderFeaturesResponseMessage, ListProviderModelsResponseMessage, ListProviderModesResponseMessage, ListAvailableProvidersResponse, GetProvidersSnapshotResponseMessage, RefreshProvidersSnapshotResponseMessage, ProviderDiagnosticResponseMessage, ProviderUsageListResponseMessage, UsageReportEntry, DaemonGetStatusResponse, DaemonGetPairingOfferResponse, DaemonConfigReloadResponse, DiagnosticsResponse, AgentRewindResponseMessage, ListTerminalsResponse, CreateTerminalResponse, SubscribeTerminalResponse, SubscribeTerminalRequest, CloseItemsResponse, KillTerminalResponse, CaptureTerminalResponse, TerminalInput, SessionInboundMessage, SessionOutboundMessage, SendAgentMessageRequest, PaseoConfigRaw, PaseoConfigRevision, WorkspaceCreateRequest, WorkspaceRecoveryState, PluginListItem, PluginLogEntry, PluginSourceStatusItem, PluginSourceUpdateItem, PluginUpdateSelection, PluginUpdateProposal, PluginUpdatePreview, PluginUpdateResult, AgentSkillSelection, AgentSkillsStatus, AgentSkillsSaveResult } from "@camerontaylor/paseo-protocol/messages";
10
10
  import type { AgentPermissionRequest, AgentPermissionResponse, AgentPersistenceHandle, AgentProviderNotice, AgentProvider, AgentSessionConfig } from "@camerontaylor/paseo-protocol/agent-types";
11
11
  import type { AgentConfigApply, MutableDaemonConfig, MutableDaemonConfigPatch } from "@camerontaylor/paseo-protocol/messages";
12
12
  import { type DaemonTransportFactory, type WebSocketFactory } from "./daemon-client-transport.js";
@@ -266,7 +266,10 @@ type GetProvidersSnapshotPayload = GetProvidersSnapshotResponseMessage["payload"
266
266
  type RefreshProvidersSnapshotPayload = RefreshProvidersSnapshotResponseMessage["payload"];
267
267
  type ProviderDiagnosticPayload = ProviderDiagnosticResponseMessage["payload"];
268
268
  type ProviderUsageListPayload = ProviderUsageListResponseMessage["payload"];
269
- type UsageListReportsPayload = UsageListReportsResponseMessage["payload"];
269
+ interface UsageListReportsPayload {
270
+ requestId: string;
271
+ reports: UsageReportEntry[];
272
+ }
270
273
  type DaemonStatusPayload = DaemonGetStatusResponse["payload"];
271
274
  type DaemonPairingOfferPayload = DaemonGetPairingOfferResponse["payload"];
272
275
  type DiagnosticsPayload = DiagnosticsResponse["payload"];
@@ -1192,10 +1195,11 @@ export declare class DaemonClient {
1192
1195
  requestId?: string;
1193
1196
  }): Promise<ProviderUsageListPayload>;
1194
1197
  listUsageReports(options?: {
1198
+ agentId?: string;
1195
1199
  requestId?: string;
1196
1200
  forceRefresh?: boolean;
1197
1201
  reportIds?: string[];
1198
- }): Promise<UsageListReportsPayload>;
1202
+ }, onReport?: (report: UsageReportEntry) => void): Promise<UsageListReportsPayload>;
1199
1203
  listCommands(options: ListCommandsOptions): Promise<ListCommandsPayload>;
1200
1204
  listCommands(agentId: string, requestId?: string): Promise<ListCommandsPayload>;
1201
1205
  listCommands(agentId: string, options?: LegacyListCommandsOptions): Promise<ListCommandsPayload>;
@@ -284,8 +284,8 @@ function toReasonCode(reason) {
284
284
  }
285
285
  return "unknown";
286
286
  }
287
+ // COMPAT(providerUsageList): added in v0.1.98, remove after 2027-03-26.
287
288
  export function supportsUsageReports(features) {
288
- // COMPAT(providerUsageList): added in v0.1.98, remove after 2027-03-26.
289
289
  return features?.usageSources === true || features?.providerUsageList === true;
290
290
  }
291
291
  export class DaemonClient {
@@ -3580,45 +3580,105 @@ export class DaemonClient {
3580
3580
  },
3581
3581
  });
3582
3582
  }
3583
- async listUsageReports(options) {
3583
+ async listUsageReports(options, onReport) {
3584
3584
  const features = this.getLastServerInfoMessage()?.features;
3585
3585
  if (!supportsUsageReports(features)) {
3586
3586
  throw new Error("Update the host to see usage.");
3587
3587
  }
3588
+ if (options?.agentId !== undefined && options.reportIds !== undefined)
3589
+ throw new Error("agentId and reportIds cannot be combined");
3588
3590
  // COMPAT(providerUsageList): added in v0.1.98, remove after 2027-03-26.
3589
3591
  if (features?.usageSources !== true) {
3592
+ if (options?.agentId !== undefined)
3593
+ return { requestId: this.createRequestId(options.requestId), reports: [] };
3590
3594
  // Released hosts serve a five-minute cache and have no forceRefresh option.
3591
3595
  const payload = await this.listProviderUsage({ requestId: options?.requestId });
3592
3596
  return {
3593
3597
  requestId: payload.requestId,
3594
3598
  reports: payload.providers
3595
3599
  .filter((provider) => !options?.reportIds || options.reportIds.includes(provider.providerId))
3596
- .map((provider) => ({
3597
- id: provider.providerId,
3598
- sourceId: provider.providerId,
3599
- sourceLabel: provider.displayName,
3600
- icon: legacyUsageIcon(provider.providerId),
3601
- account: {},
3602
- fetchedAt: provider.fetchedAt ?? payload.fetchedAt,
3603
- report: {
3604
- status: provider.status,
3605
- windows: provider.windows,
3606
- balances: provider.balances ?? undefined,
3607
- details: provider.details ?? undefined,
3608
- planLabel: provider.planLabel ?? undefined,
3609
- error: provider.error ?? undefined,
3610
- },
3611
- })),
3600
+ .map((provider) => {
3601
+ // COMPAT(providerUsageList): added in v0.1.98, remove after 2027-03-26.
3602
+ // 0.10 reports have no typed problems; preserve their unavailable badge and error text.
3603
+ let report;
3604
+ if (provider.status === "available") {
3605
+ report = {
3606
+ status: "available",
3607
+ windows: provider.windows,
3608
+ balances: provider.balances ?? undefined,
3609
+ details: provider.details ?? undefined,
3610
+ planLabel: provider.planLabel ?? undefined,
3611
+ };
3612
+ }
3613
+ else if (provider.status === "error") {
3614
+ report = { status: "error", error: provider.error ?? "" };
3615
+ }
3616
+ else {
3617
+ report = {
3618
+ status: "unavailable",
3619
+ problem: { kind: "no_quota", detail: provider.error ?? "" },
3620
+ };
3621
+ }
3622
+ return {
3623
+ id: provider.providerId,
3624
+ sourceId: provider.providerId,
3625
+ sourceLabel: provider.displayName,
3626
+ icon: legacyUsageIcon(provider.providerId),
3627
+ account: {},
3628
+ fetchedAt: provider.fetchedAt ?? payload.fetchedAt,
3629
+ report,
3630
+ };
3631
+ }),
3612
3632
  };
3613
3633
  }
3614
- return this.sendNamespacedCorrelatedSessionRequest({
3615
- requestId: options?.requestId,
3616
- message: {
3617
- type: "usage.list_reports.request",
3618
- forceRefresh: options?.forceRefresh,
3619
- reportIds: options?.reportIds,
3620
- },
3634
+ const requestId = this.createRequestId(options?.requestId);
3635
+ const reports = [];
3636
+ let active = true;
3637
+ const unsubscribe = this.subscribeRawMessages((message) => {
3638
+ if (!active ||
3639
+ !("payload" in message) ||
3640
+ !("requestId" in message.payload) ||
3641
+ message.payload.requestId !== requestId)
3642
+ return;
3643
+ if (message.type === "usage.list_reports.response" || message.type === "rpc_error") {
3644
+ active = false;
3645
+ return;
3646
+ }
3647
+ if (message.type !== "usage.list_reports.update")
3648
+ return;
3649
+ reports.push(message.payload.report);
3650
+ onReport?.(message.payload.report);
3621
3651
  });
3652
+ try {
3653
+ const response = await this.sendRequest({
3654
+ requestId,
3655
+ message: {
3656
+ type: "usage.list_reports.request",
3657
+ streaming: features?.usageReportsStreaming === true ? true : undefined,
3658
+ requestId,
3659
+ forceRefresh: options?.forceRefresh,
3660
+ reportIds: options?.reportIds,
3661
+ agentId: options?.agentId,
3662
+ },
3663
+ select: (message) => message.type === "usage.list_reports.response" && message.payload.requestId === requestId
3664
+ ? message.payload
3665
+ : null,
3666
+ });
3667
+ if (response.error != null)
3668
+ throw new Error(response.error);
3669
+ // COMPAT(usageReportsStreaming): added in v0.11.1, remove after 2027-04-08 once all hosts advertise usageReportsStreaming.
3670
+ // beta.3 sends reports only; beta.4 through 0.11.1 send updates only.
3671
+ if (response.reports !== undefined) {
3672
+ if (reports.length === 0)
3673
+ response.reports.forEach((report) => onReport?.(report));
3674
+ return { requestId, reports: response.reports };
3675
+ }
3676
+ return { requestId, reports };
3677
+ }
3678
+ finally {
3679
+ active = false;
3680
+ unsubscribe();
3681
+ }
3622
3682
  }
3623
3683
  async listCommands(input, legacyOptions) {
3624
3684
  const options = normalizeListCommandsOptions(input, legacyOptions);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camerontaylor/paseo-client",
3
- "version": "0.11.0-beta.1.fork.1",
3
+ "version": "0.11.1-fork.1",
4
4
  "description": "Paseo client SDK package",
5
5
  "files": [
6
6
  "dist",
@@ -39,8 +39,8 @@
39
39
  "test": "vitest run"
40
40
  },
41
41
  "dependencies": {
42
- "@camerontaylor/paseo-protocol": "0.11.0-beta.1.fork.1",
43
- "@camerontaylor/paseo-relay": "0.11.0-beta.1.fork.1",
42
+ "@camerontaylor/paseo-protocol": "0.11.1-fork.1",
43
+ "@camerontaylor/paseo-relay": "0.11.1-fork.1",
44
44
  "zod": "^4.4.3"
45
45
  },
46
46
  "devDependencies": {