@parall/parall 1.15.1 → 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.1",
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.1",
19
- "@parall/sdk": "1.15.1"
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,22 +10,22 @@ 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 prll://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 prll://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
@@ -34,17 +34,22 @@ Each `[Event: message.new]` includes `[Chat: ... (prll://cht_xxx)]` — use that
34
34
 
35
35
  ```bash
36
36
  # Reply to a chat (use the chat URI from the event)
37
- npx @parall/cli@latest messages send prll://cht_xxx --text "Your reply"
37
+ npx --yes @parall/cli@latest messages send prll://cht_xxx --text "Your reply"
38
38
 
39
39
  # Direct message by user URI or display name
40
- npx @parall/cli@latest dm prll://usr_xxx --text "Hello"
41
- npx @parall/cli@latest dm "Alice" --text "Hello"
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 prll://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 prll://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.
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