@parall/daemon 1.55.4 → 1.56.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.
@@ -178,11 +178,34 @@ var init_browser_viewer = __esm({
178
178
  }
179
179
  });
180
180
 
181
+ // ts/sdk/dist/attachment-types.js
182
+ var init_attachment_types = __esm({
183
+ "ts/sdk/dist/attachment-types.js"() {
184
+ "use strict";
185
+ }
186
+ });
187
+
188
+ // ts/sdk/dist/attachment-endpoints.js
189
+ function attachmentEndpoints(apiBase) {
190
+ return {
191
+ UPLOAD_PRESIGN: (orgId) => `${apiBase}/orgs/${orgId}/upload/presign`,
192
+ UPLOAD_COMPLETE: (orgId) => `${apiBase}/orgs/${orgId}/upload/complete`,
193
+ UPLOAD_ABORT: (orgId) => `${apiBase}/orgs/${orgId}/upload/abort`,
194
+ FILE: (id) => `${apiBase}/files/${id}`
195
+ };
196
+ }
197
+ var init_attachment_endpoints = __esm({
198
+ "ts/sdk/dist/attachment-endpoints.js"() {
199
+ "use strict";
200
+ }
201
+ });
202
+
181
203
  // ts/sdk/dist/constants.js
182
204
  var API_BASE, WIKI_BASE, CLIP_BASE, ENDPOINTS, WS_EVENTS;
183
205
  var init_constants = __esm({
184
206
  "ts/sdk/dist/constants.js"() {
185
207
  "use strict";
208
+ init_attachment_endpoints();
186
209
  API_BASE = "/api/v1";
187
210
  WIKI_BASE = "/wiki/v1";
188
211
  CLIP_BASE = "/clip/v1";
@@ -254,9 +277,7 @@ var init_constants = __esm({
254
277
  MESSAGE_REACTIONS: (id) => `${API_BASE}/messages/${id}/reactions`,
255
278
  MESSAGE_REACTION: (id, emoji) => `${API_BASE}/messages/${id}/reactions/${encodeURIComponent(emoji)}`,
256
279
  // Upload (org-scoped)
257
- UPLOAD_PRESIGN: (orgId) => `${API_BASE}/orgs/${orgId}/upload/presign`,
258
- UPLOAD_COMPLETE: (orgId) => `${API_BASE}/orgs/${orgId}/upload/complete`,
259
- FILE: (id) => `${API_BASE}/files/${id}`,
280
+ ...attachmentEndpoints(API_BASE),
260
281
  // Approval requests (org-scoped)
261
282
  APPROVAL_REQUESTS: (orgId) => `${API_BASE}/orgs/${orgId}/approval-requests`,
262
283
  // Approvals (global)
@@ -342,6 +363,7 @@ var init_constants = __esm({
342
363
  TASKS: (orgId) => `${API_BASE}/orgs/${orgId}/tasks`,
343
364
  TASK_SUBTASK_SUMMARY: (orgId) => `${API_BASE}/orgs/${orgId}/tasks/subtask-summary`,
344
365
  TASK: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}`,
366
+ TASK_MOVE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/move`,
345
367
  TASK_ARCHIVE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/archive`,
346
368
  TASK_RESTORE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/restore`,
347
369
  TASK_WATCH: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/watch`,
@@ -437,6 +459,8 @@ var init_constants = __esm({
437
459
  // backend router so `deleted` isn't captured as a {wikiId}; the SDK builder
438
460
  // is just a string.
439
461
  WIKIS_DELETED: (orgId) => `${WIKI_BASE}/orgs/${orgId}/wikis/deleted`,
462
+ // Org-wide changeset listing across readable wikis (Working on tab).
463
+ WIKI_ORG_CHANGESETS: (orgId) => `${WIKI_BASE}/orgs/${orgId}/wiki-changesets`,
440
464
  // Detail URL — also reused for DELETE (soft-delete) and `${WIKI}/restore`.
441
465
  WIKI: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}`,
442
466
  WIKI_RESTORE: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/restore`,
@@ -466,6 +490,12 @@ var init_constants = __esm({
466
490
  // Wiki Path Restrictions (AFCS narrowing ACL — private subtrees)
467
491
  WIKI_RESTRICTIONS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/restrictions`,
468
492
  WIKI_RESTRICTION: (orgId, wikiId, restrictionId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/restrictions/${restrictionId}`,
493
+ WIKI_ACCESS_POLICY: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-policy`,
494
+ WIKI_ACCESS_POLICY_MEMBERS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-policy/members`,
495
+ WIKI_MEMBERSHIP_SELF: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/membership/self`,
496
+ // Library-level star (self-scoped bookmark; POST = star, DELETE = unstar).
497
+ WIKI_STARS_SELF: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/stars/self`,
498
+ WIKI_MEMBERS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/members`,
469
499
  WIKI_ACCESS_STATUS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-status`,
470
500
  WIKI_ACCESS_REQUESTS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-requests`,
471
501
  // Wiki History (commits, file commits, blame)
@@ -586,6 +616,21 @@ var init_constants = __esm({
586
616
  ORG_EDGE_DEVICE_UNREGISTER: (orgId, edgeId) => `/api/v1/orgs/${orgId}/edge/${edgeId}/unregister`,
587
617
  ORG_EDGE_ONBOARDING: (orgId) => `/api/v1/orgs/${orgId}/edge/onboarding`,
588
618
  ORG_EDGE_PROFILES: (orgId, edgeId) => `/api/v1/orgs/${orgId}/edge/${edgeId}/profiles`,
619
+ ORG_EDGE_PROFILE_OPERATIONS: (orgId, edgeId) => `/api/v1/orgs/${orgId}/edge/${edgeId}/profile-operations`,
620
+ ORG_EDGE_PROFILE_OPERATION: (orgId, edgeId, operationId) => `/api/v1/orgs/${orgId}/edge/${edgeId}/profile-operations/${operationId}`,
621
+ ORG_EDGE_PROFILE_OPERATION_CONFIRM: (orgId, edgeId, operationId) => `/api/v1/orgs/${orgId}/edge/${edgeId}/profile-operations/${operationId}/confirm`,
622
+ ORG_BROWSER_ALIASES: (orgId) => `/api/v1/orgs/${orgId}/browser-aliases`,
623
+ ORG_BROWSER_ALIAS: (orgId, aliasId) => `/api/v1/orgs/${orgId}/browser-aliases/${aliasId}`,
624
+ ORG_BROWSER_ALIAS_READINESS_CHECKS: (orgId, aliasId) => `/api/v1/orgs/${orgId}/browser-aliases/${aliasId}/readiness-checks`,
625
+ ORG_BROWSER_ALIAS_READINESS_CHECK: (orgId, aliasId, checkId) => `/api/v1/orgs/${orgId}/browser-aliases/${aliasId}/readiness-checks/${checkId}`,
626
+ ORG_API_KEY_BROWSER_ALIAS_GRANTS: (orgId, keyId) => `/api/v1/orgs/${orgId}/api-keys/${keyId}/browser-alias-grants`,
627
+ ORG_API_KEY_BROWSER_ALIAS_GRANT: (orgId, keyId, aliasId) => `/api/v1/orgs/${orgId}/api-keys/${keyId}/browser-alias-grants/${aliasId}`,
628
+ ORG_MANAGED_ALIASES: (orgId) => `/api/v1/orgs/${orgId}/aliases`,
629
+ ORG_MANAGED_ALIAS: (orgId, aliasName) => `/api/v1/orgs/${orgId}/aliases/${encodeURIComponent(aliasName)}`,
630
+ ORG_BROWSER_ALIAS_EXECUTIONS: (orgId) => `/api/v1/orgs/${orgId}/executions`,
631
+ ORG_BROWSER_ALIAS_EXECUTION: (orgId, requestId) => `/api/v1/orgs/${orgId}/executions/${encodeURIComponent(requestId)}`,
632
+ ORG_BROWSER_USE_OPERATIONS: (orgId) => `/api/v1/orgs/${orgId}/browser-use/operations`,
633
+ ORG_BROWSER_USE_OPERATION: (orgId, operationId) => `/api/v1/orgs/${orgId}/browser-use/operations/${encodeURIComponent(operationId)}`,
589
634
  // Per-profile egress proxy (hosted Cloud Profiles; manager-only, human-only).
590
635
  ORG_EDGE_PROFILE_PROXY: (orgId, edgeId, profileName) => `/api/v1/orgs/${orgId}/edge/${edgeId}/profiles/${encodeURIComponent(profileName)}/proxy`,
591
636
  // Per-profile one-shot cookie seed (hosted Cloud Profiles; manager-only,
@@ -600,6 +645,8 @@ var init_constants = __esm({
600
645
  CLIP_CONNECTION: (orgId, connId) => `/api/v1/orgs/${orgId}/clip-connections/${connId}`,
601
646
  // Clip registry (v3, org-scoped, served by api-server — `crg_` entries)
602
647
  ORG_CLIP_REGISTRY: (orgId) => `/api/v1/orgs/${orgId}/clip-registry`,
648
+ ORG_CLIP_REGISTRY_RESOLVE: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/resolve`,
649
+ ORG_CLIP_REGISTRY_SEARCH: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/search`,
603
650
  ORG_CLIP_REGISTRY_CLIP: (orgId, clipId) => `/api/v1/orgs/${orgId}/clip-registry/${clipId}`,
604
651
  ORG_CLIP_REGISTRY_PUBLISH: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/publish`,
605
652
  ORG_CLIP_INSTALL: (orgId) => `/api/v1/orgs/${orgId}/clips/install`,
@@ -740,6 +787,15 @@ var init_project_task_client = __esm({
740
787
  async deleteTask(orgId, taskId, opts) {
741
788
  return this.request("DELETE", ENDPOINTS.TASK(orgId, taskId), void 0, opts?.force ? { force: "true" } : void 0);
742
789
  }
790
+ /**
791
+ * Moves a task and its whole subtree into another project (renumbering it
792
+ * there; old identifiers stay resolvable as aliases). The caller needs
793
+ * update access on the task (source project membership) and read access to
794
+ * the target project.
795
+ */
796
+ async moveTask(orgId, taskId, data) {
797
+ return this.request("POST", ENDPOINTS.TASK_MOVE(orgId, taskId), data);
798
+ }
743
799
  async archiveTask(orgId, taskId) {
744
800
  return this.request("POST", ENDPOINTS.TASK_ARCHIVE(orgId, taskId));
745
801
  }
@@ -961,6 +1017,50 @@ var init_wechat_client = __esm({
961
1017
  }
962
1018
  });
963
1019
 
1020
+ // ts/sdk/dist/attachment-client.js
1021
+ function isRetryableCompletionError(error) {
1022
+ if (!error || typeof error !== "object" || !("status" in error))
1023
+ return false;
1024
+ const status = error.status;
1025
+ return status === 0 || typeof status === "number" && status >= 500;
1026
+ }
1027
+ var COMPLETION_RETRY_DELAYS_MS, AttachmentClient;
1028
+ var init_attachment_client = __esm({
1029
+ "ts/sdk/dist/attachment-client.js"() {
1030
+ "use strict";
1031
+ init_constants();
1032
+ init_wechat_client();
1033
+ COMPLETION_RETRY_DELAYS_MS = [250, 750];
1034
+ AttachmentClient = class extends WechatClient {
1035
+ async getUploadPresignUrl(orgId, req) {
1036
+ return this.request("POST", ENDPOINTS.UPLOAD_PRESIGN(orgId), req);
1037
+ }
1038
+ async completeUpload(orgId, attachmentId, parts) {
1039
+ const body = {
1040
+ attachment_id: attachmentId,
1041
+ parts
1042
+ };
1043
+ for (let attempt = 0; ; attempt += 1) {
1044
+ try {
1045
+ return await this.request("POST", ENDPOINTS.UPLOAD_COMPLETE(orgId), body);
1046
+ } catch (error) {
1047
+ const delay = COMPLETION_RETRY_DELAYS_MS[attempt];
1048
+ if (delay === void 0 || !isRetryableCompletionError(error))
1049
+ throw error;
1050
+ await new Promise((resolve9) => setTimeout(resolve9, delay));
1051
+ }
1052
+ }
1053
+ }
1054
+ async abortUpload(orgId, attachmentId) {
1055
+ return this.request("POST", ENDPOINTS.UPLOAD_ABORT(orgId), { attachment_id: attachmentId });
1056
+ }
1057
+ async getFileUrl(id, opts) {
1058
+ return this.request("GET", ENDPOINTS.FILE(id), void 0, opts?.download ? { download: true } : void 0);
1059
+ }
1060
+ };
1061
+ }
1062
+ });
1063
+
964
1064
  // ts/sdk/dist/client.js
965
1065
  function normalizeWikiChangeset(changeset) {
966
1066
  return {
@@ -1005,8 +1105,8 @@ var init_client = __esm({
1005
1105
  "use strict";
1006
1106
  init_browser_viewer();
1007
1107
  init_constants();
1008
- init_wechat_client();
1009
- ParallClient = class _ParallClient extends WechatClient {
1108
+ init_attachment_client();
1109
+ ParallClient = class _ParallClient extends AttachmentClient {
1010
1110
  baseUrl;
1011
1111
  wikiBaseUrl;
1012
1112
  token;
@@ -1653,16 +1753,6 @@ var init_client = __esm({
1653
1753
  const res = await this.request("GET", ENDPOINTS.MESSAGE_REACTIONS(messageId));
1654
1754
  return res.reactions;
1655
1755
  }
1656
- // ---- File Upload ----
1657
- async getUploadPresignUrl(orgId, req) {
1658
- return this.request("POST", ENDPOINTS.UPLOAD_PRESIGN(orgId), req);
1659
- }
1660
- async completeUpload(orgId, attachmentId) {
1661
- return this.request("POST", ENDPOINTS.UPLOAD_COMPLETE(orgId), { attachment_id: attachmentId });
1662
- }
1663
- async getFileUrl(id, opts) {
1664
- return this.request("GET", ENDPOINTS.FILE(id), void 0, opts?.download ? { download: true } : void 0);
1665
- }
1666
1756
  // ---- Approvals ----
1667
1757
  async getApproval(id) {
1668
1758
  return this.request("GET", ENDPOINTS.APPROVAL(id));
@@ -1670,8 +1760,14 @@ var init_client = __esm({
1670
1760
  async requestApproval(orgId, req) {
1671
1761
  return this.request("POST", ENDPOINTS.APPROVAL_REQUESTS(orgId), req);
1672
1762
  }
1673
- async decideApproval(id, decision) {
1674
- return this.request("POST", ENDPOINTS.APPROVAL_DECIDE(id), { decision });
1763
+ async decideApproval(id, decision, reason) {
1764
+ if (decision === "approve" && reason?.trim()) {
1765
+ throw new ApiError(400, "Approval reason is only allowed for rejection decisions", "INVALID_DECISION_REASON");
1766
+ }
1767
+ return this.request("POST", ENDPOINTS.APPROVAL_DECIDE(id), {
1768
+ decision,
1769
+ ...decision === "reject" && reason !== void 0 ? { reason } : {}
1770
+ });
1675
1771
  }
1676
1772
  async cancelApproval(id) {
1677
1773
  return this.request("POST", ENDPOINTS.APPROVAL_CANCEL(id));
@@ -2504,6 +2600,17 @@ var init_client = __esm({
2504
2600
  const res = await this.request("GET", ENDPOINTS.WIKI_CHANGESETS(orgId, wikiId));
2505
2601
  return res.data.map(normalizeWikiChangeset);
2506
2602
  }
2603
+ /** Org-wide changeset listing across every wiki the caller can read.
2604
+ * Server default (no `status`) is the pending set: proposed,
2605
+ * approval_pending, approved. */
2606
+ async getOrgWikiChangesets(orgId, opts) {
2607
+ const params = new URLSearchParams();
2608
+ for (const s of opts?.status ?? [])
2609
+ params.append("status", s);
2610
+ const qs = params.toString();
2611
+ const res = await this.request("GET", `${ENDPOINTS.WIKI_ORG_CHANGESETS(orgId)}${qs ? `?${qs}` : ""}`);
2612
+ return (res.data ?? []).map(normalizeWikiChangeset);
2613
+ }
2507
2614
  async getWikiChangeset(orgId, wikiId, changesetId) {
2508
2615
  return normalizeWikiChangeset(await this.request("GET", ENDPOINTS.WIKI_CHANGESET(orgId, wikiId, changesetId)));
2509
2616
  }
@@ -2592,6 +2699,46 @@ var init_client = __esm({
2592
2699
  async getWikiAccessStatus(orgId, wikiId, path23) {
2593
2700
  return this.request("GET", ENDPOINTS.WIKI_ACCESS_STATUS(orgId, wikiId), void 0, path23 ? { path: path23 } : void 0);
2594
2701
  }
2702
+ // ---- Wiki membership projection (who-can-access, invites, join/leave) ----
2703
+ async getWikiAccessPolicy(orgId, wikiId, path23 = "") {
2704
+ return this.request("GET", ENDPOINTS.WIKI_ACCESS_POLICY(orgId, wikiId), void 0, path23 ? { path: path23 } : void 0);
2705
+ }
2706
+ async putWikiAccessPolicy(orgId, wikiId, policy) {
2707
+ return this.request("PUT", ENDPOINTS.WIKI_ACCESS_POLICY(orgId, wikiId), policy);
2708
+ }
2709
+ /** Add-only invite (viewer/editor); allowed for managers, and for editors
2710
+ * when the library enables editors_can_invite. */
2711
+ async addWikiMember(orgId, wikiId, subject, role) {
2712
+ await this.request("POST", ENDPOINTS.WIKI_ACCESS_POLICY_MEMBERS(orgId, wikiId), {
2713
+ subject,
2714
+ role
2715
+ });
2716
+ }
2717
+ /** Join a PUBLIC library as an explicit member (lands at the library's
2718
+ * default role). Restricted libraries answer 409 JOIN_REQUIRES_REQUEST —
2719
+ * go through createWikiAccessRequest instead. */
2720
+ async joinWiki(orgId, wikiId) {
2721
+ await this.request("POST", ENDPOINTS.WIKI_MEMBERSHIP_SELF(orgId, wikiId));
2722
+ }
2723
+ /** Remove the caller's explicit membership (team-granted membership stays). */
2724
+ async leaveWiki(orgId, wikiId) {
2725
+ await this.request("DELETE", ENDPOINTS.WIKI_MEMBERSHIP_SELF(orgId, wikiId));
2726
+ }
2727
+ /** Star a library for the caller (sidebar Starred group). Idempotent —
2728
+ * re-starring is a 204 no-op. Requires read access; hidden private
2729
+ * libraries answer 404 like absent IDs. */
2730
+ async starWiki(orgId, wikiId) {
2731
+ await this.request("POST", ENDPOINTS.WIKI_STARS_SELF(orgId, wikiId));
2732
+ }
2733
+ /** Remove the caller's star. Idempotent — unstarring a never-starred
2734
+ * library is a 204 no-op. */
2735
+ async unstarWiki(orgId, wikiId) {
2736
+ await this.request("DELETE", ENDPOINTS.WIKI_STARS_SELF(orgId, wikiId));
2737
+ }
2738
+ async getWikiMembers(orgId, wikiId) {
2739
+ const res = await this.request("GET", ENDPOINTS.WIKI_MEMBERS(orgId, wikiId));
2740
+ return res.data ?? [];
2741
+ }
2595
2742
  async createWikiAccessRequest(orgId, wikiId, data) {
2596
2743
  await this.request("POST", ENDPOINTS.WIKI_ACCESS_REQUESTS(orgId, wikiId), data);
2597
2744
  }
@@ -2941,6 +3088,31 @@ var init_client = __esm({
2941
3088
  const resp = await this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY(orgId)}?limit=100`);
2942
3089
  return resp ?? [];
2943
3090
  }
3091
+ /**
3092
+ * Resolve an exact `<publisher org, name>` reference to its registry entry —
3093
+ * the npm-style point read. Deliberately independent of catalog size: no
3094
+ * Search, no pagination, same read-visibility boundary as `getRegistryClip`
3095
+ * (cross-org requires public + approved). 404 `NOT_FOUND` when the publisher
3096
+ * org has no visible clip of that exact name.
3097
+ */
3098
+ async resolveRegistryClip(orgId, publisherOrgId, name) {
3099
+ const params = new URLSearchParams({ org_id: publisherOrgId, name });
3100
+ return this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY_RESOLVE(orgId)}?${params}`);
3101
+ }
3102
+ /**
3103
+ * Server-side fuzzy discovery over the visible registry (name/description
3104
+ * substring match), paginated. The discovery verb: rows carry the `crg_` id
3105
+ * that {@link installRegistryClip} takes.
3106
+ */
3107
+ async searchOrgRegistryClips(orgId, query, opts) {
3108
+ const params = new URLSearchParams({ q: query });
3109
+ if (opts?.limit !== void 0)
3110
+ params.set("limit", String(opts.limit));
3111
+ if (opts?.offset !== void 0)
3112
+ params.set("offset", String(opts.offset));
3113
+ const resp = await this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY_SEARCH(orgId)}?${params}`);
3114
+ return resp ?? [];
3115
+ }
2944
3116
  /**
2945
3117
  * Install a registry clip into the org (a reference in `clip_installs`, not a
2946
3118
  * copy). Idempotent: installing an already-installed clip returns the same
@@ -3054,6 +3226,86 @@ var init_client = __esm({
3054
3226
  async listEdgeProfiles(orgId, edgeId) {
3055
3227
  return this.request("GET", ENDPOINTS.ORG_EDGE_PROFILES(orgId, edgeId));
3056
3228
  }
3229
+ /** Start one durable Local BYOC Profile operation. Network-unknown callers
3230
+ * must retry with the same key or recover by operation id; a different body
3231
+ * under the same key is rejected. */
3232
+ async createEdgeProfileOperation(orgId, edgeId, request3, idempotencyKey) {
3233
+ return this.request("POST", ENDPOINTS.ORG_EDGE_PROFILE_OPERATIONS(orgId, edgeId), request3, void 0, false, { headers: { "Idempotency-Key": idempotencyKey } });
3234
+ }
3235
+ /** Strong-confirm the exact durable Delete impact. A changed impact returns
3236
+ * PROFILE_DELETE_IMPACT_CHANGED with a replacement receipt in
3237
+ * `ApiError.extras.details.operation`. */
3238
+ async confirmEdgeProfileOperation(orgId, edgeId, operationId, request3) {
3239
+ return this.request("POST", ENDPOINTS.ORG_EDGE_PROFILE_OPERATION_CONFIRM(orgId, edgeId, operationId), request3);
3240
+ }
3241
+ /** Sole read/recovery surface. The server may reconcile an already durable
3242
+ * dispatch/finalization while returning this receipt. */
3243
+ async getEdgeProfileOperation(orgId, edgeId, operationId) {
3244
+ return this.request("GET", ENDPOINTS.ORG_EDGE_PROFILE_OPERATION(orgId, edgeId, operationId));
3245
+ }
3246
+ /** Create and atomically materialize one Local BYOC Browser Alias. A replay
3247
+ * with the same idempotency key and body returns the original stable ccn_. */
3248
+ async createBrowserAlias(orgId, request3) {
3249
+ return this.request("POST", ENDPOINTS.ORG_BROWSER_ALIASES(orgId), request3);
3250
+ }
3251
+ async listBrowserAliases(orgId) {
3252
+ return this.request("GET", ENDPOINTS.ORG_BROWSER_ALIASES(orgId));
3253
+ }
3254
+ async getBrowserAlias(orgId, aliasId) {
3255
+ return this.request("GET", ENDPOINTS.ORG_BROWSER_ALIAS(orgId, aliasId));
3256
+ }
3257
+ async renameBrowserAlias(orgId, aliasId, request3) {
3258
+ return this.request("PATCH", ENDPOINTS.ORG_BROWSER_ALIAS(orgId, aliasId), request3);
3259
+ }
3260
+ async deleteBrowserAlias(orgId, aliasId, request3) {
3261
+ return this.request("DELETE", ENDPOINTS.ORG_BROWSER_ALIAS(orgId, aliasId), request3);
3262
+ }
3263
+ /** Start one durable readiness check. The key is carried as the standard
3264
+ * Idempotency-Key header; the request body is intentionally empty. */
3265
+ async createBrowserAliasReadinessCheck(orgId, aliasId, request3) {
3266
+ return this.request("POST", ENDPOINTS.ORG_BROWSER_ALIAS_READINESS_CHECKS(orgId, aliasId), void 0, void 0, false, { headers: { "Idempotency-Key": request3.idempotency_key } });
3267
+ }
3268
+ /** Sole durable recovery surface for one readiness request. */
3269
+ async getBrowserAliasReadinessCheck(orgId, aliasId, checkId) {
3270
+ return this.request("GET", ENDPOINTS.ORG_BROWSER_ALIAS_READINESS_CHECK(orgId, aliasId, checkId));
3271
+ }
3272
+ /** Organization Owner view. Hashes, reviewed snapshots and deltas are
3273
+ * intentionally available only on this human-JWT management surface. */
3274
+ async listBrowserAliasGrants(orgId, keyId) {
3275
+ return this.request("GET", ENDPOINTS.ORG_API_KEY_BROWSER_ALIAS_GRANTS(orgId, keyId));
3276
+ }
3277
+ async getBrowserAliasGrant(orgId, keyId, aliasId) {
3278
+ return this.request("GET", ENDPOINTS.ORG_API_KEY_BROWSER_ALIAS_GRANT(orgId, keyId, aliasId));
3279
+ }
3280
+ async replaceBrowserAliasGrant(orgId, keyId, aliasId, request3) {
3281
+ return this.request("PUT", ENDPOINTS.ORG_API_KEY_BROWSER_ALIAS_GRANT(orgId, keyId, aliasId), request3);
3282
+ }
3283
+ /** Managed-key discovery. The response is already grant-filtered and never
3284
+ * carries contract hashes, review snapshots, Edge IDs or Profile IDs. */
3285
+ async listManagedBrowserAliases(orgId) {
3286
+ return this.request("GET", ENDPOINTS.ORG_MANAGED_ALIASES(orgId));
3287
+ }
3288
+ async getManagedBrowserAlias(orgId, aliasName) {
3289
+ return this.request("GET", ENDPOINTS.ORG_MANAGED_ALIAS(orgId, aliasName));
3290
+ }
3291
+ /** Accept and dispatch one @alias command. request_id is generated by the
3292
+ * caller before local validation and is also the sole durable recovery key. */
3293
+ async createBrowserAliasExecution(orgId, request3) {
3294
+ return this.request("POST", ENDPOINTS.ORG_BROWSER_ALIAS_EXECUTIONS(orgId), request3);
3295
+ }
3296
+ async getBrowserAliasExecution(orgId, requestId) {
3297
+ return this.request("GET", ENDPOINTS.ORG_BROWSER_ALIAS_EXECUTION(orgId, requestId));
3298
+ }
3299
+ /** Accept one idempotent Browser Use operation for an explicit Profile.
3300
+ * The Server resolves Profile→Edge; callers never select an Edge directly. */
3301
+ async createBrowserUseOperation(orgId, request3) {
3302
+ return this.request("POST", ENDPOINTS.ORG_BROWSER_USE_OPERATIONS(orgId), request3);
3303
+ }
3304
+ /** Recover the durable receipt. Successful data is present only inside the
3305
+ * Server's short encrypted result TTL; terminal proof remains afterwards. */
3306
+ async getBrowserUseOperation(orgId, operationId) {
3307
+ return this.request("GET", ENDPOINTS.ORG_BROWSER_USE_OPERATION(orgId, operationId));
3308
+ }
3057
3309
  /**
3058
3310
  * Read a hosted Cloud Profile's egress-proxy status (manager-only: hosted
3059
3311
  * human maintainer or org admin). Sanitized — the password never comes back.
@@ -3663,6 +3915,7 @@ var init_dist = __esm({
3663
3915
  "ts/sdk/dist/index.js"() {
3664
3916
  "use strict";
3665
3917
  init_browser_viewer();
3918
+ init_attachment_types();
3666
3919
  init_client();
3667
3920
  init_constants();
3668
3921
  init_subject();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parall/daemon",
3
- "version": "1.55.4",
3
+ "version": "1.56.0",
4
4
  "description": "Parall local agent runtime — daemon supervisor + bridge runtimes, bundled as standalone JS files",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -33,11 +33,11 @@
33
33
  "@aws-sdk/client-s3": "3.984.0",
34
34
  "@pinixai/bb-browser-pro": "0.15.0",
35
35
  "ws": "^8.18.0",
36
- "@parall/agent-core": "1.55.4",
37
- "@parall/sdk": "1.55.4",
38
- "@parall/claude-agent": "1.55.4",
39
- "@parall/codex-agent": "1.55.4",
40
- "@parall/openclaw-agent": "1.55.4"
36
+ "@parall/agent-core": "1.56.0",
37
+ "@parall/sdk": "1.56.0",
38
+ "@parall/claude-agent": "1.56.0",
39
+ "@parall/codex-agent": "1.56.0",
40
+ "@parall/openclaw-agent": "1.56.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/node": "^22.0.0",