@parall/agent-core 1.24.0 → 1.26.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.
Files changed (40) hide show
  1. package/dist/bridge-workspace.d.ts +1 -1
  2. package/dist/bridge-workspace.d.ts.map +1 -1
  3. package/dist/bridge-workspace.js +4 -3
  4. package/dist/dispatch-adapter.d.ts +2 -0
  5. package/dist/dispatch-adapter.d.ts.map +1 -1
  6. package/dist/gateway-base.d.ts +7 -0
  7. package/dist/gateway-base.d.ts.map +1 -1
  8. package/dist/gateway-base.js +95 -29
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -0
  12. package/dist/platform-config.d.ts +23 -0
  13. package/dist/platform-config.d.ts.map +1 -0
  14. package/dist/platform-config.js +105 -0
  15. package/dist/skills/index.d.ts +14 -0
  16. package/dist/skills/index.d.ts.map +1 -0
  17. package/dist/skills/index.js +44 -0
  18. package/dist/skills/parall-platform.d.ts +2 -0
  19. package/dist/skills/parall-platform.d.ts.map +1 -0
  20. package/dist/skills/parall-platform.js +161 -0
  21. package/dist/skills/parall-schedules.d.ts +2 -0
  22. package/dist/skills/parall-schedules.d.ts.map +1 -0
  23. package/dist/skills/parall-schedules.js +80 -0
  24. package/dist/skills/parall-tasks.d.ts +2 -0
  25. package/dist/skills/parall-tasks.d.ts.map +1 -0
  26. package/dist/skills/parall-tasks.js +65 -0
  27. package/dist/skills/parall-wiki.d.ts +2 -0
  28. package/dist/skills/parall-wiki.d.ts.map +1 -0
  29. package/dist/skills/parall-wiki.js +131 -0
  30. package/package.json +2 -2
  31. package/src/bridge-workspace.ts +4 -3
  32. package/src/dispatch-adapter.ts +2 -0
  33. package/src/gateway-base.ts +96 -27
  34. package/src/index.ts +3 -0
  35. package/src/platform-config.ts +159 -0
  36. package/src/skills/index.ts +52 -0
  37. package/src/skills/parall-platform.ts +161 -0
  38. package/src/skills/parall-schedules.ts +80 -0
  39. package/src/skills/parall-tasks.ts +65 -0
  40. package/src/skills/parall-wiki.ts +131 -0
@@ -0,0 +1,161 @@
1
+ export const PARALL_PLATFORM_SKILL = `# Parall Platform
2
+
3
+ Query organization data via the Parall CLI. Auth is pre-configured.
4
+
5
+ ## Identity
6
+
7
+ \`\`\`bash
8
+ parall whoami
9
+ \`\`\`
10
+
11
+ ## Members & Agents
12
+
13
+ \`\`\`bash
14
+ parall members list # All org members (humans + agents)
15
+ parall agents list # Agents only
16
+ parall users get prll://usr_xxx # Get user details by ID
17
+ \`\`\`
18
+
19
+ Create a hosted agent when the user asks for a Parall-managed runtime. Hosted
20
+ provisioning is asynchronous: creation means the agent identity, API key, and
21
+ machine record were accepted, not that the runtime is online yet. Use \`--wait\`
22
+ to wait until the machine reaches \`running\`, and use \`--wait-online\` when the
23
+ task requires the child agent to be connected before you report completion.
24
+ For hosted agents, use \`--discard-api-key\`; the server injects the one-time key
25
+ into the hosted runtime, so the parent agent must not print or persist it.
26
+
27
+ Create a self-hosted agent only when the runtime will be connected outside
28
+ Parall-managed compute. In that case, write the one-time \`api_key\` to
29
+ \`--api-key-file\` so it is not captured in tool-result logs. Treat \`api_key\` as a
30
+ secret: do not print, read aloud, post it in shared chats, or echo the file
31
+ contents. Include the \`user.id\` in normal responses, and pass the key file only
32
+ through an explicit secure runtime handoff when connection is required. Never
33
+ use \`--show-api-key\` from an agent runtime. Agent callers cannot set provider
34
+ overrides until the dedicated fine-grained permission flow lands.
35
+
36
+ \`\`\`bash
37
+ # Hosted runtime (Parall-managed compute)
38
+ parall agents create \\
39
+ --name "Research Agent" \\
40
+ --runtime-type codex \\
41
+ --machine-type cloud \\
42
+ --machine-label standard \\
43
+ --discard-api-key \\
44
+ --wait \\
45
+ --wait-online
46
+
47
+ # Self-hosted runtime
48
+ parall agents create --name "Research Agent" --runtime-type codex --api-key-file /tmp/research-agent.api-key
49
+ \`\`\`
50
+
51
+ Inspect hosted provisioning directly when a create command returns before the
52
+ runtime is online, or when you need logs for a failed machine. If \`agents create\`
53
+ exits non-zero after creating a hosted agent, read the printed \`user.id\` and
54
+ \`machine.id\`, then use these commands to decide whether to wait, inspect logs,
55
+ or report the failed machine for retry.
56
+
57
+ \`\`\`bash
58
+ parall machines status prll://mch_xxx
59
+ parall machines logs prll://mch_xxx --lines 100
60
+ \`\`\`
61
+
62
+ ## Chats & Messages
63
+
64
+ \`\`\`bash
65
+ parall chats list # List all chats
66
+ parall messages list prll://cht_xxx # Read chat message history
67
+ \`\`\`
68
+
69
+ ## Sending Messages
70
+
71
+ Each \`[Event: message.new]\` includes \`[Chat: ... (prll://cht_xxx)]\` — use that chat URI to reply.
72
+
73
+ \`\`\`bash
74
+ # Reply to a chat (use the chat URI from the event)
75
+ parall messages send prll://cht_xxx --text "Your reply"
76
+
77
+ # Direct message by user URI or display name
78
+ parall dm prll://usr_xxx --text "Hello"
79
+ parall dm "Alice" --text "Hello"
80
+
81
+ # Thread reply
82
+ parall messages send prll://cht_xxx --text "Reply" --thread-root-id 01JWC...
83
+
84
+ # FYI message (no response expected — the recipient sees \`[Hint: no_reply]\`)
85
+ parall messages send prll://cht_xxx --text "FYI: done" --no-reply
86
+
87
+ # Silence this turn entirely — no chat message produced. Use when you receive
88
+ # \`[Hint: no_reply]\` or otherwise decide the turn needs no visible reply.
89
+ # Run BEFORE any \`messages send\` / \`dm\`; those still deliver real messages.
90
+ parall no-reply --reason "ack only, nothing to add"
91
+ \`\`\`
92
+
93
+ ## Files & Attachments
94
+
95
+ Attachments appear in events as \`[Attachment: prll://att_xxx | mime | size | name]\`.
96
+
97
+ \`\`\`bash
98
+ # Download an attachment
99
+ parall files download att_xxx --output /tmp/file.png
100
+
101
+ # Upload a file (returns attachment_id)
102
+ parall files upload /tmp/report.pdf
103
+
104
+ # Send a message with a file
105
+ parall messages send prll://cht_xxx --file /tmp/output.png --text "Done"
106
+
107
+ # Send an existing attachment to another chat
108
+ parall messages send prll://cht_xxx --attachment att_xxx --text "See attached"
109
+
110
+ # DM with a file
111
+ parall dm "Alice" --file /tmp/report.pdf --text "Report attached"
112
+ \`\`\`
113
+
114
+ \`--file\` and \`--attachment\` are mutually exclusive. \`--text\` can be combined with either.
115
+
116
+ ## Approvals
117
+
118
+ When a CLI command returns a \`PERMISSION_DENIED\` error, the output includes a \`Tip:\` line with an approval-request template — copy it and fill in the remaining placeholders (\`--chat\`, \`--title\`, \`--reason\`). The \`Tip:\` only appears for commonly approvable actions (archive, delete, restore); for other actions, use \`parall approvals actions\` to check if it's approvable.
119
+
120
+ \`\`\`bash
121
+ # Request approval (use action and resource_uri from the error)
122
+ parall approvals request --action chat.archive --resource prll://cht_xxx --chat prll://cht_yyy --title "Archive old channel" --reason "No activity in 6 months"
123
+
124
+ # Check a specific approval's status
125
+ parall approvals get prll://apr_xxx
126
+
127
+ # Wait for a decision (blocks until approved/rejected/timeout)
128
+ parall approvals wait prll://apr_xxx --timeout 300
129
+
130
+ # List all your pending approvals
131
+ parall approvals list
132
+
133
+ # List available approvable actions
134
+ parall approvals actions
135
+
136
+ # Cancel a pending request you made
137
+ parall approvals cancel prll://apr_xxx
138
+ \`\`\`
139
+
140
+ Only request approval after receiving an actual \`PERMISSION_DENIED\` error — never preemptively. The \`--chat\` flag specifies where the approval card appears; use the chat where the conversation is happening.
141
+
142
+ ## Reference URIs
143
+
144
+ Every entity is addressable with a \`prll://\` URI. Common prefixes you'll see in events, messages, and schedule descriptions:
145
+
146
+ | Prefix | Entity | Skill |
147
+ |--------|--------|-------|
148
+ | \`prll://usr_\` | User (human or agent) | parall-platform |
149
+ | \`prll://cht_\` | Chat | parall-platform |
150
+ | \`prll://msg_\` | Message | parall-platform |
151
+ | \`prll://tsk_\` | Task | parall-tasks |
152
+ | \`prll://prj_\` | Project | parall-tasks |
153
+ | \`prll://sch_\` | Schedule (time trigger) | parall-schedules |
154
+ | \`prll://srn_\` | Schedule run (single fire audit record; carries fire-time snapshot) | parall-schedules |
155
+ | \`prll://wik_\` | Wiki | parall-wiki |
156
+ | \`prll://att_\` | Attachment | parall-platform (files) |
157
+
158
+ When a message or event references \`prll://sch_xxx\` or \`prll://srn_xxx\`, or when you receive \`[Event: schedule.fired]\`, switch to the **parall-schedules** skill for the CLI commands (create / list / pause / resume / cancel / runs).
159
+
160
+ All CLI output is JSON.
161
+ `;
@@ -0,0 +1,2 @@
1
+ export declare const PARALL_SCHEDULES_SKILL = "# Parall Schedules\n\nA **Schedule** is a platform time trigger. At fire time the platform delivers the schedule's `description` to a target \u2014 that's it. How you respond is up to you: send a message, create a task, update a wiki page, or do nothing. Use schedules for recurring reminders (\"standup every weekday 10am\"), delayed prompts (\"in 1 hour, check CI\"), or fire-and-forget cron work.\n\nThree spec types \u2014 pick exactly one:\n\n- `cron` \u2014 5-field expression (min granularity: 1 minute)\n- `interval` \u2014 every N seconds (minimum 60)\n- `one_shot` \u2014 fire once at a specific time\n\n## Creating schedules\n\n```bash\n# Recurring cron (weekdays 10am New York)\nparall schedules create \\\n --name \"Daily standup\" \\\n --description \"Ask the team for their plan today; see prll://wik_xxx for the standup template\" \\\n --target-ids prll://usr_xxx \\\n --cron-expr \"0 10 * * 1-5\" \\\n --timezone America/New_York \\\n --attached-to-uri prll://cht_xxx\n\n# Every 30 minutes\nparall schedules create \\\n --name \"CI watch\" \\\n --description \"Check the deploy status and flag failures\" \\\n --target-ids prll://usr_xxx \\\n --interval-seconds 1800\n\n# One-shot at a future RFC3339 time\nparall schedules create \\\n --name \"Followup\" \\\n --description \"Remind the user about the PR review if still pending\" \\\n --target-ids prll://usr_xxx \\\n --run-at <FUTURE_RFC3339_TIME>\n```\n\n`--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`).\n\n## Listing / inspecting\n\n```bash\nparall schedules list --status active,paused\nparall schedules list --attached-to prll://tsk_xxx\nparall schedules list --attendee-id prll://usr_xxx\nparall schedules get prll://sch_xxx\nparall schedules runs prll://sch_xxx # fire history\nparall schedules run prll://srn_xxx # single run incl. fire-time snapshot\n```\n\n## Lifecycle\n\n```bash\nparall schedules update prll://sch_xxx --description \"New prompt\"\nparall schedules pause prll://sch_xxx # reversible\nparall schedules resume prll://sch_xxx # does NOT catch up missed slots\nparall schedules cancel prll://sch_xxx # terminal; row + runs preserved, prll://sch_ ref stays valid\nparall schedules delete prll://sch_xxx # hard-delete; requires status=cancelled AND run_count=0. Once a schedule has fired, it is permanently undeletable (409 SCHEDULE_HAS_RUNS) \u2014 cancel it and leave the audit trail. Delete is for never-fired test/accidental schedules only.\n```\n\n`spec_type` cannot be changed via update \u2014 if you need to switch between cron / interval / one_shot, cancel the old one and create a new schedule.\n\n## Responding to schedule fires\n\nWhen you receive `[Event: schedule.fired]`, the platform has fired a schedule targeting you.\n\nThe runtime (agent-core) has already done the heavy lifting: it fetched the schedule run and inlined the fire-time `description` (a frozen snapshot \u2014 later edits to the schedule don't change past fires) into your prompt, alongside `[Schedule: prll://sch_xxx]` and `[Run: prll://srn_xxx]` headers. You do **not** need to call `schedules run prll://srn_xxx` yourself \u2014 the description is already in the prompt body.\n\nYour job is to interpret the description and act:\n\n1. Read the description and any `prll://` refs it contains\n2. Do whatever the prompt asks (send a message, create a task, update a wiki, etc.) \u2014 there is no canonical response format\n3. Optional: if the fire is genuinely a no-op and you don't want to produce any artifact, use `no-reply` (from parall-platform skill) to stay silent for this turn\n\nDo not treat schedule fires as \"tasks assigned to you\" \u2014 there's no status to transition, no acknowledgment required. If the work warrants a task (multi-step, needs tracking), create one from within the response.\n\n**Fetching the run explicitly** (optional): `schedules run prll://srn_xxx` returns the same snapshot plus delivery records (reverse-lookable via `source_id=srn_xxx`) for audit. If you call it and get 404 (because the schedule was cancelled or its target/attachment changed after the fire), drop the request and continue \u2014 don't retry.\n\nCLI command results are JSON on stdout; mutation commands may emit auxiliary hints on stderr (for example, `Created: prll://sch_xxx`).\n";
2
+ //# sourceMappingURL=parall-schedules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parall-schedules.d.ts","sourceRoot":"","sources":["../../src/skills/parall-schedules.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,ugJA+ElC,CAAC"}
@@ -0,0 +1,80 @@
1
+ export const PARALL_SCHEDULES_SKILL = `# Parall Schedules
2
+
3
+ A **Schedule** is a platform time trigger. At fire time the platform delivers the schedule's \`description\` to a target — that's it. How you respond is up to you: send a message, create a task, update a wiki page, or do nothing. Use schedules for recurring reminders ("standup every weekday 10am"), delayed prompts ("in 1 hour, check CI"), or fire-and-forget cron work.
4
+
5
+ Three spec types — pick exactly one:
6
+
7
+ - \`cron\` — 5-field expression (min granularity: 1 minute)
8
+ - \`interval\` — every N seconds (minimum 60)
9
+ - \`one_shot\` — fire once at a specific time
10
+
11
+ ## Creating schedules
12
+
13
+ \`\`\`bash
14
+ # Recurring cron (weekdays 10am New York)
15
+ parall schedules create \\
16
+ --name "Daily standup" \\
17
+ --description "Ask the team for their plan today; see prll://wik_xxx for the standup template" \\
18
+ --target-ids prll://usr_xxx \\
19
+ --cron-expr "0 10 * * 1-5" \\
20
+ --timezone America/New_York \\
21
+ --attached-to-uri prll://cht_xxx
22
+
23
+ # Every 30 minutes
24
+ parall schedules create \\
25
+ --name "CI watch" \\
26
+ --description "Check the deploy status and flag failures" \\
27
+ --target-ids prll://usr_xxx \\
28
+ --interval-seconds 1800
29
+
30
+ # One-shot at a future RFC3339 time
31
+ parall schedules create \\
32
+ --name "Followup" \\
33
+ --description "Remind the user about the PR review if still pending" \\
34
+ --target-ids prll://usr_xxx \\
35
+ --run-at <FUTURE_RFC3339_TIME>
36
+ \`\`\`
37
+
38
+ \`--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 — when that resource is archived or deleted, the schedule auto-cancels (\`cancel_reason=attached_gone\`).
39
+
40
+ ## Listing / inspecting
41
+
42
+ \`\`\`bash
43
+ parall schedules list --status active,paused
44
+ parall schedules list --attached-to prll://tsk_xxx
45
+ parall schedules list --attendee-id prll://usr_xxx
46
+ parall schedules get prll://sch_xxx
47
+ parall schedules runs prll://sch_xxx # fire history
48
+ parall schedules run prll://srn_xxx # single run incl. fire-time snapshot
49
+ \`\`\`
50
+
51
+ ## Lifecycle
52
+
53
+ \`\`\`bash
54
+ parall schedules update prll://sch_xxx --description "New prompt"
55
+ parall schedules pause prll://sch_xxx # reversible
56
+ parall schedules resume prll://sch_xxx # does NOT catch up missed slots
57
+ parall schedules cancel prll://sch_xxx # terminal; row + runs preserved, prll://sch_ ref stays valid
58
+ parall schedules delete prll://sch_xxx # hard-delete; requires status=cancelled AND run_count=0. Once a schedule has fired, it is permanently undeletable (409 SCHEDULE_HAS_RUNS) — cancel it and leave the audit trail. Delete is for never-fired test/accidental schedules only.
59
+ \`\`\`
60
+
61
+ \`spec_type\` cannot be changed via update — if you need to switch between cron / interval / one_shot, cancel the old one and create a new schedule.
62
+
63
+ ## Responding to schedule fires
64
+
65
+ When you receive \`[Event: schedule.fired]\`, the platform has fired a schedule targeting you.
66
+
67
+ The runtime (agent-core) has already done the heavy lifting: it fetched the schedule run and inlined the fire-time \`description\` (a frozen snapshot — later edits to the schedule don't change past fires) into your prompt, alongside \`[Schedule: prll://sch_xxx]\` and \`[Run: prll://srn_xxx]\` headers. You do **not** need to call \`schedules run prll://srn_xxx\` yourself — the description is already in the prompt body.
68
+
69
+ Your job is to interpret the description and act:
70
+
71
+ 1. Read the description and any \`prll://\` refs it contains
72
+ 2. Do whatever the prompt asks (send a message, create a task, update a wiki, etc.) — there is no canonical response format
73
+ 3. Optional: if the fire is genuinely a no-op and you don't want to produce any artifact, use \`no-reply\` (from parall-platform skill) to stay silent for this turn
74
+
75
+ Do not treat schedule fires as "tasks assigned to you" — there's no status to transition, no acknowledgment required. If the work warrants a task (multi-step, needs tracking), create one from within the response.
76
+
77
+ **Fetching the run explicitly** (optional): \`schedules run prll://srn_xxx\` returns the same snapshot plus delivery records (reverse-lookable via \`source_id=srn_xxx\`) for audit. If you call it and get 404 (because the schedule was cancelled or its target/attachment changed after the fire), drop the request and continue — don't retry.
78
+
79
+ CLI command results are JSON on stdout; mutation commands may emit auxiliary hints on stderr (for example, \`Created: prll://sch_xxx\`).
80
+ `;
@@ -0,0 +1,2 @@
1
+ export declare const PARALL_TASKS_SKILL = "# Parall Tasks\n\nManage tasks and projects via the Parall CLI. Auth and runtime context are pre-configured.\n\n## Task Commands\n\n```bash\n# List tasks (filterable by status)\nparall tasks list\nparall tasks list --status todo\nparall tasks list --status in_progress\n\n# Create a task\nparall tasks create --title \"Task title\" [--assignee-id prll://usr_xxx] [--project-id prll://prj_xxx]\n\n# Update task status\nparall tasks update prll://tsk_xxx --status in_progress\nparall tasks update prll://tsk_xxx --status done\n\n# Add a comment\nparall tasks comments add prll://tsk_xxx --body \"Progress update...\"\n```\n\n## Project Commands\n\n```bash\nparall projects list\n```\n\n## Watching Tasks\n\nSubscribe to a task to receive notifications when others comment on it.\n\n```bash\n# Watch a task (you'll receive dispatch events for new comments)\nparall tasks watch prll://tsk_xxx\n\n# Unwatch\nparall tasks unwatch prll://tsk_xxx\n\n# List who is watching\nparall tasks watchers prll://tsk_xxx\n```\n\nNote: task creators are automatically watching their tasks.\n\n## Responding to Task Assignments\n\nWhen you receive `[Event: task.assigned]`:\n\n1. Acknowledge with a comment: `tasks comments add prll://tsk_xxx --body \"On it\"`\n2. Update status: `tasks update prll://tsk_xxx --status in_progress`\n3. Do the work\n4. Report results via comment and update status to `done`\n\n## Responding to Task Comments\n\nWhen you receive `[Event: task.comment.created]`, someone commented on a task you are watching. Read the comment body and respond if action is needed:\n\n1. Review the comment content and task context\n2. Reply via comment: `tasks comments add prll://tsk_xxx --body \"Response...\"`\n3. If the comment requests status changes, update accordingly\n\nAll CLI output is JSON.\n";
2
+ //# sourceMappingURL=parall-tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parall-tasks.d.ts","sourceRoot":"","sources":["../../src/skills/parall-tasks.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,0wDAgE9B,CAAC"}
@@ -0,0 +1,65 @@
1
+ export const PARALL_TASKS_SKILL = `# Parall Tasks
2
+
3
+ Manage tasks and projects via the Parall CLI. Auth and runtime context are pre-configured.
4
+
5
+ ## Task Commands
6
+
7
+ \`\`\`bash
8
+ # List tasks (filterable by status)
9
+ parall tasks list
10
+ parall tasks list --status todo
11
+ parall tasks list --status in_progress
12
+
13
+ # Create a task
14
+ parall tasks create --title "Task title" [--assignee-id prll://usr_xxx] [--project-id prll://prj_xxx]
15
+
16
+ # Update task status
17
+ parall tasks update prll://tsk_xxx --status in_progress
18
+ parall tasks update prll://tsk_xxx --status done
19
+
20
+ # Add a comment
21
+ parall tasks comments add prll://tsk_xxx --body "Progress update..."
22
+ \`\`\`
23
+
24
+ ## Project Commands
25
+
26
+ \`\`\`bash
27
+ parall projects list
28
+ \`\`\`
29
+
30
+ ## Watching Tasks
31
+
32
+ Subscribe to a task to receive notifications when others comment on it.
33
+
34
+ \`\`\`bash
35
+ # Watch a task (you'll receive dispatch events for new comments)
36
+ parall tasks watch prll://tsk_xxx
37
+
38
+ # Unwatch
39
+ parall tasks unwatch prll://tsk_xxx
40
+
41
+ # List who is watching
42
+ parall tasks watchers prll://tsk_xxx
43
+ \`\`\`
44
+
45
+ Note: task creators are automatically watching their tasks.
46
+
47
+ ## Responding to Task Assignments
48
+
49
+ When you receive \`[Event: task.assigned]\`:
50
+
51
+ 1. Acknowledge with a comment: \`tasks comments add prll://tsk_xxx --body "On it"\`
52
+ 2. Update status: \`tasks update prll://tsk_xxx --status in_progress\`
53
+ 3. Do the work
54
+ 4. Report results via comment and update status to \`done\`
55
+
56
+ ## Responding to Task Comments
57
+
58
+ When you receive \`[Event: task.comment.created]\`, someone commented on a task you are watching. Read the comment body and respond if action is needed:
59
+
60
+ 1. Review the comment content and task context
61
+ 2. Reply via comment: \`tasks comments add prll://tsk_xxx --body "Response..."\`
62
+ 3. If the comment requests status changes, update accordingly
63
+
64
+ All CLI output is JSON.
65
+ `;
@@ -0,0 +1,2 @@
1
+ export declare const PARALL_WIKI_SKILL = "# Parall Wiki\n\nManage organization wikis via the Parall CLI. Auth is pre-configured.\n\n## Browsing (no local state needed)\n\n```bash\nparall wiki list # List all wikis\nparall wiki tree <slug> # List files and directories\nparall wiki tree <slug> --path docs/ # List a subdirectory\n```\n\n## Editing\n\nWiki editing works on a **local workspace** \u2014 a directory on disk where wiki\nfiles are synced. You sync from the server, edit files locally, then propose\na changeset.\n\n### Step 1: Sync\n\n```bash\nparall wiki sync <slug>\n```\n\nThis downloads wiki files to a local directory. The output includes the\n**absolute mount path** for each wiki (e.g. `synced \u2192 /path/to/workspace/kb`).\n\n### Step 2: Find the mount path\n\nThe sync output JSON contains `synced[].path` \u2014 the absolute path where files\nlive. You can also check it anytime with:\n\n```bash\nparall wiki status <slug>\n```\n\nThe output includes `Mount: /absolute/path/to/<slug>`.\n\nUse this path with `read`, `write`, and `edit` tools. For example, if the mount\nis `/data/.openclaw/workspace/kb`, then `README.md` is at\n`/data/.openclaw/workspace/kb/README.md`.\n\n### Step 3: Edit files\n\nUse standard file tools (`read`, `write`, `edit`) on files under the mount path.\n\n### Step 4: Review changes\n\n```bash\nparall wiki diff <slug> # Shows unified diff of all local changes\nparall wiki status <slug> # Shows which files changed with +/- line counts\n```\n\nAlways review before proposing.\n\n### Step 5: Propose changeset\n\n```bash\nparall wiki changeset create <slug> --title \"Description of changes\"\n```\n\nThis uploads your local changes. Unprotected paths auto-merge immediately; the\nCLI prints `auto_merged: true` and refreshes the local manifest. Protected\npaths remain as a changeset for review; follow the returned `next_action`.\n\n## Changeset Management\n\n```bash\nparall wiki changeset list <slug> # List all changesets\nparall wiki changeset show <changesetId> <slug> # Show detail + feedback\nparall wiki changeset diff <changesetId> <slug> # Show changeset diff\n```\n\nIf a changeset is rejected, fix the files locally and re-propose:\n\n```bash\nparall wiki changeset create <slug> --update <changesetId>\n```\n\nThe title is inherited from the original changeset \u2014 no need to repeat it.\n\n## Handling sync conflicts\n\n`wiki sync` runs a three-way merge. When both you and the server changed the\nsame file, sync **does not overwrite your work**. It leaves your file intact\nand drops the upstream version under `.parall-wiki/conflicts/`:\n\n| Marker | Meaning |\n|--------|---------|\n| `.parall-wiki/conflicts/<path>.remote` | Server has different content (concurrent edit, new file collision, or server changed a file you deleted) |\n| `.parall-wiki/conflicts/<path>.remote-deleted` | Server deleted the file; you still have edits |\n\nstderr prints one line per conflict. Recovery:\n\n**Accept upstream** (drop your edit):\n```bash\ncp .parall-wiki/conflicts/<path>.remote <path>\nparall wiki sync\n```\n\n**Keep yours** (or hand-merge, then propose):\n```bash\n# edit <path> to final content\nparall wiki diff <slug>\nparall wiki changeset create <slug> --title \"Reconcile <path>\"\nparall wiki sync # fast-forwards after server merges\n```\n\n**Accept server delete** (`.remote-deleted` only):\n```bash\nrm <path>\nparall wiki sync\n```\n\nSync failures (`download`, `shape-conflict`) set exit code 1 and retry on\nnext sync. Conflicts exit 0 \u2014 they need your decision, not a retry.\n\n## Discarding local changes\n\n```bash\nparall wiki reset <slug> # Restore all files to last synced state\n```\n\n## History\n\n```bash\nparall wiki log <slug> # Recent wiki operations\n```\n\nAll CLI output is JSON. Run `parall wiki --help` for full options.\n";
2
+ //# sourceMappingURL=parall-wiki.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parall-wiki.d.ts","sourceRoot":"","sources":["../../src/skills/parall-wiki.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,gyHAkI7B,CAAC"}
@@ -0,0 +1,131 @@
1
+ export const PARALL_WIKI_SKILL = `# Parall Wiki
2
+
3
+ Manage organization wikis via the Parall CLI. Auth is pre-configured.
4
+
5
+ ## Browsing (no local state needed)
6
+
7
+ \`\`\`bash
8
+ parall wiki list # List all wikis
9
+ parall wiki tree <slug> # List files and directories
10
+ parall wiki tree <slug> --path docs/ # List a subdirectory
11
+ \`\`\`
12
+
13
+ ## Editing
14
+
15
+ Wiki editing works on a **local workspace** — a directory on disk where wiki
16
+ files are synced. You sync from the server, edit files locally, then propose
17
+ a changeset.
18
+
19
+ ### Step 1: Sync
20
+
21
+ \`\`\`bash
22
+ parall wiki sync <slug>
23
+ \`\`\`
24
+
25
+ This downloads wiki files to a local directory. The output includes the
26
+ **absolute mount path** for each wiki (e.g. \`synced → /path/to/workspace/kb\`).
27
+
28
+ ### Step 2: Find the mount path
29
+
30
+ The sync output JSON contains \`synced[].path\` — the absolute path where files
31
+ live. You can also check it anytime with:
32
+
33
+ \`\`\`bash
34
+ parall wiki status <slug>
35
+ \`\`\`
36
+
37
+ The output includes \`Mount: /absolute/path/to/<slug>\`.
38
+
39
+ Use this path with \`read\`, \`write\`, and \`edit\` tools. For example, if the mount
40
+ is \`/data/.openclaw/workspace/kb\`, then \`README.md\` is at
41
+ \`/data/.openclaw/workspace/kb/README.md\`.
42
+
43
+ ### Step 3: Edit files
44
+
45
+ Use standard file tools (\`read\`, \`write\`, \`edit\`) on files under the mount path.
46
+
47
+ ### Step 4: Review changes
48
+
49
+ \`\`\`bash
50
+ parall wiki diff <slug> # Shows unified diff of all local changes
51
+ parall wiki status <slug> # Shows which files changed with +/- line counts
52
+ \`\`\`
53
+
54
+ Always review before proposing.
55
+
56
+ ### Step 5: Propose changeset
57
+
58
+ \`\`\`bash
59
+ parall wiki changeset create <slug> --title "Description of changes"
60
+ \`\`\`
61
+
62
+ This uploads your local changes. Unprotected paths auto-merge immediately; the
63
+ CLI prints \`auto_merged: true\` and refreshes the local manifest. Protected
64
+ paths remain as a changeset for review; follow the returned \`next_action\`.
65
+
66
+ ## Changeset Management
67
+
68
+ \`\`\`bash
69
+ parall wiki changeset list <slug> # List all changesets
70
+ parall wiki changeset show <changesetId> <slug> # Show detail + feedback
71
+ parall wiki changeset diff <changesetId> <slug> # Show changeset diff
72
+ \`\`\`
73
+
74
+ If a changeset is rejected, fix the files locally and re-propose:
75
+
76
+ \`\`\`bash
77
+ parall wiki changeset create <slug> --update <changesetId>
78
+ \`\`\`
79
+
80
+ The title is inherited from the original changeset — no need to repeat it.
81
+
82
+ ## Handling sync conflicts
83
+
84
+ \`wiki sync\` runs a three-way merge. When both you and the server changed the
85
+ same file, sync **does not overwrite your work**. It leaves your file intact
86
+ and drops the upstream version under \`.parall-wiki/conflicts/\`:
87
+
88
+ | Marker | Meaning |
89
+ |--------|---------|
90
+ | \`.parall-wiki/conflicts/<path>.remote\` | Server has different content (concurrent edit, new file collision, or server changed a file you deleted) |
91
+ | \`.parall-wiki/conflicts/<path>.remote-deleted\` | Server deleted the file; you still have edits |
92
+
93
+ stderr prints one line per conflict. Recovery:
94
+
95
+ **Accept upstream** (drop your edit):
96
+ \`\`\`bash
97
+ cp .parall-wiki/conflicts/<path>.remote <path>
98
+ parall wiki sync
99
+ \`\`\`
100
+
101
+ **Keep yours** (or hand-merge, then propose):
102
+ \`\`\`bash
103
+ # edit <path> to final content
104
+ parall wiki diff <slug>
105
+ parall wiki changeset create <slug> --title "Reconcile <path>"
106
+ parall wiki sync # fast-forwards after server merges
107
+ \`\`\`
108
+
109
+ **Accept server delete** (\`.remote-deleted\` only):
110
+ \`\`\`bash
111
+ rm <path>
112
+ parall wiki sync
113
+ \`\`\`
114
+
115
+ Sync failures (\`download\`, \`shape-conflict\`) set exit code 1 and retry on
116
+ next sync. Conflicts exit 0 — they need your decision, not a retry.
117
+
118
+ ## Discarding local changes
119
+
120
+ \`\`\`bash
121
+ parall wiki reset <slug> # Restore all files to last synced state
122
+ \`\`\`
123
+
124
+ ## History
125
+
126
+ \`\`\`bash
127
+ parall wiki log <slug> # Recent wiki operations
128
+ \`\`\`
129
+
130
+ All CLI output is JSON. Run \`parall wiki --help\` for full options.
131
+ `;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parall/agent-core",
3
- "version": "1.24.0",
3
+ "version": "1.26.0",
4
4
  "description": "Shared agent runtime orchestration helpers for Parall",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -26,7 +26,7 @@
26
26
  "src"
27
27
  ],
28
28
  "dependencies": {
29
- "@parall/sdk": "1.24.0"
29
+ "@parall/sdk": "1.26.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "^22.0.0",
@@ -29,7 +29,7 @@ All outbound interactions go through the \`parall\` CLI. Credentials are pre-inj
29
29
  - \`parall tasks update prll://tsk_xxx --status in_progress\` — task state
30
30
  - \`parall no-reply [--reason "..."]\` — explicitly declare this turn silent (audit signal; not required for silence, just clarifies intent)
31
31
 
32
- The bridge injects Parall context via environment variables. The static credentials \`PRLL_API_URL\`, \`PRLL_API_KEY\`, and \`PRLL_ORG_ID\` are always set. Per-dispatch context \`PRLL_SESSION_ID\`, \`PRLL_CHAT_ID\`, \`PRLL_TRIGGER_MESSAGE_ID\`, \`PRLL_STEP_ID_FILE\` is set in subprocess-per-dispatch runtimes (Claude Code); in long-running runtimes (Codex) those may be absent and the CLI will fall back to whatever defaults you supply on the command line.
32
+ 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 you do not need to pass \`--chat\` or \`--session\` explicitly when the context file is present.
33
33
 
34
34
  ## Attachments
35
35
 
@@ -50,10 +50,11 @@ See \`docs/engineering-design/agent-dm-loop-prevention.md\` § Layer 0 for why p
50
50
 
51
51
  When you try an action (e.g., archive a chat) and receive a PERMISSION_DENIED error, you can request someone with permission to do it:
52
52
 
53
- 1. The error includes a \`PERMISSION_DENIED\` code use the action and resource from your original command in the approval request
53
+ 1. The error includes a \`PERMISSION_DENIED\` code. For commonly approvable actions (archive, delete, restore), a \`Tip:\` line with an approval-request template is printed — copy it and fill in the remaining placeholders (\`--chat\`, \`--title\`, \`--reason\`)
54
54
  2. Request approval: \`parall approvals request --action chat.archive --resource prll://cht_123 --chat prll://cht_456 --title "Archive #old-project" --reason "Channel inactive"\`
55
55
  3. A card will appear in the specified chat for someone with permission to approve
56
- 4. Check the result later with \`parall approvals list\`
56
+ 4. Check the result: \`parall approvals get prll://<id>\` or wait: \`parall approvals wait prll://<id> --timeout 300\`
57
+ 5. List available actions: \`parall approvals actions\`
57
58
 
58
59
  Only request approval when you've actually been denied permission. Don't request approval preemptively.
59
60
  `;
@@ -19,6 +19,8 @@ export type DispatchContext = {
19
19
  chatId?: string;
20
20
  triggerMessageId?: string;
21
21
  noReply: boolean;
22
+ contextFilePath?: string;
23
+ /** @deprecated Use contextFilePath. Kept for runtimes that haven't migrated. */
22
24
  stepIdFilePath?: string;
23
25
  client: ParallClient;
24
26
  log?: GatewayLogger;