@q9labsai/chalk-client 5.2.3 → 5.2.5
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/README.md +1 -1
- package/dist/access/grant.d.ts +2 -1
- package/dist/access/manager.d.ts +1 -0
- package/dist/{chunk-IMMT22US.js → chunk-5YPQNMJE.js} +11 -0
- package/dist/{chunk-4ZUN55Z2.js → chunk-BUNSEDXL.js} +840 -185
- package/dist/{chunk-DWKTGBHR.js → chunk-FD25AMLG.js} +322 -206
- package/dist/{chunk-6LNRDKJF.js → chunk-LKNT6XFD.js} +1 -1
- package/dist/{chunk-GA3JDPFI.js → chunk-UMAE5GCV.js} +205 -5
- package/dist/client.d.ts +131 -0
- package/dist/connection/dependencies.d.ts +10 -1
- package/dist/connection/diagnostics.d.ts +4 -0
- package/dist/connection/episode-status.d.ts +7 -0
- package/dist/connection/index.d.ts +2 -0
- package/dist/connection/lifecycle.d.ts +2 -0
- package/dist/connection/report.d.ts +21 -0
- package/dist/effect.js +30 -4
- package/dist/generated/http-api.d.ts +129 -0
- package/dist/generated/schemas.d.ts +219 -0
- package/dist/index.js +5 -5
- package/dist/media/client.d.ts +1 -1
- package/dist/media/failure-diagnostics.d.ts +10 -0
- package/dist/media/index.js +1 -1
- package/dist/media/plane.d.ts +1 -0
- package/dist/media/types.d.ts +5 -1
- package/dist/public-invites/index.js +2 -2
- package/dist/server/access-refresh.d.cts +1 -1
- package/dist/server/access-refresh.d.ts +1 -1
- package/dist/server/index.cjs +15 -5
- package/dist/server/index.js +15 -5
- package/dist/server/types.d.cts +2 -1
- package/dist/server/types.d.ts +2 -1
- package/dist/space-client/media-projection-monitor.d.ts +26 -0
- package/dist/space-client/types.d.ts +4 -0
- package/dist/sync/index.js +1 -1
- package/dist/sync/v1-types.d.ts +3 -0
- package/dist/transport-diagnostics.d.ts +3 -0
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
createSpaceClient,
|
|
16
16
|
decodeWhiteboardV1ServerFrame,
|
|
17
17
|
encodeWhiteboardV1ClientFrame
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-BUNSEDXL.js";
|
|
19
19
|
import {
|
|
20
20
|
CloudflareSFUClient,
|
|
21
21
|
CloudflareSFUError,
|
|
@@ -28,19 +28,19 @@ import {
|
|
|
28
28
|
requireSFUDescription,
|
|
29
29
|
validatePublicationSnapshot,
|
|
30
30
|
waitFor
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-FD25AMLG.js";
|
|
32
32
|
import {
|
|
33
33
|
createChalkPublicClient,
|
|
34
34
|
createChalkPublicInviteClient,
|
|
35
35
|
parseInviteCode
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-LKNT6XFD.js";
|
|
37
37
|
import {
|
|
38
38
|
ArrivalInvalidHandleError,
|
|
39
39
|
ArrivalUnavailableError,
|
|
40
40
|
SpacePublicInviteUnavailableError,
|
|
41
41
|
parseParsedAccessGrant,
|
|
42
42
|
requireAccessGrant
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-UMAE5GCV.js";
|
|
44
44
|
import {
|
|
45
45
|
AsyncStorageV1PendingTargetStore,
|
|
46
46
|
InMemoryV1PendingTargetStore,
|
|
@@ -69,7 +69,7 @@ import {
|
|
|
69
69
|
optimisticV1Control,
|
|
70
70
|
reactionFromFrame,
|
|
71
71
|
restoreV1Snapshot
|
|
72
|
-
} from "./chunk-
|
|
72
|
+
} from "./chunk-5YPQNMJE.js";
|
|
73
73
|
|
|
74
74
|
// src/space-client/reload-rejoin.ts
|
|
75
75
|
import { Schema } from "effect";
|
package/dist/media/client.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export declare class CloudflareSFUClient implements ClientMediaPlane {
|
|
|
15
15
|
start(localMedia: MediaStream): Promise<void>;
|
|
16
16
|
refreshRemotePublications(): Promise<void>;
|
|
17
17
|
setLocalPublicationTarget(target: MediaPlaneTarget): Promise<MediaPlaneResult>;
|
|
18
|
-
setLocalSourceIntent(source: MediaPublicationSource, enabled: boolean): void
|
|
18
|
+
setLocalSourceIntent(source: MediaPublicationSource, enabled: boolean): Promise<void>;
|
|
19
19
|
closeForcedLocalPublication(source: MediaPublicationSource): Promise<void>;
|
|
20
20
|
observeLocalPublications(listener: (publications: readonly MediaPublication[]) => void): () => void;
|
|
21
21
|
observeRemotePublications(listener: (publications: readonly MediaPublication[]) => void): () => void;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ConnectionReport } from "../transport-diagnostics";
|
|
2
|
+
type ReportEvent = ConnectionReport["events"][number];
|
|
3
|
+
export type MediaFailureDiagnostic = Required<Pick<ReportEvent, "media_error_kind" | "media_error_step">> & Pick<ReportEvent, "http_status">;
|
|
4
|
+
export type GrantedMedia = Required<Pick<ReportEvent, "granted_audio" | "granted_video">>;
|
|
5
|
+
type MediaFailureStep = NonNullable<ReportEvent["media_error_step"]>;
|
|
6
|
+
export declare function grantedMediaFromStream(stream: MediaStream): GrantedMedia;
|
|
7
|
+
export declare function markMediaFetchFailure(error: unknown): void;
|
|
8
|
+
export declare function markMediaFailure(error: unknown, step: MediaFailureStep): void;
|
|
9
|
+
export declare function classifyMediaFailure(cause: unknown, fallbackStep: MediaFailureStep): MediaFailureDiagnostic;
|
|
10
|
+
export {};
|
package/dist/media/index.js
CHANGED
package/dist/media/plane.d.ts
CHANGED
|
@@ -38,6 +38,7 @@ export type ConnectionMediaSnapshot = {
|
|
|
38
38
|
readonly failure: {
|
|
39
39
|
readonly code: string;
|
|
40
40
|
readonly recoverable: boolean;
|
|
41
|
+
readonly diagnostic?: import("./failure-diagnostics").MediaFailureDiagnostic;
|
|
41
42
|
} | null;
|
|
42
43
|
};
|
|
43
44
|
export type MediaPlaneOutcome = "confirmed" | "satisfied" | "retryable_failure" | "terminal_failure" | "ambiguous";
|
package/dist/media/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ConnectionReportTransportEvent } from "../transport-diagnostics";
|
|
1
2
|
import type { MediaPublication, MediaPublicationSource } from "./plane";
|
|
2
3
|
export type CloudflareSFUBootstrap = {
|
|
3
4
|
readonly connectionId: string;
|
|
@@ -89,6 +90,7 @@ export type CloudflareSFUSnapshot = {
|
|
|
89
90
|
readonly failure: {
|
|
90
91
|
readonly code: CloudflareSFUFailureCode;
|
|
91
92
|
readonly recoverable: boolean;
|
|
93
|
+
readonly diagnostic?: import("./failure-diagnostics").MediaFailureDiagnostic;
|
|
92
94
|
} | null;
|
|
93
95
|
};
|
|
94
96
|
export type CloudflareSFUClientOptions = {
|
|
@@ -97,7 +99,7 @@ export type CloudflareSFUClientOptions = {
|
|
|
97
99
|
readonly transport: CloudflareSFUSignalingTransport;
|
|
98
100
|
readonly replaceMediaConnection?: () => Promise<CloudflareSFUBootstrap>;
|
|
99
101
|
readonly pollIntervalMs?: number;
|
|
100
|
-
readonly onError?: (error: unknown) => void;
|
|
102
|
+
readonly onError?: (error: unknown, mediaConnectionId: string) => void;
|
|
101
103
|
readonly onRemoteTrack?: (publication: CloudflareSFURemoteTrack) => void;
|
|
102
104
|
readonly onScreenEnded?: () => void;
|
|
103
105
|
readonly peerConnectionFactory?: (configuration: RTCConfiguration) => RTCPeerConnection;
|
|
@@ -108,6 +110,8 @@ export type CloudflareSFURestartOptions = {
|
|
|
108
110
|
};
|
|
109
111
|
export type CloudflareSFUCredentialProvider = (signal?: AbortSignal) => string | Promise<string>;
|
|
110
112
|
export type CloudflareSFUHTTPTransportOptions = {
|
|
113
|
+
readonly traceparent?: string;
|
|
114
|
+
readonly onDiagnostic?: (event: ConnectionReportTransportEvent) => void;
|
|
111
115
|
readonly apiBaseURL: string;
|
|
112
116
|
readonly credential?: CloudflareSFUCredentialProvider;
|
|
113
117
|
/** @deprecated Use credential so refreshed media access is read before every request. */
|
|
@@ -2,12 +2,12 @@ import {
|
|
|
2
2
|
createChalkPublicClient,
|
|
3
3
|
createChalkPublicInviteClient,
|
|
4
4
|
parseInviteCode
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-LKNT6XFD.js";
|
|
6
6
|
import {
|
|
7
7
|
ArrivalInvalidHandleError,
|
|
8
8
|
ArrivalUnavailableError,
|
|
9
9
|
SpacePublicInviteUnavailableError
|
|
10
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-UMAE5GCV.js";
|
|
11
11
|
export {
|
|
12
12
|
ArrivalInvalidHandleError,
|
|
13
13
|
ArrivalUnavailableError,
|
|
@@ -2,7 +2,7 @@ import type { AccessContext } from "../space-client/types.cjs";
|
|
|
2
2
|
import type { IssueAccessGrantInput } from "./types.cjs";
|
|
3
3
|
import { type AccessGrant, type ParticipantMediaCredential } from "../access/grant.cjs";
|
|
4
4
|
/** Forward the browser request unchanged; only Chalk decides whether media needs replacing. */
|
|
5
|
-
export type AccessRefreshRequest = Pick<AccessContext, "replaceMediaConnection">;
|
|
5
|
+
export type AccessRefreshRequest = Pick<AccessContext, "replaceMediaConnection" | "expectedMediaConnectionId" | "currentMediaToken">;
|
|
6
6
|
/** Keep this on your backend, scoped to the authenticated Participant. Never send it to a browser or log it. */
|
|
7
7
|
export type AccessRefreshState = {
|
|
8
8
|
readonly participantGeneration: number;
|
|
@@ -2,7 +2,7 @@ import type { AccessContext } from "../space-client/types.js";
|
|
|
2
2
|
import type { IssueAccessGrantInput } from "./types.js";
|
|
3
3
|
import { type AccessGrant, type ParticipantMediaCredential } from "../access/grant.js";
|
|
4
4
|
/** Forward the browser request unchanged; only Chalk decides whether media needs replacing. */
|
|
5
|
-
export type AccessRefreshRequest = Pick<AccessContext, "replaceMediaConnection">;
|
|
5
|
+
export type AccessRefreshRequest = Pick<AccessContext, "replaceMediaConnection" | "expectedMediaConnectionId" | "currentMediaToken">;
|
|
6
6
|
/** Keep this on your backend, scoped to the authenticated Participant. Never send it to a browser or log it. */
|
|
7
7
|
export type AccessRefreshState = {
|
|
8
8
|
readonly participantGeneration: number;
|
package/dist/server/index.cjs
CHANGED
|
@@ -38,11 +38,13 @@ function decodeBase64Url(value) {
|
|
|
38
38
|
// src/access/grant.ts
|
|
39
39
|
var accessGrantBrand = /* @__PURE__ */ Symbol("AccessGrant");
|
|
40
40
|
var AccessGrantError = class extends TypeError {
|
|
41
|
-
|
|
42
|
-
constructor(message = "Access grant is invalid") {
|
|
41
|
+
constructor(message = "Access grant is invalid", reason) {
|
|
43
42
|
super(message);
|
|
43
|
+
this.reason = reason;
|
|
44
44
|
this.name = "AccessGrantError";
|
|
45
45
|
}
|
|
46
|
+
reason;
|
|
47
|
+
code = "access.invalid";
|
|
46
48
|
};
|
|
47
49
|
function parseParsedAccessGrant(value) {
|
|
48
50
|
if (!isRecord(value)) throw new AccessGrantError();
|
|
@@ -165,7 +167,12 @@ function getAccessRefreshState(access) {
|
|
|
165
167
|
});
|
|
166
168
|
}
|
|
167
169
|
function accessRefreshInput(state, request) {
|
|
168
|
-
if (request?.replaceMediaConnection === true)
|
|
170
|
+
if (request?.replaceMediaConnection === true)
|
|
171
|
+
return {
|
|
172
|
+
participantGeneration: state.participantGeneration,
|
|
173
|
+
replaceMediaConnection: true,
|
|
174
|
+
...request.expectedMediaConnectionId === void 0 ? {} : { expectedMediaConnectionId: request.expectedMediaConnectionId, ...request.currentMediaToken === void 0 ? {} : { currentMediaToken: request.currentMediaToken } }
|
|
175
|
+
};
|
|
169
176
|
return state;
|
|
170
177
|
}
|
|
171
178
|
|
|
@@ -326,7 +333,9 @@ function setOptionalHeader(headers, name, value) {
|
|
|
326
333
|
if (value !== void 0) headers.set(name, value);
|
|
327
334
|
}
|
|
328
335
|
async function responseError(response, retryable) {
|
|
329
|
-
|
|
336
|
+
const code = errorCode(await errorBody(response));
|
|
337
|
+
const pendingReplacement = response.status === 409 && code === "participant.media_replacement_pending";
|
|
338
|
+
return new ChalkAPIError({ code, requestId: requestId(response.headers), retryable: pendingReplacement || retryable && retryableStatuses.has(response.status), status: response.status });
|
|
330
339
|
}
|
|
331
340
|
async function errorBody(response) {
|
|
332
341
|
try {
|
|
@@ -601,7 +610,8 @@ function accessGrantRequest(input) {
|
|
|
601
610
|
return {
|
|
602
611
|
participant_generation: input.participantGeneration,
|
|
603
612
|
replace_media_connection: input.replaceMediaConnection ?? false,
|
|
604
|
-
...input.currentMediaToken ? { current_media_token: input.currentMediaToken } : {}
|
|
613
|
+
...input.currentMediaToken ? { current_media_token: input.currentMediaToken } : {},
|
|
614
|
+
...input.replaceMediaConnection && input.expectedMediaConnectionId !== void 0 ? { expected_media_connection_id: input.expectedMediaConnectionId } : {}
|
|
605
615
|
};
|
|
606
616
|
}
|
|
607
617
|
function participantRemovalRequest(input) {
|
package/dist/server/index.js
CHANGED
|
@@ -16,11 +16,13 @@ function decodeBase64Url(value) {
|
|
|
16
16
|
// src/access/grant.ts
|
|
17
17
|
var accessGrantBrand = /* @__PURE__ */ Symbol("AccessGrant");
|
|
18
18
|
var AccessGrantError = class extends TypeError {
|
|
19
|
-
|
|
20
|
-
constructor(message = "Access grant is invalid") {
|
|
19
|
+
constructor(message = "Access grant is invalid", reason) {
|
|
21
20
|
super(message);
|
|
21
|
+
this.reason = reason;
|
|
22
22
|
this.name = "AccessGrantError";
|
|
23
23
|
}
|
|
24
|
+
reason;
|
|
25
|
+
code = "access.invalid";
|
|
24
26
|
};
|
|
25
27
|
function parseParsedAccessGrant(value) {
|
|
26
28
|
if (!isRecord(value)) throw new AccessGrantError();
|
|
@@ -143,7 +145,12 @@ function getAccessRefreshState(access) {
|
|
|
143
145
|
});
|
|
144
146
|
}
|
|
145
147
|
function accessRefreshInput(state, request) {
|
|
146
|
-
if (request?.replaceMediaConnection === true)
|
|
148
|
+
if (request?.replaceMediaConnection === true)
|
|
149
|
+
return {
|
|
150
|
+
participantGeneration: state.participantGeneration,
|
|
151
|
+
replaceMediaConnection: true,
|
|
152
|
+
...request.expectedMediaConnectionId === void 0 ? {} : { expectedMediaConnectionId: request.expectedMediaConnectionId, ...request.currentMediaToken === void 0 ? {} : { currentMediaToken: request.currentMediaToken } }
|
|
153
|
+
};
|
|
147
154
|
return state;
|
|
148
155
|
}
|
|
149
156
|
|
|
@@ -228,7 +235,9 @@ function setOptionalHeader(headers, name, value) {
|
|
|
228
235
|
if (value !== void 0) headers.set(name, value);
|
|
229
236
|
}
|
|
230
237
|
async function responseError(response, retryable) {
|
|
231
|
-
|
|
238
|
+
const code = errorCode(await errorBody(response));
|
|
239
|
+
const pendingReplacement = response.status === 409 && code === "participant.media_replacement_pending";
|
|
240
|
+
return new ChalkAPIError({ code, requestId: requestId(response.headers), retryable: pendingReplacement || retryable && retryableStatuses.has(response.status), status: response.status });
|
|
232
241
|
}
|
|
233
242
|
async function errorBody(response) {
|
|
234
243
|
try {
|
|
@@ -503,7 +512,8 @@ function accessGrantRequest(input) {
|
|
|
503
512
|
return {
|
|
504
513
|
participant_generation: input.participantGeneration,
|
|
505
514
|
replace_media_connection: input.replaceMediaConnection ?? false,
|
|
506
|
-
...input.currentMediaToken ? { current_media_token: input.currentMediaToken } : {}
|
|
515
|
+
...input.currentMediaToken ? { current_media_token: input.currentMediaToken } : {},
|
|
516
|
+
...input.replaceMediaConnection && input.expectedMediaConnectionId !== void 0 ? { expected_media_connection_id: input.expectedMediaConnectionId } : {}
|
|
507
517
|
};
|
|
508
518
|
}
|
|
509
519
|
function participantRemovalRequest(input) {
|
package/dist/server/types.d.cts
CHANGED
|
@@ -158,8 +158,9 @@ export type IssueAccessGrantInput = {
|
|
|
158
158
|
readonly replaceMediaConnection?: false;
|
|
159
159
|
} | {
|
|
160
160
|
readonly participantGeneration: number;
|
|
161
|
-
readonly currentMediaToken?:
|
|
161
|
+
readonly currentMediaToken?: string;
|
|
162
162
|
readonly replaceMediaConnection: true;
|
|
163
|
+
readonly expectedMediaConnectionId?: string;
|
|
163
164
|
};
|
|
164
165
|
export type APIKey = {
|
|
165
166
|
readonly created_at: string;
|
package/dist/server/types.d.ts
CHANGED
|
@@ -158,8 +158,9 @@ export type IssueAccessGrantInput = {
|
|
|
158
158
|
readonly replaceMediaConnection?: false;
|
|
159
159
|
} | {
|
|
160
160
|
readonly participantGeneration: number;
|
|
161
|
-
readonly currentMediaToken?:
|
|
161
|
+
readonly currentMediaToken?: string;
|
|
162
162
|
readonly replaceMediaConnection: true;
|
|
163
|
+
readonly expectedMediaConnectionId?: string;
|
|
163
164
|
};
|
|
164
165
|
export type APIKey = {
|
|
165
166
|
readonly created_at: string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ConnectionReportTransportEvent } from "../transport-diagnostics";
|
|
2
|
+
type Source = "microphone" | "camera";
|
|
3
|
+
type Observation = {
|
|
4
|
+
readonly revision: number;
|
|
5
|
+
readonly publicationId: string | null;
|
|
6
|
+
readonly enabled: boolean;
|
|
7
|
+
readonly projectedEnabled: boolean;
|
|
8
|
+
readonly projectedPublicationId: string | null;
|
|
9
|
+
};
|
|
10
|
+
type Options = {
|
|
11
|
+
readonly now: () => number;
|
|
12
|
+
readonly schedule: (callback: () => void, milliseconds: number) => unknown;
|
|
13
|
+
readonly cancel: (timer: unknown) => void;
|
|
14
|
+
readonly report: (event: ConnectionReportTransportEvent) => void;
|
|
15
|
+
readonly pause: (source: Source, revision: number) => void;
|
|
16
|
+
readonly changed: () => void;
|
|
17
|
+
};
|
|
18
|
+
/** Observes authority without sending targets that could affect another client. */
|
|
19
|
+
export declare class MediaProjectionMonitor {
|
|
20
|
+
#private;
|
|
21
|
+
constructor(options: Options);
|
|
22
|
+
observe(source: Source, observation: Observation): void;
|
|
23
|
+
state(source: Source): "requesting" | "failed" | null;
|
|
24
|
+
reset(): void;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -17,6 +17,10 @@ export type AccessContext = {
|
|
|
17
17
|
readonly reason: AccessReason;
|
|
18
18
|
/** Forward to the access endpoint so media recovery can obtain a fresh connection. */
|
|
19
19
|
readonly replaceMediaConnection: boolean;
|
|
20
|
+
/** Automatic replacement succeeds only while this media binding is current. Omit for explicit takeover. */
|
|
21
|
+
readonly expectedMediaConnectionId?: string;
|
|
22
|
+
/** Forward unchanged for replay-safe recovery. Never log credentials. */
|
|
23
|
+
readonly currentMediaToken?: string;
|
|
20
24
|
readonly signal?: AbortSignal;
|
|
21
25
|
};
|
|
22
26
|
/**
|
package/dist/sync/index.js
CHANGED
package/dist/sync/v1-types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ConnectionReportTransportEvent } from "../transport-diagnostics";
|
|
1
2
|
import type { SetAdmissionPolicyCommandFrame, SyncV1ServerFrame } from "../generated/sync";
|
|
2
3
|
import type { ClientMediaPlane, MediaPlaneOutcome, MediaPlaneResult, MediaPlaneTarget, MediaPublication, MediaSource } from "../media/plane";
|
|
3
4
|
import type { ChalkChatReactionInput, ChalkChatReactions, ChalkChatMessage, ChalkChatPageResult, ChalkChatReadReceipt, ChalkReaction, ChalkReactionEvent, ChalkSendChatMessageInput, ChalkSyncV1CollaborationCapability } from "../collaboration/types";
|
|
@@ -189,6 +190,8 @@ export type V1CollaborationClient = {
|
|
|
189
190
|
}) => Promise<ChalkChatPageResult>;
|
|
190
191
|
};
|
|
191
192
|
export type V1SyncClientOptions = {
|
|
193
|
+
readonly traceparent?: string;
|
|
194
|
+
readonly onDiagnostic?: (event: ConnectionReportTransportEvent) => void;
|
|
192
195
|
readonly url: string;
|
|
193
196
|
readonly token: () => Promise<string>;
|
|
194
197
|
readonly webSocket: SyncWebSocketFactory;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { components } from "./generated/openapi-types";
|
|
2
|
+
export type ConnectionReport = components["schemas"]["ConnectionReportRequest"];
|
|
3
|
+
export type ConnectionReportTransportEvent = Pick<ConnectionReport["events"][number], "event" | "phase" | "attempt" | "duration_ms" | "heartbeat_gap_ms" | "close_code" | "http_status" | "source" | "publication_state" | "projection_state" | "outcome">;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@q9labsai/chalk-client",
|
|
3
|
-
"version": "5.2.
|
|
3
|
+
"version": "5.2.5",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -218,7 +218,7 @@
|
|
|
218
218
|
"dev": "tsup ./src/index.ts ./src/effect.ts ./src/media/index.ts ./src/sync/index.ts --format esm --out-dir ./dist --platform browser --external effect --watch",
|
|
219
219
|
"generate:webhooks": "node ./scripts/generate-webhook-contract.mjs",
|
|
220
220
|
"check:webhooks-generated": "node ./scripts/generate-webhook-contract.mjs --check",
|
|
221
|
-
"test": "pnpm exec vitest run",
|
|
221
|
+
"test": "node ../../../scripts/test/run.mjs pnpm exec vitest run",
|
|
222
222
|
"test:webhooks-package": "pnpm run build && node ./scripts/check-webhook-package.mjs",
|
|
223
223
|
"test:server-package": "pnpm run build && node ./scripts/check-server-package.mjs",
|
|
224
224
|
"test:sync-browser": "pnpm run build && node ./scripts/real-browser-sync.mjs",
|