@parall/daemon 1.46.0 → 1.47.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.46.0",
3
- "built_at": "2026-07-16T19:15:13.903Z",
2
+ "version": "1.47.0",
3
+ "built_at": "2026-07-20T03:34:22.601Z",
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": "cf07c471424ed728b1576b9c002eee4d32d01f9212612f3768576a363a4801df",
20
- "size": 2886066
19
+ "sha256": "a3dcf5eaae3552b8c8220231dfc1af9abc07991d5e9d18a33c1e6e94550c5740",
20
+ "size": 2889611
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": "fdae94bac193fb2f645f488874bdb795965173cd1e13ff60363b6fb622e7f932",
28
- "size": 2717830
27
+ "sha256": "ba2f015614ac1b2177fb1326129aba73ed1575bad646f279c2e4b3e7106a838c",
28
+ "size": 2721373
29
29
  },
30
30
  "parall-codex-agent.js": {
31
- "sha256": "729dd09421cbf60d046060df0084ac1aed976f33df9b90f449bebf23a11bf3c4",
32
- "size": 2759570
31
+ "sha256": "35bcc6c1651f40e4e169eef9afb1969ca97bb946ebc6f80beb1eef61cf76c65f",
32
+ "size": 2763113
33
33
  },
34
34
  "parall-daemon.js": {
35
- "sha256": "7db4991b1de426126d86f04ebbc91004d5012708e2e4638c44727ef065d99c35",
36
- "size": 2935538
35
+ "sha256": "5bcbd939b1c753687ec7a79f5df98210aee6d92d825e043d4ad1b38b2daa5883",
36
+ "size": 2950822
37
37
  },
38
38
  "parall-openclaw-agent.js": {
39
39
  "sha256": "856a1c3a9ae0ffef8efe2481fa1171dbeb1d67cccb88616aa9bf16da96a69355",
40
40
  "size": 9923
41
41
  }
42
42
  },
43
- "signature": "mrgNk35+8SZTRSfZVFcN6rThJ1RvMzcZcUhzQbq79qRcmmRHL3Whll/AIZlHzixmdSJHAApQVBBT4Cci6iE/BQ=="
43
+ "signature": "jEnwJR/MRRqU9qfDoaqSVZdhjBLn4MLME3hjhe5l5AM7KRGMlrbTjc2r/8Vq3STH/d8RCJl++tBgL0rB31i+CA=="
44
44
  }
@@ -63685,10 +63685,17 @@ var ENDPOINTS = {
63685
63685
  CHANNEL_CONVERSATION_SESSION: (orgId, conversationId) => `${API_BASE}/orgs/${orgId}/channel-conversations/${conversationId}/session`,
63686
63686
  CHANNEL_MESSAGE: (orgId, messageId) => `${API_BASE}/orgs/${orgId}/channel-messages/${messageId}`,
63687
63687
  CHANNEL_PROVISIONING: (orgId) => `${API_BASE}/orgs/${orgId}/channel-provisioning`,
63688
+ CHANNEL_SLACK_MANIFEST_LINK: (orgId) => `${API_BASE}/orgs/${orgId}/channel-provisioning/slack/manifest-link`,
63688
63689
  CHANNEL_PROVISIONING_SESSION: (orgId, sessionId) => `${API_BASE}/orgs/${orgId}/channel-provisioning/${sessionId}`,
63689
63690
  CHANNEL_PROVISIONING_CANCEL: (orgId, sessionId) => `${API_BASE}/orgs/${orgId}/channel-provisioning/${sessionId}/cancel`,
63690
63691
  // Tier-B platform verb (agent-only): send one message as the bound bot.
63691
63692
  CHANNEL_SEND: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/channel-send`,
63693
+ // Tier-B read verbs (agent-only): workspace visibility as the bot sees it.
63694
+ SLACK_CHANNELS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/channels`,
63695
+ SLACK_USERS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/users`,
63696
+ SLACK_HISTORY: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/history`,
63697
+ SLACK_MEMBERS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/members`,
63698
+ SLACK_STATUS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/status`,
63692
63699
  // Invitations (org-scoped, admin)
63693
63700
  ORG_INVITATIONS: (orgId) => `${API_BASE}/orgs/${orgId}/invitations`,
63694
63701
  ORG_INVITATION: (orgId, invId) => `${API_BASE}/orgs/${orgId}/invitations/${invId}`,
@@ -63783,6 +63790,7 @@ var ENDPOINTS = {
63783
63790
  ORG_UNREAD: (orgId) => `${API_BASE}/orgs/${orgId}/unread`,
63784
63791
  CHAT_READ: (orgId, chatId) => `${API_BASE}/orgs/${orgId}/chats/${chatId}/read`,
63785
63792
  THREAD_UNREAD: (orgId, chatId, threadRootId) => `${API_BASE}/orgs/${orgId}/chats/${chatId}/threads/${threadRootId}/unread`,
63793
+ THREAD_READ: (orgId, chatId, threadRootId) => `${API_BASE}/orgs/${orgId}/chats/${chatId}/threads/${threadRootId}/read`,
63786
63794
  // References (org-scoped)
63787
63795
  REFS_RESOLVE: (orgId) => `${API_BASE}/orgs/${orgId}/refs/resolve`,
63788
63796
  REFS_BACKLINKS: (orgId) => `${API_BASE}/orgs/${orgId}/refs/backlinks`,
@@ -64789,10 +64797,16 @@ var ParallClient = class _ParallClient {
64789
64797
  async resizeMachine(orgId, machineId, spec) {
64790
64798
  return this.request("PATCH", ENDPOINTS.MACHINE_SPEC(orgId, machineId), spec);
64791
64799
  }
64792
- /** Signal a local daemon-mode Machine to check for and apply an update. */
64800
+ /** @deprecated Retired server-side (daemon-control-authorization §4.2):
64801
+ * daemons update autonomously (CDN poll + platform release signal). The
64802
+ * endpoint now answers 409 LOCAL_UPDATE_NOT_SUPPORTED unconditionally. */
64793
64803
  async requestMachineUpdate(orgId, machineId, mandatory = false) {
64794
64804
  await this.request("POST", ENDPOINTS.MACHINE_REQUEST_UPDATE(orgId, machineId), { mandatory });
64795
64805
  }
64806
+ /** @deprecated Retired server-side (daemon-control-authorization §4.2):
64807
+ * remote filesystem browse of a member's machine was remote device access.
64808
+ * The endpoint now answers 409 LOCAL_BROWSE_NOT_SUPPORTED unconditionally;
64809
+ * workspace paths are typed in (or picked on the machine's own Desktop). */
64796
64810
  async browseMachineFilesystem(orgId, machineId, path7) {
64797
64811
  return this.request("POST", ENDPOINTS.MACHINE_BROWSE(orgId, machineId), { path: path7 }, void 0, false, { timeoutMs: 15e3 });
64798
64812
  }
@@ -64817,6 +64831,14 @@ var ParallClient = class _ParallClient {
64817
64831
  async getThreadUnread(orgId, chatId, threadRootId) {
64818
64832
  return this.request("GET", ENDPOINTS.THREAD_UNREAD(orgId, chatId, threadRootId));
64819
64833
  }
64834
+ /** Advance the per-thread read cursor (forward-only). The server auto-clears
64835
+ * thread-scoped inbox items (thread_reply + in-thread mentions) the cursor
64836
+ * now covers. */
64837
+ async markThreadRead(orgId, chatId, threadRootId, messageId) {
64838
+ return this.request("POST", ENDPOINTS.THREAD_READ(orgId, chatId, threadRootId), {
64839
+ message_id: messageId
64840
+ });
64841
+ }
64820
64842
  // ---- Inbox ----
64821
64843
  async getInbox(orgId, params) {
64822
64844
  return this.request("GET", ENDPOINTS.INBOX(orgId), void 0, params);
@@ -64840,9 +64862,12 @@ var ParallClient = class _ParallClient {
64840
64862
  async archiveAllInbox(orgId) {
64841
64863
  return this.request("POST", ENDPOINTS.INBOX_ARCHIVE_ALL(orgId));
64842
64864
  }
64843
- /** Mark an inbox item as read by its source (source_type + source_id) rather than inbox item ID. */
64844
- async ackInbox(orgId, source) {
64845
- return this.request("POST", ENDPOINTS.INBOX_ACK(orgId), source);
64865
+ /** Mark inbox items as read by their source (source_type + source_id) or by
64866
+ * group_key, rather than by inbox item ID. The group_key form clears a whole
64867
+ * group at once (e.g. `task:{taskId}` — task_assign/task_update/task_comment
64868
+ * share it), used by the task detail view's auto-ack on open. */
64869
+ async ackInbox(orgId, target) {
64870
+ return this.request("POST", ENDPOINTS.INBOX_ACK(orgId), target);
64846
64871
  }
64847
64872
  async deleteInboxItem(orgId, id) {
64848
64873
  return this.request("DELETE", ENDPOINTS.INBOX_ITEM(orgId, id));
@@ -65124,6 +65149,15 @@ var ParallClient = class _ParallClient {
65124
65149
  async initiateChannelProvisioning(orgId, input) {
65125
65150
  return this.request("POST", ENDPOINTS.CHANNEL_PROVISIONING(orgId), input);
65126
65151
  }
65152
+ /**
65153
+ * Mint a pending slack connection + api.slack.com manifest-prefill link
65154
+ * (guided manual path). Activate the returned connection_id with
65155
+ * deliverChannelCredentials once the user brings back the bot token +
65156
+ * signing secret.
65157
+ */
65158
+ async createSlackManifestLink(orgId, input) {
65159
+ return this.request("POST", ENDPOINTS.CHANNEL_SLACK_MANIFEST_LINK(orgId), input);
65160
+ }
65127
65161
  /**
65128
65162
  * Lazy status poll — server-side this may forward one provider poll, so
65129
65163
  * call it at the session's `poll_interval_seconds` cadence, not faster.
@@ -65142,6 +65176,38 @@ var ParallClient = class _ParallClient {
65142
65176
  async sendChannelMessage(orgId, input) {
65143
65177
  return this.request("POST", ENDPOINTS.CHANNEL_SEND(orgId), input);
65144
65178
  }
65179
+ slackReadQuery(base, query, extra) {
65180
+ const params = new URLSearchParams();
65181
+ if (query?.cursor)
65182
+ params.set("cursor", query.cursor);
65183
+ if (query?.limit)
65184
+ params.set("limit", String(query.limit));
65185
+ for (const [k5, v] of Object.entries(extra ?? {}))
65186
+ params.set(k5, v);
65187
+ const qs = params.toString();
65188
+ return qs ? `${base}?${qs}` : base;
65189
+ }
65190
+ /**
65191
+ * Tier-B read verbs (agent-only): workspace visibility as the bot sees
65192
+ * it. Same live gate as the send verb; authorization beyond it is the
65193
+ * bot's own Slack permissions.
65194
+ */
65195
+ async listSlackChannels(orgId, query) {
65196
+ return this.request("GET", this.slackReadQuery(ENDPOINTS.SLACK_CHANNELS(orgId), query));
65197
+ }
65198
+ async listSlackUsers(orgId, query) {
65199
+ return this.request("GET", this.slackReadQuery(ENDPOINTS.SLACK_USERS(orgId), query));
65200
+ }
65201
+ async slackHistory(orgId, conversationId, query) {
65202
+ return this.request("GET", this.slackReadQuery(ENDPOINTS.SLACK_HISTORY(orgId), query, { conversation: conversationId }));
65203
+ }
65204
+ async slackMembers(orgId, conversationId, query) {
65205
+ return this.request("GET", this.slackReadQuery(ENDPOINTS.SLACK_MEMBERS(orgId), query, { conversation: conversationId }));
65206
+ }
65207
+ /** Set/clear the Agents-pane "typing…" indicator (best-effort cosmetic). */
65208
+ async setSlackStatus(orgId, input) {
65209
+ await this.request("POST", ENDPOINTS.SLACK_STATUS(orgId), input);
65210
+ }
65145
65211
  async listChannelConversations(orgId, connectionId) {
65146
65212
  return this.request("GET", ENDPOINTS.CHANNEL_CONNECTION_CONVERSATIONS(orgId, connectionId));
65147
65213
  }
@@ -51484,10 +51484,17 @@ var ENDPOINTS = {
51484
51484
  CHANNEL_CONVERSATION_SESSION: (orgId, conversationId) => `${API_BASE}/orgs/${orgId}/channel-conversations/${conversationId}/session`,
51485
51485
  CHANNEL_MESSAGE: (orgId, messageId) => `${API_BASE}/orgs/${orgId}/channel-messages/${messageId}`,
51486
51486
  CHANNEL_PROVISIONING: (orgId) => `${API_BASE}/orgs/${orgId}/channel-provisioning`,
51487
+ CHANNEL_SLACK_MANIFEST_LINK: (orgId) => `${API_BASE}/orgs/${orgId}/channel-provisioning/slack/manifest-link`,
51487
51488
  CHANNEL_PROVISIONING_SESSION: (orgId, sessionId) => `${API_BASE}/orgs/${orgId}/channel-provisioning/${sessionId}`,
51488
51489
  CHANNEL_PROVISIONING_CANCEL: (orgId, sessionId) => `${API_BASE}/orgs/${orgId}/channel-provisioning/${sessionId}/cancel`,
51489
51490
  // Tier-B platform verb (agent-only): send one message as the bound bot.
51490
51491
  CHANNEL_SEND: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/channel-send`,
51492
+ // Tier-B read verbs (agent-only): workspace visibility as the bot sees it.
51493
+ SLACK_CHANNELS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/channels`,
51494
+ SLACK_USERS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/users`,
51495
+ SLACK_HISTORY: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/history`,
51496
+ SLACK_MEMBERS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/members`,
51497
+ SLACK_STATUS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/status`,
51491
51498
  // Invitations (org-scoped, admin)
51492
51499
  ORG_INVITATIONS: (orgId) => `${API_BASE}/orgs/${orgId}/invitations`,
51493
51500
  ORG_INVITATION: (orgId, invId) => `${API_BASE}/orgs/${orgId}/invitations/${invId}`,
@@ -51582,6 +51589,7 @@ var ENDPOINTS = {
51582
51589
  ORG_UNREAD: (orgId) => `${API_BASE}/orgs/${orgId}/unread`,
51583
51590
  CHAT_READ: (orgId, chatId) => `${API_BASE}/orgs/${orgId}/chats/${chatId}/read`,
51584
51591
  THREAD_UNREAD: (orgId, chatId, threadRootId) => `${API_BASE}/orgs/${orgId}/chats/${chatId}/threads/${threadRootId}/unread`,
51592
+ THREAD_READ: (orgId, chatId, threadRootId) => `${API_BASE}/orgs/${orgId}/chats/${chatId}/threads/${threadRootId}/read`,
51585
51593
  // References (org-scoped)
51586
51594
  REFS_RESOLVE: (orgId) => `${API_BASE}/orgs/${orgId}/refs/resolve`,
51587
51595
  REFS_BACKLINKS: (orgId) => `${API_BASE}/orgs/${orgId}/refs/backlinks`,
@@ -52672,10 +52680,16 @@ var ParallClient = class _ParallClient {
52672
52680
  async resizeMachine(orgId, machineId, spec) {
52673
52681
  return this.request("PATCH", ENDPOINTS.MACHINE_SPEC(orgId, machineId), spec);
52674
52682
  }
52675
- /** Signal a local daemon-mode Machine to check for and apply an update. */
52683
+ /** @deprecated Retired server-side (daemon-control-authorization §4.2):
52684
+ * daemons update autonomously (CDN poll + platform release signal). The
52685
+ * endpoint now answers 409 LOCAL_UPDATE_NOT_SUPPORTED unconditionally. */
52676
52686
  async requestMachineUpdate(orgId, machineId, mandatory = false) {
52677
52687
  await this.request("POST", ENDPOINTS.MACHINE_REQUEST_UPDATE(orgId, machineId), { mandatory });
52678
52688
  }
52689
+ /** @deprecated Retired server-side (daemon-control-authorization §4.2):
52690
+ * remote filesystem browse of a member's machine was remote device access.
52691
+ * The endpoint now answers 409 LOCAL_BROWSE_NOT_SUPPORTED unconditionally;
52692
+ * workspace paths are typed in (or picked on the machine's own Desktop). */
52679
52693
  async browseMachineFilesystem(orgId, machineId, path11) {
52680
52694
  return this.request("POST", ENDPOINTS.MACHINE_BROWSE(orgId, machineId), { path: path11 }, void 0, false, { timeoutMs: 15e3 });
52681
52695
  }
@@ -52700,6 +52714,14 @@ var ParallClient = class _ParallClient {
52700
52714
  async getThreadUnread(orgId, chatId, threadRootId) {
52701
52715
  return this.request("GET", ENDPOINTS.THREAD_UNREAD(orgId, chatId, threadRootId));
52702
52716
  }
52717
+ /** Advance the per-thread read cursor (forward-only). The server auto-clears
52718
+ * thread-scoped inbox items (thread_reply + in-thread mentions) the cursor
52719
+ * now covers. */
52720
+ async markThreadRead(orgId, chatId, threadRootId, messageId) {
52721
+ return this.request("POST", ENDPOINTS.THREAD_READ(orgId, chatId, threadRootId), {
52722
+ message_id: messageId
52723
+ });
52724
+ }
52703
52725
  // ---- Inbox ----
52704
52726
  async getInbox(orgId, params) {
52705
52727
  return this.request("GET", ENDPOINTS.INBOX(orgId), void 0, params);
@@ -52723,9 +52745,12 @@ var ParallClient = class _ParallClient {
52723
52745
  async archiveAllInbox(orgId) {
52724
52746
  return this.request("POST", ENDPOINTS.INBOX_ARCHIVE_ALL(orgId));
52725
52747
  }
52726
- /** Mark an inbox item as read by its source (source_type + source_id) rather than inbox item ID. */
52727
- async ackInbox(orgId, source) {
52728
- return this.request("POST", ENDPOINTS.INBOX_ACK(orgId), source);
52748
+ /** Mark inbox items as read by their source (source_type + source_id) or by
52749
+ * group_key, rather than by inbox item ID. The group_key form clears a whole
52750
+ * group at once (e.g. `task:{taskId}` — task_assign/task_update/task_comment
52751
+ * share it), used by the task detail view's auto-ack on open. */
52752
+ async ackInbox(orgId, target) {
52753
+ return this.request("POST", ENDPOINTS.INBOX_ACK(orgId), target);
52729
52754
  }
52730
52755
  async deleteInboxItem(orgId, id) {
52731
52756
  return this.request("DELETE", ENDPOINTS.INBOX_ITEM(orgId, id));
@@ -53007,6 +53032,15 @@ var ParallClient = class _ParallClient {
53007
53032
  async initiateChannelProvisioning(orgId, input) {
53008
53033
  return this.request("POST", ENDPOINTS.CHANNEL_PROVISIONING(orgId), input);
53009
53034
  }
53035
+ /**
53036
+ * Mint a pending slack connection + api.slack.com manifest-prefill link
53037
+ * (guided manual path). Activate the returned connection_id with
53038
+ * deliverChannelCredentials once the user brings back the bot token +
53039
+ * signing secret.
53040
+ */
53041
+ async createSlackManifestLink(orgId, input) {
53042
+ return this.request("POST", ENDPOINTS.CHANNEL_SLACK_MANIFEST_LINK(orgId), input);
53043
+ }
53010
53044
  /**
53011
53045
  * Lazy status poll — server-side this may forward one provider poll, so
53012
53046
  * call it at the session's `poll_interval_seconds` cadence, not faster.
@@ -53025,6 +53059,38 @@ var ParallClient = class _ParallClient {
53025
53059
  async sendChannelMessage(orgId, input) {
53026
53060
  return this.request("POST", ENDPOINTS.CHANNEL_SEND(orgId), input);
53027
53061
  }
53062
+ slackReadQuery(base, query, extra) {
53063
+ const params = new URLSearchParams();
53064
+ if (query?.cursor)
53065
+ params.set("cursor", query.cursor);
53066
+ if (query?.limit)
53067
+ params.set("limit", String(query.limit));
53068
+ for (const [k, v] of Object.entries(extra ?? {}))
53069
+ params.set(k, v);
53070
+ const qs = params.toString();
53071
+ return qs ? `${base}?${qs}` : base;
53072
+ }
53073
+ /**
53074
+ * Tier-B read verbs (agent-only): workspace visibility as the bot sees
53075
+ * it. Same live gate as the send verb; authorization beyond it is the
53076
+ * bot's own Slack permissions.
53077
+ */
53078
+ async listSlackChannels(orgId, query) {
53079
+ return this.request("GET", this.slackReadQuery(ENDPOINTS.SLACK_CHANNELS(orgId), query));
53080
+ }
53081
+ async listSlackUsers(orgId, query) {
53082
+ return this.request("GET", this.slackReadQuery(ENDPOINTS.SLACK_USERS(orgId), query));
53083
+ }
53084
+ async slackHistory(orgId, conversationId, query) {
53085
+ return this.request("GET", this.slackReadQuery(ENDPOINTS.SLACK_HISTORY(orgId), query, { conversation: conversationId }));
53086
+ }
53087
+ async slackMembers(orgId, conversationId, query) {
53088
+ return this.request("GET", this.slackReadQuery(ENDPOINTS.SLACK_MEMBERS(orgId), query, { conversation: conversationId }));
53089
+ }
53090
+ /** Set/clear the Agents-pane "typing…" indicator (best-effort cosmetic). */
53091
+ async setSlackStatus(orgId, input) {
53092
+ await this.request("POST", ENDPOINTS.SLACK_STATUS(orgId), input);
53093
+ }
53028
53094
  async listChannelConversations(orgId, connectionId) {
53029
53095
  return this.request("GET", ENDPOINTS.CHANNEL_CONNECTION_CONVERSATIONS(orgId, connectionId));
53030
53096
  }
@@ -51484,10 +51484,17 @@ var ENDPOINTS = {
51484
51484
  CHANNEL_CONVERSATION_SESSION: (orgId, conversationId) => `${API_BASE}/orgs/${orgId}/channel-conversations/${conversationId}/session`,
51485
51485
  CHANNEL_MESSAGE: (orgId, messageId) => `${API_BASE}/orgs/${orgId}/channel-messages/${messageId}`,
51486
51486
  CHANNEL_PROVISIONING: (orgId) => `${API_BASE}/orgs/${orgId}/channel-provisioning`,
51487
+ CHANNEL_SLACK_MANIFEST_LINK: (orgId) => `${API_BASE}/orgs/${orgId}/channel-provisioning/slack/manifest-link`,
51487
51488
  CHANNEL_PROVISIONING_SESSION: (orgId, sessionId) => `${API_BASE}/orgs/${orgId}/channel-provisioning/${sessionId}`,
51488
51489
  CHANNEL_PROVISIONING_CANCEL: (orgId, sessionId) => `${API_BASE}/orgs/${orgId}/channel-provisioning/${sessionId}/cancel`,
51489
51490
  // Tier-B platform verb (agent-only): send one message as the bound bot.
51490
51491
  CHANNEL_SEND: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/channel-send`,
51492
+ // Tier-B read verbs (agent-only): workspace visibility as the bot sees it.
51493
+ SLACK_CHANNELS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/channels`,
51494
+ SLACK_USERS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/users`,
51495
+ SLACK_HISTORY: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/history`,
51496
+ SLACK_MEMBERS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/members`,
51497
+ SLACK_STATUS: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me/slack/status`,
51491
51498
  // Invitations (org-scoped, admin)
51492
51499
  ORG_INVITATIONS: (orgId) => `${API_BASE}/orgs/${orgId}/invitations`,
51493
51500
  ORG_INVITATION: (orgId, invId) => `${API_BASE}/orgs/${orgId}/invitations/${invId}`,
@@ -51582,6 +51589,7 @@ var ENDPOINTS = {
51582
51589
  ORG_UNREAD: (orgId) => `${API_BASE}/orgs/${orgId}/unread`,
51583
51590
  CHAT_READ: (orgId, chatId) => `${API_BASE}/orgs/${orgId}/chats/${chatId}/read`,
51584
51591
  THREAD_UNREAD: (orgId, chatId, threadRootId) => `${API_BASE}/orgs/${orgId}/chats/${chatId}/threads/${threadRootId}/unread`,
51592
+ THREAD_READ: (orgId, chatId, threadRootId) => `${API_BASE}/orgs/${orgId}/chats/${chatId}/threads/${threadRootId}/read`,
51585
51593
  // References (org-scoped)
51586
51594
  REFS_RESOLVE: (orgId) => `${API_BASE}/orgs/${orgId}/refs/resolve`,
51587
51595
  REFS_BACKLINKS: (orgId) => `${API_BASE}/orgs/${orgId}/refs/backlinks`,
@@ -52672,10 +52680,16 @@ var ParallClient = class _ParallClient {
52672
52680
  async resizeMachine(orgId, machineId, spec) {
52673
52681
  return this.request("PATCH", ENDPOINTS.MACHINE_SPEC(orgId, machineId), spec);
52674
52682
  }
52675
- /** Signal a local daemon-mode Machine to check for and apply an update. */
52683
+ /** @deprecated Retired server-side (daemon-control-authorization §4.2):
52684
+ * daemons update autonomously (CDN poll + platform release signal). The
52685
+ * endpoint now answers 409 LOCAL_UPDATE_NOT_SUPPORTED unconditionally. */
52676
52686
  async requestMachineUpdate(orgId, machineId, mandatory = false) {
52677
52687
  await this.request("POST", ENDPOINTS.MACHINE_REQUEST_UPDATE(orgId, machineId), { mandatory });
52678
52688
  }
52689
+ /** @deprecated Retired server-side (daemon-control-authorization §4.2):
52690
+ * remote filesystem browse of a member's machine was remote device access.
52691
+ * The endpoint now answers 409 LOCAL_BROWSE_NOT_SUPPORTED unconditionally;
52692
+ * workspace paths are typed in (or picked on the machine's own Desktop). */
52679
52693
  async browseMachineFilesystem(orgId, machineId, path12) {
52680
52694
  return this.request("POST", ENDPOINTS.MACHINE_BROWSE(orgId, machineId), { path: path12 }, void 0, false, { timeoutMs: 15e3 });
52681
52695
  }
@@ -52700,6 +52714,14 @@ var ParallClient = class _ParallClient {
52700
52714
  async getThreadUnread(orgId, chatId, threadRootId) {
52701
52715
  return this.request("GET", ENDPOINTS.THREAD_UNREAD(orgId, chatId, threadRootId));
52702
52716
  }
52717
+ /** Advance the per-thread read cursor (forward-only). The server auto-clears
52718
+ * thread-scoped inbox items (thread_reply + in-thread mentions) the cursor
52719
+ * now covers. */
52720
+ async markThreadRead(orgId, chatId, threadRootId, messageId) {
52721
+ return this.request("POST", ENDPOINTS.THREAD_READ(orgId, chatId, threadRootId), {
52722
+ message_id: messageId
52723
+ });
52724
+ }
52703
52725
  // ---- Inbox ----
52704
52726
  async getInbox(orgId, params) {
52705
52727
  return this.request("GET", ENDPOINTS.INBOX(orgId), void 0, params);
@@ -52723,9 +52745,12 @@ var ParallClient = class _ParallClient {
52723
52745
  async archiveAllInbox(orgId) {
52724
52746
  return this.request("POST", ENDPOINTS.INBOX_ARCHIVE_ALL(orgId));
52725
52747
  }
52726
- /** Mark an inbox item as read by its source (source_type + source_id) rather than inbox item ID. */
52727
- async ackInbox(orgId, source) {
52728
- return this.request("POST", ENDPOINTS.INBOX_ACK(orgId), source);
52748
+ /** Mark inbox items as read by their source (source_type + source_id) or by
52749
+ * group_key, rather than by inbox item ID. The group_key form clears a whole
52750
+ * group at once (e.g. `task:{taskId}` — task_assign/task_update/task_comment
52751
+ * share it), used by the task detail view's auto-ack on open. */
52752
+ async ackInbox(orgId, target) {
52753
+ return this.request("POST", ENDPOINTS.INBOX_ACK(orgId), target);
52729
52754
  }
52730
52755
  async deleteInboxItem(orgId, id) {
52731
52756
  return this.request("DELETE", ENDPOINTS.INBOX_ITEM(orgId, id));
@@ -53007,6 +53032,15 @@ var ParallClient = class _ParallClient {
53007
53032
  async initiateChannelProvisioning(orgId, input) {
53008
53033
  return this.request("POST", ENDPOINTS.CHANNEL_PROVISIONING(orgId), input);
53009
53034
  }
53035
+ /**
53036
+ * Mint a pending slack connection + api.slack.com manifest-prefill link
53037
+ * (guided manual path). Activate the returned connection_id with
53038
+ * deliverChannelCredentials once the user brings back the bot token +
53039
+ * signing secret.
53040
+ */
53041
+ async createSlackManifestLink(orgId, input) {
53042
+ return this.request("POST", ENDPOINTS.CHANNEL_SLACK_MANIFEST_LINK(orgId), input);
53043
+ }
53010
53044
  /**
53011
53045
  * Lazy status poll — server-side this may forward one provider poll, so
53012
53046
  * call it at the session's `poll_interval_seconds` cadence, not faster.
@@ -53025,6 +53059,38 @@ var ParallClient = class _ParallClient {
53025
53059
  async sendChannelMessage(orgId, input) {
53026
53060
  return this.request("POST", ENDPOINTS.CHANNEL_SEND(orgId), input);
53027
53061
  }
53062
+ slackReadQuery(base, query, extra) {
53063
+ const params = new URLSearchParams();
53064
+ if (query?.cursor)
53065
+ params.set("cursor", query.cursor);
53066
+ if (query?.limit)
53067
+ params.set("limit", String(query.limit));
53068
+ for (const [k, v] of Object.entries(extra ?? {}))
53069
+ params.set(k, v);
53070
+ const qs = params.toString();
53071
+ return qs ? `${base}?${qs}` : base;
53072
+ }
53073
+ /**
53074
+ * Tier-B read verbs (agent-only): workspace visibility as the bot sees
53075
+ * it. Same live gate as the send verb; authorization beyond it is the
53076
+ * bot's own Slack permissions.
53077
+ */
53078
+ async listSlackChannels(orgId, query) {
53079
+ return this.request("GET", this.slackReadQuery(ENDPOINTS.SLACK_CHANNELS(orgId), query));
53080
+ }
53081
+ async listSlackUsers(orgId, query) {
53082
+ return this.request("GET", this.slackReadQuery(ENDPOINTS.SLACK_USERS(orgId), query));
53083
+ }
53084
+ async slackHistory(orgId, conversationId, query) {
53085
+ return this.request("GET", this.slackReadQuery(ENDPOINTS.SLACK_HISTORY(orgId), query, { conversation: conversationId }));
53086
+ }
53087
+ async slackMembers(orgId, conversationId, query) {
53088
+ return this.request("GET", this.slackReadQuery(ENDPOINTS.SLACK_MEMBERS(orgId), query, { conversation: conversationId }));
53089
+ }
53090
+ /** Set/clear the Agents-pane "typing…" indicator (best-effort cosmetic). */
53091
+ async setSlackStatus(orgId, input) {
53092
+ await this.request("POST", ENDPOINTS.SLACK_STATUS(orgId), input);
53093
+ }
53028
53094
  async listChannelConversations(orgId, connectionId) {
53029
53095
  return this.request("GET", ENDPOINTS.CHANNEL_CONNECTION_CONVERSATIONS(orgId, connectionId));
53030
53096
  }