@parall/parall 1.25.0 → 1.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -4
- package/skills/parall-schedules/SKILL.md +2 -2
- package/skills/parall-wiki/SKILL.md +1 -1
- package/src/config-manager.ts +34 -9
- package/src/fork.ts +6 -4
- package/src/gateway.ts +14 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parall/parall",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.26.1",
|
|
4
4
|
"description": "OpenClaw channel plugin for Parall IM",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"openclaw.plugin.json"
|
|
16
16
|
],
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@parall/sdk": "1.
|
|
19
|
-
"@parall/agent-core": "1.
|
|
18
|
+
"@parall/sdk": "1.26.1",
|
|
19
|
+
"@parall/agent-core": "1.26.1"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@types/node": "^22.0.0",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
38
|
"scripts": {
|
|
39
|
-
"build": "tsc -b",
|
|
39
|
+
"build": "tsc -b && node scripts/generate-skills.mjs",
|
|
40
40
|
"test": "node --test test/*.test.mjs"
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -37,7 +37,7 @@ parall schedules create \
|
|
|
37
37
|
--name "Followup" \
|
|
38
38
|
--description "Remind the user about the PR review if still pending" \
|
|
39
39
|
--target-ids prll://usr_xxx \
|
|
40
|
-
--run-at
|
|
40
|
+
--run-at <FUTURE_RFC3339_TIME>
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
`--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`).
|
|
@@ -75,7 +75,7 @@ Your job is to interpret the description and act:
|
|
|
75
75
|
|
|
76
76
|
1. Read the description and any `prll://` refs it contains
|
|
77
77
|
2. Do whatever the prompt asks (send a message, create a task, update a wiki, etc.) — there is no canonical response format
|
|
78
|
-
3. Optional: if the fire is genuinely a no-op and you don't want to produce any artifact, use `no-reply` (from
|
|
78
|
+
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
|
|
79
79
|
|
|
80
80
|
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.
|
|
81
81
|
|
|
@@ -28,7 +28,7 @@ parall wiki sync <slug>
|
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
This downloads wiki files to a local directory. The output includes the
|
|
31
|
-
**absolute mount path** for each wiki (e.g. `synced → /
|
|
31
|
+
**absolute mount path** for each wiki (e.g. `synced → /path/to/workspace/kb`).
|
|
32
32
|
|
|
33
33
|
### Step 2: Find the mount path
|
|
34
34
|
|
package/src/config-manager.ts
CHANGED
|
@@ -81,18 +81,43 @@ function applyToOpenClawConfig(
|
|
|
81
81
|
models.providers = providers;
|
|
82
82
|
existing.models = models;
|
|
83
83
|
|
|
84
|
-
//
|
|
84
|
+
// Strip keys OpenClaw doesn't recognize from agents.defaults — platform-only
|
|
85
|
+
// keys like thinking_effort are consumed by agent-core's PlatformConfigManager.
|
|
86
|
+
// See: OpenClaw agents.defaults config schema.
|
|
87
|
+
const OPENCLAW_AGENTS_DEFAULTS_KEYS = new Set(["model", "maxTokens", "compaction"]);
|
|
88
|
+
|
|
89
|
+
// Unconditionally sanitize existing defaults to self-heal already-poisoned
|
|
90
|
+
// openclaw.json files (e.g. mode=self agents that were poisoned while in
|
|
91
|
+
// platform mode).
|
|
92
|
+
const agents = (existing.agents ?? {}) as Record<string, unknown>;
|
|
93
|
+
const existingDefaults = (agents.defaults ?? {}) as Record<string, unknown>;
|
|
94
|
+
const cleanedExisting: Record<string, unknown> = {};
|
|
95
|
+
for (const [k, v] of Object.entries(existingDefaults)) {
|
|
96
|
+
if (OPENCLAW_AGENTS_DEFAULTS_KEYS.has(k)) {
|
|
97
|
+
cleanedExisting[k] = v;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Overlay platform defaults (filtered) when present.
|
|
85
102
|
const platformAgents = (platformConfig.agents ?? {}) as Record<string, unknown>;
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
103
|
+
const rawDefaults = platformAgents.defaults;
|
|
104
|
+
if (
|
|
105
|
+
rawDefaults !== undefined &&
|
|
106
|
+
rawDefaults !== null &&
|
|
107
|
+
typeof rawDefaults === "object" &&
|
|
108
|
+
!Array.isArray(rawDefaults)
|
|
109
|
+
) {
|
|
110
|
+
const raw = rawDefaults as Record<string, unknown>;
|
|
111
|
+
for (const [k, v] of Object.entries(raw)) {
|
|
112
|
+
if (OPENCLAW_AGENTS_DEFAULTS_KEYS.has(k)) {
|
|
113
|
+
cleanedExisting[k] = v;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
94
116
|
}
|
|
95
117
|
|
|
118
|
+
agents.defaults = cleanedExisting;
|
|
119
|
+
existing.agents = agents;
|
|
120
|
+
|
|
96
121
|
// No plugin tools to allow — all operations go through CLI.
|
|
97
122
|
|
|
98
123
|
// Atomic write
|
package/src/fork.ts
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
//
|
|
3
3
|
// When the orchestrator's main session is busy, new events are handled by
|
|
4
4
|
// forking the main session's transcript and dispatching to the fork in parallel.
|
|
5
|
-
// The
|
|
6
|
-
//
|
|
7
|
-
//
|
|
5
|
+
// The caller provides a pre-dispatch branch point so the fork inherits
|
|
6
|
+
// history up to (but not including) the in-flight dispatch. Without a
|
|
7
|
+
// branch point, the fork falls back to the current on-disk leaf — which
|
|
8
|
+
// may include partial in-flight state.
|
|
8
9
|
|
|
9
10
|
import * as fs from "node:fs";
|
|
10
11
|
import * as path from "node:path";
|
|
@@ -102,6 +103,7 @@ export function forkOrchestratorSession(opts: {
|
|
|
102
103
|
accountId: string;
|
|
103
104
|
transcriptFile: string;
|
|
104
105
|
sessionsDir: string;
|
|
106
|
+
branchPointId?: string;
|
|
105
107
|
}): ForkSessionResult | null {
|
|
106
108
|
const { orchestratorSessionKey, accountId, transcriptFile, sessionsDir } = opts;
|
|
107
109
|
|
|
@@ -109,7 +111,7 @@ export function forkOrchestratorSession(opts: {
|
|
|
109
111
|
|
|
110
112
|
try {
|
|
111
113
|
const manager = SessionManager.open(transcriptFile);
|
|
112
|
-
const leafId = manager.getLeafId();
|
|
114
|
+
const leafId = opts.branchPointId ?? manager.getLeafId();
|
|
113
115
|
|
|
114
116
|
let sessionId: string;
|
|
115
117
|
let sessionFile: string;
|
package/src/gateway.ts
CHANGED
|
@@ -27,6 +27,7 @@ import { buildOrchestratorSessionKey } from "./session.js";
|
|
|
27
27
|
import type { ResolvedParallAccount } from "./types.js";
|
|
28
28
|
import { fetchAndApplyPlatformConfig } from "./config-manager.js";
|
|
29
29
|
import { startWikiHelper } from "./wiki-helper.js";
|
|
30
|
+
import { SessionManager } from "@mariozechner/pi-coding-agent";
|
|
30
31
|
import { cleanupForkSession, forkOrchestratorSession, resolveTranscriptFile } from "./fork.js";
|
|
31
32
|
|
|
32
33
|
function resolveWsUrl(account: ResolvedParallAccount): string {
|
|
@@ -210,7 +211,18 @@ function createOpenClawDispatchAdapter(opts: {
|
|
|
210
211
|
yield* stream.stream();
|
|
211
212
|
},
|
|
212
213
|
|
|
213
|
-
|
|
214
|
+
getBranchPoint(sessionKey: string): string | undefined {
|
|
215
|
+
const transcriptFile = resolveTranscriptFile(opts.sessionsDir, sessionKey);
|
|
216
|
+
if (!transcriptFile) return undefined;
|
|
217
|
+
try {
|
|
218
|
+
const manager = SessionManager.open(transcriptFile);
|
|
219
|
+
return manager.getLeafId() ?? undefined;
|
|
220
|
+
} catch {
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
|
|
225
|
+
forkSession({ sessionKey, preDispatchBranchPoint }) {
|
|
214
226
|
const transcriptFile = resolveTranscriptFile(opts.sessionsDir, sessionKey);
|
|
215
227
|
if (!transcriptFile) return null;
|
|
216
228
|
return forkOrchestratorSession({
|
|
@@ -218,6 +230,7 @@ function createOpenClawDispatchAdapter(opts: {
|
|
|
218
230
|
accountId: opts.accountId,
|
|
219
231
|
transcriptFile,
|
|
220
232
|
sessionsDir: opts.sessionsDir,
|
|
233
|
+
branchPointId: preDispatchBranchPoint,
|
|
221
234
|
});
|
|
222
235
|
},
|
|
223
236
|
|