@parall/agent-core 1.33.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.
- package/dist/gateway-base.d.ts.map +1 -1
- package/dist/gateway-base.js +8 -1
- package/dist/skills/parall-wiki.d.ts +1 -1
- package/dist/skills/parall-wiki.d.ts.map +1 -1
- package/dist/skills/parall-wiki.js +88 -89
- package/package.json +2 -2
- package/src/gateway-base.ts +8 -1
- package/src/skills/parall-wiki.ts +88 -89
|
@@ -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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"}
|
package/dist/gateway-base.js
CHANGED
|
@@ -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##
|
|
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,
|
|
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
|
-
##
|
|
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
|
|
9
|
-
|
|
10
|
-
parall wiki
|
|
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
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
45
|
+
## Stale base (server moved since your sync)
|
|
20
46
|
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
68
|
+
All paths below are relative to the workspace root. Pick one:
|
|
48
69
|
|
|
49
70
|
\`\`\`bash
|
|
50
|
-
|
|
51
|
-
parall
|
|
52
|
-
\`\`\`
|
|
71
|
+
# Accept upstream (drop your edit):
|
|
72
|
+
cp <workspace>/.parall-wiki/conflicts/<path>.remote <workspace>/<path>
|
|
53
73
|
|
|
54
|
-
|
|
74
|
+
# Keep yours / hand-merge: edit <workspace>/<path> to final content, then
|
|
75
|
+
parall wiki changeset create <wiki> --title "Reconcile <path>"
|
|
55
76
|
|
|
56
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
85
|
+
## Changesets
|
|
75
86
|
|
|
76
87
|
\`\`\`bash
|
|
77
|
-
parall wiki changeset
|
|
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
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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
|
-
|
|
112
|
-
parall wiki
|
|
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
|
-
|
|
116
|
-
next sync. Conflicts exit 0 — they need your decision, not a retry.
|
|
113
|
+
## Permissions
|
|
117
114
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
##
|
|
120
|
+
## Recovery
|
|
125
121
|
|
|
126
122
|
\`\`\`bash
|
|
127
|
-
parall wiki
|
|
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
|
|
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.
|
|
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.
|
|
38
|
+
"@parall/sdk": "1.35.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/node": "^22.0.0",
|
package/src/gateway-base.ts
CHANGED
|
@@ -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
|
-
##
|
|
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
|
|
9
|
-
|
|
10
|
-
parall wiki
|
|
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
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
45
|
+
## Stale base (server moved since your sync)
|
|
20
46
|
|
|
21
|
-
|
|
22
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
68
|
+
All paths below are relative to the workspace root. Pick one:
|
|
48
69
|
|
|
49
70
|
\`\`\`bash
|
|
50
|
-
|
|
51
|
-
parall
|
|
52
|
-
\`\`\`
|
|
71
|
+
# Accept upstream (drop your edit):
|
|
72
|
+
cp <workspace>/.parall-wiki/conflicts/<path>.remote <workspace>/<path>
|
|
53
73
|
|
|
54
|
-
|
|
74
|
+
# Keep yours / hand-merge: edit <workspace>/<path> to final content, then
|
|
75
|
+
parall wiki changeset create <wiki> --title "Reconcile <path>"
|
|
55
76
|
|
|
56
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
85
|
+
## Changesets
|
|
75
86
|
|
|
76
87
|
\`\`\`bash
|
|
77
|
-
parall wiki changeset
|
|
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
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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
|
-
|
|
112
|
-
parall wiki
|
|
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
|
-
|
|
116
|
-
next sync. Conflicts exit 0 — they need your decision, not a retry.
|
|
113
|
+
## Permissions
|
|
117
114
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
##
|
|
120
|
+
## Recovery
|
|
125
121
|
|
|
126
122
|
\`\`\`bash
|
|
127
|
-
parall wiki
|
|
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
|
|
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
|
`;
|