@muhkoo/connect 0.3.0-alpha.0 → 0.4.0-alpha.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.
- package/README.md +73 -6
- package/dist/browser/index.js +265 -8
- package/dist/browser/index.js.map +1 -1
- package/dist/connect.d.ts +328 -3
- package/dist/server/index.js +265 -8
- package/dist/server/index.js.map +1 -1
- package/dist/workers/index.js +20 -1
- package/dist/workers/index.js.map +1 -1
- package/package.json +1 -1
package/dist/server/index.js
CHANGED
|
@@ -2790,6 +2790,9 @@ class HttpClient {
|
|
|
2790
2790
|
post(path, body) {
|
|
2791
2791
|
return this.request("POST", path, body);
|
|
2792
2792
|
}
|
|
2793
|
+
patch(path, body) {
|
|
2794
|
+
return this.request("PATCH", path, body);
|
|
2795
|
+
}
|
|
2793
2796
|
del(path, body) {
|
|
2794
2797
|
return this.request("DELETE", path, body);
|
|
2795
2798
|
}
|
|
@@ -3272,6 +3275,7 @@ class WSTransport extends EventCore {
|
|
|
3272
3275
|
return `${this.id}:${event}`;
|
|
3273
3276
|
}
|
|
3274
3277
|
url;
|
|
3278
|
+
urlProvider;
|
|
3275
3279
|
socket = null;
|
|
3276
3280
|
_isConnected = false;
|
|
3277
3281
|
_isConnecting = false;
|
|
@@ -3297,6 +3301,7 @@ class WSTransport extends EventCore {
|
|
|
3297
3301
|
throw new Error("WSTransport: `url` is required");
|
|
3298
3302
|
}
|
|
3299
3303
|
this.url = opts.url;
|
|
3304
|
+
this.urlProvider = opts.urlProvider;
|
|
3300
3305
|
this.id = opts.id ?? `ws${++__wsInstanceSeq}`;
|
|
3301
3306
|
this.autoReconnect = opts.autoReconnect ?? true;
|
|
3302
3307
|
this.reconnectDelay = opts.reconnectDelay ?? 3000;
|
|
@@ -3313,6 +3318,18 @@ class WSTransport extends EventCore {
|
|
|
3313
3318
|
throw new Error("WSTransport: already connected or connecting");
|
|
3314
3319
|
}
|
|
3315
3320
|
this._isConnecting = true;
|
|
3321
|
+
// On a RECONNECT, refresh the URL (the baked-in single-use ticket is spent).
|
|
3322
|
+
// The first connect uses `url` as-is. If the provider throws (e.g. can't
|
|
3323
|
+
// mint a ticket), surface it and let scheduleReconnect retry.
|
|
3324
|
+
if (this.urlProvider && this.reconnectAttempts > 0) {
|
|
3325
|
+
try {
|
|
3326
|
+
this.url = await this.urlProvider();
|
|
3327
|
+
}
|
|
3328
|
+
catch (err) {
|
|
3329
|
+
this._isConnecting = false;
|
|
3330
|
+
throw err;
|
|
3331
|
+
}
|
|
3332
|
+
}
|
|
3316
3333
|
return new Promise((resolve, reject) => {
|
|
3317
3334
|
try {
|
|
3318
3335
|
const socket = new WebSocket(this.url);
|
|
@@ -3485,7 +3502,12 @@ class WSTransport extends EventCore {
|
|
|
3485
3502
|
await this.connect();
|
|
3486
3503
|
}
|
|
3487
3504
|
catch {
|
|
3488
|
-
//
|
|
3505
|
+
// A failed reconnect never opened the socket, so its `onclose` won't
|
|
3506
|
+
// re-schedule (that path is guarded by `wasConnected`). Re-schedule here
|
|
3507
|
+
// so we keep retrying (with a fresh ticket each time) until we succeed
|
|
3508
|
+
// or hit the attempt cap.
|
|
3509
|
+
if (this.autoReconnect)
|
|
3510
|
+
this.scheduleReconnect();
|
|
3489
3511
|
}
|
|
3490
3512
|
}, this.reconnectDelay);
|
|
3491
3513
|
}
|
|
@@ -4266,6 +4288,8 @@ class FileStorage {
|
|
|
4266
4288
|
const fileId = input.fileId ?? generateId();
|
|
4267
4289
|
const createdAt = Date.now();
|
|
4268
4290
|
const chunks = [];
|
|
4291
|
+
const totalChunks = Math.max(1, Math.ceil(data.length / this.chunkSize));
|
|
4292
|
+
input.onProgress?.(0, totalChunks);
|
|
4269
4293
|
// Slicing + encrypting + encoding + uploading is done per-chunk so
|
|
4270
4294
|
// the peak memory footprint stays at ~chunkSize even for huge files.
|
|
4271
4295
|
// Within a chunk, the shard uploads are parallelized up to
|
|
@@ -4275,6 +4299,7 @@ class FileStorage {
|
|
|
4275
4299
|
const end = Math.min(start + this.chunkSize, data.length);
|
|
4276
4300
|
const plaintext = data.subarray(start, end);
|
|
4277
4301
|
chunks.push(await this.writeChunk(plaintext, chunkIndex));
|
|
4302
|
+
input.onProgress?.(chunks.length, totalChunks);
|
|
4278
4303
|
// Stop after one iteration if the file is empty — we still emit a
|
|
4279
4304
|
// single zero-length chunk so the manifest has a stable shape.
|
|
4280
4305
|
if (data.length === 0)
|
|
@@ -5390,12 +5415,27 @@ class Space {
|
|
|
5390
5415
|
/** Open the space websocket (resolves the ticket + identity lazily). */
|
|
5391
5416
|
async connect() {
|
|
5392
5417
|
if (!this.channel) {
|
|
5393
|
-
|
|
5394
|
-
|
|
5395
|
-
|
|
5418
|
+
// The WS upgrade ticket is single-use + short-TTL, so a reconnect
|
|
5419
|
+
// must mint a FRESH one — otherwise the socket drops (idle timeout,
|
|
5420
|
+
// network blip) and never comes back. `buildUrl` is handed to the
|
|
5421
|
+
// transport as a `urlProvider` it calls before each reconnect.
|
|
5422
|
+
const buildUrl = async () => {
|
|
5423
|
+
const ticket = await this.deps.fetchTicket();
|
|
5424
|
+
return (`${this.deps.wsBaseUrl}/api/spaces/${encodeURIComponent(this.name)}/websocket` +
|
|
5425
|
+
(ticket ? `?ticket=${encodeURIComponent(ticket)}` : ""));
|
|
5426
|
+
};
|
|
5427
|
+
const url = await buildUrl();
|
|
5396
5428
|
this.channel = this.deps.createChannel
|
|
5397
5429
|
? this.deps.createChannel(url, this.deps.myId())
|
|
5398
|
-
: new BroadcastChannel({
|
|
5430
|
+
: new BroadcastChannel({
|
|
5431
|
+
url,
|
|
5432
|
+
myId: this.deps.myId(),
|
|
5433
|
+
autoAnnounce: false,
|
|
5434
|
+
urlProvider: buildUrl,
|
|
5435
|
+
// Keep recovering across network flaps (each attempt mints a
|
|
5436
|
+
// fresh ticket); teardown calls disconnect() which stops it.
|
|
5437
|
+
maxReconnectAttempts: 0,
|
|
5438
|
+
});
|
|
5399
5439
|
for (const [event, handler] of this.pending)
|
|
5400
5440
|
this.channel.on(event, handler);
|
|
5401
5441
|
this.pending.length = 0;
|
|
@@ -5599,8 +5639,8 @@ class Space {
|
|
|
5599
5639
|
return this.requireKeyring().rotate(roster);
|
|
5600
5640
|
}
|
|
5601
5641
|
// -- room-scoped files (no websocket needed) -------------------------------
|
|
5602
|
-
async putFile(file, metadata) {
|
|
5603
|
-
return this.fileStorage().writeFileToShards({ data: file, metadata });
|
|
5642
|
+
async putFile(file, metadata, opts = {}) {
|
|
5643
|
+
return this.fileStorage().writeFileToShards({ data: file, metadata, onProgress: opts.onProgress });
|
|
5604
5644
|
}
|
|
5605
5645
|
async getFile(manifest) {
|
|
5606
5646
|
return this.fileStorage().readFileFromShards(manifest);
|
|
@@ -5757,6 +5797,12 @@ class Space {
|
|
|
5757
5797
|
* nothing to verify against → reject.
|
|
5758
5798
|
*/
|
|
5759
5799
|
async verifySender(packet) {
|
|
5800
|
+
// Trust our OWN messages — we sent them, so there's nothing to prove
|
|
5801
|
+
// against the roster. This also keeps a returning member (who loaded a
|
|
5802
|
+
// cached key and never re-published a join-request) from dropping the
|
|
5803
|
+
// echo of their own messages when their `ecdsaPub` isn't in the roster.
|
|
5804
|
+
if (packet.source === this.deps.myId())
|
|
5805
|
+
return true;
|
|
5760
5806
|
const keyring = this.deps.keyring;
|
|
5761
5807
|
const sig = packet.headers?.sig;
|
|
5762
5808
|
if (!keyring || typeof sig !== "string")
|
|
@@ -6253,6 +6299,34 @@ class KeyringClient {
|
|
|
6253
6299
|
async invite(username) {
|
|
6254
6300
|
await this.post("/keyring/invite", { username });
|
|
6255
6301
|
}
|
|
6302
|
+
// -- Shareable invite links ----------------------------------------------
|
|
6303
|
+
// A capability token tied to this space. Redeeming it allowlists the holder
|
|
6304
|
+
// so the keeper admits them — the link IS the invitation. Mint/list/revoke
|
|
6305
|
+
// require the caller to be the creator or an existing member.
|
|
6306
|
+
async createInviteLink(opts = {}) {
|
|
6307
|
+
return this.post("/keyring/link", opts);
|
|
6308
|
+
}
|
|
6309
|
+
async listInviteLinks() {
|
|
6310
|
+
const body = await this.get("/keyring/links");
|
|
6311
|
+
return body.links ?? [];
|
|
6312
|
+
}
|
|
6313
|
+
/** Set a member's role ("viewer" | "editor"). Owner-only on the server. */
|
|
6314
|
+
async setMemberRole(username, role) {
|
|
6315
|
+
await this.post("/keyring/role", { username, role });
|
|
6316
|
+
}
|
|
6317
|
+
/** Roster with roles (owner/members only). */
|
|
6318
|
+
async members() {
|
|
6319
|
+
const body = await this.get("/keyring/members");
|
|
6320
|
+
return body.members ?? [];
|
|
6321
|
+
}
|
|
6322
|
+
async revokeInviteLink(token) {
|
|
6323
|
+
await this.post("/keyring/link-revoke", { token });
|
|
6324
|
+
}
|
|
6325
|
+
/** Redeem a link: the server allowlists this member and asks the keeper to
|
|
6326
|
+
* wrap the group key for their identity. Caller must be authenticated. */
|
|
6327
|
+
async redeemInvite(req) {
|
|
6328
|
+
await this.post("/keyring/redeem", req);
|
|
6329
|
+
}
|
|
6256
6330
|
async fetchMetadata() {
|
|
6257
6331
|
try {
|
|
6258
6332
|
return await this.get("/metadata");
|
|
@@ -6390,6 +6464,56 @@ class SpaceNamespace {
|
|
|
6390
6464
|
return this.joinSpace(spaceId, opts);
|
|
6391
6465
|
}
|
|
6392
6466
|
// -------------------------------------------------------------------------
|
|
6467
|
+
// Invite links — shareable, keeper-gated invitations to a space. The token
|
|
6468
|
+
// is a capability: anyone signed in who redeems it is admitted by the
|
|
6469
|
+
// keeper. Mint/list/revoke require the caller to be the space's creator or
|
|
6470
|
+
// an existing member.
|
|
6471
|
+
// -------------------------------------------------------------------------
|
|
6472
|
+
/** Mint a shareable invite link for a space. `opts.expiresInSec` / `maxUses`
|
|
6473
|
+
* bound it (0/undefined = unlimited); `opts.role` ("viewer"|"editor") is the
|
|
6474
|
+
* access granted to redeemers (default viewer). Returns the link. */
|
|
6475
|
+
async createInviteLink(spaceId, opts = {}) {
|
|
6476
|
+
return this.keyringFor(spaceId).createInviteLink(opts);
|
|
6477
|
+
}
|
|
6478
|
+
/** Set a member's role on a space ("viewer" | "editor"). Owner-only. */
|
|
6479
|
+
async setMemberRole(spaceId, username, role) {
|
|
6480
|
+
await this.keyringFor(spaceId).setMemberRole(username, role);
|
|
6481
|
+
}
|
|
6482
|
+
/** Roster with roles (owner/members only). */
|
|
6483
|
+
async members(spaceId) {
|
|
6484
|
+
return this.keyringFor(spaceId).members();
|
|
6485
|
+
}
|
|
6486
|
+
/** List a space's active invite links (creator/members only). */
|
|
6487
|
+
async listInviteLinks(spaceId) {
|
|
6488
|
+
return this.keyringFor(spaceId).listInviteLinks();
|
|
6489
|
+
}
|
|
6490
|
+
/** Revoke an invite link by token. */
|
|
6491
|
+
async revokeInviteLink(spaceId, token) {
|
|
6492
|
+
await this.keyringFor(spaceId).revokeInviteLink(token);
|
|
6493
|
+
}
|
|
6494
|
+
/**
|
|
6495
|
+
* Join a space using an invite link: redeem the token (the keeper admits
|
|
6496
|
+
* this member), then connect and resolve once the group key arrives.
|
|
6497
|
+
* Returns the open {@link Space}.
|
|
6498
|
+
*/
|
|
6499
|
+
async joinByInvite(spaceId, token, opts = {}) {
|
|
6500
|
+
const memberId = this.myId();
|
|
6501
|
+
const { ecdhPub, ecdsaPub } = await this.ensureIdentity(memberId);
|
|
6502
|
+
await this.keyringFor(spaceId).redeemInvite({ token, identityEcdhPub: ecdhPub, identityEcdsaPub: ecdsaPub });
|
|
6503
|
+
return this.joinSpace(spaceId, opts);
|
|
6504
|
+
}
|
|
6505
|
+
/** The current member roster of a space (member id → identity public keys). */
|
|
6506
|
+
async roster(spaceId) {
|
|
6507
|
+
return this.keyringFor(spaceId).fetchRoster();
|
|
6508
|
+
}
|
|
6509
|
+
keyringFor(spaceId) {
|
|
6510
|
+
return new KeyringClient({
|
|
6511
|
+
spaceId,
|
|
6512
|
+
httpBaseUrl: this.deps.http.baseUrl,
|
|
6513
|
+
fetch: this.deps.http.fetch,
|
|
6514
|
+
});
|
|
6515
|
+
}
|
|
6516
|
+
// -------------------------------------------------------------------------
|
|
6393
6517
|
// Internals
|
|
6394
6518
|
// -------------------------------------------------------------------------
|
|
6395
6519
|
async build(spaceId, historyPolicy) {
|
|
@@ -6456,6 +6580,133 @@ class SpaceNamespace {
|
|
|
6456
6580
|
}
|
|
6457
6581
|
}
|
|
6458
6582
|
|
|
6583
|
+
/**
|
|
6584
|
+
* `client.agents` — manage an app's **Programmable Agents** (server-side
|
|
6585
|
+
* "virtual users" backed by Workers AI).
|
|
6586
|
+
*
|
|
6587
|
+
* const { config } = await client.agents.create(appId, {
|
|
6588
|
+
* handle: '@assistant', displayName: 'Assistant',
|
|
6589
|
+
* systemPrompt: 'You are a helpful teammate in this Space.',
|
|
6590
|
+
* triggers: [{ type: 'mention' }],
|
|
6591
|
+
* });
|
|
6592
|
+
* await client.agents.enable(appId, config.agentId, spaceId); // per-Space opt-in
|
|
6593
|
+
*
|
|
6594
|
+
* These are MANAGEMENT calls — the agent itself runs on the accelerator. Only an
|
|
6595
|
+
* app's owner or an editor of its shared Space may create/update/enable an agent
|
|
6596
|
+
* (viewers can read). Authorization rides the user session token; non-owner
|
|
6597
|
+
* editors pass their management Space via `opts.space`.
|
|
6598
|
+
*
|
|
6599
|
+
* v1 is "prompts + persona": a system prompt, a model, named prompt `skills`,
|
|
6600
|
+
* and `triggers` that decide when the agent speaks. No tools, no code.
|
|
6601
|
+
*/
|
|
6602
|
+
class AgentsNamespace {
|
|
6603
|
+
deps;
|
|
6604
|
+
constructor(deps) {
|
|
6605
|
+
this.deps = deps;
|
|
6606
|
+
}
|
|
6607
|
+
/** List the app's agents. */
|
|
6608
|
+
async list(appId, opts = {}) {
|
|
6609
|
+
const res = await this.deps.http.get(this.path(appId, "", opts));
|
|
6610
|
+
return res.agents ?? [];
|
|
6611
|
+
}
|
|
6612
|
+
/** Read one agent (config + identity keys). */
|
|
6613
|
+
async get(appId, agentId, opts = {}) {
|
|
6614
|
+
return this.deps.http.get(this.path(appId, `/${encodeURIComponent(agentId)}`, opts));
|
|
6615
|
+
}
|
|
6616
|
+
/** Create an agent (owner/editor only). */
|
|
6617
|
+
async create(appId, input, opts = {}) {
|
|
6618
|
+
return this.deps.http.post(this.path(appId, "", {}), { ...input, space: opts.space });
|
|
6619
|
+
}
|
|
6620
|
+
/** Update an agent's editor-settable fields (owner/editor only). */
|
|
6621
|
+
async update(appId, agentId, patch, opts = {}) {
|
|
6622
|
+
return this.deps.http.patch(this.path(appId, `/${encodeURIComponent(agentId)}`, {}), { ...patch, space: opts.space });
|
|
6623
|
+
}
|
|
6624
|
+
/** Delete an agent (owner/editor only). */
|
|
6625
|
+
async delete(appId, agentId, opts = {}) {
|
|
6626
|
+
return this.deps.http.del(this.path(appId, `/${encodeURIComponent(agentId)}`, {}), { space: opts.space });
|
|
6627
|
+
}
|
|
6628
|
+
/** Enable the agent on a Space (per-Space opt-in). */
|
|
6629
|
+
async enable(appId, agentId, spaceId, opts = {}) {
|
|
6630
|
+
return this.deps.http.post(this.path(appId, `/${encodeURIComponent(agentId)}/enable`, {}), { targetSpaceId: spaceId, space: opts.space });
|
|
6631
|
+
}
|
|
6632
|
+
/** Disable the agent on a Space. */
|
|
6633
|
+
async disable(appId, agentId, spaceId, opts = {}) {
|
|
6634
|
+
return this.deps.http.post(this.path(appId, `/${encodeURIComponent(agentId)}/disable`, {}), { targetSpaceId: spaceId, space: opts.space });
|
|
6635
|
+
}
|
|
6636
|
+
path(appId, suffix, opts) {
|
|
6637
|
+
const q = opts.space ? `?space=${encodeURIComponent(opts.space)}` : "";
|
|
6638
|
+
return `/api/apps/${encodeURIComponent(appId)}/agents${suffix}${q}`;
|
|
6639
|
+
}
|
|
6640
|
+
}
|
|
6641
|
+
|
|
6642
|
+
/**
|
|
6643
|
+
* `client.functions` — manage an app's **serverless functions** (developer-
|
|
6644
|
+
* authored code that runs on the accelerator).
|
|
6645
|
+
*
|
|
6646
|
+
* const { config } = await client.functions.deploy(appId, {
|
|
6647
|
+
* name: 'hello', displayName: 'Hello',
|
|
6648
|
+
* code: `export default { fetch: () => new Response('hi') }`,
|
|
6649
|
+
* triggers: { http: { enabled: true } },
|
|
6650
|
+
* });
|
|
6651
|
+
* // HTTP-reachable at hello--<slug>.fns.muhkoo.dev
|
|
6652
|
+
* await client.functions.enable(appId, config.functionId, spaceId); // Space-bound
|
|
6653
|
+
*
|
|
6654
|
+
* These are MANAGEMENT calls — the function itself runs on the accelerator
|
|
6655
|
+
* (uploaded just-in-time, decrypted only at invocation). Only an app's owner or
|
|
6656
|
+
* an editor of its shared Space may deploy/update/enable (viewers read).
|
|
6657
|
+
* Authorization rides the user session token; non-owner editors pass their
|
|
6658
|
+
* management Space via `opts.space`.
|
|
6659
|
+
*
|
|
6660
|
+
* v1 is "compute-only": a function is an untrusted single-module ES worker
|
|
6661
|
+
* (`export default { fetch }`) with NO platform bindings — it reaches the
|
|
6662
|
+
* platform as an external client (the end-user session is passed through). Two
|
|
6663
|
+
* triggers: `http` (its own subdomain) and `space` (invoked on Space messages,
|
|
6664
|
+
* like a Programmable Agent).
|
|
6665
|
+
*/
|
|
6666
|
+
class FunctionsNamespace {
|
|
6667
|
+
deps;
|
|
6668
|
+
constructor(deps) {
|
|
6669
|
+
this.deps = deps;
|
|
6670
|
+
}
|
|
6671
|
+
/** List the app's functions. */
|
|
6672
|
+
async list(appId, opts = {}) {
|
|
6673
|
+
const res = await this.deps.http.get(this.path(appId, "", opts));
|
|
6674
|
+
return res.functions ?? [];
|
|
6675
|
+
}
|
|
6676
|
+
/** Read one function's config. */
|
|
6677
|
+
async get(appId, functionId, opts = {}) {
|
|
6678
|
+
return this.deps.http.get(this.path(appId, `/${encodeURIComponent(functionId)}`, opts));
|
|
6679
|
+
}
|
|
6680
|
+
/** Read a function's decrypted source (owner/editor; for the editor UI). */
|
|
6681
|
+
async code(appId, functionId, opts = {}) {
|
|
6682
|
+
return this.deps.http.get(this.path(appId, `/${encodeURIComponent(functionId)}/code`, opts));
|
|
6683
|
+
}
|
|
6684
|
+
/** Deploy (create) a function (owner/editor only). */
|
|
6685
|
+
async deploy(appId, input, opts = {}) {
|
|
6686
|
+
return this.deps.http.post(this.path(appId, "", {}), { ...input, space: opts.space });
|
|
6687
|
+
}
|
|
6688
|
+
/** Update a function's editor-settable fields and/or redeploy its `code`. */
|
|
6689
|
+
async update(appId, functionId, patch, opts = {}) {
|
|
6690
|
+
return this.deps.http.patch(this.path(appId, `/${encodeURIComponent(functionId)}`, {}), { ...patch, space: opts.space });
|
|
6691
|
+
}
|
|
6692
|
+
/** Delete a function (owner/editor only). */
|
|
6693
|
+
async delete(appId, functionId, opts = {}) {
|
|
6694
|
+
return this.deps.http.del(this.path(appId, `/${encodeURIComponent(functionId)}`, {}), { space: opts.space });
|
|
6695
|
+
}
|
|
6696
|
+
/** Enable the function on a Space (per-Space opt-in for the `space` trigger). */
|
|
6697
|
+
async enable(appId, functionId, spaceId, opts = {}) {
|
|
6698
|
+
return this.deps.http.post(this.path(appId, `/${encodeURIComponent(functionId)}/enable`, {}), { targetSpaceId: spaceId, space: opts.space });
|
|
6699
|
+
}
|
|
6700
|
+
/** Disable the function on a Space. */
|
|
6701
|
+
async disable(appId, functionId, spaceId, opts = {}) {
|
|
6702
|
+
return this.deps.http.post(this.path(appId, `/${encodeURIComponent(functionId)}/disable`, {}), { targetSpaceId: spaceId, space: opts.space });
|
|
6703
|
+
}
|
|
6704
|
+
path(appId, suffix, opts) {
|
|
6705
|
+
const q = opts.space ? `?space=${encodeURIComponent(opts.space)}` : "";
|
|
6706
|
+
return `/api/apps/${encodeURIComponent(appId)}/functions${suffix}${q}`;
|
|
6707
|
+
}
|
|
6708
|
+
}
|
|
6709
|
+
|
|
6459
6710
|
/**
|
|
6460
6711
|
* `Client` — the single entry point to the Muhkoo SDK.
|
|
6461
6712
|
*
|
|
@@ -6500,6 +6751,10 @@ class Client {
|
|
|
6500
6751
|
message;
|
|
6501
6752
|
/** Fan-out group spaces — `client.space.createSpace(...)`, etc. */
|
|
6502
6753
|
space;
|
|
6754
|
+
/** Programmable Agents — `client.agents.create(appId, …)`, etc. */
|
|
6755
|
+
agents;
|
|
6756
|
+
/** Serverless functions — `client.functions.deploy(appId, …)`, etc. */
|
|
6757
|
+
functions;
|
|
6503
6758
|
session;
|
|
6504
6759
|
http;
|
|
6505
6760
|
/** Subscribers notified when a session expires and can't be recovered. */
|
|
@@ -6542,6 +6797,8 @@ class Client {
|
|
|
6542
6797
|
wsBaseUrl,
|
|
6543
6798
|
cache: spaceKeyCache,
|
|
6544
6799
|
});
|
|
6800
|
+
this.agents = new AgentsNamespace({ http: this.http });
|
|
6801
|
+
this.functions = new FunctionsNamespace({ http: this.http });
|
|
6545
6802
|
}
|
|
6546
6803
|
/** The currently signed-in user, or `null`. */
|
|
6547
6804
|
get user() {
|
|
@@ -7131,5 +7388,5 @@ var bundledLoader = /*#__PURE__*/Object.freeze({
|
|
|
7131
7388
|
default: loadRsWasm
|
|
7132
7389
|
});
|
|
7133
7390
|
|
|
7134
|
-
export { AES_GCM_IV_BYTES, AES_GCM_KEY_BYTES, AES_GCM_TAG_BYTES, AuthClient, AuthNamespace, AuthPublicInput, Authenticator, BroadcastChannel, BroadcastChannelEvents, ChannelExistsError, ChannelNotFoundError, ChunkCipher, Client, DEFAULT_BASE_URL, DoubleRatchet, DoubleRatchetCipher, DoubleRatchetManager, EncryptedSession, EventCore, EventCoreEvents, Field, Field as FieldElement, FileStorage, HashKnowledge, HttpClient, HttpError, KEEPER_MEMBER_ID, KeyStore, KeyringClient, KvNamespace, LocalStorageSessionStore, Logger, MemorySessionStore, Message, Message as MessageDefault, MessageNamespace, PBKDF2_DEFAULT_ITERATIONS, PREIMAGE_POK_VERIFICATION_KEY, Packet, PersonalSpaceClient, Poseidon, PreimagePoK, Ready, ReedSolomonCodec, Retry, Space as Room, SerializeMessage, SessionState, ShardClient, SharedSpaceClient, Space, SpaceKeyring, SpaceNamespace, SpacePacketCipher, StorageNamespace, WSTransport, ZkAuth, _accountId, _formatBytes, _messageId, _objectId, _packetId, _socketId, _userId, appLogger$1 as appLogger, assertType, base58Decode, base58Encode, buildCommitment, compilePrograms, concatBytes, decodeFromHex, decorators, decryptAesGcm, defaultCircuitUrls, defaultSessionStore, deriveAesKeyFromPassphrase, deriveBitsHkdf, deriveIdentity, deserialize, encodeToHex, encryptAesGcm, exportPublicKeyBase64, exportPublicKeyHex, fromBase64, fromBase64Url, fromHex, generateAuthProof, generateChecksum, generateId, getIPAddress, getId, getSubtle, initBn128Wasm, initRsWasm, initializeCircuits, isNumber, log, manifestToStat, poseidonHash, quickVerify, randomBytes, serialize, shardHash, signMessage, toBase64, toBase64Url, toField, toHex, unwrapWithPassphrase, utf8Decode, utf8Encode, verify, verifyChecksum, verifyGroth16, verifyHashKnowledge, verifyPreimagePoK, wrapWithPassphrase };
|
|
7391
|
+
export { AES_GCM_IV_BYTES, AES_GCM_KEY_BYTES, AES_GCM_TAG_BYTES, AgentsNamespace, AuthClient, AuthNamespace, AuthPublicInput, Authenticator, BroadcastChannel, BroadcastChannelEvents, ChannelExistsError, ChannelNotFoundError, ChunkCipher, Client, DEFAULT_BASE_URL, DoubleRatchet, DoubleRatchetCipher, DoubleRatchetManager, EncryptedSession, EventCore, EventCoreEvents, Field, Field as FieldElement, FileStorage, FunctionsNamespace, HashKnowledge, HttpClient, HttpError, KEEPER_MEMBER_ID, KeyStore, KeyringClient, KvNamespace, LocalStorageSessionStore, Logger, MemorySessionStore, Message, Message as MessageDefault, MessageNamespace, PBKDF2_DEFAULT_ITERATIONS, PREIMAGE_POK_VERIFICATION_KEY, Packet, PersonalSpaceClient, Poseidon, PreimagePoK, Ready, ReedSolomonCodec, Retry, Space as Room, SerializeMessage, SessionState, ShardClient, SharedSpaceClient, Space, SpaceKeyring, SpaceNamespace, SpacePacketCipher, StorageNamespace, WSTransport, ZkAuth, _accountId, _formatBytes, _messageId, _objectId, _packetId, _socketId, _userId, appLogger$1 as appLogger, assertType, base58Decode, base58Encode, buildCommitment, compilePrograms, concatBytes, decodeFromHex, decorators, decryptAesGcm, defaultCircuitUrls, defaultSessionStore, deriveAesKeyFromPassphrase, deriveBitsHkdf, deriveIdentity, deserialize, encodeToHex, encryptAesGcm, exportPublicKeyBase64, exportPublicKeyHex, fromBase64, fromBase64Url, fromHex, generateAuthProof, generateChecksum, generateId, getIPAddress, getId, getSubtle, initBn128Wasm, initRsWasm, initializeCircuits, isNumber, log, manifestToStat, poseidonHash, quickVerify, randomBytes, serialize, shardHash, signMessage, toBase64, toBase64Url, toField, toHex, unwrapWithPassphrase, utf8Decode, utf8Encode, verify, verifyChecksum, verifyGroth16, verifyHashKnowledge, verifyPreimagePoK, wrapWithPassphrase };
|
|
7135
7392
|
//# sourceMappingURL=index.js.map
|