@parall/daemon 1.55.5 → 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.
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.55.5",
3
- "built_at": "2026-08-19T09:00:25.731Z",
2
+ "version": "1.56.0",
3
+ "built_at": "2026-08-20T12:13:18.765Z",
4
4
  "min_node_version": "20.0.0",
5
5
  "files": {
6
6
  "bb-browser-daemon.js": {
@@ -16,29 +16,29 @@
16
16
  "size": 18
17
17
  },
18
18
  "parall-browser-pod.js": {
19
- "sha256": "d8e29aebf550cf44b7c8f88b78ce87e9a65ed278e0c54226d99e84ea5646e430",
20
- "size": 2957682
19
+ "sha256": "29465ed25d7eaa9f7f6e35345f0501594fafa0c885a4ad8bc9712aa6a20fac6b",
20
+ "size": 2961071
21
21
  },
22
22
  "parall-channel-exec.js": {
23
23
  "sha256": "7c2a6e12483a45e9eb4a42cd7d4cdd3c4fa21dd09ac1347d9a3e177b4ddee930",
24
24
  "size": 7220
25
25
  },
26
26
  "parall-claude-agent.js": {
27
- "sha256": "f0ddfbcf097f1e337c1441f92c267b054fa1742cc8712d387ba71beb5748241f",
28
- "size": 2833131
27
+ "sha256": "4ccbdb9f93cb2adeea7313b4391c471c0df150a185fb91b439c59274abfff506",
28
+ "size": 2838235
29
29
  },
30
30
  "parall-codex-agent.js": {
31
- "sha256": "3cabe812d9db0d281b9962e1c086b377bb1d8fbd063f962450d0b0f1b1f4c56e",
32
- "size": 2865078
31
+ "sha256": "a0dd40e7a27785f60ca8fff9a1c158203f5381447223dad3374811ec22ca1da5",
32
+ "size": 2870182
33
33
  },
34
34
  "parall-daemon.js": {
35
- "sha256": "f808002af2072ee6e148e6c66145ee593a403e195d36501f6334c7a62e99083a",
36
- "size": 3024616
35
+ "sha256": "0f149f68323a5013c1afc5ddc3de6f1cd94b5005dac905ac2142f85fe7987ee9",
36
+ "size": 3028253
37
37
  },
38
38
  "parall-openclaw-agent.js": {
39
39
  "sha256": "856a1c3a9ae0ffef8efe2481fa1171dbeb1d67cccb88616aa9bf16da96a69355",
40
40
  "size": 9923
41
41
  }
42
42
  },
43
- "signature": "z3Biqj/B7cQM1ouwkrPkezIlKPIoOCzqmHBhf9eXdB2nPGpZWFPumTFI0i845pHcg6MH398RHxHq9SIrHX6JCQ=="
43
+ "signature": "WXtWlGYLvRViBXtS33ZMXudumDWb7pcc8PkegD7b6DIONYlVsnlLWxqbpuA2o7S7g6poInLXWY0LTt+I1RIGAQ=="
44
44
  }
@@ -63701,6 +63701,7 @@ var ENDPOINTS = {
63701
63701
  TASKS: (orgId) => `${API_BASE}/orgs/${orgId}/tasks`,
63702
63702
  TASK_SUBTASK_SUMMARY: (orgId) => `${API_BASE}/orgs/${orgId}/tasks/subtask-summary`,
63703
63703
  TASK: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}`,
63704
+ TASK_MOVE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/move`,
63704
63705
  TASK_ARCHIVE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/archive`,
63705
63706
  TASK_RESTORE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/restore`,
63706
63707
  TASK_WATCH: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/watch`,
@@ -63830,6 +63831,8 @@ var ENDPOINTS = {
63830
63831
  WIKI_ACCESS_POLICY: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-policy`,
63831
63832
  WIKI_ACCESS_POLICY_MEMBERS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-policy/members`,
63832
63833
  WIKI_MEMBERSHIP_SELF: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/membership/self`,
63834
+ // Library-level star (self-scoped bookmark; POST = star, DELETE = unstar).
63835
+ WIKI_STARS_SELF: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/stars/self`,
63833
63836
  WIKI_MEMBERS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/members`,
63834
63837
  WIKI_ACCESS_STATUS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-status`,
63835
63838
  WIKI_ACCESS_REQUESTS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-requests`,
@@ -63964,6 +63967,8 @@ var ENDPOINTS = {
63964
63967
  ORG_MANAGED_ALIAS: (orgId, aliasName) => `/api/v1/orgs/${orgId}/aliases/${encodeURIComponent(aliasName)}`,
63965
63968
  ORG_BROWSER_ALIAS_EXECUTIONS: (orgId) => `/api/v1/orgs/${orgId}/executions`,
63966
63969
  ORG_BROWSER_ALIAS_EXECUTION: (orgId, requestId) => `/api/v1/orgs/${orgId}/executions/${encodeURIComponent(requestId)}`,
63970
+ ORG_BROWSER_USE_OPERATIONS: (orgId) => `/api/v1/orgs/${orgId}/browser-use/operations`,
63971
+ ORG_BROWSER_USE_OPERATION: (orgId, operationId) => `/api/v1/orgs/${orgId}/browser-use/operations/${encodeURIComponent(operationId)}`,
63967
63972
  // Per-profile egress proxy (hosted Cloud Profiles; manager-only, human-only).
63968
63973
  ORG_EDGE_PROFILE_PROXY: (orgId, edgeId, profileName) => `/api/v1/orgs/${orgId}/edge/${edgeId}/profiles/${encodeURIComponent(profileName)}/proxy`,
63969
63974
  // Per-profile one-shot cookie seed (hosted Cloud Profiles; manager-only,
@@ -63978,6 +63983,8 @@ var ENDPOINTS = {
63978
63983
  CLIP_CONNECTION: (orgId, connId) => `/api/v1/orgs/${orgId}/clip-connections/${connId}`,
63979
63984
  // Clip registry (v3, org-scoped, served by api-server — `crg_` entries)
63980
63985
  ORG_CLIP_REGISTRY: (orgId) => `/api/v1/orgs/${orgId}/clip-registry`,
63986
+ ORG_CLIP_REGISTRY_RESOLVE: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/resolve`,
63987
+ ORG_CLIP_REGISTRY_SEARCH: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/search`,
63981
63988
  ORG_CLIP_REGISTRY_CLIP: (orgId, clipId) => `/api/v1/orgs/${orgId}/clip-registry/${clipId}`,
63982
63989
  ORG_CLIP_REGISTRY_PUBLISH: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/publish`,
63983
63990
  ORG_CLIP_INSTALL: (orgId) => `/api/v1/orgs/${orgId}/clips/install`,
@@ -64020,6 +64027,15 @@ var ProjectTaskClient = class {
64020
64027
  async deleteTask(orgId, taskId, opts) {
64021
64028
  return this.request("DELETE", ENDPOINTS.TASK(orgId, taskId), void 0, opts?.force ? { force: "true" } : void 0);
64022
64029
  }
64030
+ /**
64031
+ * Moves a task and its whole subtree into another project (renumbering it
64032
+ * there; old identifiers stay resolvable as aliases). The caller needs
64033
+ * update access on the task (source project membership) and read access to
64034
+ * the target project.
64035
+ */
64036
+ async moveTask(orgId, taskId, data2) {
64037
+ return this.request("POST", ENDPOINTS.TASK_MOVE(orgId, taskId), data2);
64038
+ }
64023
64039
  async archiveTask(orgId, taskId) {
64024
64040
  return this.request("POST", ENDPOINTS.TASK_ARCHIVE(orgId, taskId));
64025
64041
  }
@@ -65878,6 +65894,17 @@ var ParallClient = class _ParallClient extends AttachmentClient {
65878
65894
  async leaveWiki(orgId, wikiId) {
65879
65895
  await this.request("DELETE", ENDPOINTS.WIKI_MEMBERSHIP_SELF(orgId, wikiId));
65880
65896
  }
65897
+ /** Star a library for the caller (sidebar Starred group). Idempotent —
65898
+ * re-starring is a 204 no-op. Requires read access; hidden private
65899
+ * libraries answer 404 like absent IDs. */
65900
+ async starWiki(orgId, wikiId) {
65901
+ await this.request("POST", ENDPOINTS.WIKI_STARS_SELF(orgId, wikiId));
65902
+ }
65903
+ /** Remove the caller's star. Idempotent — unstarring a never-starred
65904
+ * library is a 204 no-op. */
65905
+ async unstarWiki(orgId, wikiId) {
65906
+ await this.request("DELETE", ENDPOINTS.WIKI_STARS_SELF(orgId, wikiId));
65907
+ }
65881
65908
  async getWikiMembers(orgId, wikiId) {
65882
65909
  const res = await this.request("GET", ENDPOINTS.WIKI_MEMBERS(orgId, wikiId));
65883
65910
  return res.data ?? [];
@@ -66231,6 +66258,31 @@ var ParallClient = class _ParallClient extends AttachmentClient {
66231
66258
  const resp = await this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY(orgId)}?limit=100`);
66232
66259
  return resp ?? [];
66233
66260
  }
66261
+ /**
66262
+ * Resolve an exact `<publisher org, name>` reference to its registry entry —
66263
+ * the npm-style point read. Deliberately independent of catalog size: no
66264
+ * Search, no pagination, same read-visibility boundary as `getRegistryClip`
66265
+ * (cross-org requires public + approved). 404 `NOT_FOUND` when the publisher
66266
+ * org has no visible clip of that exact name.
66267
+ */
66268
+ async resolveRegistryClip(orgId, publisherOrgId, name) {
66269
+ const params = new URLSearchParams({ org_id: publisherOrgId, name });
66270
+ return this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY_RESOLVE(orgId)}?${params}`);
66271
+ }
66272
+ /**
66273
+ * Server-side fuzzy discovery over the visible registry (name/description
66274
+ * substring match), paginated. The discovery verb: rows carry the `crg_` id
66275
+ * that {@link installRegistryClip} takes.
66276
+ */
66277
+ async searchOrgRegistryClips(orgId, query, opts) {
66278
+ const params = new URLSearchParams({ q: query });
66279
+ if (opts?.limit !== void 0)
66280
+ params.set("limit", String(opts.limit));
66281
+ if (opts?.offset !== void 0)
66282
+ params.set("offset", String(opts.offset));
66283
+ const resp = await this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY_SEARCH(orgId)}?${params}`);
66284
+ return resp ?? [];
66285
+ }
66234
66286
  /**
66235
66287
  * Install a registry clip into the org (a reference in `clip_installs`, not a
66236
66288
  * copy). Idempotent: installing an already-installed clip returns the same
@@ -66414,6 +66466,16 @@ var ParallClient = class _ParallClient extends AttachmentClient {
66414
66466
  async getBrowserAliasExecution(orgId, requestId) {
66415
66467
  return this.request("GET", ENDPOINTS.ORG_BROWSER_ALIAS_EXECUTION(orgId, requestId));
66416
66468
  }
66469
+ /** Accept one idempotent Browser Use operation for an explicit Profile.
66470
+ * The Server resolves Profile→Edge; callers never select an Edge directly. */
66471
+ async createBrowserUseOperation(orgId, request) {
66472
+ return this.request("POST", ENDPOINTS.ORG_BROWSER_USE_OPERATIONS(orgId), request);
66473
+ }
66474
+ /** Recover the durable receipt. Successful data is present only inside the
66475
+ * Server's short encrypted result TTL; terminal proof remains afterwards. */
66476
+ async getBrowserUseOperation(orgId, operationId) {
66477
+ return this.request("GET", ENDPOINTS.ORG_BROWSER_USE_OPERATION(orgId, operationId));
66478
+ }
66417
66479
  /**
66418
66480
  * Read a hosted Cloud Profile's egress-proxy status (manager-only: hosted
66419
66481
  * human maintainer or org admin). Sanitized — the password never comes back.
@@ -51504,6 +51504,8 @@ function buildEventBody(event) {
51504
51504
  ].filter(Boolean).join(" | ");
51505
51505
  lines.push(`[Thread: ${threadMeta}]`);
51506
51506
  }
51507
+ if (event.deliveryReason)
51508
+ lines.push(`[Delivery: ${sanitizeMeta(event.deliveryReason)}]`);
51507
51509
  if (event.unreadCount != null && event.unreadCount > 1) {
51508
51510
  const countStr = event.unreadCount >= 1e3 ? "999+" : String(event.unreadCount);
51509
51511
  const sinceStr = event.unreadSince ? ` | since: prll://${event.unreadSince}` : "";
@@ -51875,6 +51877,7 @@ var ENDPOINTS = {
51875
51877
  TASKS: (orgId) => `${API_BASE}/orgs/${orgId}/tasks`,
51876
51878
  TASK_SUBTASK_SUMMARY: (orgId) => `${API_BASE}/orgs/${orgId}/tasks/subtask-summary`,
51877
51879
  TASK: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}`,
51880
+ TASK_MOVE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/move`,
51878
51881
  TASK_ARCHIVE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/archive`,
51879
51882
  TASK_RESTORE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/restore`,
51880
51883
  TASK_WATCH: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/watch`,
@@ -52004,6 +52007,8 @@ var ENDPOINTS = {
52004
52007
  WIKI_ACCESS_POLICY: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-policy`,
52005
52008
  WIKI_ACCESS_POLICY_MEMBERS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-policy/members`,
52006
52009
  WIKI_MEMBERSHIP_SELF: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/membership/self`,
52010
+ // Library-level star (self-scoped bookmark; POST = star, DELETE = unstar).
52011
+ WIKI_STARS_SELF: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/stars/self`,
52007
52012
  WIKI_MEMBERS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/members`,
52008
52013
  WIKI_ACCESS_STATUS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-status`,
52009
52014
  WIKI_ACCESS_REQUESTS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-requests`,
@@ -52138,6 +52143,8 @@ var ENDPOINTS = {
52138
52143
  ORG_MANAGED_ALIAS: (orgId, aliasName) => `/api/v1/orgs/${orgId}/aliases/${encodeURIComponent(aliasName)}`,
52139
52144
  ORG_BROWSER_ALIAS_EXECUTIONS: (orgId) => `/api/v1/orgs/${orgId}/executions`,
52140
52145
  ORG_BROWSER_ALIAS_EXECUTION: (orgId, requestId) => `/api/v1/orgs/${orgId}/executions/${encodeURIComponent(requestId)}`,
52146
+ ORG_BROWSER_USE_OPERATIONS: (orgId) => `/api/v1/orgs/${orgId}/browser-use/operations`,
52147
+ ORG_BROWSER_USE_OPERATION: (orgId, operationId) => `/api/v1/orgs/${orgId}/browser-use/operations/${encodeURIComponent(operationId)}`,
52141
52148
  // Per-profile egress proxy (hosted Cloud Profiles; manager-only, human-only).
52142
52149
  ORG_EDGE_PROFILE_PROXY: (orgId, edgeId, profileName) => `/api/v1/orgs/${orgId}/edge/${edgeId}/profiles/${encodeURIComponent(profileName)}/proxy`,
52143
52150
  // Per-profile one-shot cookie seed (hosted Cloud Profiles; manager-only,
@@ -52152,6 +52159,8 @@ var ENDPOINTS = {
52152
52159
  CLIP_CONNECTION: (orgId, connId) => `/api/v1/orgs/${orgId}/clip-connections/${connId}`,
52153
52160
  // Clip registry (v3, org-scoped, served by api-server — `crg_` entries)
52154
52161
  ORG_CLIP_REGISTRY: (orgId) => `/api/v1/orgs/${orgId}/clip-registry`,
52162
+ ORG_CLIP_REGISTRY_RESOLVE: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/resolve`,
52163
+ ORG_CLIP_REGISTRY_SEARCH: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/search`,
52155
52164
  ORG_CLIP_REGISTRY_CLIP: (orgId, clipId) => `/api/v1/orgs/${orgId}/clip-registry/${clipId}`,
52156
52165
  ORG_CLIP_REGISTRY_PUBLISH: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/publish`,
52157
52166
  ORG_CLIP_INSTALL: (orgId) => `/api/v1/orgs/${orgId}/clips/install`,
@@ -52285,6 +52294,15 @@ var ProjectTaskClient = class {
52285
52294
  async deleteTask(orgId, taskId, opts) {
52286
52295
  return this.request("DELETE", ENDPOINTS.TASK(orgId, taskId), void 0, opts?.force ? { force: "true" } : void 0);
52287
52296
  }
52297
+ /**
52298
+ * Moves a task and its whole subtree into another project (renumbering it
52299
+ * there; old identifiers stay resolvable as aliases). The caller needs
52300
+ * update access on the task (source project membership) and read access to
52301
+ * the target project.
52302
+ */
52303
+ async moveTask(orgId, taskId, data) {
52304
+ return this.request("POST", ENDPOINTS.TASK_MOVE(orgId, taskId), data);
52305
+ }
52288
52306
  async archiveTask(orgId, taskId) {
52289
52307
  return this.request("POST", ENDPOINTS.TASK_ARCHIVE(orgId, taskId));
52290
52308
  }
@@ -54143,6 +54161,17 @@ var ParallClient = class _ParallClient extends AttachmentClient {
54143
54161
  async leaveWiki(orgId, wikiId) {
54144
54162
  await this.request("DELETE", ENDPOINTS.WIKI_MEMBERSHIP_SELF(orgId, wikiId));
54145
54163
  }
54164
+ /** Star a library for the caller (sidebar Starred group). Idempotent —
54165
+ * re-starring is a 204 no-op. Requires read access; hidden private
54166
+ * libraries answer 404 like absent IDs. */
54167
+ async starWiki(orgId, wikiId) {
54168
+ await this.request("POST", ENDPOINTS.WIKI_STARS_SELF(orgId, wikiId));
54169
+ }
54170
+ /** Remove the caller's star. Idempotent — unstarring a never-starred
54171
+ * library is a 204 no-op. */
54172
+ async unstarWiki(orgId, wikiId) {
54173
+ await this.request("DELETE", ENDPOINTS.WIKI_STARS_SELF(orgId, wikiId));
54174
+ }
54146
54175
  async getWikiMembers(orgId, wikiId) {
54147
54176
  const res = await this.request("GET", ENDPOINTS.WIKI_MEMBERS(orgId, wikiId));
54148
54177
  return res.data ?? [];
@@ -54496,6 +54525,31 @@ var ParallClient = class _ParallClient extends AttachmentClient {
54496
54525
  const resp = await this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY(orgId)}?limit=100`);
54497
54526
  return resp ?? [];
54498
54527
  }
54528
+ /**
54529
+ * Resolve an exact `<publisher org, name>` reference to its registry entry —
54530
+ * the npm-style point read. Deliberately independent of catalog size: no
54531
+ * Search, no pagination, same read-visibility boundary as `getRegistryClip`
54532
+ * (cross-org requires public + approved). 404 `NOT_FOUND` when the publisher
54533
+ * org has no visible clip of that exact name.
54534
+ */
54535
+ async resolveRegistryClip(orgId, publisherOrgId, name) {
54536
+ const params = new URLSearchParams({ org_id: publisherOrgId, name });
54537
+ return this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY_RESOLVE(orgId)}?${params}`);
54538
+ }
54539
+ /**
54540
+ * Server-side fuzzy discovery over the visible registry (name/description
54541
+ * substring match), paginated. The discovery verb: rows carry the `crg_` id
54542
+ * that {@link installRegistryClip} takes.
54543
+ */
54544
+ async searchOrgRegistryClips(orgId, query, opts) {
54545
+ const params = new URLSearchParams({ q: query });
54546
+ if (opts?.limit !== void 0)
54547
+ params.set("limit", String(opts.limit));
54548
+ if (opts?.offset !== void 0)
54549
+ params.set("offset", String(opts.offset));
54550
+ const resp = await this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY_SEARCH(orgId)}?${params}`);
54551
+ return resp ?? [];
54552
+ }
54499
54553
  /**
54500
54554
  * Install a registry clip into the org (a reference in `clip_installs`, not a
54501
54555
  * copy). Idempotent: installing an already-installed clip returns the same
@@ -54679,6 +54733,16 @@ var ParallClient = class _ParallClient extends AttachmentClient {
54679
54733
  async getBrowserAliasExecution(orgId, requestId) {
54680
54734
  return this.request("GET", ENDPOINTS.ORG_BROWSER_ALIAS_EXECUTION(orgId, requestId));
54681
54735
  }
54736
+ /** Accept one idempotent Browser Use operation for an explicit Profile.
54737
+ * The Server resolves Profile→Edge; callers never select an Edge directly. */
54738
+ async createBrowserUseOperation(orgId, request3) {
54739
+ return this.request("POST", ENDPOINTS.ORG_BROWSER_USE_OPERATIONS(orgId), request3);
54740
+ }
54741
+ /** Recover the durable receipt. Successful data is present only inside the
54742
+ * Server's short encrypted result TTL; terminal proof remains afterwards. */
54743
+ async getBrowserUseOperation(orgId, operationId) {
54744
+ return this.request("GET", ENDPOINTS.ORG_BROWSER_USE_OPERATION(orgId, operationId));
54745
+ }
54682
54746
  /**
54683
54747
  * Read a hosted Cloud Profile's egress-proxy status (manager-only: hosted
54684
54748
  * human maintainer or org admin). Sanitized — the password never comes back.
@@ -58927,11 +58991,28 @@ var ParallAgentGateway = class {
58927
58991
  const hasAttachments = message.attachments?.length;
58928
58992
  if (!body && !hasAttachments)
58929
58993
  return { action: "skip" };
58930
- if (chatInfo.type === "group" && chatInfo.agentRoutingMode !== "active") {
58931
- const mentions = content.mentions ?? [];
58932
- const isMentioned = mentions.some((mention) => mentionTargetsUser(mention.user_id, this.opts.agentUserId, "agent"));
58933
- if (!isMentioned)
58994
+ const mentions = content.mentions ?? [];
58995
+ const isMentioned = mentions.some((mention) => mentionTargetsUser(mention.user_id, this.opts.agentUserId, "agent"));
58996
+ let deliveryReason;
58997
+ if (message.thread_root_id) {
58998
+ if (isMentioned) {
58999
+ deliveryReason = "mention";
59000
+ } else {
59001
+ let watching;
59002
+ try {
59003
+ watching = await this.opts.client.isWatchingThread(message.thread_root_id);
59004
+ } catch {
59005
+ return { action: "retry" };
59006
+ }
59007
+ if (!watching)
59008
+ return { action: "skip" };
59009
+ deliveryReason = "watcher";
59010
+ }
59011
+ } else if (chatInfo.type === "group") {
59012
+ if (chatInfo.agentRoutingMode !== "active" && !isMentioned)
58934
59013
  return { action: "skip" };
59014
+ if (isMentioned)
59015
+ deliveryReason = "mention";
58935
59016
  }
58936
59017
  const attachments = (message.attachments ?? []).map((a) => ({
58937
59018
  id: a.id,
@@ -58972,6 +59053,7 @@ var ParallAgentGateway = class {
58972
59053
  messageId: message.id,
58973
59054
  body: body || "[attachment]",
58974
59055
  threadRootId: message.thread_root_id ?? void 0,
59056
+ deliveryReason,
58975
59057
  noReply: message.hints?.no_reply ?? false,
58976
59058
  attachments: attachments.length > 0 ? attachments : void 0,
58977
59059
  sentAt: message.created_at,
@@ -60066,7 +60148,7 @@ parall dm prll://usr_xxx --text-file /tmp/reply.md
60066
60148
  parall dm "Alice" --text "Hello"
60067
60149
 
60068
60150
  # Thread reply
60069
- parall messages send prll://cht_xxx --text-file /tmp/reply.md --thread-root-id 01JWC...
60151
+ parall messages send prll://cht_xxx --text-file /tmp/reply.md --thread-root-id prll://msg_xxx
60070
60152
 
60071
60153
  # FYI message (no response expected \u2014 the recipient sees \`[Hint: no_reply]\`)
60072
60154
  parall messages send prll://cht_xxx --text "FYI: done" --no-reply
@@ -60077,6 +60159,27 @@ parall messages send prll://cht_xxx --text "FYI: done" --no-reply
60077
60159
  parall no-reply --reason "ack only, nothing to add"
60078
60160
  \`\`\`
60079
60161
 
60162
+ ## Thread Subscriptions
60163
+
60164
+ Replying in a thread subscribes you to it: every later reply reaches you as
60165
+ \`[Event: message.new]\` with a \`[Thread: ...]\` line, marked
60166
+ \`[Delivery: watcher]\`. You are also auto-subscribed when a thread reply
60167
+ @-mentions you personally, and when someone replies to a thread whose root
60168
+ message you wrote. \`[Delivery: mention]\` means you were @-mentioned in that
60169
+ message.
60170
+
60171
+ \`\`\`bash
60172
+ parall messages watch prll://msg_xxx # follow a thread without replying (ID = the thread's root message)
60173
+ parall messages unwatch prll://msg_xxx # stop receiving a thread's replies
60174
+ parall messages watchers prll://msg_xxx # list who is watching a thread
60175
+ \`\`\`
60176
+
60177
+ Unwatch is sticky: no automatic source (including later @-mentions \u2014 you
60178
+ still get the one-off mention, just no subscription) re-subscribes you.
60179
+ Only replying in the thread yourself or an explicit \`watch\` does. Unwatch
60180
+ threads you have nothing more to contribute to instead of ignoring their
60181
+ wake-ups.
60182
+
60080
60183
  ## Files & Attachments
60081
60184
 
60082
60185
  Attachments appear in events as \`[Attachment: prll://att_xxx | mime | size | name]\`.
@@ -61184,7 +61287,7 @@ bound to whatever profile the connection selected.
61184
61287
  var SKILLS = [
61185
61288
  {
61186
61289
  name: "parall-platform",
61187
- description: "Parall platform queries and lightweight agent provisioning: list org members, agents, chats, read message history, check identity, create another agent, or walk the prll:// reference graph (resolve URIs, backlinks, multi-hop graph). Use when: user asks about org members, who's online, chat history, agent list, creating an agent, identity/auth questions, or you need to find what an entity is connected to / who references it.",
61290
+ description: "Parall platform queries and lightweight agent provisioning: list org members, agents, chats, read message history, watch/unwatch threads, check identity, create another agent, or walk the prll:// reference graph (resolve URIs, backlinks, multi-hop graph). Use when: user asks about org members, who's online, chat history, agent list, creating an agent, identity/auth questions, you want to follow or mute a thread (e.g. after `[Delivery: watcher]` wake-ups), or you need to find what an entity is connected to / who references it.",
61188
61291
  content: PARALL_PLATFORM_SKILL
61189
61292
  },
61190
61293
  {
@@ -51504,6 +51504,8 @@ function buildEventBody(event) {
51504
51504
  ].filter(Boolean).join(" | ");
51505
51505
  lines.push(`[Thread: ${threadMeta}]`);
51506
51506
  }
51507
+ if (event.deliveryReason)
51508
+ lines.push(`[Delivery: ${sanitizeMeta(event.deliveryReason)}]`);
51507
51509
  if (event.unreadCount != null && event.unreadCount > 1) {
51508
51510
  const countStr = event.unreadCount >= 1e3 ? "999+" : String(event.unreadCount);
51509
51511
  const sinceStr = event.unreadSince ? ` | since: prll://${event.unreadSince}` : "";
@@ -51875,6 +51877,7 @@ var ENDPOINTS = {
51875
51877
  TASKS: (orgId) => `${API_BASE}/orgs/${orgId}/tasks`,
51876
51878
  TASK_SUBTASK_SUMMARY: (orgId) => `${API_BASE}/orgs/${orgId}/tasks/subtask-summary`,
51877
51879
  TASK: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}`,
51880
+ TASK_MOVE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/move`,
51878
51881
  TASK_ARCHIVE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/archive`,
51879
51882
  TASK_RESTORE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/restore`,
51880
51883
  TASK_WATCH: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/watch`,
@@ -52004,6 +52007,8 @@ var ENDPOINTS = {
52004
52007
  WIKI_ACCESS_POLICY: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-policy`,
52005
52008
  WIKI_ACCESS_POLICY_MEMBERS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-policy/members`,
52006
52009
  WIKI_MEMBERSHIP_SELF: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/membership/self`,
52010
+ // Library-level star (self-scoped bookmark; POST = star, DELETE = unstar).
52011
+ WIKI_STARS_SELF: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/stars/self`,
52007
52012
  WIKI_MEMBERS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/members`,
52008
52013
  WIKI_ACCESS_STATUS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-status`,
52009
52014
  WIKI_ACCESS_REQUESTS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-requests`,
@@ -52138,6 +52143,8 @@ var ENDPOINTS = {
52138
52143
  ORG_MANAGED_ALIAS: (orgId, aliasName) => `/api/v1/orgs/${orgId}/aliases/${encodeURIComponent(aliasName)}`,
52139
52144
  ORG_BROWSER_ALIAS_EXECUTIONS: (orgId) => `/api/v1/orgs/${orgId}/executions`,
52140
52145
  ORG_BROWSER_ALIAS_EXECUTION: (orgId, requestId) => `/api/v1/orgs/${orgId}/executions/${encodeURIComponent(requestId)}`,
52146
+ ORG_BROWSER_USE_OPERATIONS: (orgId) => `/api/v1/orgs/${orgId}/browser-use/operations`,
52147
+ ORG_BROWSER_USE_OPERATION: (orgId, operationId) => `/api/v1/orgs/${orgId}/browser-use/operations/${encodeURIComponent(operationId)}`,
52141
52148
  // Per-profile egress proxy (hosted Cloud Profiles; manager-only, human-only).
52142
52149
  ORG_EDGE_PROFILE_PROXY: (orgId, edgeId, profileName) => `/api/v1/orgs/${orgId}/edge/${edgeId}/profiles/${encodeURIComponent(profileName)}/proxy`,
52143
52150
  // Per-profile one-shot cookie seed (hosted Cloud Profiles; manager-only,
@@ -52152,6 +52159,8 @@ var ENDPOINTS = {
52152
52159
  CLIP_CONNECTION: (orgId, connId) => `/api/v1/orgs/${orgId}/clip-connections/${connId}`,
52153
52160
  // Clip registry (v3, org-scoped, served by api-server — `crg_` entries)
52154
52161
  ORG_CLIP_REGISTRY: (orgId) => `/api/v1/orgs/${orgId}/clip-registry`,
52162
+ ORG_CLIP_REGISTRY_RESOLVE: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/resolve`,
52163
+ ORG_CLIP_REGISTRY_SEARCH: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/search`,
52155
52164
  ORG_CLIP_REGISTRY_CLIP: (orgId, clipId) => `/api/v1/orgs/${orgId}/clip-registry/${clipId}`,
52156
52165
  ORG_CLIP_REGISTRY_PUBLISH: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/publish`,
52157
52166
  ORG_CLIP_INSTALL: (orgId) => `/api/v1/orgs/${orgId}/clips/install`,
@@ -52285,6 +52294,15 @@ var ProjectTaskClient = class {
52285
52294
  async deleteTask(orgId, taskId, opts) {
52286
52295
  return this.request("DELETE", ENDPOINTS.TASK(orgId, taskId), void 0, opts?.force ? { force: "true" } : void 0);
52287
52296
  }
52297
+ /**
52298
+ * Moves a task and its whole subtree into another project (renumbering it
52299
+ * there; old identifiers stay resolvable as aliases). The caller needs
52300
+ * update access on the task (source project membership) and read access to
52301
+ * the target project.
52302
+ */
52303
+ async moveTask(orgId, taskId, data) {
52304
+ return this.request("POST", ENDPOINTS.TASK_MOVE(orgId, taskId), data);
52305
+ }
52288
52306
  async archiveTask(orgId, taskId) {
52289
52307
  return this.request("POST", ENDPOINTS.TASK_ARCHIVE(orgId, taskId));
52290
52308
  }
@@ -54143,6 +54161,17 @@ var ParallClient = class _ParallClient extends AttachmentClient {
54143
54161
  async leaveWiki(orgId, wikiId) {
54144
54162
  await this.request("DELETE", ENDPOINTS.WIKI_MEMBERSHIP_SELF(orgId, wikiId));
54145
54163
  }
54164
+ /** Star a library for the caller (sidebar Starred group). Idempotent —
54165
+ * re-starring is a 204 no-op. Requires read access; hidden private
54166
+ * libraries answer 404 like absent IDs. */
54167
+ async starWiki(orgId, wikiId) {
54168
+ await this.request("POST", ENDPOINTS.WIKI_STARS_SELF(orgId, wikiId));
54169
+ }
54170
+ /** Remove the caller's star. Idempotent — unstarring a never-starred
54171
+ * library is a 204 no-op. */
54172
+ async unstarWiki(orgId, wikiId) {
54173
+ await this.request("DELETE", ENDPOINTS.WIKI_STARS_SELF(orgId, wikiId));
54174
+ }
54146
54175
  async getWikiMembers(orgId, wikiId) {
54147
54176
  const res = await this.request("GET", ENDPOINTS.WIKI_MEMBERS(orgId, wikiId));
54148
54177
  return res.data ?? [];
@@ -54496,6 +54525,31 @@ var ParallClient = class _ParallClient extends AttachmentClient {
54496
54525
  const resp = await this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY(orgId)}?limit=100`);
54497
54526
  return resp ?? [];
54498
54527
  }
54528
+ /**
54529
+ * Resolve an exact `<publisher org, name>` reference to its registry entry —
54530
+ * the npm-style point read. Deliberately independent of catalog size: no
54531
+ * Search, no pagination, same read-visibility boundary as `getRegistryClip`
54532
+ * (cross-org requires public + approved). 404 `NOT_FOUND` when the publisher
54533
+ * org has no visible clip of that exact name.
54534
+ */
54535
+ async resolveRegistryClip(orgId, publisherOrgId, name) {
54536
+ const params = new URLSearchParams({ org_id: publisherOrgId, name });
54537
+ return this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY_RESOLVE(orgId)}?${params}`);
54538
+ }
54539
+ /**
54540
+ * Server-side fuzzy discovery over the visible registry (name/description
54541
+ * substring match), paginated. The discovery verb: rows carry the `crg_` id
54542
+ * that {@link installRegistryClip} takes.
54543
+ */
54544
+ async searchOrgRegistryClips(orgId, query, opts) {
54545
+ const params = new URLSearchParams({ q: query });
54546
+ if (opts?.limit !== void 0)
54547
+ params.set("limit", String(opts.limit));
54548
+ if (opts?.offset !== void 0)
54549
+ params.set("offset", String(opts.offset));
54550
+ const resp = await this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY_SEARCH(orgId)}?${params}`);
54551
+ return resp ?? [];
54552
+ }
54499
54553
  /**
54500
54554
  * Install a registry clip into the org (a reference in `clip_installs`, not a
54501
54555
  * copy). Idempotent: installing an already-installed clip returns the same
@@ -54679,6 +54733,16 @@ var ParallClient = class _ParallClient extends AttachmentClient {
54679
54733
  async getBrowserAliasExecution(orgId, requestId) {
54680
54734
  return this.request("GET", ENDPOINTS.ORG_BROWSER_ALIAS_EXECUTION(orgId, requestId));
54681
54735
  }
54736
+ /** Accept one idempotent Browser Use operation for an explicit Profile.
54737
+ * The Server resolves Profile→Edge; callers never select an Edge directly. */
54738
+ async createBrowserUseOperation(orgId, request3) {
54739
+ return this.request("POST", ENDPOINTS.ORG_BROWSER_USE_OPERATIONS(orgId), request3);
54740
+ }
54741
+ /** Recover the durable receipt. Successful data is present only inside the
54742
+ * Server's short encrypted result TTL; terminal proof remains afterwards. */
54743
+ async getBrowserUseOperation(orgId, operationId) {
54744
+ return this.request("GET", ENDPOINTS.ORG_BROWSER_USE_OPERATION(orgId, operationId));
54745
+ }
54682
54746
  /**
54683
54747
  * Read a hosted Cloud Profile's egress-proxy status (manager-only: hosted
54684
54748
  * human maintainer or org admin). Sanitized — the password never comes back.
@@ -58927,11 +58991,28 @@ var ParallAgentGateway = class {
58927
58991
  const hasAttachments = message.attachments?.length;
58928
58992
  if (!body && !hasAttachments)
58929
58993
  return { action: "skip" };
58930
- if (chatInfo.type === "group" && chatInfo.agentRoutingMode !== "active") {
58931
- const mentions = content.mentions ?? [];
58932
- const isMentioned = mentions.some((mention) => mentionTargetsUser(mention.user_id, this.opts.agentUserId, "agent"));
58933
- if (!isMentioned)
58994
+ const mentions = content.mentions ?? [];
58995
+ const isMentioned = mentions.some((mention) => mentionTargetsUser(mention.user_id, this.opts.agentUserId, "agent"));
58996
+ let deliveryReason;
58997
+ if (message.thread_root_id) {
58998
+ if (isMentioned) {
58999
+ deliveryReason = "mention";
59000
+ } else {
59001
+ let watching;
59002
+ try {
59003
+ watching = await this.opts.client.isWatchingThread(message.thread_root_id);
59004
+ } catch {
59005
+ return { action: "retry" };
59006
+ }
59007
+ if (!watching)
59008
+ return { action: "skip" };
59009
+ deliveryReason = "watcher";
59010
+ }
59011
+ } else if (chatInfo.type === "group") {
59012
+ if (chatInfo.agentRoutingMode !== "active" && !isMentioned)
58934
59013
  return { action: "skip" };
59014
+ if (isMentioned)
59015
+ deliveryReason = "mention";
58935
59016
  }
58936
59017
  const attachments = (message.attachments ?? []).map((a) => ({
58937
59018
  id: a.id,
@@ -58972,6 +59053,7 @@ var ParallAgentGateway = class {
58972
59053
  messageId: message.id,
58973
59054
  body: body || "[attachment]",
58974
59055
  threadRootId: message.thread_root_id ?? void 0,
59056
+ deliveryReason,
58975
59057
  noReply: message.hints?.no_reply ?? false,
58976
59058
  attachments: attachments.length > 0 ? attachments : void 0,
58977
59059
  sentAt: message.created_at,
@@ -60069,7 +60151,7 @@ parall dm prll://usr_xxx --text-file /tmp/reply.md
60069
60151
  parall dm "Alice" --text "Hello"
60070
60152
 
60071
60153
  # Thread reply
60072
- parall messages send prll://cht_xxx --text-file /tmp/reply.md --thread-root-id 01JWC...
60154
+ parall messages send prll://cht_xxx --text-file /tmp/reply.md --thread-root-id prll://msg_xxx
60073
60155
 
60074
60156
  # FYI message (no response expected \u2014 the recipient sees \`[Hint: no_reply]\`)
60075
60157
  parall messages send prll://cht_xxx --text "FYI: done" --no-reply
@@ -60080,6 +60162,27 @@ parall messages send prll://cht_xxx --text "FYI: done" --no-reply
60080
60162
  parall no-reply --reason "ack only, nothing to add"
60081
60163
  \`\`\`
60082
60164
 
60165
+ ## Thread Subscriptions
60166
+
60167
+ Replying in a thread subscribes you to it: every later reply reaches you as
60168
+ \`[Event: message.new]\` with a \`[Thread: ...]\` line, marked
60169
+ \`[Delivery: watcher]\`. You are also auto-subscribed when a thread reply
60170
+ @-mentions you personally, and when someone replies to a thread whose root
60171
+ message you wrote. \`[Delivery: mention]\` means you were @-mentioned in that
60172
+ message.
60173
+
60174
+ \`\`\`bash
60175
+ parall messages watch prll://msg_xxx # follow a thread without replying (ID = the thread's root message)
60176
+ parall messages unwatch prll://msg_xxx # stop receiving a thread's replies
60177
+ parall messages watchers prll://msg_xxx # list who is watching a thread
60178
+ \`\`\`
60179
+
60180
+ Unwatch is sticky: no automatic source (including later @-mentions \u2014 you
60181
+ still get the one-off mention, just no subscription) re-subscribes you.
60182
+ Only replying in the thread yourself or an explicit \`watch\` does. Unwatch
60183
+ threads you have nothing more to contribute to instead of ignoring their
60184
+ wake-ups.
60185
+
60083
60186
  ## Files & Attachments
60084
60187
 
60085
60188
  Attachments appear in events as \`[Attachment: prll://att_xxx | mime | size | name]\`.
@@ -61187,7 +61290,7 @@ bound to whatever profile the connection selected.
61187
61290
  var SKILLS = [
61188
61291
  {
61189
61292
  name: "parall-platform",
61190
- description: "Parall platform queries and lightweight agent provisioning: list org members, agents, chats, read message history, check identity, create another agent, or walk the prll:// reference graph (resolve URIs, backlinks, multi-hop graph). Use when: user asks about org members, who's online, chat history, agent list, creating an agent, identity/auth questions, or you need to find what an entity is connected to / who references it.",
61293
+ description: "Parall platform queries and lightweight agent provisioning: list org members, agents, chats, read message history, watch/unwatch threads, check identity, create another agent, or walk the prll:// reference graph (resolve URIs, backlinks, multi-hop graph). Use when: user asks about org members, who's online, chat history, agent list, creating an agent, identity/auth questions, you want to follow or mute a thread (e.g. after `[Delivery: watcher]` wake-ups), or you need to find what an entity is connected to / who references it.",
61191
61294
  content: PARALL_PLATFORM_SKILL
61192
61295
  },
61193
61296
  {
@@ -363,6 +363,7 @@ var init_constants = __esm({
363
363
  TASKS: (orgId) => `${API_BASE}/orgs/${orgId}/tasks`,
364
364
  TASK_SUBTASK_SUMMARY: (orgId) => `${API_BASE}/orgs/${orgId}/tasks/subtask-summary`,
365
365
  TASK: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}`,
366
+ TASK_MOVE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/move`,
366
367
  TASK_ARCHIVE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/archive`,
367
368
  TASK_RESTORE: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/restore`,
368
369
  TASK_WATCH: (orgId, taskId) => `${API_BASE}/orgs/${orgId}/tasks/${taskId}/watch`,
@@ -492,6 +493,8 @@ var init_constants = __esm({
492
493
  WIKI_ACCESS_POLICY: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-policy`,
493
494
  WIKI_ACCESS_POLICY_MEMBERS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-policy/members`,
494
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`,
495
498
  WIKI_MEMBERS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/members`,
496
499
  WIKI_ACCESS_STATUS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-status`,
497
500
  WIKI_ACCESS_REQUESTS: (orgId, wikiId) => `${WIKI_BASE}/orgs/${orgId}/wikis/${wikiId}/access-requests`,
@@ -626,6 +629,8 @@ var init_constants = __esm({
626
629
  ORG_MANAGED_ALIAS: (orgId, aliasName) => `/api/v1/orgs/${orgId}/aliases/${encodeURIComponent(aliasName)}`,
627
630
  ORG_BROWSER_ALIAS_EXECUTIONS: (orgId) => `/api/v1/orgs/${orgId}/executions`,
628
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)}`,
629
634
  // Per-profile egress proxy (hosted Cloud Profiles; manager-only, human-only).
630
635
  ORG_EDGE_PROFILE_PROXY: (orgId, edgeId, profileName) => `/api/v1/orgs/${orgId}/edge/${edgeId}/profiles/${encodeURIComponent(profileName)}/proxy`,
631
636
  // Per-profile one-shot cookie seed (hosted Cloud Profiles; manager-only,
@@ -640,6 +645,8 @@ var init_constants = __esm({
640
645
  CLIP_CONNECTION: (orgId, connId) => `/api/v1/orgs/${orgId}/clip-connections/${connId}`,
641
646
  // Clip registry (v3, org-scoped, served by api-server — `crg_` entries)
642
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`,
643
650
  ORG_CLIP_REGISTRY_CLIP: (orgId, clipId) => `/api/v1/orgs/${orgId}/clip-registry/${clipId}`,
644
651
  ORG_CLIP_REGISTRY_PUBLISH: (orgId) => `/api/v1/orgs/${orgId}/clip-registry/publish`,
645
652
  ORG_CLIP_INSTALL: (orgId) => `/api/v1/orgs/${orgId}/clips/install`,
@@ -780,6 +787,15 @@ var init_project_task_client = __esm({
780
787
  async deleteTask(orgId, taskId, opts) {
781
788
  return this.request("DELETE", ENDPOINTS.TASK(orgId, taskId), void 0, opts?.force ? { force: "true" } : void 0);
782
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
+ }
783
799
  async archiveTask(orgId, taskId) {
784
800
  return this.request("POST", ENDPOINTS.TASK_ARCHIVE(orgId, taskId));
785
801
  }
@@ -2708,6 +2724,17 @@ var init_client = __esm({
2708
2724
  async leaveWiki(orgId, wikiId) {
2709
2725
  await this.request("DELETE", ENDPOINTS.WIKI_MEMBERSHIP_SELF(orgId, wikiId));
2710
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
+ }
2711
2738
  async getWikiMembers(orgId, wikiId) {
2712
2739
  const res = await this.request("GET", ENDPOINTS.WIKI_MEMBERS(orgId, wikiId));
2713
2740
  return res.data ?? [];
@@ -3061,6 +3088,31 @@ var init_client = __esm({
3061
3088
  const resp = await this.request("GET", `${ENDPOINTS.ORG_CLIP_REGISTRY(orgId)}?limit=100`);
3062
3089
  return resp ?? [];
3063
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
+ }
3064
3116
  /**
3065
3117
  * Install a registry clip into the org (a reference in `clip_installs`, not a
3066
3118
  * copy). Idempotent: installing an already-installed clip returns the same
@@ -3244,6 +3296,16 @@ var init_client = __esm({
3244
3296
  async getBrowserAliasExecution(orgId, requestId) {
3245
3297
  return this.request("GET", ENDPOINTS.ORG_BROWSER_ALIAS_EXECUTION(orgId, requestId));
3246
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
+ }
3247
3309
  /**
3248
3310
  * Read a hosted Cloud Profile's egress-proxy status (manager-only: hosted
3249
3311
  * human maintainer or org admin). Sanitized — the password never comes back.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parall/daemon",
3
- "version": "1.55.5",
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.5",
37
- "@parall/sdk": "1.55.5",
38
- "@parall/claude-agent": "1.55.5",
39
- "@parall/codex-agent": "1.55.5",
40
- "@parall/openclaw-agent": "1.55.5"
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",