@parall/daemon 1.39.0 → 1.41.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.
- package/bundle/manifest.json +11 -11
- package/bundle/parall-browser-pod.js +11 -0
- package/bundle/parall-claude-agent.js +169 -66
- package/bundle/parall-codex-agent.js +169 -66
- package/bundle/parall-daemon.js +12 -0
- package/package.json +6 -6
package/bundle/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.
|
|
3
|
-
"built_at": "2026-07-
|
|
2
|
+
"version": "1.41.0",
|
|
3
|
+
"built_at": "2026-07-10T05:52:54.072Z",
|
|
4
4
|
"min_node_version": "20.0.0",
|
|
5
5
|
"files": {
|
|
6
6
|
"bb-browser-daemon.js": {
|
|
@@ -16,25 +16,25 @@
|
|
|
16
16
|
"size": 18
|
|
17
17
|
},
|
|
18
18
|
"parall-browser-pod.js": {
|
|
19
|
-
"sha256": "
|
|
20
|
-
"size":
|
|
19
|
+
"sha256": "6d5aade09173b16e332dcd29d0d1b1d68cfb424c4297d031b36069b07d3077cc",
|
|
20
|
+
"size": 1698807
|
|
21
21
|
},
|
|
22
22
|
"parall-claude-agent.js": {
|
|
23
|
-
"sha256": "
|
|
24
|
-
"size":
|
|
23
|
+
"sha256": "e83d963acd70069ee4e4f564df91154d3172325f6681925ee0cbca0330c90099",
|
|
24
|
+
"size": 1623952
|
|
25
25
|
},
|
|
26
26
|
"parall-codex-agent.js": {
|
|
27
|
-
"sha256": "
|
|
28
|
-
"size":
|
|
27
|
+
"sha256": "13ccc915e9b18f6a300d8d27a07221f7d0bcf2ac3edce719abc85bbd57db9fc1",
|
|
28
|
+
"size": 1654762
|
|
29
29
|
},
|
|
30
30
|
"parall-daemon.js": {
|
|
31
|
-
"sha256": "
|
|
32
|
-
"size":
|
|
31
|
+
"sha256": "eeef6afe86012476ccbb8ec7e2e0e9228f66515a044e4bba69445fbeb5850a6a",
|
|
32
|
+
"size": 1719056
|
|
33
33
|
},
|
|
34
34
|
"parall-openclaw-agent.js": {
|
|
35
35
|
"sha256": "505433b4bf3a4b8dbb7b96978d8693d6c48079f4513282ff1ee59a6d13b3eddf",
|
|
36
36
|
"size": 9801
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
|
-
"signature": "
|
|
39
|
+
"signature": "Gl4UXAqlHYlaqbK5L48tDAHYjBs6yGSAd0zg2HsNj3yTvqxQgSyDQtO++hPKdkR7VdVdM/weOj6qoct4UXVZDA=="
|
|
40
40
|
}
|
|
@@ -35165,6 +35165,7 @@ var ENDPOINTS = {
|
|
|
35165
35165
|
AGENT_MONITOR: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/monitor`,
|
|
35166
35166
|
AGENT_ME: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me`,
|
|
35167
35167
|
AGENT_NEW_SESSION: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/new-session`,
|
|
35168
|
+
AGENT_DEEP_RESET: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/deep-reset`,
|
|
35168
35169
|
AGENT_SESSIONS: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/sessions`,
|
|
35169
35170
|
AGENT_SESSION: (orgId, agentId, sessionId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/sessions/${sessionId}`,
|
|
35170
35171
|
AGENT_SESSION_STEPS: (orgId, agentId, sessionId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/sessions/${sessionId}/steps`,
|
|
@@ -36064,6 +36065,16 @@ var ParallClient = class _ParallClient {
|
|
|
36064
36065
|
async requestNewAgentSession(orgId, agentId) {
|
|
36065
36066
|
return this.request("POST", ENDPOINTS.AGENT_NEW_SESSION(orgId, agentId));
|
|
36066
36067
|
}
|
|
36068
|
+
/**
|
|
36069
|
+
* Wipe a managed agent's entity state — sandbox filesystem, AGENT.md,
|
|
36070
|
+
* long-term memory — while keeping the conversation line and channel
|
|
36071
|
+
* binding. The destructive counterpart of New Session under the
|
|
36072
|
+
* conversation/entity split (managed/parel agents only; 409 SHARED_AGENT
|
|
36073
|
+
* for multi-org memberships).
|
|
36074
|
+
*/
|
|
36075
|
+
async deepResetAgent(orgId, agentId) {
|
|
36076
|
+
return this.request("POST", ENDPOINTS.AGENT_DEEP_RESET(orgId, agentId));
|
|
36077
|
+
}
|
|
36067
36078
|
async createAgentSession(orgId, agentId, req) {
|
|
36068
36079
|
return this.request("POST", ENDPOINTS.AGENT_SESSIONS(orgId, agentId), req);
|
|
36069
36080
|
}
|
|
@@ -26711,6 +26711,10 @@ function buildSendMessageHint(event) {
|
|
|
26711
26711
|
<system-reminder>To reply on ${where}, run: \`parall comments add --target "${event.replyTargetUri}" --body "..."\` (read the thread first with \`parall comments list --target "${event.replyTargetUri}"\`). To message someone instead, use \`parall messages send\` / \`parall dm\`. Your plain text output is not delivered.</system-reminder>`;
|
|
26712
26712
|
}
|
|
26713
26713
|
if (event.targetId.startsWith("cht_")) {
|
|
26714
|
+
if (event.threadRootId) {
|
|
26715
|
+
return `
|
|
26716
|
+
<system-reminder>To reply in this thread, run \`parall messages send prll://${event.targetId} --thread-root-id ${sanitizeMeta(event.threadRootId)} --text-file - <<'EOF'\` \u2026 \`EOF\` \u2014 the quoted heredoc keeps \`$\`, backticks and apostrophes literal (plain \`--text "$1,000"\` sends \`,000\`). Your plain text output is not delivered to the chat.</system-reminder>`;
|
|
26717
|
+
}
|
|
26714
26718
|
return `
|
|
26715
26719
|
<system-reminder>To reply, run \`parall messages send prll://${event.targetId} --text-file - <<'EOF'\` \u2026 \`EOF\` \u2014 the quoted heredoc keeps \`$\`, backticks and apostrophes literal (plain \`--text "$1,000"\` sends \`,000\`). Your plain text output is not delivered to the chat.</system-reminder>`;
|
|
26716
26720
|
}
|
|
@@ -26803,6 +26807,10 @@ Don't wait for instructions. If you see the next step, take it. If something is
|
|
|
26803
26807
|
ambiguous, clarify once and proceed. If you're blocked, say what's blocking you
|
|
26804
26808
|
\u2014 don't go silent. Initiative is expected.
|
|
26805
26809
|
|
|
26810
|
+
Use schedules as self-reminders \u2014 re-checking blocked work, chasing unanswered
|
|
26811
|
+
requests, verifying something landed. When a thing needs future attention and
|
|
26812
|
+
nothing will prompt it, schedule it (load the \`parall-schedules\` skill).
|
|
26813
|
+
|
|
26806
26814
|
### Work in the open
|
|
26807
26815
|
Nothing you do exists until the system can see it. Your progress, decisions,
|
|
26808
26816
|
blockers, and results need to live in tasks, comments, messages, or wiki pages
|
|
@@ -26811,13 +26819,92 @@ who picks up where you left off. Leave traces as you go, not at the end.
|
|
|
26811
26819
|
|
|
26812
26820
|
For non-trivial work: create or claim a task, mark it \`in_progress\`, comment
|
|
26813
26821
|
when status materially changes, close it when done, and link the origin that
|
|
26814
|
-
triggered it.
|
|
26822
|
+
triggered it. Decompose multi-step work into subtasks and keep their statuses
|
|
26823
|
+
current \u2014 progress should be auditable without watching the work happen.
|
|
26824
|
+
Details: load the \`parall-tasks\` skill.
|
|
26825
|
+
|
|
26826
|
+
### Done means landed
|
|
26827
|
+
Producing output does not complete a task. Work counts as done only when it has
|
|
26828
|
+
cleared its remaining gates \u2014 review, merge, deployment, the requester's
|
|
26829
|
+
verification. Until then keep the status honest (\`in_progress\` or
|
|
26830
|
+
\`in_review\`), name the remaining gate in a comment, and chase it (schedule a
|
|
26831
|
+
self-reminder if nothing else will prompt follow-up). Never mark done what a
|
|
26832
|
+
human still has to accept.
|
|
26833
|
+
|
|
26834
|
+
### Sessions, forks, and what survives
|
|
26835
|
+
Sessions end and context compacts. Anything that must survive \u2014 decisions,
|
|
26836
|
+
progress, constraints \u2014 belongs in tasks, comments, or wiki. Future sessions
|
|
26837
|
+
read the workspace, not this conversation.
|
|
26838
|
+
|
|
26839
|
+
Some events are handled by parallel fork sessions \u2014 short-lived copies of the
|
|
26840
|
+
same agent identity with separate context. In a fork: leave a written trace of
|
|
26841
|
+
what was done or deliberately not done (other sessions cannot see fork
|
|
26842
|
+
context), and do not start long-running processes \u2014 they die with the fork.
|
|
26843
|
+
When an event is marked fork-handled: do not re-handle it; verify its outcome
|
|
26844
|
+
instead of assuming it.
|
|
26815
26845
|
|
|
26816
26846
|
### Communicate like a teammate
|
|
26817
26847
|
Match the conversation \u2014 concise in chat, thorough in docs, plain language over
|
|
26818
26848
|
jargon. Say what matters; stop when you're done. Don't narrate every tool call
|
|
26819
26849
|
or pad replies to seem thorough.
|
|
26820
26850
|
|
|
26851
|
+
Match the language of the person you're replying to. If someone writes in
|
|
26852
|
+
Chinese, reply in Chinese. If in English, reply in English. Never force a
|
|
26853
|
+
language switch unless explicitly asked.
|
|
26854
|
+
|
|
26855
|
+
Do not promise delivery times ("in an hour", "by tonight") unless the work is
|
|
26856
|
+
driven by an explicit schedule. Scope visibly; report when actually done.
|
|
26857
|
+
|
|
26858
|
+
### Keep topics in threads
|
|
26859
|
+
Check for a \`[Thread: prll://msg_xxx]\` line before interpreting a message.
|
|
26860
|
+
Present \u2192 that thread is the context; reply there, passing the same root as
|
|
26861
|
+
\`--thread-root-id\`. Absent \u2192 the message belongs to the main conversation:
|
|
26862
|
+
never treat it as continuing your most recent thread. The sender's newest
|
|
26863
|
+
message is the anchor \u2014 never route a reply back into an older thread just
|
|
26864
|
+
because the topic used to live there.
|
|
26865
|
+
|
|
26866
|
+
Reply where the event lives: a thread message gets a thread reply, a
|
|
26867
|
+
top-level message gets a top-level reply. But in group chats, your later
|
|
26868
|
+
follow-up on that topic \u2014 progress updates, analysis, links, verification you
|
|
26869
|
+
post afterwards \u2014 belongs in a thread rooted at the topic's message
|
|
26870
|
+
(\`parall messages send <chat> --thread-root-id <msgId> --text-file -\`), so
|
|
26871
|
+
the main channel stays scannable. Post follow-up at top level only when
|
|
26872
|
+
starting a genuinely new topic, making a channel-wide announcement, or when
|
|
26873
|
+
explicitly asked. Never post the same update in both the thread and the main
|
|
26874
|
+
channel \u2014 thread replies surface in the thread panel; no need to duplicate
|
|
26875
|
+
for visibility.
|
|
26876
|
+
|
|
26877
|
+
In DMs, reply top-level by default; use a thread only to continue one that
|
|
26878
|
+
already exists.
|
|
26879
|
+
|
|
26880
|
+
### Group chats: mentions and unaddressed work
|
|
26881
|
+
An @mention is a direct request \u2014 act on it. A group message delivered to you
|
|
26882
|
+
without an @mention means the chat's routing lets you see the conversation:
|
|
26883
|
+
decide whether a reply adds value; silence is the default.
|
|
26884
|
+
|
|
26885
|
+
A message without an @mention is not an open invitation. Judge from context
|
|
26886
|
+
who the work belongs to \u2014 the named domain, the topic's owner, whoever is
|
|
26887
|
+
already on it. If it belongs to someone else, leave it. If genuinely unclear,
|
|
26888
|
+
ask or claim in one line ("taking this unless someone else has it") before
|
|
26889
|
+
starting \u2014 asking first beats duplicated or misdirected work.
|
|
26890
|
+
|
|
26891
|
+
### Verify before you act
|
|
26892
|
+
Events can be redelivered \u2014 before acting, check whether it was already
|
|
26893
|
+
handled (your own recent replies, task comments); if handled, do nothing.
|
|
26894
|
+
Sends can fail silently, and creates can error after succeeding server-side \u2014
|
|
26895
|
+
check the chat or entity before retrying. Never blind-retry a mutating call.
|
|
26896
|
+
|
|
26897
|
+
### Gather the full picture first
|
|
26898
|
+
When a request is vague, an entity may already exist, or work may already be
|
|
26899
|
+
underway \u2014 gather context before acting: search (\`parall search "..."\`),
|
|
26900
|
+
check existing tasks/chats/wiki, read the surrounding conversation. Act on the
|
|
26901
|
+
full picture, not the fragment that arrived in the event.
|
|
26902
|
+
|
|
26903
|
+
### Report only work that ran
|
|
26904
|
+
If a scheduled job, scan, or tool call did not actually run \u2014 restarted
|
|
26905
|
+
session, missing credentials, silent failure \u2014 say so plainly. Never fabricate
|
|
26906
|
+
or approximate results of work that did not execute.
|
|
26907
|
+
|
|
26821
26908
|
### Respect what's shared
|
|
26822
26909
|
You have broad latitude inside your own work. But actions that are visible to
|
|
26823
26910
|
others, hard to reverse, or touch shared state \u2014 sending DMs, editing shared
|
|
@@ -26916,6 +27003,15 @@ session already has continuity, so skip the fetch unless something is unclear.
|
|
|
26916
27003
|
Same pattern for any other entity referenced in the event: \`tasks get\`,
|
|
26917
27004
|
\`projects get\`, \`users get\`, \`chats get\`. Follow the reflink, don't ask.
|
|
26918
27005
|
|
|
27006
|
+
### Find context with search first
|
|
27007
|
+
|
|
27008
|
+
Reach for unified semantic search before paging chat history:
|
|
27009
|
+
|
|
27010
|
+
parall search "pricing decision june" [--limit 10]
|
|
27011
|
+
|
|
27012
|
+
It spans messages, tasks, and wiki. Page \`messages list\` only for the verbatim
|
|
27013
|
+
recent flow of one chat, not for discovery.
|
|
27014
|
+
|
|
26919
27015
|
### File attachments
|
|
26920
27016
|
|
|
26921
27017
|
Messages may include attachments. They appear in events as:
|
|
@@ -27005,6 +27101,8 @@ Keep \`--text "..."\` for short literals with no \`$\`, backtick, or apostrophe.
|
|
|
27005
27101
|
|
|
27006
27102
|
The bridge injects Parall context via environment variables. The static credentials \`PRLL_API_URL\`, \`PRLL_API_KEY\`, and \`PRLL_ORG_ID\` are always set. \`PRLL_CONTEXT_FILE\` points to a per-session JSON file that the gateway updates each dispatch with \`session_id\`, \`chat_id\`, \`trigger_message_id\`, \`no_reply\`, and \`step_id\` (updated per tool call). The CLI reads this file automatically \u2014 you do not need to pass \`--chat\` or \`--session\` explicitly when the context file is present.
|
|
27007
27103
|
|
|
27104
|
+
CLI errors are agent-readable \u2014 read them; they usually name the next step.
|
|
27105
|
+
|
|
27008
27106
|
## Attachments
|
|
27009
27107
|
|
|
27010
27108
|
Image attachments are pre-downloaded under \`.parall/attachments/<messageId>/\`. Each event's \`[Local attachment files]\` block lists each image as a metadata header followed by its absolute local path on its own line \u2014 pass that path to your file-reading tool when the user refers to image contents.
|
|
@@ -27031,29 +27129,6 @@ When you try an action (e.g., archive a chat) and receive a PERMISSION_DENIED er
|
|
|
27031
27129
|
5. List available actions: \`parall approvals actions\`
|
|
27032
27130
|
|
|
27033
27131
|
Only request approval when you've actually been denied permission. Don't request approval preemptively.
|
|
27034
|
-
|
|
27035
|
-
## Threads
|
|
27036
|
-
|
|
27037
|
-
Messages may arrive with a \`[Thread: prll://msg_xxx]\` line in the event block, indicating the message is a reply inside a thread rooted at \`msg_xxx\`.
|
|
27038
|
-
|
|
27039
|
-
### When to use threads
|
|
27040
|
-
- Replying to a specific message or continuing a focused sub-conversation
|
|
27041
|
-
- Keeping detailed discussion (logs, debugging, follow-ups) out of the main channel flow
|
|
27042
|
-
- When someone starts a thread with you, reply in the same thread
|
|
27043
|
-
|
|
27044
|
-
### When NOT to use threads
|
|
27045
|
-
- Broadcasting status updates or announcements \u2014 use top-level messages
|
|
27046
|
-
- Starting a new topic \u2014 post at top level, let others thread if needed
|
|
27047
|
-
|
|
27048
|
-
### CLI usage
|
|
27049
|
-
- The \`msg_xxx\` from the \`[Thread: prll://msg_xxx]\` line is the thread root ID \u2014 pass it as \`--thread-root-id\`
|
|
27050
|
-
- Reply in a thread: \`parall messages send <chatId> --text-file /tmp/reply.md --thread-root-id <msgId>\`
|
|
27051
|
-
- Read thread replies: \`parall messages list <chatId> --thread-root-id <msgId>\`
|
|
27052
|
-
|
|
27053
|
-
### Thread etiquette
|
|
27054
|
-
- If your trigger message is in a thread, reply in that thread by default
|
|
27055
|
-
- Don't duplicate thread content to the channel unless explicitly asked
|
|
27056
|
-
- Keep thread replies focused on the original topic
|
|
27057
27132
|
`;
|
|
27058
27133
|
function extractShellCommand(input) {
|
|
27059
27134
|
if (!input || typeof input !== "object")
|
|
@@ -27100,6 +27175,11 @@ function isParallNoReplyCommand(command) {
|
|
|
27100
27175
|
return sub?.[0] === "no-reply";
|
|
27101
27176
|
}
|
|
27102
27177
|
|
|
27178
|
+
// ts/agent-core/dist/dispatch-adapter.js
|
|
27179
|
+
function buildErrorStepContent(message) {
|
|
27180
|
+
return { text: message, suppressed: false, status: "error" };
|
|
27181
|
+
}
|
|
27182
|
+
|
|
27103
27183
|
// ts/agent-core/dist/logger.js
|
|
27104
27184
|
function createLogger(prefix) {
|
|
27105
27185
|
return {
|
|
@@ -27200,6 +27280,7 @@ var ENDPOINTS = {
|
|
|
27200
27280
|
AGENT_MONITOR: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/monitor`,
|
|
27201
27281
|
AGENT_ME: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me`,
|
|
27202
27282
|
AGENT_NEW_SESSION: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/new-session`,
|
|
27283
|
+
AGENT_DEEP_RESET: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/deep-reset`,
|
|
27203
27284
|
AGENT_SESSIONS: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/sessions`,
|
|
27204
27285
|
AGENT_SESSION: (orgId, agentId, sessionId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/sessions/${sessionId}`,
|
|
27205
27286
|
AGENT_SESSION_STEPS: (orgId, agentId, sessionId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/sessions/${sessionId}/steps`,
|
|
@@ -28183,6 +28264,16 @@ var ParallClient = class _ParallClient {
|
|
|
28183
28264
|
async requestNewAgentSession(orgId, agentId) {
|
|
28184
28265
|
return this.request("POST", ENDPOINTS.AGENT_NEW_SESSION(orgId, agentId));
|
|
28185
28266
|
}
|
|
28267
|
+
/**
|
|
28268
|
+
* Wipe a managed agent's entity state — sandbox filesystem, AGENT.md,
|
|
28269
|
+
* long-term memory — while keeping the conversation line and channel
|
|
28270
|
+
* binding. The destructive counterpart of New Session under the
|
|
28271
|
+
* conversation/entity split (managed/parel agents only; 409 SHARED_AGENT
|
|
28272
|
+
* for multi-org memberships).
|
|
28273
|
+
*/
|
|
28274
|
+
async deepResetAgent(orgId, agentId) {
|
|
28275
|
+
return this.request("POST", ENDPOINTS.AGENT_DEEP_RESET(orgId, agentId));
|
|
28276
|
+
}
|
|
28186
28277
|
async createAgentSession(orgId, agentId, req) {
|
|
28187
28278
|
return this.request("POST", ENDPOINTS.AGENT_SESSIONS(orgId, agentId), req);
|
|
28188
28279
|
}
|
|
@@ -30798,7 +30889,7 @@ var ParallAgentGateway = class {
|
|
|
30798
30889
|
step_type: "text",
|
|
30799
30890
|
target_type: target.target_type,
|
|
30800
30891
|
target_id: target.target_id,
|
|
30801
|
-
content:
|
|
30892
|
+
content: buildErrorStepContent(runtimeEvent.message),
|
|
30802
30893
|
projection: false
|
|
30803
30894
|
});
|
|
30804
30895
|
break;
|
|
@@ -32725,20 +32816,20 @@ parall projects list
|
|
|
32725
32816
|
|
|
32726
32817
|
## Watching Tasks
|
|
32727
32818
|
|
|
32728
|
-
|
|
32819
|
+
Watchers receive dispatch events for a task's new comments. Acting on a task
|
|
32820
|
+
auto-subscribes you \u2014 creating it, being assigned, commenting, being
|
|
32821
|
+
@mentioned, or substantively editing it (description / assignee). Handle or
|
|
32822
|
+
dismiss those comment events deliberately.
|
|
32729
32823
|
|
|
32730
32824
|
\`\`\`bash
|
|
32731
|
-
#
|
|
32732
|
-
parall tasks
|
|
32733
|
-
|
|
32734
|
-
# Unwatch
|
|
32735
|
-
parall tasks unwatch prll://tsk_xxx
|
|
32736
|
-
|
|
32737
|
-
# List who is watching
|
|
32738
|
-
parall tasks watchers prll://tsk_xxx
|
|
32825
|
+
parall tasks watch prll://tsk_xxx # follow a task without acting on it
|
|
32826
|
+
parall tasks unwatch prll://tsk_xxx # opt out of a task's comment events
|
|
32827
|
+
parall tasks watchers prll://tsk_xxx # list who is watching
|
|
32739
32828
|
\`\`\`
|
|
32740
32829
|
|
|
32741
|
-
|
|
32830
|
+
Creators and assignees are locked subscribers \u2014 \`unwatch\` returns 409 for
|
|
32831
|
+
them until the role changes (e.g. reassignment); it works for every other
|
|
32832
|
+
watcher.
|
|
32742
32833
|
|
|
32743
32834
|
## Responding to Task Assignments
|
|
32744
32835
|
|
|
@@ -32747,7 +32838,9 @@ When you receive \`[Event: task.assigned]\`:
|
|
|
32747
32838
|
1. Acknowledge with a comment: \`tasks comments add prll://tsk_xxx --body "On it"\`
|
|
32748
32839
|
2. Update status: \`tasks update prll://tsk_xxx --status in_progress\`
|
|
32749
32840
|
3. Do the work
|
|
32750
|
-
4. Report results
|
|
32841
|
+
4. Report results in a comment. If a gate remains \u2014 review, merge, deploy,
|
|
32842
|
+
requester acceptance \u2014 set \`in_review\` and name the gate; set \`done\`
|
|
32843
|
+
only once the work has actually landed
|
|
32751
32844
|
|
|
32752
32845
|
## Responding to Task Comments
|
|
32753
32846
|
|
|
@@ -32934,6 +33027,18 @@ parall wiki reset <wiki> # discard ALL local edits, restore last-synced state
|
|
|
32934
33027
|
parall wiki status <wiki> # local changes + your changesets, anytime
|
|
32935
33028
|
\`\`\`
|
|
32936
33029
|
|
|
33030
|
+
## Changeset Discipline
|
|
33031
|
+
|
|
33032
|
+
- Creation is fail-closed \u2014 without explicit CLI confirmation of success,
|
|
33033
|
+
assume nothing was created; check before retrying to avoid duplicates.
|
|
33034
|
+
- Read the outcome feedback after proposing changes; do not assume a merge
|
|
33035
|
+
happened.
|
|
33036
|
+
- Terminal changesets (merged / closed) are immutable \u2014 open a new changeset
|
|
33037
|
+
instead of re-merging or re-closing.
|
|
33038
|
+
- Respect path scopes \u2014 some wiki paths are access-restricted.
|
|
33039
|
+
PERMISSION_DENIED on a path means it is not yours to edit; follow the
|
|
33040
|
+
error, don't work around it.
|
|
33041
|
+
|
|
32937
33042
|
CLI success output is JSON on stdout (human summary on stderr); errors state
|
|
32938
33043
|
the reason and the next step \u2014 follow them. \`parall wiki --help\` for the
|
|
32939
33044
|
full command list.
|
|
@@ -32979,6 +33084,14 @@ parall schedules create \\
|
|
|
32979
33084
|
|
|
32980
33085
|
\`--target-ids\` is who receives the fire (usually yourself when you're self-scheduling; another agent or human when delegating). \`--attached-to-uri\` optionally anchors the schedule to a task / chat / project / wiki page \u2014 when that resource is archived or deleted, the schedule auto-cancels (\`cancel_reason=attached_gone\`).
|
|
32981
33086
|
|
|
33087
|
+
### Reminders for someone else
|
|
33088
|
+
|
|
33089
|
+
When someone asks you to remind them (or a third person), put that person in
|
|
33090
|
+
\`--target-ids\` \u2014 the fire is delivered to its targets, so a reminder
|
|
33091
|
+
targeting only yourself never reaches them. The schedule record stays yours as
|
|
33092
|
+
creator (there is no owner transfer); add yourself as an additional target
|
|
33093
|
+
only if you also need to act at fire time.
|
|
33094
|
+
|
|
32982
33095
|
## Listing / inspecting
|
|
32983
33096
|
|
|
32984
33097
|
\`\`\`bash
|
|
@@ -33114,47 +33227,37 @@ CLI command results are JSON on stdout; mutation commands may emit auxiliary hin
|
|
|
33114
33227
|
// ts/agent-core/dist/skills/parall-clips.js
|
|
33115
33228
|
var PARALL_CLIPS_SKILL = `# Parall Clips
|
|
33116
33229
|
|
|
33117
|
-
Clips are
|
|
33230
|
+
Clips are packaged capabilities that let agents operate external systems \u2014
|
|
33231
|
+
APIs and websites \u2014 through named commands installed in the org.
|
|
33118
33232
|
|
|
33119
|
-
##
|
|
33233
|
+
## Discover
|
|
33120
33234
|
|
|
33121
33235
|
\`\`\`bash
|
|
33122
|
-
|
|
33123
|
-
parall clip
|
|
33124
|
-
|
|
33125
|
-
# Show detailed info about a clip (manifest, commands, version)
|
|
33126
|
-
parall clip info <alias>
|
|
33236
|
+
parall clip list # clips installed in this org
|
|
33237
|
+
parall clip info <alias> # commands, params, version
|
|
33127
33238
|
\`\`\`
|
|
33128
33239
|
|
|
33129
|
-
##
|
|
33240
|
+
## Invoke
|
|
33130
33241
|
|
|
33131
33242
|
\`\`\`bash
|
|
33132
|
-
|
|
33133
|
-
|
|
33134
|
-
|
|
33135
|
-
# input is optional \u2014 when provided, it can be a JSON string or plain text
|
|
33136
|
-
parall clip invoke github-tools list-repos '{"org": "acme"}'
|
|
33137
|
-
parall clip invoke web-search search "latest Node.js LTS version"
|
|
33138
|
-
|
|
33139
|
-
# Custom timeout (default 30s)
|
|
33140
|
-
parall clip invoke github-tools create-issue '{"title": "Bug report"}' --timeout 60000
|
|
33243
|
+
parall clip invoke <alias> <command> [input] [--timeout <ms>] # timeout default 30s
|
|
33244
|
+
# input: JSON string or plain text, per the command's params in \`info\`
|
|
33245
|
+
parall clip invoke github-tools list-repos '{"org":"acme"}'
|
|
33141
33246
|
\`\`\`
|
|
33142
33247
|
|
|
33143
|
-
|
|
33144
|
-
|
|
33145
|
-
1. An org admin installs a clip from the Pinix registry or creates a custom one
|
|
33146
|
-
2. \`parall clip list\` shows every clip installed in the org
|
|
33147
|
-
3. You can only **invoke** clips that an admin has **bound to you** \u2014 invoking an unbound clip returns a "not bound" error. Ask an admin to bind the clip if you need it.
|
|
33148
|
-
4. Each clip exposes one or more named commands with typed input/output
|
|
33149
|
-
|
|
33150
|
-
## When to use clips
|
|
33248
|
+
Results are JSON on stdout; failures print an error.
|
|
33151
33249
|
|
|
33152
|
-
|
|
33153
|
-
- Use \`parall clip info <alias>\` to discover available commands and their expected input format
|
|
33154
|
-
- If \`parall clip invoke\` reports the clip isn't bound to you, that clip exists in the org but hasn't been granted to you \u2014 ask an admin to bind it
|
|
33155
|
-
- Clip invocations return JSON output on success or an error message on failure
|
|
33250
|
+
## Behavior rules
|
|
33156
33251
|
|
|
33157
|
-
|
|
33252
|
+
- An authorization error (clip not bound to you) is a fail-fast: ask the
|
|
33253
|
+
clip's owner or an admin to bind it \u2014 do not retry or work around it.
|
|
33254
|
+
- If the executing runtime is offline or the call times out, report that
|
|
33255
|
+
plainly; do not queue, and never fabricate a result for a run that errored.
|
|
33256
|
+
- A clip may act through a person's real logged-in account \u2014 outward,
|
|
33257
|
+
irreversible, or spending actions (post, order, delete, pay) get the same
|
|
33258
|
+
caution as any shared-state change: confirm when intent isn't explicit.
|
|
33259
|
+
- Reach for \`parall clip list\` whenever a task needs capabilities beyond
|
|
33260
|
+
built-in tools.
|
|
33158
33261
|
`;
|
|
33159
33262
|
|
|
33160
33263
|
// ts/agent-core/dist/skills/index.js
|
|
@@ -26711,6 +26711,10 @@ function buildSendMessageHint(event) {
|
|
|
26711
26711
|
<system-reminder>To reply on ${where}, run: \`parall comments add --target "${event.replyTargetUri}" --body "..."\` (read the thread first with \`parall comments list --target "${event.replyTargetUri}"\`). To message someone instead, use \`parall messages send\` / \`parall dm\`. Your plain text output is not delivered.</system-reminder>`;
|
|
26712
26712
|
}
|
|
26713
26713
|
if (event.targetId.startsWith("cht_")) {
|
|
26714
|
+
if (event.threadRootId) {
|
|
26715
|
+
return `
|
|
26716
|
+
<system-reminder>To reply in this thread, run \`parall messages send prll://${event.targetId} --thread-root-id ${sanitizeMeta(event.threadRootId)} --text-file - <<'EOF'\` \u2026 \`EOF\` \u2014 the quoted heredoc keeps \`$\`, backticks and apostrophes literal (plain \`--text "$1,000"\` sends \`,000\`). Your plain text output is not delivered to the chat.</system-reminder>`;
|
|
26717
|
+
}
|
|
26714
26718
|
return `
|
|
26715
26719
|
<system-reminder>To reply, run \`parall messages send prll://${event.targetId} --text-file - <<'EOF'\` \u2026 \`EOF\` \u2014 the quoted heredoc keeps \`$\`, backticks and apostrophes literal (plain \`--text "$1,000"\` sends \`,000\`). Your plain text output is not delivered to the chat.</system-reminder>`;
|
|
26716
26720
|
}
|
|
@@ -26803,6 +26807,10 @@ Don't wait for instructions. If you see the next step, take it. If something is
|
|
|
26803
26807
|
ambiguous, clarify once and proceed. If you're blocked, say what's blocking you
|
|
26804
26808
|
\u2014 don't go silent. Initiative is expected.
|
|
26805
26809
|
|
|
26810
|
+
Use schedules as self-reminders \u2014 re-checking blocked work, chasing unanswered
|
|
26811
|
+
requests, verifying something landed. When a thing needs future attention and
|
|
26812
|
+
nothing will prompt it, schedule it (load the \`parall-schedules\` skill).
|
|
26813
|
+
|
|
26806
26814
|
### Work in the open
|
|
26807
26815
|
Nothing you do exists until the system can see it. Your progress, decisions,
|
|
26808
26816
|
blockers, and results need to live in tasks, comments, messages, or wiki pages
|
|
@@ -26811,13 +26819,92 @@ who picks up where you left off. Leave traces as you go, not at the end.
|
|
|
26811
26819
|
|
|
26812
26820
|
For non-trivial work: create or claim a task, mark it \`in_progress\`, comment
|
|
26813
26821
|
when status materially changes, close it when done, and link the origin that
|
|
26814
|
-
triggered it.
|
|
26822
|
+
triggered it. Decompose multi-step work into subtasks and keep their statuses
|
|
26823
|
+
current \u2014 progress should be auditable without watching the work happen.
|
|
26824
|
+
Details: load the \`parall-tasks\` skill.
|
|
26825
|
+
|
|
26826
|
+
### Done means landed
|
|
26827
|
+
Producing output does not complete a task. Work counts as done only when it has
|
|
26828
|
+
cleared its remaining gates \u2014 review, merge, deployment, the requester's
|
|
26829
|
+
verification. Until then keep the status honest (\`in_progress\` or
|
|
26830
|
+
\`in_review\`), name the remaining gate in a comment, and chase it (schedule a
|
|
26831
|
+
self-reminder if nothing else will prompt follow-up). Never mark done what a
|
|
26832
|
+
human still has to accept.
|
|
26833
|
+
|
|
26834
|
+
### Sessions, forks, and what survives
|
|
26835
|
+
Sessions end and context compacts. Anything that must survive \u2014 decisions,
|
|
26836
|
+
progress, constraints \u2014 belongs in tasks, comments, or wiki. Future sessions
|
|
26837
|
+
read the workspace, not this conversation.
|
|
26838
|
+
|
|
26839
|
+
Some events are handled by parallel fork sessions \u2014 short-lived copies of the
|
|
26840
|
+
same agent identity with separate context. In a fork: leave a written trace of
|
|
26841
|
+
what was done or deliberately not done (other sessions cannot see fork
|
|
26842
|
+
context), and do not start long-running processes \u2014 they die with the fork.
|
|
26843
|
+
When an event is marked fork-handled: do not re-handle it; verify its outcome
|
|
26844
|
+
instead of assuming it.
|
|
26815
26845
|
|
|
26816
26846
|
### Communicate like a teammate
|
|
26817
26847
|
Match the conversation \u2014 concise in chat, thorough in docs, plain language over
|
|
26818
26848
|
jargon. Say what matters; stop when you're done. Don't narrate every tool call
|
|
26819
26849
|
or pad replies to seem thorough.
|
|
26820
26850
|
|
|
26851
|
+
Match the language of the person you're replying to. If someone writes in
|
|
26852
|
+
Chinese, reply in Chinese. If in English, reply in English. Never force a
|
|
26853
|
+
language switch unless explicitly asked.
|
|
26854
|
+
|
|
26855
|
+
Do not promise delivery times ("in an hour", "by tonight") unless the work is
|
|
26856
|
+
driven by an explicit schedule. Scope visibly; report when actually done.
|
|
26857
|
+
|
|
26858
|
+
### Keep topics in threads
|
|
26859
|
+
Check for a \`[Thread: prll://msg_xxx]\` line before interpreting a message.
|
|
26860
|
+
Present \u2192 that thread is the context; reply there, passing the same root as
|
|
26861
|
+
\`--thread-root-id\`. Absent \u2192 the message belongs to the main conversation:
|
|
26862
|
+
never treat it as continuing your most recent thread. The sender's newest
|
|
26863
|
+
message is the anchor \u2014 never route a reply back into an older thread just
|
|
26864
|
+
because the topic used to live there.
|
|
26865
|
+
|
|
26866
|
+
Reply where the event lives: a thread message gets a thread reply, a
|
|
26867
|
+
top-level message gets a top-level reply. But in group chats, your later
|
|
26868
|
+
follow-up on that topic \u2014 progress updates, analysis, links, verification you
|
|
26869
|
+
post afterwards \u2014 belongs in a thread rooted at the topic's message
|
|
26870
|
+
(\`parall messages send <chat> --thread-root-id <msgId> --text-file -\`), so
|
|
26871
|
+
the main channel stays scannable. Post follow-up at top level only when
|
|
26872
|
+
starting a genuinely new topic, making a channel-wide announcement, or when
|
|
26873
|
+
explicitly asked. Never post the same update in both the thread and the main
|
|
26874
|
+
channel \u2014 thread replies surface in the thread panel; no need to duplicate
|
|
26875
|
+
for visibility.
|
|
26876
|
+
|
|
26877
|
+
In DMs, reply top-level by default; use a thread only to continue one that
|
|
26878
|
+
already exists.
|
|
26879
|
+
|
|
26880
|
+
### Group chats: mentions and unaddressed work
|
|
26881
|
+
An @mention is a direct request \u2014 act on it. A group message delivered to you
|
|
26882
|
+
without an @mention means the chat's routing lets you see the conversation:
|
|
26883
|
+
decide whether a reply adds value; silence is the default.
|
|
26884
|
+
|
|
26885
|
+
A message without an @mention is not an open invitation. Judge from context
|
|
26886
|
+
who the work belongs to \u2014 the named domain, the topic's owner, whoever is
|
|
26887
|
+
already on it. If it belongs to someone else, leave it. If genuinely unclear,
|
|
26888
|
+
ask or claim in one line ("taking this unless someone else has it") before
|
|
26889
|
+
starting \u2014 asking first beats duplicated or misdirected work.
|
|
26890
|
+
|
|
26891
|
+
### Verify before you act
|
|
26892
|
+
Events can be redelivered \u2014 before acting, check whether it was already
|
|
26893
|
+
handled (your own recent replies, task comments); if handled, do nothing.
|
|
26894
|
+
Sends can fail silently, and creates can error after succeeding server-side \u2014
|
|
26895
|
+
check the chat or entity before retrying. Never blind-retry a mutating call.
|
|
26896
|
+
|
|
26897
|
+
### Gather the full picture first
|
|
26898
|
+
When a request is vague, an entity may already exist, or work may already be
|
|
26899
|
+
underway \u2014 gather context before acting: search (\`parall search "..."\`),
|
|
26900
|
+
check existing tasks/chats/wiki, read the surrounding conversation. Act on the
|
|
26901
|
+
full picture, not the fragment that arrived in the event.
|
|
26902
|
+
|
|
26903
|
+
### Report only work that ran
|
|
26904
|
+
If a scheduled job, scan, or tool call did not actually run \u2014 restarted
|
|
26905
|
+
session, missing credentials, silent failure \u2014 say so plainly. Never fabricate
|
|
26906
|
+
or approximate results of work that did not execute.
|
|
26907
|
+
|
|
26821
26908
|
### Respect what's shared
|
|
26822
26909
|
You have broad latitude inside your own work. But actions that are visible to
|
|
26823
26910
|
others, hard to reverse, or touch shared state \u2014 sending DMs, editing shared
|
|
@@ -26916,6 +27003,15 @@ session already has continuity, so skip the fetch unless something is unclear.
|
|
|
26916
27003
|
Same pattern for any other entity referenced in the event: \`tasks get\`,
|
|
26917
27004
|
\`projects get\`, \`users get\`, \`chats get\`. Follow the reflink, don't ask.
|
|
26918
27005
|
|
|
27006
|
+
### Find context with search first
|
|
27007
|
+
|
|
27008
|
+
Reach for unified semantic search before paging chat history:
|
|
27009
|
+
|
|
27010
|
+
parall search "pricing decision june" [--limit 10]
|
|
27011
|
+
|
|
27012
|
+
It spans messages, tasks, and wiki. Page \`messages list\` only for the verbatim
|
|
27013
|
+
recent flow of one chat, not for discovery.
|
|
27014
|
+
|
|
26919
27015
|
### File attachments
|
|
26920
27016
|
|
|
26921
27017
|
Messages may include attachments. They appear in events as:
|
|
@@ -27005,6 +27101,8 @@ Keep \`--text "..."\` for short literals with no \`$\`, backtick, or apostrophe.
|
|
|
27005
27101
|
|
|
27006
27102
|
The bridge injects Parall context via environment variables. The static credentials \`PRLL_API_URL\`, \`PRLL_API_KEY\`, and \`PRLL_ORG_ID\` are always set. \`PRLL_CONTEXT_FILE\` points to a per-session JSON file that the gateway updates each dispatch with \`session_id\`, \`chat_id\`, \`trigger_message_id\`, \`no_reply\`, and \`step_id\` (updated per tool call). The CLI reads this file automatically \u2014 you do not need to pass \`--chat\` or \`--session\` explicitly when the context file is present.
|
|
27007
27103
|
|
|
27104
|
+
CLI errors are agent-readable \u2014 read them; they usually name the next step.
|
|
27105
|
+
|
|
27008
27106
|
## Attachments
|
|
27009
27107
|
|
|
27010
27108
|
Image attachments are pre-downloaded under \`.parall/attachments/<messageId>/\`. Each event's \`[Local attachment files]\` block lists each image as a metadata header followed by its absolute local path on its own line \u2014 pass that path to your file-reading tool when the user refers to image contents.
|
|
@@ -27031,29 +27129,6 @@ When you try an action (e.g., archive a chat) and receive a PERMISSION_DENIED er
|
|
|
27031
27129
|
5. List available actions: \`parall approvals actions\`
|
|
27032
27130
|
|
|
27033
27131
|
Only request approval when you've actually been denied permission. Don't request approval preemptively.
|
|
27034
|
-
|
|
27035
|
-
## Threads
|
|
27036
|
-
|
|
27037
|
-
Messages may arrive with a \`[Thread: prll://msg_xxx]\` line in the event block, indicating the message is a reply inside a thread rooted at \`msg_xxx\`.
|
|
27038
|
-
|
|
27039
|
-
### When to use threads
|
|
27040
|
-
- Replying to a specific message or continuing a focused sub-conversation
|
|
27041
|
-
- Keeping detailed discussion (logs, debugging, follow-ups) out of the main channel flow
|
|
27042
|
-
- When someone starts a thread with you, reply in the same thread
|
|
27043
|
-
|
|
27044
|
-
### When NOT to use threads
|
|
27045
|
-
- Broadcasting status updates or announcements \u2014 use top-level messages
|
|
27046
|
-
- Starting a new topic \u2014 post at top level, let others thread if needed
|
|
27047
|
-
|
|
27048
|
-
### CLI usage
|
|
27049
|
-
- The \`msg_xxx\` from the \`[Thread: prll://msg_xxx]\` line is the thread root ID \u2014 pass it as \`--thread-root-id\`
|
|
27050
|
-
- Reply in a thread: \`parall messages send <chatId> --text-file /tmp/reply.md --thread-root-id <msgId>\`
|
|
27051
|
-
- Read thread replies: \`parall messages list <chatId> --thread-root-id <msgId>\`
|
|
27052
|
-
|
|
27053
|
-
### Thread etiquette
|
|
27054
|
-
- If your trigger message is in a thread, reply in that thread by default
|
|
27055
|
-
- Don't duplicate thread content to the channel unless explicitly asked
|
|
27056
|
-
- Keep thread replies focused on the original topic
|
|
27057
27132
|
`;
|
|
27058
27133
|
function extractShellCommand(input) {
|
|
27059
27134
|
if (!input || typeof input !== "object")
|
|
@@ -27100,6 +27175,11 @@ function isParallNoReplyCommand(command) {
|
|
|
27100
27175
|
return sub?.[0] === "no-reply";
|
|
27101
27176
|
}
|
|
27102
27177
|
|
|
27178
|
+
// ts/agent-core/dist/dispatch-adapter.js
|
|
27179
|
+
function buildErrorStepContent(message) {
|
|
27180
|
+
return { text: message, suppressed: false, status: "error" };
|
|
27181
|
+
}
|
|
27182
|
+
|
|
27103
27183
|
// ts/agent-core/dist/logger.js
|
|
27104
27184
|
function createLogger(prefix) {
|
|
27105
27185
|
return {
|
|
@@ -27200,6 +27280,7 @@ var ENDPOINTS = {
|
|
|
27200
27280
|
AGENT_MONITOR: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/monitor`,
|
|
27201
27281
|
AGENT_ME: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me`,
|
|
27202
27282
|
AGENT_NEW_SESSION: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/new-session`,
|
|
27283
|
+
AGENT_DEEP_RESET: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/deep-reset`,
|
|
27203
27284
|
AGENT_SESSIONS: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/sessions`,
|
|
27204
27285
|
AGENT_SESSION: (orgId, agentId, sessionId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/sessions/${sessionId}`,
|
|
27205
27286
|
AGENT_SESSION_STEPS: (orgId, agentId, sessionId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/sessions/${sessionId}/steps`,
|
|
@@ -28183,6 +28264,16 @@ var ParallClient = class _ParallClient {
|
|
|
28183
28264
|
async requestNewAgentSession(orgId, agentId) {
|
|
28184
28265
|
return this.request("POST", ENDPOINTS.AGENT_NEW_SESSION(orgId, agentId));
|
|
28185
28266
|
}
|
|
28267
|
+
/**
|
|
28268
|
+
* Wipe a managed agent's entity state — sandbox filesystem, AGENT.md,
|
|
28269
|
+
* long-term memory — while keeping the conversation line and channel
|
|
28270
|
+
* binding. The destructive counterpart of New Session under the
|
|
28271
|
+
* conversation/entity split (managed/parel agents only; 409 SHARED_AGENT
|
|
28272
|
+
* for multi-org memberships).
|
|
28273
|
+
*/
|
|
28274
|
+
async deepResetAgent(orgId, agentId) {
|
|
28275
|
+
return this.request("POST", ENDPOINTS.AGENT_DEEP_RESET(orgId, agentId));
|
|
28276
|
+
}
|
|
28186
28277
|
async createAgentSession(orgId, agentId, req) {
|
|
28187
28278
|
return this.request("POST", ENDPOINTS.AGENT_SESSIONS(orgId, agentId), req);
|
|
28188
28279
|
}
|
|
@@ -30798,7 +30889,7 @@ var ParallAgentGateway = class {
|
|
|
30798
30889
|
step_type: "text",
|
|
30799
30890
|
target_type: target.target_type,
|
|
30800
30891
|
target_id: target.target_id,
|
|
30801
|
-
content:
|
|
30892
|
+
content: buildErrorStepContent(runtimeEvent.message),
|
|
30802
30893
|
projection: false
|
|
30803
30894
|
});
|
|
30804
30895
|
break;
|
|
@@ -32725,20 +32816,20 @@ parall projects list
|
|
|
32725
32816
|
|
|
32726
32817
|
## Watching Tasks
|
|
32727
32818
|
|
|
32728
|
-
|
|
32819
|
+
Watchers receive dispatch events for a task's new comments. Acting on a task
|
|
32820
|
+
auto-subscribes you \u2014 creating it, being assigned, commenting, being
|
|
32821
|
+
@mentioned, or substantively editing it (description / assignee). Handle or
|
|
32822
|
+
dismiss those comment events deliberately.
|
|
32729
32823
|
|
|
32730
32824
|
\`\`\`bash
|
|
32731
|
-
#
|
|
32732
|
-
parall tasks
|
|
32733
|
-
|
|
32734
|
-
# Unwatch
|
|
32735
|
-
parall tasks unwatch prll://tsk_xxx
|
|
32736
|
-
|
|
32737
|
-
# List who is watching
|
|
32738
|
-
parall tasks watchers prll://tsk_xxx
|
|
32825
|
+
parall tasks watch prll://tsk_xxx # follow a task without acting on it
|
|
32826
|
+
parall tasks unwatch prll://tsk_xxx # opt out of a task's comment events
|
|
32827
|
+
parall tasks watchers prll://tsk_xxx # list who is watching
|
|
32739
32828
|
\`\`\`
|
|
32740
32829
|
|
|
32741
|
-
|
|
32830
|
+
Creators and assignees are locked subscribers \u2014 \`unwatch\` returns 409 for
|
|
32831
|
+
them until the role changes (e.g. reassignment); it works for every other
|
|
32832
|
+
watcher.
|
|
32742
32833
|
|
|
32743
32834
|
## Responding to Task Assignments
|
|
32744
32835
|
|
|
@@ -32747,7 +32838,9 @@ When you receive \`[Event: task.assigned]\`:
|
|
|
32747
32838
|
1. Acknowledge with a comment: \`tasks comments add prll://tsk_xxx --body "On it"\`
|
|
32748
32839
|
2. Update status: \`tasks update prll://tsk_xxx --status in_progress\`
|
|
32749
32840
|
3. Do the work
|
|
32750
|
-
4. Report results
|
|
32841
|
+
4. Report results in a comment. If a gate remains \u2014 review, merge, deploy,
|
|
32842
|
+
requester acceptance \u2014 set \`in_review\` and name the gate; set \`done\`
|
|
32843
|
+
only once the work has actually landed
|
|
32751
32844
|
|
|
32752
32845
|
## Responding to Task Comments
|
|
32753
32846
|
|
|
@@ -32934,6 +33027,18 @@ parall wiki reset <wiki> # discard ALL local edits, restore last-synced state
|
|
|
32934
33027
|
parall wiki status <wiki> # local changes + your changesets, anytime
|
|
32935
33028
|
\`\`\`
|
|
32936
33029
|
|
|
33030
|
+
## Changeset Discipline
|
|
33031
|
+
|
|
33032
|
+
- Creation is fail-closed \u2014 without explicit CLI confirmation of success,
|
|
33033
|
+
assume nothing was created; check before retrying to avoid duplicates.
|
|
33034
|
+
- Read the outcome feedback after proposing changes; do not assume a merge
|
|
33035
|
+
happened.
|
|
33036
|
+
- Terminal changesets (merged / closed) are immutable \u2014 open a new changeset
|
|
33037
|
+
instead of re-merging or re-closing.
|
|
33038
|
+
- Respect path scopes \u2014 some wiki paths are access-restricted.
|
|
33039
|
+
PERMISSION_DENIED on a path means it is not yours to edit; follow the
|
|
33040
|
+
error, don't work around it.
|
|
33041
|
+
|
|
32937
33042
|
CLI success output is JSON on stdout (human summary on stderr); errors state
|
|
32938
33043
|
the reason and the next step \u2014 follow them. \`parall wiki --help\` for the
|
|
32939
33044
|
full command list.
|
|
@@ -32979,6 +33084,14 @@ parall schedules create \\
|
|
|
32979
33084
|
|
|
32980
33085
|
\`--target-ids\` is who receives the fire (usually yourself when you're self-scheduling; another agent or human when delegating). \`--attached-to-uri\` optionally anchors the schedule to a task / chat / project / wiki page \u2014 when that resource is archived or deleted, the schedule auto-cancels (\`cancel_reason=attached_gone\`).
|
|
32981
33086
|
|
|
33087
|
+
### Reminders for someone else
|
|
33088
|
+
|
|
33089
|
+
When someone asks you to remind them (or a third person), put that person in
|
|
33090
|
+
\`--target-ids\` \u2014 the fire is delivered to its targets, so a reminder
|
|
33091
|
+
targeting only yourself never reaches them. The schedule record stays yours as
|
|
33092
|
+
creator (there is no owner transfer); add yourself as an additional target
|
|
33093
|
+
only if you also need to act at fire time.
|
|
33094
|
+
|
|
32982
33095
|
## Listing / inspecting
|
|
32983
33096
|
|
|
32984
33097
|
\`\`\`bash
|
|
@@ -33114,47 +33227,37 @@ CLI command results are JSON on stdout; mutation commands may emit auxiliary hin
|
|
|
33114
33227
|
// ts/agent-core/dist/skills/parall-clips.js
|
|
33115
33228
|
var PARALL_CLIPS_SKILL = `# Parall Clips
|
|
33116
33229
|
|
|
33117
|
-
Clips are
|
|
33230
|
+
Clips are packaged capabilities that let agents operate external systems \u2014
|
|
33231
|
+
APIs and websites \u2014 through named commands installed in the org.
|
|
33118
33232
|
|
|
33119
|
-
##
|
|
33233
|
+
## Discover
|
|
33120
33234
|
|
|
33121
33235
|
\`\`\`bash
|
|
33122
|
-
|
|
33123
|
-
parall clip
|
|
33124
|
-
|
|
33125
|
-
# Show detailed info about a clip (manifest, commands, version)
|
|
33126
|
-
parall clip info <alias>
|
|
33236
|
+
parall clip list # clips installed in this org
|
|
33237
|
+
parall clip info <alias> # commands, params, version
|
|
33127
33238
|
\`\`\`
|
|
33128
33239
|
|
|
33129
|
-
##
|
|
33240
|
+
## Invoke
|
|
33130
33241
|
|
|
33131
33242
|
\`\`\`bash
|
|
33132
|
-
|
|
33133
|
-
|
|
33134
|
-
|
|
33135
|
-
# input is optional \u2014 when provided, it can be a JSON string or plain text
|
|
33136
|
-
parall clip invoke github-tools list-repos '{"org": "acme"}'
|
|
33137
|
-
parall clip invoke web-search search "latest Node.js LTS version"
|
|
33138
|
-
|
|
33139
|
-
# Custom timeout (default 30s)
|
|
33140
|
-
parall clip invoke github-tools create-issue '{"title": "Bug report"}' --timeout 60000
|
|
33243
|
+
parall clip invoke <alias> <command> [input] [--timeout <ms>] # timeout default 30s
|
|
33244
|
+
# input: JSON string or plain text, per the command's params in \`info\`
|
|
33245
|
+
parall clip invoke github-tools list-repos '{"org":"acme"}'
|
|
33141
33246
|
\`\`\`
|
|
33142
33247
|
|
|
33143
|
-
|
|
33144
|
-
|
|
33145
|
-
1. An org admin installs a clip from the Pinix registry or creates a custom one
|
|
33146
|
-
2. \`parall clip list\` shows every clip installed in the org
|
|
33147
|
-
3. You can only **invoke** clips that an admin has **bound to you** \u2014 invoking an unbound clip returns a "not bound" error. Ask an admin to bind the clip if you need it.
|
|
33148
|
-
4. Each clip exposes one or more named commands with typed input/output
|
|
33149
|
-
|
|
33150
|
-
## When to use clips
|
|
33248
|
+
Results are JSON on stdout; failures print an error.
|
|
33151
33249
|
|
|
33152
|
-
|
|
33153
|
-
- Use \`parall clip info <alias>\` to discover available commands and their expected input format
|
|
33154
|
-
- If \`parall clip invoke\` reports the clip isn't bound to you, that clip exists in the org but hasn't been granted to you \u2014 ask an admin to bind it
|
|
33155
|
-
- Clip invocations return JSON output on success or an error message on failure
|
|
33250
|
+
## Behavior rules
|
|
33156
33251
|
|
|
33157
|
-
|
|
33252
|
+
- An authorization error (clip not bound to you) is a fail-fast: ask the
|
|
33253
|
+
clip's owner or an admin to bind it \u2014 do not retry or work around it.
|
|
33254
|
+
- If the executing runtime is offline or the call times out, report that
|
|
33255
|
+
plainly; do not queue, and never fabricate a result for a run that errored.
|
|
33256
|
+
- A clip may act through a person's real logged-in account \u2014 outward,
|
|
33257
|
+
irreversible, or spending actions (post, order, delete, pay) get the same
|
|
33258
|
+
caution as any shared-state change: confirm when intent isn't explicit.
|
|
33259
|
+
- Reach for \`parall clip list\` whenever a task needs capabilities beyond
|
|
33260
|
+
built-in tools.
|
|
33158
33261
|
`;
|
|
33159
33262
|
|
|
33160
33263
|
// ts/agent-core/dist/skills/index.js
|
package/bundle/parall-daemon.js
CHANGED
|
@@ -266,6 +266,7 @@ var init_constants = __esm({
|
|
|
266
266
|
AGENT_MONITOR: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/monitor`,
|
|
267
267
|
AGENT_ME: (orgId) => `${API_BASE}/orgs/${orgId}/agents/me`,
|
|
268
268
|
AGENT_NEW_SESSION: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/new-session`,
|
|
269
|
+
AGENT_DEEP_RESET: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/deep-reset`,
|
|
269
270
|
AGENT_SESSIONS: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/sessions`,
|
|
270
271
|
AGENT_SESSION: (orgId, agentId, sessionId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/sessions/${sessionId}`,
|
|
271
272
|
AGENT_SESSION_STEPS: (orgId, agentId, sessionId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/sessions/${sessionId}/steps`,
|
|
@@ -1290,6 +1291,16 @@ var init_client = __esm({
|
|
|
1290
1291
|
async requestNewAgentSession(orgId, agentId) {
|
|
1291
1292
|
return this.request("POST", ENDPOINTS.AGENT_NEW_SESSION(orgId, agentId));
|
|
1292
1293
|
}
|
|
1294
|
+
/**
|
|
1295
|
+
* Wipe a managed agent's entity state — sandbox filesystem, AGENT.md,
|
|
1296
|
+
* long-term memory — while keeping the conversation line and channel
|
|
1297
|
+
* binding. The destructive counterpart of New Session under the
|
|
1298
|
+
* conversation/entity split (managed/parel agents only; 409 SHARED_AGENT
|
|
1299
|
+
* for multi-org memberships).
|
|
1300
|
+
*/
|
|
1301
|
+
async deepResetAgent(orgId, agentId) {
|
|
1302
|
+
return this.request("POST", ENDPOINTS.AGENT_DEEP_RESET(orgId, agentId));
|
|
1303
|
+
}
|
|
1293
1304
|
async createAgentSession(orgId, agentId, req) {
|
|
1294
1305
|
return this.request("POST", ENDPOINTS.AGENT_SESSIONS(orgId, agentId), req);
|
|
1295
1306
|
}
|
|
@@ -29350,6 +29361,7 @@ var init_gateway_base = __esm({
|
|
|
29350
29361
|
"use strict";
|
|
29351
29362
|
init_dist();
|
|
29352
29363
|
init_event_format();
|
|
29364
|
+
init_dispatch_adapter();
|
|
29353
29365
|
init_gateway_lane_flow();
|
|
29354
29366
|
init_lane_ledger();
|
|
29355
29367
|
init_routing();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parall/daemon",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.41.0",
|
|
4
4
|
"description": "Parall local agent runtime — daemon supervisor + bridge runtimes, bundled as standalone JS files",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@aws-sdk/client-s3": "3.984.0",
|
|
34
34
|
"@pinixai/bb-browser-pro": "0.15.0",
|
|
35
|
-
"@parall/agent-core": "1.
|
|
36
|
-
"@parall/
|
|
37
|
-
"@parall/
|
|
38
|
-
"@parall/codex-agent": "1.
|
|
39
|
-
"@parall/
|
|
35
|
+
"@parall/agent-core": "1.41.0",
|
|
36
|
+
"@parall/sdk": "1.41.0",
|
|
37
|
+
"@parall/claude-agent": "1.41.0",
|
|
38
|
+
"@parall/codex-agent": "1.41.0",
|
|
39
|
+
"@parall/openclaw-agent": "1.41.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/node": "^22.0.0",
|