@parall/parall 1.15.0 → 1.16.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parall/parall",
3
- "version": "1.15.0",
3
+ "version": "1.16.0",
4
4
  "description": "OpenClaw channel plugin for Parall IM",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -15,8 +15,8 @@
15
15
  "openclaw.plugin.json"
16
16
  ],
17
17
  "dependencies": {
18
- "@parall/agent-core": "1.15.0",
19
- "@parall/sdk": "1.15.0"
18
+ "@parall/agent-core": "1.16.0",
19
+ "@parall/sdk": "1.16.0"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/node": "^22.0.0",
@@ -10,41 +10,46 @@ Query organization data via the Parall CLI. Auth is pre-configured.
10
10
  ## Identity
11
11
 
12
12
  ```bash
13
- npx @parall/cli@latest whoami
13
+ npx --yes @parall/cli@latest whoami
14
14
  ```
15
15
 
16
16
  ## Members & Agents
17
17
 
18
18
  ```bash
19
- npx @parall/cli@latest members list # All org members (humans + agents)
20
- npx @parall/cli@latest agents list # Agents only
21
- npx @parall/cli@latest users get usr_xxx # Get user details by ID
19
+ npx --yes @parall/cli@latest members list # All org members (humans + agents)
20
+ npx --yes @parall/cli@latest agents list # Agents only
21
+ npx --yes @parall/cli@latest users get prll://usr_xxx # Get user details by ID
22
22
  ```
23
23
 
24
24
  ## Chats & Messages
25
25
 
26
26
  ```bash
27
- npx @parall/cli@latest chats list # List all chats
28
- npx @parall/cli@latest messages list cht_xxx # Read chat message history
27
+ npx --yes @parall/cli@latest chats list # List all chats
28
+ npx --yes @parall/cli@latest messages list prll://cht_xxx # Read chat message history
29
29
  ```
30
30
 
31
31
  ## Sending Messages
32
32
 
33
- Each `[Event: message.new]` includes `[Chat: ... (cht_xxx)]` — always use that chat ID explicitly.
33
+ Each `[Event: message.new]` includes `[Chat: ... (prll://cht_xxx)]` — use that chat URI to reply.
34
34
 
35
35
  ```bash
36
- # Reply to a chat (use the chat ID from the event)
37
- npx @parall/cli@latest messages send cht_xxx --text "Your reply"
36
+ # Reply to a chat (use the chat URI from the event)
37
+ npx --yes @parall/cli@latest messages send prll://cht_xxx --text "Your reply"
38
38
 
39
- # Direct message by user ID or display name
40
- npx @parall/cli@latest dm usr_xxx --text "Hello"
41
- npx @parall/cli@latest dm "Alice" --text "Hello"
39
+ # Direct message by user URI or display name
40
+ npx --yes @parall/cli@latest dm prll://usr_xxx --text "Hello"
41
+ npx --yes @parall/cli@latest dm "Alice" --text "Hello"
42
42
 
43
43
  # Thread reply
44
- npx @parall/cli@latest messages send cht_xxx --text "Reply" --thread-root-id 01JWC...
44
+ npx --yes @parall/cli@latest messages send prll://cht_xxx --text "Reply" --thread-root-id 01JWC...
45
45
 
46
- # FYI message (no response expected)
47
- npx @parall/cli@latest messages send cht_xxx --text "FYI: done" --no-reply
46
+ # FYI message (no response expected — the recipient sees `[Hint: no_reply]`)
47
+ npx --yes @parall/cli@latest messages send prll://cht_xxx --text "FYI: done" --no-reply
48
+
49
+ # Silence this turn entirely — no chat message produced. Use when you receive
50
+ # `[Hint: no_reply]` or otherwise decide the turn needs no visible reply.
51
+ # Run BEFORE any `messages send` / `dm`; those still deliver real messages.
52
+ npx --yes @parall/cli@latest no-reply --reason "ack only, nothing to add"
48
53
  ```
49
54
 
50
55
  All CLI output is JSON.
@@ -16,14 +16,14 @@ npx @parall/cli@latest tasks list --status todo
16
16
  npx @parall/cli@latest tasks list --status in_progress
17
17
 
18
18
  # Create a task
19
- npx @parall/cli@latest tasks create --title "Task title" [--assignee-id usr_xxx] [--project-id prj_xxx]
19
+ npx @parall/cli@latest tasks create --title "Task title" [--assignee-id prll://usr_xxx] [--project-id prll://prj_xxx]
20
20
 
21
21
  # Update task status
22
- npx @parall/cli@latest tasks update tsk_xxx --status in_progress
23
- npx @parall/cli@latest tasks update tsk_xxx --status done
22
+ npx @parall/cli@latest tasks update prll://tsk_xxx --status in_progress
23
+ npx @parall/cli@latest tasks update prll://tsk_xxx --status done
24
24
 
25
25
  # Add a comment
26
- npx @parall/cli@latest tasks comments add tsk_xxx --body "Progress update..."
26
+ npx @parall/cli@latest tasks comments add prll://tsk_xxx --body "Progress update..."
27
27
  ```
28
28
 
29
29
  ## Project Commands
@@ -36,8 +36,8 @@ npx @parall/cli@latest projects list
36
36
 
37
37
  When you receive `[Event: task.assigned]`:
38
38
 
39
- 1. Acknowledge with a comment: `tasks comments add tsk_xxx --body "On it"`
40
- 2. Update status: `tasks update tsk_xxx --status in_progress`
39
+ 1. Acknowledge with a comment: `tasks comments add prll://tsk_xxx --body "On it"`
40
+ 2. Update status: `tasks update prll://tsk_xxx --status in_progress`
41
41
  3. Do the work
42
42
  4. Report results via comment and update status to `done`
43
43
 
package/src/gateway.ts CHANGED
@@ -48,7 +48,7 @@ function buildInboundCtx(
48
48
  BodyForAgent: bodyForAgent,
49
49
  RawBody: event.body,
50
50
  CommandBody: event.body,
51
- ...(event.mediaFields ?? {}),
51
+ // Attachment metadata is now in event.attachments (structured), not mediaFields
52
52
  ...(inboundHistory?.length ? { InboundHistory: inboundHistory } : {}),
53
53
  From: `parall:${event.senderId}`,
54
54
  To: `parall:orchestrator`,
@@ -73,8 +73,11 @@ function buildInboundHistory(events: ParallEvent[]): Array<{ sender: string; bod
73
73
  meta.push(`[Message ID: ${event.messageId}]`);
74
74
  if (event.noReply) meta.push(`[Hint: no_reply]`);
75
75
  if (event.threadRootId) meta.push(`[Thread: ${event.threadRootId}]`);
76
- if (event.mediaFields?.MediaUrl) {
77
- meta.push(`[Attachment: ${event.mediaFields.MediaType ?? "file"} ${event.mediaFields.MediaUrl}]`);
76
+ if (event.attachments?.length) {
77
+ for (const att of event.attachments) {
78
+ const safeMime = att.mimeType.replace(/[\r\n[\]|]/g, " ").trim();
79
+ meta.push(`[Attachment: prll://${att.id} | ${safeMime}]`);
80
+ }
78
81
  }
79
82
  return {
80
83
  sender: event.senderName,
package/src/hooks.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
2
- import { PRLL_REFERENCE_GUIDE } from "@parall/agent-core";
2
+ import { PRLL_BEHAVIOR, PRLL_IDENTITY, PRLL_REFERENCE_GUIDE } from "@parall/agent-core";
3
3
  import { extractAccountIdFromSessionKey } from "./session.js";
4
4
  import { clearDispatchGroupKey, getDispatchGroupKey, getDispatchMessageId, getParallAccountState, getSessionChatId } from "./runtime.js";
5
5
 
@@ -28,19 +28,30 @@ To reply, you **must** use the Parall CLI via the exec (Bash) tool.
28
28
 
29
29
  Each event includes \`[Chat: ... (prll://cht_xxx)]\` — use that chat ID (or full URI) to reply:
30
30
 
31
- npx @parall/cli@latest messages send prll://cht_xxx --text "Your reply here"
31
+ npx --yes @parall/cli@latest messages send prll://cht_xxx --text "Your reply here"
32
32
 
33
33
  Credentials are pre-configured in every Bash command — no setup needed.
34
34
  Load the \`parall-platform\` skill for full CLI reference.
35
35
  When an event has \`[Hint: no_reply]\`, do not reply to that specific event.
36
- A dispatch may contain multiple events — only skip replies to the hinted ones.`;
36
+ A dispatch may contain multiple events — only skip replies to the hinted ones.
37
+
38
+ To silence a turn without running any \`messages send\` / \`dm\`, call:
39
+
40
+ npx --yes @parall/cli@latest no-reply [--reason "..."]
41
+
42
+ Do NOT emit polite acknowledgements like "No response needed" via \`messages send\` — they become real messages and start agent-to-agent loops.`;
37
43
 
38
44
  export function registerParallHooks(api: OpenClawPluginApi) {
39
45
  const log = api.logger;
40
46
 
41
- // Append Parall channel context + reference guide AFTER workspace files so it takes precedence
47
+ // Append Parall identity + channel context + behavior charter + reference guide
48
+ // AFTER workspace files so it takes precedence. Order matters: identity anchors
49
+ // who the agent is, channel context is a hard interface constraint, behavior
50
+ // sets working principles, reference guide is the URI lookup reference.
42
51
  api.on("before_prompt_build", () => {
43
- return { appendSystemContext: PRLL_CHANNEL_CONTEXT + "\n\n" + PRLL_REFERENCE_GUIDE };
52
+ return {
53
+ appendSystemContext: [PRLL_IDENTITY, PRLL_CHANNEL_CONTEXT, PRLL_BEHAVIOR, PRLL_REFERENCE_GUIDE].join("\n\n"),
54
+ };
44
55
  });
45
56
 
46
57
  // before_tool_call -> (1) await step creation to get step ID, (2) ENV injection for exec tool