@phreshos/client 0.1.36 → 0.1.38

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 CHANGED
@@ -51,8 +51,8 @@ published shape.
51
51
 
52
52
  ## Related repositories
53
53
 
54
- - [`@phreshos/core`](https://github.com/PhreshOS/core) owns every shared
55
- contract and domain class exposed here.
54
+ - [`@phreshos/core`](https://github.com/PhreshOS/core) is the one public import
55
+ path for every shared contract and domain class implemented by these handles.
56
56
  - [`@phreshos/server`](https://github.com/PhreshOS/server) adapts the paired
57
57
  Server Endpoint boundary.
58
58
  - [`@phreshos/react`](https://github.com/PhreshOS/react) adapts the Client
@@ -4,12 +4,11 @@ import Events from "./events.js";
4
4
  export default class ClientAppearance extends Events<AppearanceEvents, never> implements WritableAppearance {
5
5
  constructor();
6
6
  snapshot(): Promise<Readonly<{
7
- background: import("@phreshos/core").ThemedValue<string, string>;
8
- foreground: import("@phreshos/core").ThemedValue<string, string>;
9
- accent: import("@phreshos/core").ThemedValue<string, string>;
7
+ colors: import("@phreshos/core").AppearanceColors;
10
8
  spacing: import("@phreshos/core").ThemedValue<number>;
11
9
  radius: import("@phreshos/core").ThemedValue<number>;
12
- surface: import("@phreshos/core").ThemedValue<import("@phreshos/core").AppearanceSurface, import("@phreshos/core").AppearanceSurface>;
10
+ shadow: import("@phreshos/core").ThemedValue<import("@phreshos/core").AppearanceShadow, import("@phreshos/core").AppearanceShadow>;
11
+ material: import("@phreshos/core").ThemedValue<import("@phreshos/core").AppearanceMaterial, import("@phreshos/core").AppearanceMaterial>;
13
12
  signInWallpaper: import("@phreshos/core").ThemedValue<string | null, string | null>;
14
13
  desktopWallpaper: import("@phreshos/core").ThemedValue<string | null, string | null>;
15
14
  }>>;
package/dist/content.d.ts CHANGED
@@ -1,6 +1,7 @@
1
+ import type { WritableContent } from "@phreshos/core";
1
2
  export type ContentBody = Blob | ReadableStream<Uint8Array>;
2
3
  /** Converts one authored value into the browser body and metadata used by storage and serving. */
3
- export declare function content(value: unknown): {
4
+ export declare function content(value: WritableContent): {
4
5
  body: ContentBody;
5
6
  extension: string;
6
7
  type: string;
package/dist/context.d.ts CHANGED
@@ -1,13 +1,3 @@
1
- import type { ClientContext as CoreClientContext, ContextCapture as CoreContextCapture, ContextEvents as CoreContextEvents, ContextMessage as CoreContextMessage } from "@phreshos/core";
2
- import { ServerEndpoint, type Endpoint } from "./domain.js";
3
- /** The executing Process's canonical Server Endpoint handle. */
4
- export type ContextServer<Events extends object = {}, Fallback = unknown> = ServerEndpoint<Events, Fallback>;
5
- /** One value addressed to the current Client Endpoint, with a client-visible sender. */
6
- export type ContextMessage<Payload = unknown> = CoreContextMessage<Payload, Endpoint | null>;
7
- /** Applies the client-visible sender envelope to known Context events. */
8
- export type ContextEvents<Events extends object> = CoreContextEvents<Events, Endpoint | null>;
9
- /** Every event observable through the current Client Endpoint Context. */
10
- export type ContextCapture<Events extends object = {}> = CoreContextCapture<Events, Endpoint | null>;
11
- export type Context<Events extends object = {}> = CoreClientContext<Events>;
1
+ import type { ClientContext as CoreClientContext } from "@phreshos/core";
12
2
  /** Inbound events, owner hierarchy, and paired Server Endpoint for this Client runtime. */
13
- export declare const context: Context;
3
+ export declare const context: CoreClientContext;
package/dist/domain.js CHANGED
@@ -336,6 +336,7 @@ class WindowHandle extends Events {
336
336
  async changeTitle(title) { await wire.request(["changeTitle", await this.target(), title]); }
337
337
  async raise() { await wire.request(["raise", await this.target()]); }
338
338
  }
339
+ const windowTargets = new WeakMap();
339
340
  class LocalWindowHandle {
340
341
  target;
341
342
  selected;
@@ -351,6 +352,15 @@ class LocalWindowHandle {
351
352
  async move(position) { await this.change("windowLocalMove", position); }
352
353
  async resize(size) { await this.change("windowLocalResize", size); }
353
354
  async setGeometry(geometry) { await this.change("windowLocalGeometry", geometry); }
355
+ async minimize(minimized = true) { await this.change("windowLocalMinimize", minimized); }
356
+ async follow(window) {
357
+ const target = windowTargets.get(window);
358
+ if (!target)
359
+ throw new Error("Local Window follow requires a Window from this Client SDK");
360
+ await wire.request(["windowLocalFollow", await this.target(), await target(), this.selected]);
361
+ }
362
+ async unfollow() { await wire.request(["windowLocalUnfollow", await this.target(), this.selected]); }
363
+ async raise() { await wire.request(["windowLocalRaise", await this.target()]); }
354
364
  async change(operation, value) {
355
365
  await wire.request([operation, await this.target(), value, this.selected]);
356
366
  }
@@ -499,7 +509,9 @@ function endpointHandle(owner, kind, preferred) {
499
509
  return handles.obtain(`endpoint:${owner.reference}:${kind}`, () => preferred ?? (kind === "server" ? new ServerEndpointHandle(owner) : new ClientEndpointHandle(owner)));
500
510
  }
501
511
  export function window(target) {
502
- return new WindowHandle(target);
512
+ const handle = new WindowHandle(target);
513
+ windowTargets.set(handle, target);
514
+ return handle;
503
515
  }
504
516
  export function localWindow(target) {
505
517
  return new LocalWindowHandle(target);
package/dist/main.d.ts CHANGED
@@ -1,6 +1,3 @@
1
1
  export { system } from "./system.js";
2
2
  export { desktop } from "./desktop/desktop.js";
3
- export { context, type Context, type ContextCapture, type ContextEvents, type ContextMessage, type ContextServer } from "./context.js";
4
- export { ClientService, ServerService, Service, clientPermissionCatalog, isPermissionName, type ServiceKey, } from "@phreshos/core";
5
- export { ClientEndpoint, Endpoint, Process, Program, ServerEndpoint, type Window, type ProgramProcess, type ProgramProcessRunEvent, type ProgramProcessRunOptions, type AnswerCapture, type AnswerMessage, type AnswerSubscriber, type AskCapture, type AskMessage, type AskSubscriber, type ClientTraffic, type EndpointTraffic, type ServerTraffic, type TrafficCapture, type TrafficEvents, type TrafficMessage } from "./domain.js";
6
- export type { Askable, AnswerOutcome, ClientContext, Capture, Captures, CaptureSubscriber, ClientLaunch, ClientDeclaration, Cleanup, DirectoryStat, EndpointDeclaration, EndpointLifecycle, EndpointLifecycleEvents, EntryStat, EventMessage, EventName, EventOptions, EventSubscriber, Exit, FileStat, Launch, ServerLaunch, ShellEvent, ShellOptions, Layer, LogKind, LogRecord, LogSource, Message, OtherStat, Permission, PermissionDefinition, PermissionDefinitions, PermissionInput, PermissionName, PermissionRequest, PermissionValue, PermissionValueDomain, Permissions, ClientPermissionDeclarations, ClientPermissions, ContextPermissions, ProgramPermissions, TimedContextPermissions, Position, Storage, ProgramEvents, ProgramProcessEvents, ProgramProcessExit, ProgramStartup, ProgramSql, ProgramStore, ProcessEvents, Publishable, System, SystemUploads, Upload, Size, Subscribable, SubscribableEvents, SubscribableFallback, TimedAskable, Timeoutable, Appearance, AppearanceEvents, AppearanceSource, AppearanceSurface, AnimationsPreference, DesktopPreferences, DesktopPreferencesEvents, DesktopPreferencesSource, DesktopPreferencesUpdate, Desktop, DesktopSize, DesktopSurfaceEvents, DesktopSurfaceSnapshot, DesktopSurfaceSource, WritableDesktopPreferencesSource, ThemedValue, Theme, ThemePreference, Value, WindowEvents, WindowGeometry, WindowLayer, WindowState, Easing, LocalWindow, LocalWindowOperations, Transaction } from "@phreshos/core";
3
+ export { context } from "./context.js";
package/dist/main.js CHANGED
@@ -1,5 +1,3 @@
1
1
  export { system } from "./system.js";
2
2
  export { desktop } from "./desktop/desktop.js";
3
3
  export { context } from "./context.js";
4
- export { ClientService, ServerService, Service, clientPermissionCatalog, isPermissionName, } from "@phreshos/core";
5
- export { ClientEndpoint, Endpoint, Process, Program, ServerEndpoint } from "./domain.js";
package/dist/storage.d.ts CHANGED
@@ -1,9 +1,8 @@
1
- import type { ProgramSql, ProgramStore, Storage as CoreStorage } from "@phreshos/core";
1
+ import { Storage, type ProgramSql, type ProgramStore } from "@phreshos/core";
2
2
  import type { HandleAddress } from "./domain.js";
3
- export type Storage = CoreStorage;
4
3
  /** Client-side access to one exact Program storage area. */
5
4
  export declare function area(program: HandleAddress, which: "data" | "cache"): Storage;
6
- export declare function store(program: HandleAddress): ProgramStore;
7
- export declare function sql(kind: "database" | "logs", program: HandleAddress): ProgramSql;
8
5
  /** Access to the System's native storage through the Client boundary. */
9
6
  export declare function systemStorage(): Storage;
7
+ export declare function store(program: HandleAddress): ProgramStore;
8
+ export declare function sql(kind: "database" | "logs", program: HandleAddress): ProgramSql;
package/dist/storage.js CHANGED
@@ -1,53 +1,202 @@
1
+ import { Storage, StorageFile } from "@phreshos/core";
1
2
  import { content } from "./content.js";
2
3
  import controlledStream from "./controlled-stream.js";
3
4
  import wire from "./wire.js";
4
5
  /** Client-side access to one exact Program storage area. */
5
6
  export function area(program, which) {
6
- async function ask(operation, ...values) {
7
- const answer = await wire.request([which, program, operation, ...values]);
7
+ return new RemoteStorage(new ProgramStorageBoundary(program, which), []);
8
+ }
9
+ /** Access to the System's native storage through the Client boundary. */
10
+ export function systemStorage() {
11
+ return new RemoteStorage(new SystemStorageBoundary(), []);
12
+ }
13
+ class StorageBoundary {
14
+ }
15
+ class ProgramStorageBoundary extends StorageBoundary {
16
+ program;
17
+ area;
18
+ constructor(program, area) {
19
+ super();
20
+ this.program = program;
21
+ this.area = area;
22
+ }
23
+ async ask(operation, path, input) {
24
+ const answer = await wire.request([this.area, this.program, operation, [...path], input]);
8
25
  return answer[0];
9
26
  }
10
- async function transfer(operation, path, body = null) {
11
- const channel = new MessageChannel();
12
- const abort = () => channel.port1.postMessage("abort");
13
- const close = () => channel.port1.close();
14
- try {
15
- const answer = await wire.request([which, program, operation, path, body, channel.port2], undefined, body instanceof ReadableStream ? [body, channel.port2] : [channel.port2]);
16
- if (operation === "write") {
17
- close();
18
- return null;
19
- }
20
- if (!(answer[0] instanceof ReadableStream))
21
- throw new Error("The storage response has no byte stream");
22
- return controlledStream(answer[0], abort, close);
23
- }
24
- catch (error) {
25
- abort();
26
- close();
27
- throw error;
28
- }
27
+ transfer(operation, path, body, input) {
28
+ return transfer([this.area, this.program, operation], path, body, input);
29
+ }
30
+ watch(path, options, signal) {
31
+ return watch(["program", this.program, this.area, [...path], options], signal);
32
+ }
33
+ }
34
+ class SystemStorageBoundary extends StorageBoundary {
35
+ async ask(operation, path, input) {
36
+ const answer = await wire.request(["host-storage", operation, [...path], input]);
37
+ return answer[0];
38
+ }
39
+ transfer(operation, path, body, input) {
40
+ return transfer([`host-storage-${operation}`], path, body, input);
29
41
  }
30
- async function stream(...path) {
31
- const body = await transfer("stream", path);
42
+ watch(path, options, signal) {
43
+ return watch(["system", [...path], options], signal);
44
+ }
45
+ }
46
+ class RemoteStorage extends Storage {
47
+ boundary;
48
+ parts;
49
+ constructor(boundary, parts) {
50
+ super();
51
+ this.boundary = boundary;
52
+ this.parts = parts;
53
+ }
54
+ name() { return this.boundary.ask("name", this.parts); }
55
+ path() { return this.boundary.ask("path", this.parts); }
56
+ navigate(...parts) { return new RemoteStorage(this.boundary, [...this.parts, ...parts]); }
57
+ file(...parts) { return new RemoteStorageFile(this.boundary, [...this.parts, ...parts]); }
58
+ create() { return this.boundary.ask("create", this.parts); }
59
+ stat() { return this.boundary.ask("stat-storage", this.parts); }
60
+ async list(options = {}) {
61
+ const values = await this.boundary.ask("list", this.parts, options);
62
+ if (!Array.isArray(values))
63
+ throw new Error("The System returned an invalid Storage list");
64
+ return values.map(value => {
65
+ const entry = parseEntry(value);
66
+ return entry.kind === "file"
67
+ ? new RemoteStorageFile(this.boundary, [...this.parts, ...entry.path])
68
+ : new RemoteStorage(this.boundary, [...this.parts, ...entry.path]);
69
+ });
70
+ }
71
+ copy(destination, options = {}) { return copyStorage(this, destination, options); }
72
+ async move(destination, options = {}) {
73
+ if (await sameLocation(this, destination))
74
+ return;
75
+ await copyStorage(this, destination, options);
76
+ await this.delete();
77
+ }
78
+ delete() { return this.boundary.ask("delete-storage", this.parts); }
79
+ clear() { return this.boundary.ask("clear", this.parts); }
80
+ space() { return this.boundary.ask("space", this.parts); }
81
+ watch(options = {}) {
82
+ return this.boundary.watch(this.parts, { recursive: options.recursive }, options.signal);
83
+ }
84
+ }
85
+ class RemoteStorageFile extends StorageFile {
86
+ boundary;
87
+ parts;
88
+ constructor(boundary, parts) {
89
+ super();
90
+ this.boundary = boundary;
91
+ this.parts = parts;
92
+ }
93
+ name() { return this.boundary.ask("name", this.parts); }
94
+ path() { return this.boundary.ask("path", this.parts); }
95
+ stat() { return this.boundary.ask("stat-file", this.parts); }
96
+ async stream(options = {}) {
97
+ const body = await this.boundary.transfer("stream", this.parts, undefined, options);
32
98
  if (!body)
33
- throw new Error("The storage response has no body");
99
+ throw new Error("The Storage response has no byte stream");
34
100
  return body;
35
101
  }
36
- return {
37
- path: () => ask("path"),
38
- resolve: (...path) => ask("resolve", ...path),
39
- stream,
40
- async bytes(...path) { return new Uint8Array(await new Response(await stream(...path)).arrayBuffer()); },
41
- async text(...path) { return new Response(await stream(...path)).text(); },
42
- async json(...path) { return JSON.parse(await new Response(await stream(...path)).text()); },
43
- async write(...args) {
44
- await transfer("write", args.slice(0, -1), content(args.at(-1)).body);
45
- },
46
- stat: (...path) => ask("stat", ...path),
47
- list: (...path) => ask("list", ...path),
48
- delete: (...path) => ask("delete", ...path),
49
- clear: (...path) => ask("clear", ...path)
50
- };
102
+ async bytes(options) {
103
+ return new Uint8Array(await new Response(await this.stream(options)).arrayBuffer());
104
+ }
105
+ async text(options) {
106
+ return new Response(await this.stream(options)).text();
107
+ }
108
+ async json() { return JSON.parse(await this.text()); }
109
+ async write(value, options = {}) {
110
+ await this.boundary.transfer("write", this.parts, content(value).body, options);
111
+ }
112
+ async append(value) {
113
+ await this.boundary.transfer("append", this.parts, content(value).body);
114
+ }
115
+ async copy(destination, options = {}) {
116
+ if (await sameLocation(this, destination))
117
+ return;
118
+ await destination.write(await this.stream(), { overwrite: options.overwrite ?? false });
119
+ }
120
+ async move(destination, options = {}) {
121
+ if (await sameLocation(this, destination))
122
+ return;
123
+ await this.copy(destination, options);
124
+ await this.delete();
125
+ }
126
+ delete() { return this.boundary.ask("delete-file", this.parts); }
127
+ }
128
+ async function transfer(prefix, path, body, input) {
129
+ const channel = new MessageChannel();
130
+ const abort = () => channel.port1.postMessage("abort");
131
+ const close = () => channel.port1.close();
132
+ try {
133
+ const answer = await wire.request([...prefix, [...path], body ?? null, channel.port2, input], undefined, body instanceof ReadableStream ? [body, channel.port2] : [channel.port2]);
134
+ if (prefix.at(-1) !== "stream") {
135
+ close();
136
+ return null;
137
+ }
138
+ if (!(answer[0] instanceof ReadableStream))
139
+ throw new Error("The Storage response has no byte stream");
140
+ return controlledStream(answer[0], abort, close);
141
+ }
142
+ catch (error) {
143
+ abort();
144
+ close();
145
+ throw error;
146
+ }
147
+ }
148
+ function watch(values, signal) {
149
+ const operation = wire.stream(["storage-watch", ...values], undefined, signal);
150
+ return (async function* () {
151
+ for await (const value of operation) {
152
+ const change = value;
153
+ if (!change || (change.event !== "change" && change.event !== "rename") || change.path !== null && typeof change.path !== "string") {
154
+ throw new Error("The System returned an invalid Storage change");
155
+ }
156
+ yield Object.freeze({ event: change.event, path: change.path });
157
+ }
158
+ })();
159
+ }
160
+ async function copyStorage(source, destination, options) {
161
+ if (await sameLocation(source, destination))
162
+ return;
163
+ const [sourcePath, destinationPath] = await Promise.all([source.path(), destination.path()]);
164
+ if (descendsFrom(destinationPath, sourcePath))
165
+ throw new Error("A Storage directory cannot be copied inside itself");
166
+ if (!await source.stat())
167
+ throw new Error(`There is no Storage directory at ${sourcePath}`);
168
+ if (await destination.stat()) {
169
+ if (!options.overwrite)
170
+ throw new Error(`A Storage directory already exists at ${destinationPath}`);
171
+ await destination.delete();
172
+ }
173
+ await destination.create();
174
+ for (const entry of await source.list()) {
175
+ const name = await entry.name();
176
+ if (entry instanceof StorageFile)
177
+ await entry.copy(destination.file(name), options);
178
+ else
179
+ await entry.copy(destination.navigate(name), options);
180
+ }
181
+ }
182
+ async function sameLocation(left, right) {
183
+ const [leftPath, rightPath] = await Promise.all([left.path(), right.path()]);
184
+ return normalizePath(leftPath) === normalizePath(rightPath);
185
+ }
186
+ function descendsFrom(path, parent) {
187
+ const normalized = normalizePath(path);
188
+ const root = normalizePath(parent);
189
+ return normalized.startsWith(`${root}/`);
190
+ }
191
+ function normalizePath(path) {
192
+ return path.replaceAll("\\", "/").replace(/\/+$/, "");
193
+ }
194
+ function parseEntry(value) {
195
+ const entry = value;
196
+ if (!entry || (entry.kind !== "storage" && entry.kind !== "file") || !Array.isArray(entry.path) || entry.path.length === 0 || entry.path.some(part => typeof part !== "string")) {
197
+ throw new Error("The System returned an invalid Storage entry");
198
+ }
199
+ return { kind: entry.kind, path: entry.path };
51
200
  }
52
201
  export function store(program) {
53
202
  async function ask(operation, ...values) {
@@ -72,52 +221,3 @@ export function sql(kind, program) {
72
221
  }
73
222
  };
74
223
  }
75
- /** Access to the System's native storage through the Client boundary. */
76
- export function systemStorage() {
77
- async function ask(operation, ...values) {
78
- const answer = await wire.request(["host-storage", operation, ...values]);
79
- return answer[0];
80
- }
81
- async function transfer(operation, path, body = null) {
82
- const channel = new MessageChannel();
83
- const abort = () => channel.port1.postMessage("abort");
84
- const close = () => channel.port1.close();
85
- try {
86
- const answer = await wire.request([`host-storage-${operation}`, path, body, channel.port2], undefined, body instanceof ReadableStream ? [body, channel.port2] : [channel.port2]);
87
- if (operation === "write") {
88
- close();
89
- return null;
90
- }
91
- if (!(answer[0] instanceof ReadableStream))
92
- throw new Error("The storage response has no byte stream");
93
- return controlledStream(answer[0], abort, close);
94
- }
95
- catch (error) {
96
- abort();
97
- close();
98
- throw error;
99
- }
100
- }
101
- async function stream(...path) {
102
- const body = await transfer("stream", path);
103
- if (!body)
104
- throw new Error("The storage response has no body");
105
- return body;
106
- }
107
- return {
108
- path: () => ask("path"),
109
- resolve: (...path) => ask("resolve", ...path),
110
- stream,
111
- async bytes(...path) { return new Uint8Array(await new Response(await stream(...path)).arrayBuffer()); },
112
- async text(...path) { return new Response(await stream(...path)).text(); },
113
- async json(...path) { return JSON.parse(await new Response(await stream(...path)).text()); },
114
- async write(...args) {
115
- const path = args.slice(0, -1);
116
- await transfer("write", path, content(args.at(-1)).body);
117
- },
118
- stat: (...path) => ask("stat", ...path),
119
- list: (...path) => ask("list", ...path),
120
- delete: (...path) => ask("delete", ...path),
121
- clear: (...path) => ask("clear", ...path)
122
- };
123
- }
package/dist/system.js CHANGED
@@ -14,10 +14,6 @@ class ClientSystem {
14
14
  program = new SystemProgramHandle();
15
15
  process = new SystemProcessHandle();
16
16
  uploads = uploads;
17
- async forceCreateProgram(source) {
18
- const answer = await wire.request(["host-program-force-create", source]);
19
- return program(answer[0]);
20
- }
21
17
  service(key) { return prepareService(key); }
22
18
  async fetch(input, init) {
23
19
  const request = new Request(input, {
@@ -102,6 +98,10 @@ class SystemProgramHandle extends Events {
102
98
  const answer = await wire.request(["host-program-create", source]);
103
99
  return program(answer[0]);
104
100
  }
101
+ async forceCreate(source) {
102
+ const answer = await wire.request(["host-program-force-create", source]);
103
+ return program(answer[0]);
104
+ }
105
105
  }
106
106
  class SystemProcessHandle extends Events {
107
107
  constructor() {
package/dist/uploads.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- import { type SystemUploads, type Upload } from "@phreshos/core";
1
+ import { type FileStat, type SystemUploads, type Upload, type WritableContent } from "@phreshos/core";
2
2
  /** Flat upload access transported through the Client's Desktop boundary. */
3
3
  declare class ClientUploads implements SystemUploads {
4
4
  path(): Promise<string>;
5
- write(value: unknown): Promise<Upload>;
5
+ write(value: WritableContent): Promise<Upload>;
6
6
  stream(file: string): Promise<ReadableStream<Uint8Array>>;
7
7
  bytes(file: string): Promise<Uint8Array<ArrayBuffer>>;
8
8
  text(file: string): Promise<string>;
9
9
  json<Value>(file: string): Promise<Value>;
10
- stat(file: string): Promise<Upload | null>;
10
+ stat(file: string): Promise<FileStat | null>;
11
11
  }
12
12
  export declare const uploads: ClientUploads;
13
13
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phreshos/client",
3
- "version": "0.1.36",
3
+ "version": "0.1.38",
4
4
  "description": "The SDK used by a Program's client endpoint.",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
@@ -47,13 +47,13 @@
47
47
  "prepack": "node --run build"
48
48
  },
49
49
  "peerDependencies": {
50
- "@phreshos/core": "^0.1.40"
50
+ "@phreshos/core": "^0.1.42"
51
51
  },
52
52
  "dependencies": {
53
53
  "@the-link/messagepack": "^0.1.0"
54
54
  },
55
55
  "devDependencies": {
56
- "@phreshos/core": "^0.1.40",
56
+ "@phreshos/core": "^0.1.42",
57
57
  "typescript": "^6.0.3"
58
58
  }
59
59
  }