castle-web-sdk 0.4.47 → 0.4.48

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.
@@ -7,7 +7,7 @@ export type { MultiplayerSessionMode, PlatformHandle, PlatformSessionConfig, Pla
7
7
  export { createSaveCoordinator } from "../saveCoordinator";
8
8
  export type { CoordinatedChange, CoordinatedSave, SaveCoordinator, SaveStatus, } from "../saveCoordinator";
9
9
  export { SaveError } from "../save";
10
- export type { SaveApi, SaveBucketApi, SaveBucketRead, SaveChange, SaveCheck, SaveClaimed, SaveClaimInput, SaveErrorEnvelope, SaveInitial, SaveInitializeInput, SaveOpened, SaveOperation, SaveReadTarget, SaveReceipt, SaveRevision, SaveRows, SaveScope, SaveSelection, SaveSnapshot, SaveTarget, SaveTransactionInput, SaveWriter, } from "../save";
10
+ export type { SaveApi, SaveBucketApi, SaveBucketRead, SaveChange, SaveCheck, SaveConditionalCheck, SaveConditionalWriteInput, SaveClaimed, SaveClaimInput, SaveErrorEnvelope, SaveInitial, SaveInitializeInput, SaveOpened, SaveOperation, SaveReadTarget, SaveReceipt, SaveRecentOperationsInput, SaveRecentOperationsPage, SaveRevision, SaveRows, SaveScope, SaveSelection, SaveSnapshot, SaveTarget, SaveTransactionInput, SaveWriter, } from "../save";
11
11
  export type { MultiplayerHubArrival, MultiplayerHubBoard, MultiplayerHubOutcome, MultiplayerHubPadUpdateInput, MultiplayerHubPadUpdateResult, MultiplayerHubPlayerResults, MultiplayerHubRecord, MultiplayerHubReportReceipt, MultiplayerHubResultInput, MultiplayerHubResultRow, MultiplayerHubResultShape, MultiplayerHubResultsRead, MultiplayerHubResultsReadInput, MultiplayerHubWearable, MultiplayerHubWearReceipt, MultiplayerHubEarnedClass, MultiplayerHubEarnedItem, MultiplayerHubHomeClass, MultiplayerHubHomeItem, MultiplayerHubUnlockReceipt, MultiplayerHubUnlocksRead, MultiplayerHubWearEarnedReceipt, MultiplayerServerHub, } from "./hub";
12
12
  export type { CharacterActionNotice, CharacterGameStateOperation, CharacterGameStateResult, CharacterKnowledgeDeliveryOperation, CharacterKnowledgeDeliveryResult, CharacterKnowledgeSource, CompleteCharacterBeatInput, DeliverCharacterKnowledgeInput, RecordCharacterEventInput, SetCharacterGameStateInput, ShareCharacterClaimInput, ServerStorage, ServerStorageBoard, ServerStorageBoardScore, ServerStorageListEntry, ServerStorageListOptions, ServerStorageListPage, ServerPlaythrough, ServerPlaythroughCharacters, ServerCharacterHistoryOptions, ServerStorageScope, ServerTownStorage, } from "./storage";
13
13
  export interface MultiplayerServerPlayer extends PlayerIdentity {
@@ -288,6 +288,12 @@ export interface MultiplayerWorldCharacterTurn {
288
288
  export type MultiplayerPlaceTool = PlatformPlaceTool;
289
289
  export interface MultiplayerWorldCharacterSendOptions {
290
290
  tools?: readonly MultiplayerPlaceTool[];
291
+ /** Private host-brokered transcript metadata, not player-selected. */
292
+ hubTextArchive?: {
293
+ npcId: string;
294
+ conversationId?: string;
295
+ input: string;
296
+ };
291
297
  }
292
298
  /** One place-tool use by a character during a turn this place admitted. */
293
299
  export interface MultiplayerWorldCharacterToolRequest {
@@ -1,3 +1,4 @@
1
+ import { CastleError } from "../errors";
1
2
  import { isBinaryPayload, toUint8Array, } from "../multiplayerProtocol";
2
3
  import { encodeStorageValue, storageError } from "../storageJson";
3
4
  import { createServerStorage } from "./storage";
@@ -1193,6 +1194,11 @@ function assertPlatformWorldCharacterRead(value) {
1193
1194
  // carrying anything beyond the grant); otherwise this is exactly the tool-less send.
1194
1195
  function sendWorldCharacterTurn(platformHandle, grantId, options) {
1195
1196
  const tools = options?.tools;
1197
+ if (options?.hubTextArchive !== undefined) {
1198
+ if (platformHandle.hubTextArchiveEnabled !== true)
1199
+ return Promise.reject(new CastleError({ code: 'CAULDRON_HUB_UNAVAILABLE', message: 'This host cannot archive NPC transcripts.', operation: 'worldCharacter.send' }));
1200
+ return platformHandle.worldCharacterSend(grantId, Array.isArray(tools) && typeof platformHandle.worldCharacterToolResult === "function" ? tools : undefined, options.hubTextArchive);
1201
+ }
1196
1202
  return Array.isArray(tools) && tools.length > 0 &&
1197
1203
  typeof platformHandle.worldCharacterToolResult === "function"
1198
1204
  ? platformHandle.worldCharacterSend(grantId, tools)
@@ -1419,10 +1425,11 @@ function joinedPlayer(connId, identity) {
1419
1425
  delete player.hiddenUserIds;
1420
1426
  // A/B arms arrive beside the player; one a host put on it stays off it too.
1421
1427
  delete player.experimentVariants;
1428
+ Object.defineProperty(player, "under13", { value: identity.under13 === true, enumerable: false });
1422
1429
  return player;
1423
1430
  }
1424
1431
  const legacy = connId;
1425
- return {
1432
+ const player = {
1426
1433
  playerId: legacy.playerId,
1427
1434
  userId: legacy.userId,
1428
1435
  username: legacy.username,
@@ -1430,6 +1437,8 @@ function joinedPlayer(connId, identity) {
1430
1437
  participantId: legacy.scopedUserId ?? legacy.userId,
1431
1438
  ...(legacy.scopedUserId ? { scopedUserId: legacy.scopedUserId } : {}),
1432
1439
  };
1440
+ Object.defineProperty(player, "under13", { value: legacy.under13 === true, enumerable: false });
1441
+ return player;
1433
1442
  }
1434
1443
  function parseHandleMessage(text) {
1435
1444
  if (typeof text !== "string")
@@ -0,0 +1,9 @@
1
+ import type { SocialFriend, SocialPresence } from './commands';
2
+ export type { SocialFriend, SocialPresence } from './commands';
3
+ export interface CastleSocialApi {
4
+ /** The signed-in player's mutual Castle follows, at most 20. */
5
+ friends(): Promise<SocialFriend[]>;
6
+ /** Mutual friends playing this deck now. Poll to refresh; v1 has no event. */
7
+ presence(): Promise<SocialPresence[]>;
8
+ }
9
+ export declare const Social: CastleSocialApi;
package/dist/social.js ADDED
@@ -0,0 +1,5 @@
1
+ import { hostRequest } from './transport';
2
+ export const Social = {
3
+ friends: () => hostRequest('social.friends', {}),
4
+ presence: () => hostRequest('social.presence', {}),
5
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "castle-web-sdk",
3
- "version": "0.4.47",
3
+ "version": "0.4.48",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/castle-xyz/castle-experimental-web.git"