@q9labsai/chalk-client 5.1.0 → 5.2.0

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.
Files changed (34) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/dist/chat-files/types.d.ts +3 -0
  3. package/dist/{chunk-RJRSLXVT.js → chunk-BCO3AZUB.js} +647 -221
  4. package/dist/{chunk-K7PNW3KI.js → chunk-D2GXPX2P.js} +143 -13
  5. package/dist/{chunk-KHHULLBZ.js → chunk-DHGAKJXP.js} +1 -1
  6. package/dist/{chunk-3ZN7IXOZ.js → chunk-HO4745TX.js} +250 -2
  7. package/dist/client.d.ts +201 -0
  8. package/dist/connection/dependencies.d.ts +3 -0
  9. package/dist/connection/diagnostics.d.ts +3 -2
  10. package/dist/connection/lifecycle.d.ts +1 -0
  11. package/dist/connection/types.d.ts +2 -0
  12. package/dist/effect.js +62 -4
  13. package/dist/generated/http-api.d.ts +197 -0
  14. package/dist/generated/schemas.d.ts +366 -0
  15. package/dist/generated/sync.d.ts +74 -3
  16. package/dist/generated/whiteboard-v1.d.ts +71 -9
  17. package/dist/index.d.ts +1 -0
  18. package/dist/index.js +18 -14
  19. package/dist/public-invites/index.js +2 -2
  20. package/dist/space-client/reload-rejoin.d.ts +1 -1
  21. package/dist/space-client/types.d.ts +8 -1
  22. package/dist/sync/connect-diagnostics.d.ts +10 -0
  23. package/dist/sync/index.js +1 -1
  24. package/dist/sync/types.d.ts +1 -0
  25. package/dist/sync/v1-client.d.ts +2 -0
  26. package/dist/sync/v1-types.d.ts +4 -0
  27. package/dist/whiteboard/index.d.ts +2 -5
  28. package/dist/whiteboard/types.d.ts +26 -3
  29. package/dist/whiteboard/v1-client.d.ts +3 -1
  30. package/dist/whiteboard/v1-codec.d.ts +5 -1
  31. package/dist/whiteboard/v1-multipart.d.ts +1 -1
  32. package/dist/whiteboard/view-bounds.d.ts +5 -0
  33. package/dist/whiteboard/view-versions.d.ts +9 -0
  34. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,130 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.2.0
4
+
5
+ ### board-draw-policy
6
+
7
+ Add a call-wide drawing policy for the board: everyone, only hosts, or picked people.
8
+ Hosts set it with `setDrawPolicy` on the whiteboard transport and pick people with the
9
+ existing `setDrawPermission`. Sync computes each person's permission and sends it with
10
+ the policy over the new `draw_policy_v1` extension, so the summary and
11
+ `useWhiteboard().access` now carry `canDraw`, `drawPolicy` and the host's per-person
12
+ choices. The React board follows that permission instead of the role capability, and
13
+ hosts get a "Who can draw" section with a person picker in the board menu.
14
+
15
+ The whiteboard client now steps its hello down only when Sync can't decode it (close
16
+ 1009). A rejected token or a late hello (close 1008) is retried at the same level up to
17
+ four times, so a brief token problem no longer hides the drawing policy for the rest of
18
+ the connection. On a Sync without the drawing policy, a host's waiting policy change is
19
+ refused as `unavailable`, and also reported on the summary, instead of being replayed.
20
+
21
+ ### confirmed-call-entry
22
+
23
+ Count a person in a call only after they have fully entered it. The built-in
24
+ browser and React Native Sync clients ask Sync for entry confirmation on the Sync
25
+ URL (`entry_confirmation=1`). When Sync's `welcome` grants it, the client sends
26
+ `entered` once Sync is live and media has started, so a failed connection no
27
+ longer leaves a ghost participant or an attendance record. Against an older Sync,
28
+ the client sends the previous hello and Sync confirms entry at hello as before.
29
+
30
+ `confirmEntered()` on a custom `createSyncClient` implementation is optional.
31
+ Implementing it, and building `V1SyncClient` with `entryConfirmation: true`, adds
32
+ the confirmed entry above. Without it, the client never asks for entry
33
+ confirmation and Sync confirms the entry at hello, as in 5.0.x. `V1SyncClient`
34
+ asks only when it is built with `entryConfirmation: true`.
35
+
36
+ When entry fails, the client cancels the pending admission through the new
37
+ `cancelEpisodeParticipantJoin` endpoint (`POST .../participants/:participant_id/cancel-join`),
38
+ and a retry keeps the same person. If Sync reports `entry timeout` because the
39
+ pending seat expired before entry, the connection fails as a retryable
40
+ `sync_start_failed` instead of rejected access, and the client does not reconnect
41
+ the expired seat with the same grant.
42
+
43
+ The admission contract declares the 409 `participant.not_active` response when
44
+ a retried admission names a participant that has already left. The public
45
+ `AdmitEpisodeParticipantError` union stays compatible with 5.1.0; this response
46
+ uses the existing `HttpClientError` channel, with its code in the response body.
47
+ The dashboard reads that code and retries once with a fresh join key.
48
+
49
+ Sync assigns each entry a participant-local generation and returns it in
50
+ `welcome`. The client resumes that generation through the `entry_generation`
51
+ WebSocket query, even after refreshing its credential. Confirmation advances
52
+ ownership only forward and voids older pending Leaves. Acceptance and completion
53
+ both fence a Leave against the confirmed generation, so reattaching the same
54
+ seat cannot let the previous mount remove it. Previous Sync ignores this query.
55
+ Legacy sockets receive a server generation internally without changing their
56
+ welcome frame, and still confirm at hello. Participants created before seat
57
+ storage acquire it on their first live hello. When recovery replaces the Sync
58
+ client, it confirms the replacement entry before reporting recovery complete.
59
+ Completed startup also survives reconnecting from an older Sync to an upgraded
60
+ one. Recovery can finish while a previous entry's Leave is pending, and an
61
+ uncertain confirmation reply checks that entry's generation before acknowledging it.
62
+ A claimed Leave blocks later entry
63
+ admission until its provider work settles. An entry admitted before that claim
64
+ defers the older provider work until confirmation or its two-minute startup
65
+ lease expires, preventing old cleanup from closing the new entry's media.
66
+
67
+ Rollout: apply the database migrations first, then upgrade Sync, then the API and
68
+ this client. This client also works with an older Sync, and published 5.0.x
69
+ clients keep hello confirmation with the new Sync.
70
+
71
+ ### follow-view-owner
72
+
73
+ Converge Follow views on one Episode owner, recover from its canonical snapshot,
74
+ and preserve real camera moves during recovery and tab switches. Zoom controls
75
+ and keyboard moves now consistently leave Follow and lead the person's view.
76
+
77
+ Keep all 500 active people's views using internal schema-generated limits in the client and React caches. The client's public bounds, event unions and decoded-frame unions are unchanged. The client now exports `ChalkWhiteboardViewVersions`, which the React SDK uses to order view moves, and whiteboard view events now carry `ownerId`, `ownerSequence` and `originEpoch`, so both releases are minor.
78
+
79
+ ### honest-chat-file-errors
80
+
81
+ Report chat attachment network and browser access failures without blaming storage.
82
+ Keep token acquisition failures separate with a diagnostic stage while preserving
83
+ the published error codes and original cause. Preserve recoverable access and
84
+ connection failures through SpaceClient, including signed storage uploads. Show
85
+ the storage-unavailable message only when a readable 503 response confirms
86
+ `chat.storage_unavailable`.
87
+
88
+ ### problem-reporting
89
+
90
+ Add the problem-report API contract and reusable report dialog, with opt-in diagnostics,
91
+ editable delivery failures and bounded Unicode input. Call details and failed or ended
92
+ call screens can expose reporting when an integration supplies a delivery callback.
93
+ Use `reportUnavailableReason` to show expired access inside an editable report.
94
+ Live report drafts survive call termination. Integrations with their own terminal
95
+ screens can use `onOpenReportProblem` to keep one app-owned dialog across those screens.
96
+ Give `ReportProblemDialog` a `focusScope` containing the current call or terminal screen,
97
+ so closing it returns focus to its usable opener, or to a visible current control
98
+ when the opener has disappeared. Hidden, inert and disabled targets are skipped.
99
+
100
+ ### recording-auto-render
101
+
102
+ Expose recording expiry reasons through additive failure fields while preserving the existing export status enum.
103
+
104
+ Add the Tenant recording_render_mode setting, defaulting to on_demand, with opt-in automatic MP4 rendering.
105
+
106
+ ### recording-transcription-expiry
107
+
108
+ Recordings now report when their transcription source expires, as
109
+ `transcription_preparation.expires_at`. A transcript can be requested only
110
+ while `transcription_preparation.status` is `ready` and this time is ahead. It
111
+ is never later than `source.expires_at`, and it can be much earlier, because a
112
+ Space's transcription source window is often shorter than its video retention. The field is
113
+ absent when transcription is disabled or no transcription source exists yet.
114
+
115
+ ### space-activity-read
116
+
117
+ Add `spaces.listSpaceActivity` (`GET /v1/tenants/{tenant_id}/space-activity`) and
118
+ its generated schemas and types. One read returns, for up to 300 Spaces, whether each
119
+ is archived, the live Episode with its full participant count and first five Participants, the latest
120
+ Episode with its status and start and end times, and up to five Participants who
121
+ most recently joined that Episode. It needs `episodes:read`; an unknown or other
122
+ Tenant's Space returns `404` for the whole batch. Existing operations are unchanged.
123
+
124
+ ### sync-connect-diagnostics
125
+
126
+ Report Sync connection failures with the existing `connection.sync_hello_timeout` code without adding values to the public `ErrorCode` union. Add the current attempt's safe diagnostics to client errors, telemetry, and the call failure reference: opening/hello stage, close code and bounded reason, whether the socket opened, and elapsed time. Earlier attempts remain in the diagnostic history. Browsers do not expose DNS, TCP, or TLS progress. Unrecognized peer reasons are redacted. This is a compatible patch for the next client and React releases; released 5.1.0 files are unchanged.
127
+
3
128
  ## 5.1.0
4
129
 
5
130
  - Add shared board views: `ChalkWhiteboardView`, `ChalkWhiteboardViewBounds`, and the whiteboard client's `supportsViews` and `sendView()`, so participants can follow a person's board view or bring everyone to theirs. The board stream also carries a `view` event.
@@ -1,16 +1,19 @@
1
1
  import type { ChalkChatAttachment, ChalkChatAttachmentMimeType } from "../collaboration/types";
2
2
  export type ChalkChatFileOperation = "initiate_upload" | "finalize_upload" | "get_download";
3
+ export declare const CHAT_FILE_REACHABILITY_MESSAGE = "Could not reach the chat attachment service (network or browser access failure).";
3
4
  export type ChalkChatFileErrorCode = "access.invalid" | "unavailable" | "permission_denied" | "invalid_payload" | "conflict" | "not_found" | "expired" | "file_transfer_failed";
4
5
  export type ChalkChatFileFailure = {
5
6
  readonly operation: ChalkChatFileOperation;
6
7
  readonly code: ChalkChatFileErrorCode;
7
8
  readonly recoverable: boolean;
8
9
  readonly message: string;
10
+ readonly stage?: "token" | "request";
9
11
  };
10
12
  export declare class ChalkChatFileError extends Error {
11
13
  readonly operation: ChalkChatFileOperation;
12
14
  readonly code: ChalkChatFileErrorCode;
13
15
  readonly recoverable: boolean;
16
+ readonly stage: "token" | "request";
14
17
  constructor(failure: ChalkChatFileFailure, options?: ErrorOptions);
15
18
  }
16
19
  export type ChalkChatFileTransport = {