@parall/agent-core 1.34.0 → 1.35.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.
@@ -1 +1 @@
1
- {"version":3,"file":"gateway-base.d.ts","sourceRoot":"","sources":["../src/gateway-base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway-base.d.ts","sourceRoot":"","sources":["../src/gateway-base.ts"],"names":[],"mappings":"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"}
@@ -1037,6 +1037,13 @@ export class ParallAgentGateway {
1037
1037
  this.dispatchState.mainCurrentTargetId = undefined;
1038
1038
  this.dispatchState.mainPreDispatchBranchPoint = undefined;
1039
1039
  if (!this.shuttingDown && this.dispatchState.mainBuffer.length > 0) {
1040
+ // Opportunistic re-drain — best-effort, not a recovery deadline, so it
1041
+ // must not be the sole handle keeping the event loop alive. In a live
1042
+ // bridge the WS connection holds the loop open and this still fires;
1043
+ // when nothing else is pending there is no runtime to drain to anyway,
1044
+ // and an un-ref'd timer lets the process (or a test run) exit instead
1045
+ // of idling out the 5s. The abort deadlines deliberately stay ref'd —
1046
+ // firing as the sole handle IS their recovery job.
1040
1047
  setTimeout(() => {
1041
1048
  if (!this.draining &&
1042
1049
  !this.dispatchState.mainDispatching &&
@@ -1044,7 +1051,7 @@ export class ParallAgentGateway {
1044
1051
  this.dispatchState.mainDispatching = true;
1045
1052
  void this.drainMainBuffer();
1046
1053
  }
1047
- }, 5000);
1054
+ }, 5000).unref();
1048
1055
  }
1049
1056
  }
1050
1057
  }
@@ -1,2 +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\nCLI success output is JSON; errors may add a plain-text `Request approval:` line on a `PERMISSION_DENIED` \u2014 read both. Run `parall wiki --help` for full options.\n";
1
+ export declare const PARALL_WIKI_SKILL = "# Parall Wiki\n\nManage organization wikis via the Parall CLI. Auth is pre-configured.\n\n## Mental model\n\nWiki editing works on a **local workspace**: `parall wiki sync` downloads the\nwiki into a directory on disk, you edit those files with your normal file\ntools, then `parall wiki changeset create` uploads the result as a proposal.\nThere is no git in the workspace \u2014 your edits are detected by diffing against\nthe synced baseline.\n\nKey facts the commands won't tell you:\n\n- **Workspace location is fixed.** Sync output and `parall wiki status` print\n the absolute workspace path (`synced \u2192 /path/to/<slug>` / `Mount: ...`).\n Always address wiki files by that absolute path \u2014 your shell cwd is usually\n NOT inside the workspace.\n- **Text files only.** Changesets reject binary content. Don't put images or\n archives in the workspace; binary uploads go through the web UI.\n- **`cat`, `search`, `query`, `outline`, and `section` read your local\n workspace copy when it exists** \u2014 including your own unproposed edits. Add\n `--remote` to `cat` to read the server version instead.\n- **`search`/`query` are keyword (lexical) matching**, not semantic search.\n `query` additionally ranks whole documents \u2014 better for multi-word\n questions; `search` for a single identifier.\n- The `<wiki>` argument is the slug or ID from `parall wiki list`; with a\n single wiki in the org it can be omitted.\n\n## Core workflow\n\n```bash\nparall wiki sync # 1. get/update files (prints workspace path)\n# 2. read + edit files under the workspace path with standard file tools\nparall wiki diff <wiki> # 3. review exactly what you'll propose\nparall wiki changeset create <wiki> --title \"...\" # 4. submit\n```\n\nAlways sync before starting and always check `diff` before proposing \u2014 the\nchangeset uploads the full content of every changed file.\n\nUnprotected paths auto-merge immediately (`auto_merged: true`); protected\npaths stay open for human review. Follow the returned `next_action` either way.\n\n## Stale base (server moved since your sync)\n\nIf files changed on the server after your last sync, `changeset create` is\nrejected \u2014 both by a CLI precheck and by the server (409 `STALE_BASE`) \u2014 so\nyou can't silently overwrite someone's concurrent edit. Recovery:\n\n```bash\nparall wiki sync # pull latest; your local edits are preserved\n# if a file conflicts, resolve it (see next section)\nparall wiki changeset create <wiki> --title \"...\"\n```\n\n## Sync conflicts\n\n`sync` three-way merges. When both you and the server changed the same file,\nyour file is left intact and the upstream copy lands under\n`<workspace>/.parall-wiki/conflicts/`:\n\n| Marker | Meaning |\n|--------|---------|\n| `conflicts/<path>.remote` | Server has different content for `<path>` |\n| `conflicts/<path>.remote-deleted` | Server deleted `<path>`; you still have edits |\n\nAll paths below are relative to the workspace root. Pick one:\n\n```bash\n# Accept upstream (drop your edit):\ncp <workspace>/.parall-wiki/conflicts/<path>.remote <workspace>/<path>\n\n# Keep yours / hand-merge: edit <workspace>/<path> to final content, then\nparall wiki changeset create <wiki> --title \"Reconcile <path>\"\n\n# Accept server delete (.remote-deleted only):\nrm <workspace>/<path>\n```\n\nThen re-run `parall wiki sync` and delete the used marker file. Conflicts\nexit 0 (they need your decision); `failed[]` entries (download error,\nshape-conflict) exit 1 and retry on the next sync.\n\n## Changesets\n\n```bash\nparall wiki changeset list <wiki>\nparall wiki changeset show <changesetId> <wiki> # status + feedback\nparall wiki changeset diff <changesetId> <wiki>\nparall wiki changeset create <wiki> --update <id> # re-propose after rejection (title inherited)\n```\n\nRejected: read the feedback (`show` / `status`), fix the files, re-propose\nwith `--update <id>`. Conflict status: `sync`, resolve, then `--update <id>`.\n\nRe-propose REPLACES the changeset's previous contents with your current\nworkspace diff \u2014 to withdraw a file from the proposal, revert it locally\n(restore the synced content) and re-propose; it drops out of the changeset.\n\n## Discovery & history\n\n```bash\nparall wiki query \"how is auth configured\" <wiki> # multi-word lookup (query FIRST, wiki second)\nparall wiki search \"JWT\" <wiki> # single keyword (query FIRST, wiki second)\nparall wiki outline <wiki> --path docs/ # heading structure\nparall wiki cat docs/auth.md <wiki> # print a file (--remote for server version)\nparall wiki tree <wiki> # list files\nparall wiki log <wiki> # recent operations\nparall wiki log <wiki> docs/auth.md # per-file commit history\n```\n\n## Permissions\n\nReads and writes are ACL-checked server-side per path. `parall wiki access\n<path>` shows your level for a path. On a `PERMISSION_DENIED`, errors include\na `Request approval:` hint \u2014 use `parall wiki request-access <path> --reason\n\"...\"` to file an approval card for a maintainer, then re-sync after approval.\n\n## Recovery\n\n```bash\nparall wiki reset <wiki> # discard ALL local edits, restore last-synced state\nparall wiki status <wiki> # local changes + your changesets, anytime\n```\n\nCLI success output is JSON on stdout (human summary on stderr); errors state\nthe reason and the next step \u2014 follow them. `parall wiki --help` for the\nfull command list.\n";
2
2
  //# sourceMappingURL=parall-wiki.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parall-wiki.d.ts","sourceRoot":"","sources":["../../src/skills/parall-wiki.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,o4HAkI7B,CAAC"}
1
+ {"version":3,"file":"parall-wiki.d.ts","sourceRoot":"","sources":["../../src/skills/parall-wiki.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,m/KAiI7B,CAAC"}
@@ -2,130 +2,129 @@ export const PARALL_WIKI_SKILL = `# Parall Wiki
2
2
 
3
3
  Manage organization wikis via the Parall CLI. Auth is pre-configured.
4
4
 
5
- ## Browsing (no local state needed)
5
+ ## Mental model
6
+
7
+ Wiki editing works on a **local workspace**: \`parall wiki sync\` downloads the
8
+ wiki into a directory on disk, you edit those files with your normal file
9
+ tools, then \`parall wiki changeset create\` uploads the result as a proposal.
10
+ There is no git in the workspace — your edits are detected by diffing against
11
+ the synced baseline.
12
+
13
+ Key facts the commands won't tell you:
14
+
15
+ - **Workspace location is fixed.** Sync output and \`parall wiki status\` print
16
+ the absolute workspace path (\`synced → /path/to/<slug>\` / \`Mount: ...\`).
17
+ Always address wiki files by that absolute path — your shell cwd is usually
18
+ NOT inside the workspace.
19
+ - **Text files only.** Changesets reject binary content. Don't put images or
20
+ archives in the workspace; binary uploads go through the web UI.
21
+ - **\`cat\`, \`search\`, \`query\`, \`outline\`, and \`section\` read your local
22
+ workspace copy when it exists** — including your own unproposed edits. Add
23
+ \`--remote\` to \`cat\` to read the server version instead.
24
+ - **\`search\`/\`query\` are keyword (lexical) matching**, not semantic search.
25
+ \`query\` additionally ranks whole documents — better for multi-word
26
+ questions; \`search\` for a single identifier.
27
+ - The \`<wiki>\` argument is the slug or ID from \`parall wiki list\`; with a
28
+ single wiki in the org it can be omitted.
29
+
30
+ ## Core workflow
6
31
 
7
32
  \`\`\`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
33
+ parall wiki sync # 1. get/update files (prints workspace path)
34
+ # 2. read + edit files under the workspace path with standard file tools
35
+ parall wiki diff <wiki> # 3. review exactly what you'll propose
36
+ parall wiki changeset create <wiki> --title "..." # 4. submit
11
37
  \`\`\`
12
38
 
13
- ## Editing
39
+ Always sync before starting and always check \`diff\` before proposing — the
40
+ changeset uploads the full content of every changed file.
14
41
 
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.
42
+ Unprotected paths auto-merge immediately (\`auto_merged: true\`); protected
43
+ paths stay open for human review. Follow the returned \`next_action\` either way.
18
44
 
19
- ### Step 1: Sync
45
+ ## Stale base (server moved since your sync)
20
46
 
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:
47
+ If files changed on the server after your last sync, \`changeset create\` is
48
+ rejected both by a CLI precheck and by the server (409 \`STALE_BASE\`) — so
49
+ you can't silently overwrite someone's concurrent edit. Recovery:
32
50
 
33
51
  \`\`\`bash
34
- parall wiki status <slug>
52
+ parall wiki sync # pull latest; your local edits are preserved
53
+ # if a file conflicts, resolve it (see next section)
54
+ parall wiki changeset create <wiki> --title "..."
35
55
  \`\`\`
36
56
 
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\`.
57
+ ## Sync conflicts
42
58
 
43
- ### Step 3: Edit files
59
+ \`sync\` three-way merges. When both you and the server changed the same file,
60
+ your file is left intact and the upstream copy lands under
61
+ \`<workspace>/.parall-wiki/conflicts/\`:
44
62
 
45
- Use standard file tools (\`read\`, \`write\`, \`edit\`) on files under the mount path.
63
+ | Marker | Meaning |
64
+ |--------|---------|
65
+ | \`conflicts/<path>.remote\` | Server has different content for \`<path>\` |
66
+ | \`conflicts/<path>.remote-deleted\` | Server deleted \`<path>\`; you still have edits |
46
67
 
47
- ### Step 4: Review changes
68
+ All paths below are relative to the workspace root. Pick one:
48
69
 
49
70
  \`\`\`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
- \`\`\`
71
+ # Accept upstream (drop your edit):
72
+ cp <workspace>/.parall-wiki/conflicts/<path>.remote <workspace>/<path>
53
73
 
54
- Always review before proposing.
74
+ # Keep yours / hand-merge: edit <workspace>/<path> to final content, then
75
+ parall wiki changeset create <wiki> --title "Reconcile <path>"
55
76
 
56
- ### Step 5: Propose changeset
57
-
58
- \`\`\`bash
59
- parall wiki changeset create <slug> --title "Description of changes"
77
+ # Accept server delete (.remote-deleted only):
78
+ rm <workspace>/<path>
60
79
  \`\`\`
61
80
 
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
- \`\`\`
81
+ Then re-run \`parall wiki sync\` and delete the used marker file. Conflicts
82
+ exit 0 (they need your decision); \`failed[]\` entries (download error,
83
+ shape-conflict) exit 1 and retry on the next sync.
73
84
 
74
- If a changeset is rejected, fix the files locally and re-propose:
85
+ ## Changesets
75
86
 
76
87
  \`\`\`bash
77
- parall wiki changeset create <slug> --update <changesetId>
88
+ parall wiki changeset list <wiki>
89
+ parall wiki changeset show <changesetId> <wiki> # status + feedback
90
+ parall wiki changeset diff <changesetId> <wiki>
91
+ parall wiki changeset create <wiki> --update <id> # re-propose after rejection (title inherited)
78
92
  \`\`\`
79
93
 
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
+ Rejected: read the feedback (\`show\` / \`status\`), fix the files, re-propose
95
+ with \`--update <id>\`. Conflict status: \`sync\`, resolve, then \`--update <id>\`.
94
96
 
95
- **Accept upstream** (drop your edit):
96
- \`\`\`bash
97
- cp .parall-wiki/conflicts/<path>.remote <path>
98
- parall wiki sync
99
- \`\`\`
97
+ Re-propose REPLACES the changeset's previous contents with your current
98
+ workspace diff — to withdraw a file from the proposal, revert it locally
99
+ (restore the synced content) and re-propose; it drops out of the changeset.
100
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
- \`\`\`
101
+ ## Discovery & history
108
102
 
109
- **Accept server delete** (\`.remote-deleted\` only):
110
103
  \`\`\`bash
111
- rm <path>
112
- parall wiki sync
104
+ parall wiki query "how is auth configured" <wiki> # multi-word lookup (query FIRST, wiki second)
105
+ parall wiki search "JWT" <wiki> # single keyword (query FIRST, wiki second)
106
+ parall wiki outline <wiki> --path docs/ # heading structure
107
+ parall wiki cat docs/auth.md <wiki> # print a file (--remote for server version)
108
+ parall wiki tree <wiki> # list files
109
+ parall wiki log <wiki> # recent operations
110
+ parall wiki log <wiki> docs/auth.md # per-file commit history
113
111
  \`\`\`
114
112
 
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.
113
+ ## Permissions
117
114
 
118
- ## Discarding local changes
119
-
120
- \`\`\`bash
121
- parall wiki reset <slug> # Restore all files to last synced state
122
- \`\`\`
115
+ Reads and writes are ACL-checked server-side per path. \`parall wiki access
116
+ <path>\` shows your level for a path. On a \`PERMISSION_DENIED\`, errors include
117
+ a \`Request approval:\` hint — use \`parall wiki request-access <path> --reason
118
+ "..."\` to file an approval card for a maintainer, then re-sync after approval.
123
119
 
124
- ## History
120
+ ## Recovery
125
121
 
126
122
  \`\`\`bash
127
- parall wiki log <slug> # Recent wiki operations
123
+ parall wiki reset <wiki> # discard ALL local edits, restore last-synced state
124
+ parall wiki status <wiki> # local changes + your changesets, anytime
128
125
  \`\`\`
129
126
 
130
- CLI success output is JSON; errors may add a plain-text \`Request approval:\` line on a \`PERMISSION_DENIED\` — read both. Run \`parall wiki --help\` for full options.
127
+ CLI success output is JSON on stdout (human summary on stderr); errors state
128
+ the reason and the next step — follow them. \`parall wiki --help\` for the
129
+ full command list.
131
130
  `;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parall/agent-core",
3
- "version": "1.34.0",
3
+ "version": "1.35.0",
4
4
  "description": "Shared agent runtime orchestration helpers for Parall",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -35,7 +35,7 @@
35
35
  "@opentelemetry/sdk-logs": "^0.57.0",
36
36
  "@opentelemetry/sdk-metrics": "^1.30.0",
37
37
  "@opentelemetry/sdk-trace-node": "^1.30.0",
38
- "@parall/sdk": "1.34.0"
38
+ "@parall/sdk": "1.35.0"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/node": "^22.0.0",
@@ -1342,6 +1342,13 @@ export class ParallAgentGateway {
1342
1342
  this.dispatchState.mainCurrentTargetId = undefined;
1343
1343
  this.dispatchState.mainPreDispatchBranchPoint = undefined;
1344
1344
  if (!this.shuttingDown && this.dispatchState.mainBuffer.length > 0) {
1345
+ // Opportunistic re-drain — best-effort, not a recovery deadline, so it
1346
+ // must not be the sole handle keeping the event loop alive. In a live
1347
+ // bridge the WS connection holds the loop open and this still fires;
1348
+ // when nothing else is pending there is no runtime to drain to anyway,
1349
+ // and an un-ref'd timer lets the process (or a test run) exit instead
1350
+ // of idling out the 5s. The abort deadlines deliberately stay ref'd —
1351
+ // firing as the sole handle IS their recovery job.
1345
1352
  setTimeout(() => {
1346
1353
  if (
1347
1354
  !this.draining &&
@@ -1351,7 +1358,7 @@ export class ParallAgentGateway {
1351
1358
  this.dispatchState.mainDispatching = true;
1352
1359
  void this.drainMainBuffer();
1353
1360
  }
1354
- }, 5000);
1361
+ }, 5000).unref();
1355
1362
  }
1356
1363
  }
1357
1364
  }
@@ -2,130 +2,129 @@ export const PARALL_WIKI_SKILL = `# Parall Wiki
2
2
 
3
3
  Manage organization wikis via the Parall CLI. Auth is pre-configured.
4
4
 
5
- ## Browsing (no local state needed)
5
+ ## Mental model
6
+
7
+ Wiki editing works on a **local workspace**: \`parall wiki sync\` downloads the
8
+ wiki into a directory on disk, you edit those files with your normal file
9
+ tools, then \`parall wiki changeset create\` uploads the result as a proposal.
10
+ There is no git in the workspace — your edits are detected by diffing against
11
+ the synced baseline.
12
+
13
+ Key facts the commands won't tell you:
14
+
15
+ - **Workspace location is fixed.** Sync output and \`parall wiki status\` print
16
+ the absolute workspace path (\`synced → /path/to/<slug>\` / \`Mount: ...\`).
17
+ Always address wiki files by that absolute path — your shell cwd is usually
18
+ NOT inside the workspace.
19
+ - **Text files only.** Changesets reject binary content. Don't put images or
20
+ archives in the workspace; binary uploads go through the web UI.
21
+ - **\`cat\`, \`search\`, \`query\`, \`outline\`, and \`section\` read your local
22
+ workspace copy when it exists** — including your own unproposed edits. Add
23
+ \`--remote\` to \`cat\` to read the server version instead.
24
+ - **\`search\`/\`query\` are keyword (lexical) matching**, not semantic search.
25
+ \`query\` additionally ranks whole documents — better for multi-word
26
+ questions; \`search\` for a single identifier.
27
+ - The \`<wiki>\` argument is the slug or ID from \`parall wiki list\`; with a
28
+ single wiki in the org it can be omitted.
29
+
30
+ ## Core workflow
6
31
 
7
32
  \`\`\`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
33
+ parall wiki sync # 1. get/update files (prints workspace path)
34
+ # 2. read + edit files under the workspace path with standard file tools
35
+ parall wiki diff <wiki> # 3. review exactly what you'll propose
36
+ parall wiki changeset create <wiki> --title "..." # 4. submit
11
37
  \`\`\`
12
38
 
13
- ## Editing
39
+ Always sync before starting and always check \`diff\` before proposing — the
40
+ changeset uploads the full content of every changed file.
14
41
 
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.
42
+ Unprotected paths auto-merge immediately (\`auto_merged: true\`); protected
43
+ paths stay open for human review. Follow the returned \`next_action\` either way.
18
44
 
19
- ### Step 1: Sync
45
+ ## Stale base (server moved since your sync)
20
46
 
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:
47
+ If files changed on the server after your last sync, \`changeset create\` is
48
+ rejected both by a CLI precheck and by the server (409 \`STALE_BASE\`) — so
49
+ you can't silently overwrite someone's concurrent edit. Recovery:
32
50
 
33
51
  \`\`\`bash
34
- parall wiki status <slug>
52
+ parall wiki sync # pull latest; your local edits are preserved
53
+ # if a file conflicts, resolve it (see next section)
54
+ parall wiki changeset create <wiki> --title "..."
35
55
  \`\`\`
36
56
 
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\`.
57
+ ## Sync conflicts
42
58
 
43
- ### Step 3: Edit files
59
+ \`sync\` three-way merges. When both you and the server changed the same file,
60
+ your file is left intact and the upstream copy lands under
61
+ \`<workspace>/.parall-wiki/conflicts/\`:
44
62
 
45
- Use standard file tools (\`read\`, \`write\`, \`edit\`) on files under the mount path.
63
+ | Marker | Meaning |
64
+ |--------|---------|
65
+ | \`conflicts/<path>.remote\` | Server has different content for \`<path>\` |
66
+ | \`conflicts/<path>.remote-deleted\` | Server deleted \`<path>\`; you still have edits |
46
67
 
47
- ### Step 4: Review changes
68
+ All paths below are relative to the workspace root. Pick one:
48
69
 
49
70
  \`\`\`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
- \`\`\`
71
+ # Accept upstream (drop your edit):
72
+ cp <workspace>/.parall-wiki/conflicts/<path>.remote <workspace>/<path>
53
73
 
54
- Always review before proposing.
74
+ # Keep yours / hand-merge: edit <workspace>/<path> to final content, then
75
+ parall wiki changeset create <wiki> --title "Reconcile <path>"
55
76
 
56
- ### Step 5: Propose changeset
57
-
58
- \`\`\`bash
59
- parall wiki changeset create <slug> --title "Description of changes"
77
+ # Accept server delete (.remote-deleted only):
78
+ rm <workspace>/<path>
60
79
  \`\`\`
61
80
 
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
- \`\`\`
81
+ Then re-run \`parall wiki sync\` and delete the used marker file. Conflicts
82
+ exit 0 (they need your decision); \`failed[]\` entries (download error,
83
+ shape-conflict) exit 1 and retry on the next sync.
73
84
 
74
- If a changeset is rejected, fix the files locally and re-propose:
85
+ ## Changesets
75
86
 
76
87
  \`\`\`bash
77
- parall wiki changeset create <slug> --update <changesetId>
88
+ parall wiki changeset list <wiki>
89
+ parall wiki changeset show <changesetId> <wiki> # status + feedback
90
+ parall wiki changeset diff <changesetId> <wiki>
91
+ parall wiki changeset create <wiki> --update <id> # re-propose after rejection (title inherited)
78
92
  \`\`\`
79
93
 
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
+ Rejected: read the feedback (\`show\` / \`status\`), fix the files, re-propose
95
+ with \`--update <id>\`. Conflict status: \`sync\`, resolve, then \`--update <id>\`.
94
96
 
95
- **Accept upstream** (drop your edit):
96
- \`\`\`bash
97
- cp .parall-wiki/conflicts/<path>.remote <path>
98
- parall wiki sync
99
- \`\`\`
97
+ Re-propose REPLACES the changeset's previous contents with your current
98
+ workspace diff — to withdraw a file from the proposal, revert it locally
99
+ (restore the synced content) and re-propose; it drops out of the changeset.
100
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
- \`\`\`
101
+ ## Discovery & history
108
102
 
109
- **Accept server delete** (\`.remote-deleted\` only):
110
103
  \`\`\`bash
111
- rm <path>
112
- parall wiki sync
104
+ parall wiki query "how is auth configured" <wiki> # multi-word lookup (query FIRST, wiki second)
105
+ parall wiki search "JWT" <wiki> # single keyword (query FIRST, wiki second)
106
+ parall wiki outline <wiki> --path docs/ # heading structure
107
+ parall wiki cat docs/auth.md <wiki> # print a file (--remote for server version)
108
+ parall wiki tree <wiki> # list files
109
+ parall wiki log <wiki> # recent operations
110
+ parall wiki log <wiki> docs/auth.md # per-file commit history
113
111
  \`\`\`
114
112
 
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.
113
+ ## Permissions
117
114
 
118
- ## Discarding local changes
119
-
120
- \`\`\`bash
121
- parall wiki reset <slug> # Restore all files to last synced state
122
- \`\`\`
115
+ Reads and writes are ACL-checked server-side per path. \`parall wiki access
116
+ <path>\` shows your level for a path. On a \`PERMISSION_DENIED\`, errors include
117
+ a \`Request approval:\` hint — use \`parall wiki request-access <path> --reason
118
+ "..."\` to file an approval card for a maintainer, then re-sync after approval.
123
119
 
124
- ## History
120
+ ## Recovery
125
121
 
126
122
  \`\`\`bash
127
- parall wiki log <slug> # Recent wiki operations
123
+ parall wiki reset <wiki> # discard ALL local edits, restore last-synced state
124
+ parall wiki status <wiki> # local changes + your changesets, anytime
128
125
  \`\`\`
129
126
 
130
- CLI success output is JSON; errors may add a plain-text \`Request approval:\` line on a \`PERMISSION_DENIED\` — read both. Run \`parall wiki --help\` for full options.
127
+ CLI success output is JSON on stdout (human summary on stderr); errors state
128
+ the reason and the next step — follow them. \`parall wiki --help\` for the
129
+ full command list.
131
130
  `;