@parall/daemon 1.55.5 → 1.56.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/manifest.json +11 -11
- package/bundle/parall-browser-pod.js +62 -0
- package/bundle/parall-claude-agent.js +109 -6
- package/bundle/parall-codex-agent.js +109 -6
- package/bundle/parall-daemon.js +62 -0
- package/package.json +6 -6
package/bundle/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.
|
|
3
|
-
"built_at": "2026-08-
|
|
2
|
+
"version": "1.56.1",
|
|
3
|
+
"built_at": "2026-08-20T15:59:41.375Z",
|
|
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": "
|
|
20
|
-
"size":
|
|
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": "
|
|
28
|
-
"size":
|
|
27
|
+
"sha256": "4ccbdb9f93cb2adeea7313b4391c471c0df150a185fb91b439c59274abfff506",
|
|
28
|
+
"size": 2838235
|
|
29
29
|
},
|
|
30
30
|
"parall-codex-agent.js": {
|
|
31
|
-
"sha256": "
|
|
32
|
-
"size":
|
|
31
|
+
"sha256": "a0dd40e7a27785f60ca8fff9a1c158203f5381447223dad3374811ec22ca1da5",
|
|
32
|
+
"size": 2870182
|
|
33
33
|
},
|
|
34
34
|
"parall-daemon.js": {
|
|
35
|
-
"sha256": "
|
|
36
|
-
"size":
|
|
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": "
|
|
43
|
+
"signature": "rveWOLf71C0Rr6tMca/y0AlIm7l2yLQIUbgJABu5NEz0TLXgWVhymuNYkGDKMhx0aztrea064KwfTBa8rk3JCA=="
|
|
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
|
-
|
|
58931
|
-
|
|
58932
|
-
|
|
58933
|
-
|
|
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
|
|
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
|
-
|
|
58931
|
-
|
|
58932
|
-
|
|
58933
|
-
|
|
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
|
|
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
|
{
|
package/bundle/parall-daemon.js
CHANGED
|
@@ -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.
|
|
3
|
+
"version": "1.56.1",
|
|
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.
|
|
37
|
-
"@parall/sdk": "1.
|
|
38
|
-
"@parall/claude-agent": "1.
|
|
39
|
-
"@parall/codex-agent": "1.
|
|
40
|
-
"@parall/openclaw-agent": "1.
|
|
36
|
+
"@parall/agent-core": "1.56.1",
|
|
37
|
+
"@parall/sdk": "1.56.1",
|
|
38
|
+
"@parall/claude-agent": "1.56.1",
|
|
39
|
+
"@parall/codex-agent": "1.56.1",
|
|
40
|
+
"@parall/openclaw-agent": "1.56.1"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/node": "^22.0.0",
|