@laurentenhoor/devclaw 0.1.1 → 1.1.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/README.md +58 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/dispatch.d.ts.map +1 -1
- package/dist/lib/dispatch.js +29 -24
- package/dist/lib/dispatch.js.map +1 -1
- package/dist/lib/notify.d.ts.map +1 -1
- package/dist/lib/notify.js +4 -5
- package/dist/lib/notify.js.map +1 -1
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +56 -7
- package/dist/lib/onboarding.js.map +1 -1
- package/dist/lib/providers/github.d.ts +3 -0
- package/dist/lib/providers/github.d.ts.map +1 -1
- package/dist/lib/providers/github.js +12 -37
- package/dist/lib/providers/github.js.map +1 -1
- package/dist/lib/providers/gitlab.d.ts +3 -0
- package/dist/lib/providers/gitlab.d.ts.map +1 -1
- package/dist/lib/providers/gitlab.js +16 -42
- package/dist/lib/providers/gitlab.js.map +1 -1
- package/dist/lib/providers/index.d.ts +4 -1
- package/dist/lib/providers/index.d.ts.map +1 -1
- package/dist/lib/providers/index.js +6 -9
- package/dist/lib/providers/index.js.map +1 -1
- package/dist/lib/run-command.d.ts +18 -0
- package/dist/lib/run-command.d.ts.map +1 -0
- package/dist/lib/run-command.js +17 -0
- package/dist/lib/run-command.js.map +1 -0
- package/dist/lib/services/heartbeat.d.ts.map +1 -1
- package/dist/lib/services/heartbeat.js +34 -11
- package/dist/lib/services/heartbeat.js.map +1 -1
- package/dist/lib/services/pipeline.d.ts +5 -0
- package/dist/lib/services/pipeline.d.ts.map +1 -1
- package/dist/lib/services/pipeline.js +2 -9
- package/dist/lib/services/pipeline.js.map +1 -1
- package/dist/lib/services/queue.js +1 -1
- package/dist/lib/services/queue.js.map +1 -1
- package/dist/lib/services/tick.js +1 -1
- package/dist/lib/services/tick.js.map +1 -1
- package/dist/lib/setup/agent.d.ts.map +1 -1
- package/dist/lib/setup/agent.js +2 -4
- package/dist/lib/setup/agent.js.map +1 -1
- package/dist/lib/setup/llm-model-selector.d.ts +19 -0
- package/dist/lib/setup/llm-model-selector.d.ts.map +1 -0
- package/dist/lib/setup/llm-model-selector.js +102 -0
- package/dist/lib/setup/llm-model-selector.js.map +1 -0
- package/dist/lib/setup/model-fetcher.d.ts +22 -0
- package/dist/lib/setup/model-fetcher.d.ts.map +1 -0
- package/dist/lib/setup/model-fetcher.js +52 -0
- package/dist/lib/setup/model-fetcher.js.map +1 -0
- package/dist/lib/setup/smart-model-selector.d.ts +38 -0
- package/dist/lib/setup/smart-model-selector.d.ts.map +1 -0
- package/dist/lib/setup/smart-model-selector.js +76 -0
- package/dist/lib/setup/smart-model-selector.js.map +1 -0
- package/dist/lib/templates.d.ts +1 -1
- package/dist/lib/templates.d.ts.map +1 -1
- package/dist/lib/templates.js +29 -1
- package/dist/lib/templates.js.map +1 -1
- package/dist/lib/tool-helpers.d.ts +1 -1
- package/dist/lib/tool-helpers.d.ts.map +1 -1
- package/dist/lib/tool-helpers.js +1 -1
- package/dist/lib/tool-helpers.js.map +1 -1
- package/dist/lib/tools/autoconfigure-models.d.ts +26 -0
- package/dist/lib/tools/autoconfigure-models.d.ts.map +1 -0
- package/dist/lib/tools/autoconfigure-models.js +110 -0
- package/dist/lib/tools/autoconfigure-models.js.map +1 -0
- package/dist/lib/tools/health.js +1 -1
- package/dist/lib/tools/health.js.map +1 -1
- package/dist/lib/tools/project-register.js +1 -1
- package/dist/lib/tools/project-register.js.map +1 -1
- package/dist/lib/tools/setup.d.ts.map +1 -1
- package/dist/lib/tools/setup.js +2 -1
- package/dist/lib/tools/setup.js.map +1 -1
- package/dist/lib/tools/task-comment.js +1 -1
- package/dist/lib/tools/task-comment.js.map +1 -1
- package/dist/lib/tools/task-create.js +1 -1
- package/dist/lib/tools/task-create.js.map +1 -1
- package/dist/lib/tools/task-update.js +1 -1
- package/dist/lib/tools/task-update.js.map +1 -1
- package/dist/lib/tools/work-finish.js +1 -1
- package/dist/lib/tools/work-finish.js.map +1 -1
- package/dist/lib/tools/work-start.js +1 -1
- package/dist/lib/tools/work-start.js.map +1 -1
- package/docs/ARCHITECTURE.md +5 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -6,12 +6,21 @@
|
|
|
6
6
|
|
|
7
7
|
**Turn any group chat into a dev team that ships.**
|
|
8
8
|
|
|
9
|
-
DevClaw is a plugin for [OpenClaw](https://openclaw.ai) that turns your orchestrator agent into a development manager. It hires developers, assigns tasks, reviews code, and keeps the pipeline moving — across as many projects as you have group chats.
|
|
9
|
+
DevClaw is a plugin for [OpenClaw](https://openclaw.ai) that turns your orchestrator agent into a development manager. It hires developers, assigns tasks, reviews code, and keeps the pipeline moving — across as many projects as you have group chats.
|
|
10
|
+
|
|
11
|
+
**Prerequisites:** [OpenClaw](https://openclaw.ai) must be installed and running.
|
|
10
12
|
|
|
11
13
|
```bash
|
|
12
14
|
openclaw plugins install @laurentenhoor/devclaw
|
|
13
15
|
```
|
|
14
16
|
|
|
17
|
+
Then start onboarding by chatting with your agent in any channel:
|
|
18
|
+
```
|
|
19
|
+
"Hey, can you help me set up DevClaw?"
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
[Read more on onboarding →](#getting-started)
|
|
23
|
+
|
|
15
24
|
---
|
|
16
25
|
|
|
17
26
|
## What it looks like
|
|
@@ -324,6 +333,49 @@ Deployment steps, test commands, coding standards, acceptance criteria — all i
|
|
|
324
333
|
|
|
325
334
|
---
|
|
326
335
|
|
|
336
|
+
## The orchestrator's role
|
|
337
|
+
|
|
338
|
+
The orchestrator is a **planner and dispatcher** — not a coder. This separation is intentional and enforced.
|
|
339
|
+
|
|
340
|
+
### What the orchestrator does
|
|
341
|
+
|
|
342
|
+
- **Plans**: Analyzes requirements, breaks down work, decides priorities
|
|
343
|
+
- **Dispatches**: Creates issues, assigns developer levels, starts workers
|
|
344
|
+
- **Coordinates**: Monitors queue, handles status checks, answers questions
|
|
345
|
+
- **Reads**: Can inspect code to understand context (but never writes)
|
|
346
|
+
|
|
347
|
+
### What goes through workers
|
|
348
|
+
|
|
349
|
+
All implementation work flows through the issue → worker pipeline:
|
|
350
|
+
|
|
351
|
+
| Action | Goes through worker? | Why |
|
|
352
|
+
|---|---|---|
|
|
353
|
+
| Writing or editing code | ✅ Yes | Audit trail, tier selection |
|
|
354
|
+
| Git operations (commits, branches, PRs) | ✅ Yes | Workers own their worktrees |
|
|
355
|
+
| Running tests | ✅ Yes | Part of the dev/QA workflow |
|
|
356
|
+
| Fixing bugs | ✅ Yes | Even quick fixes need tracking |
|
|
357
|
+
| Refactoring | ✅ Yes | Sonnet/Opus for complexity |
|
|
358
|
+
| Reading code to answer questions | ❌ No | Orchestrator can read |
|
|
359
|
+
| Creating issues | ❌ No | Orchestrator's job |
|
|
360
|
+
| Status checks | ❌ No | Orchestrator's job |
|
|
361
|
+
| Architecture discussions | ❌ No | Orchestrator's job |
|
|
362
|
+
|
|
363
|
+
### Why this boundary exists
|
|
364
|
+
|
|
365
|
+
1. **Audit trail** — Every code change links to an issue. You can trace any line of code back to a tracked task.
|
|
366
|
+
|
|
367
|
+
2. **Right model for the job** — A typo fix uses Haiku (~$0.001). A migration uses Opus (~$0.20). Without tier selection, you're either overpaying or underperforming on every task.
|
|
368
|
+
|
|
369
|
+
3. **Parallelization** — While workers code, the orchestrator stays free to handle new requests, answer questions, create more issues. No bottleneck.
|
|
370
|
+
|
|
371
|
+
4. **QA pipeline** — Code goes through review before merging. Skip the worker pipeline, skip QA.
|
|
372
|
+
|
|
373
|
+
5. **Session reuse** — Workers accumulate codebase context over multiple tasks. The orchestrator starting fresh every time wastes tokens.
|
|
374
|
+
|
|
375
|
+
The orchestrator saying "I'll just make this quick fix myself" is like a manager saying "I'll just write that feature instead of assigning it." Technically possible, but it breaks the system that makes everything else work.
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
327
379
|
## Getting started
|
|
328
380
|
|
|
329
381
|
### Prerequisites
|
|
@@ -343,6 +395,11 @@ Or for local development:
|
|
|
343
395
|
openclaw plugins install -l ./devclaw
|
|
344
396
|
```
|
|
345
397
|
|
|
398
|
+
Start onboarding:
|
|
399
|
+
```bash
|
|
400
|
+
openclaw chat "Help me set up DevClaw"
|
|
401
|
+
```
|
|
402
|
+
|
|
346
403
|
### Set up through conversation
|
|
347
404
|
|
|
348
405
|
The easiest way to configure DevClaw is to just talk to your agent:
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAgB7D,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAwEI,iBAAiB;CAqChC,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,8 +8,10 @@ import { createHealthTool } from "./lib/tools/health.js";
|
|
|
8
8
|
import { createProjectRegisterTool } from "./lib/tools/project-register.js";
|
|
9
9
|
import { createSetupTool } from "./lib/tools/setup.js";
|
|
10
10
|
import { createOnboardTool } from "./lib/tools/onboard.js";
|
|
11
|
+
import { createAutoConfigureModelsTool } from "./lib/tools/autoconfigure-models.js";
|
|
11
12
|
import { registerCli } from "./lib/cli.js";
|
|
12
13
|
import { registerHeartbeatService } from "./lib/services/heartbeat.js";
|
|
14
|
+
import { initRunCommand } from "./lib/run-command.js";
|
|
13
15
|
const plugin = {
|
|
14
16
|
id: "devclaw",
|
|
15
17
|
name: "DevClaw",
|
|
@@ -78,6 +80,7 @@ const plugin = {
|
|
|
78
80
|
},
|
|
79
81
|
},
|
|
80
82
|
register(api) {
|
|
83
|
+
initRunCommand(api);
|
|
81
84
|
// Worker lifecycle
|
|
82
85
|
api.registerTool(createWorkStartTool(api), { names: ["work_start"] });
|
|
83
86
|
api.registerTool(createWorkFinishTool(api), { names: ["work_finish"] });
|
|
@@ -94,13 +97,16 @@ const plugin = {
|
|
|
94
97
|
});
|
|
95
98
|
api.registerTool(createSetupTool(api), { names: ["setup"] });
|
|
96
99
|
api.registerTool(createOnboardTool(api), { names: ["onboard"] });
|
|
100
|
+
api.registerTool(createAutoConfigureModelsTool(api), {
|
|
101
|
+
names: ["autoconfigure_models"],
|
|
102
|
+
});
|
|
97
103
|
// CLI
|
|
98
104
|
api.registerCli(({ program }) => registerCli(program, api), {
|
|
99
105
|
commands: ["devclaw"],
|
|
100
106
|
});
|
|
101
107
|
// Services
|
|
102
108
|
registerHeartbeatService(api);
|
|
103
|
-
api.logger.info("DevClaw plugin registered (
|
|
109
|
+
api.logger.info("DevClaw plugin registered (11 tools, 1 CLI command group, 1 service)");
|
|
104
110
|
},
|
|
105
111
|
};
|
|
106
112
|
export default plugin;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../lib/dispatch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../lib/dispatch.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,OAAO,EAIb,MAAM,eAAe,CAAC;AAGvB,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,OAAO,GAAG,MAAM,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,MAAM,CAAC,CA2ClB;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CAiEzB"}
|
package/dist/lib/dispatch.js
CHANGED
|
@@ -4,14 +4,12 @@
|
|
|
4
4
|
* Handles: session lookup, spawn/reuse via Gateway RPC, task dispatch via CLI,
|
|
5
5
|
* state update (activateWorker), and audit logging.
|
|
6
6
|
*/
|
|
7
|
-
import { execFile, spawn } from "node:child_process";
|
|
8
7
|
import fs from "node:fs/promises";
|
|
9
8
|
import path from "node:path";
|
|
10
|
-
import { promisify } from "node:util";
|
|
11
9
|
import { log as auditLog } from "./audit.js";
|
|
10
|
+
import { runCommand } from "./run-command.js";
|
|
12
11
|
import { activateWorker, getSessionForLevel, getWorker, } from "./projects.js";
|
|
13
12
|
import { resolveModel, levelEmoji } from "./tiers.js";
|
|
14
|
-
const execFileAsync = promisify(execFile);
|
|
15
13
|
/**
|
|
16
14
|
* Build the task message sent to a worker session.
|
|
17
15
|
* Reads role-specific instructions from workspace/projects/roles/<project>/<role>.md (falls back to projects/roles/default/).
|
|
@@ -58,19 +56,20 @@ export async function dispatchTask(opts) {
|
|
|
58
56
|
repo: project.repo, baseBranch: project.baseBranch, groupId,
|
|
59
57
|
});
|
|
60
58
|
await transitionLabel(issueId, fromLabel, toLabel);
|
|
61
|
-
let sessionKey = existingSessionKey;
|
|
62
59
|
let dispatched = false;
|
|
60
|
+
let session;
|
|
63
61
|
try {
|
|
64
|
-
|
|
62
|
+
session = await ensureSession(sessionAction, existingSessionKey, {
|
|
65
63
|
agentId, projectName: project.name, role, level, model,
|
|
66
64
|
});
|
|
67
|
-
|
|
65
|
+
sendToAgent(session.key, taskMessage, {
|
|
68
66
|
agentId, projectName: project.name, issueId, role,
|
|
69
67
|
orchestratorSessionKey: opts.sessionKey,
|
|
70
68
|
});
|
|
71
69
|
dispatched = true;
|
|
70
|
+
// Always store session key — a "send" may have fallen back to "spawn"
|
|
72
71
|
await recordWorkerState(workspaceDir, groupId, role, {
|
|
73
|
-
issueId, level, sessionKey:
|
|
72
|
+
issueId, level, sessionKey: session.key, sessionAction: session.action,
|
|
74
73
|
});
|
|
75
74
|
}
|
|
76
75
|
catch (err) {
|
|
@@ -78,7 +77,7 @@ export async function dispatchTask(opts) {
|
|
|
78
77
|
await auditLog(workspaceDir, "work_start", {
|
|
79
78
|
project: project.name, groupId, issue: issueId, role,
|
|
80
79
|
warning: "State update failed after successful dispatch",
|
|
81
|
-
error: err.message, sessionKey,
|
|
80
|
+
error: err.message, sessionKey: session.key,
|
|
82
81
|
});
|
|
83
82
|
throw new Error(`State update failed after successful session dispatch: ${err.message}. Session is running but projects.json was not updated.`);
|
|
84
83
|
}
|
|
@@ -90,11 +89,11 @@ export async function dispatchTask(opts) {
|
|
|
90
89
|
}
|
|
91
90
|
await auditDispatch(workspaceDir, {
|
|
92
91
|
project: project.name, groupId, issueId, issueTitle,
|
|
93
|
-
role, level, model, sessionAction, sessionKey:
|
|
92
|
+
role, level, model, sessionAction: session.action, sessionKey: session.key,
|
|
94
93
|
fromLabel, toLabel,
|
|
95
94
|
});
|
|
96
|
-
const announcement = buildAnnouncement(level, role,
|
|
97
|
-
return { sessionAction, sessionKey:
|
|
95
|
+
const announcement = buildAnnouncement(level, role, session.action, issueId, issueTitle, issueUrl);
|
|
96
|
+
return { sessionAction: session.action, sessionKey: session.key, level, model, announcement };
|
|
98
97
|
}
|
|
99
98
|
// ---------------------------------------------------------------------------
|
|
100
99
|
// Private helpers — exist so dispatchTask reads as a sequence of steps
|
|
@@ -113,11 +112,20 @@ async function loadRoleInstructions(workspaceDir, projectName, role) {
|
|
|
113
112
|
return "";
|
|
114
113
|
}
|
|
115
114
|
async function ensureSession(action, existingKey, opts) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
115
|
+
const expectedKey = `agent:${opts.agentId ?? "unknown"}:subagent:${opts.projectName}-${opts.role}-${opts.level}`;
|
|
116
|
+
// Reuse: validate stored key matches expected format, then verify session exists
|
|
117
|
+
if (action === "send" && existingKey === expectedKey) {
|
|
118
|
+
try {
|
|
119
|
+
await runCommand(["openclaw", "gateway", "call", "sessions.patch", "--params", JSON.stringify({ key: existingKey, model: opts.model })], { timeoutMs: 30_000 });
|
|
120
|
+
return { key: existingKey, action: "send" };
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Session gone (deleted, cleanup, etc.) — fall through to spawn
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Spawn: create fresh session (also handles stale/mismatched keys)
|
|
127
|
+
await runCommand(["openclaw", "gateway", "call", "sessions.patch", "--params", JSON.stringify({ key: expectedKey, model: opts.model })], { timeoutMs: 30_000 });
|
|
128
|
+
return { key: expectedKey, action: "spawn" };
|
|
121
129
|
}
|
|
122
130
|
function sendToAgent(sessionKey, taskMessage, opts) {
|
|
123
131
|
const gatewayParams = JSON.stringify({
|
|
@@ -129,19 +137,16 @@ function sendToAgent(sessionKey, taskMessage, opts) {
|
|
|
129
137
|
lane: "subagent",
|
|
130
138
|
...(opts.orchestratorSessionKey ? { spawnedBy: opts.orchestratorSessionKey } : {}),
|
|
131
139
|
});
|
|
132
|
-
|
|
133
|
-
|
|
140
|
+
// Fire-and-forget: long-running agent turn, don't await
|
|
141
|
+
runCommand(["openclaw", "gateway", "call", "agent", "--params", gatewayParams, "--expect-final", "--json"], { timeoutMs: 600_000 }).catch(() => { });
|
|
134
142
|
}
|
|
135
143
|
async function recordWorkerState(workspaceDir, groupId, role, opts) {
|
|
136
|
-
|
|
144
|
+
await activateWorker(workspaceDir, groupId, role, {
|
|
137
145
|
issueId: String(opts.issueId),
|
|
138
146
|
level: opts.level,
|
|
147
|
+
sessionKey: opts.sessionKey,
|
|
139
148
|
startTime: new Date().toISOString(),
|
|
140
|
-
};
|
|
141
|
-
if (opts.sessionAction === "spawn") {
|
|
142
|
-
params.sessionKey = opts.sessionKey;
|
|
143
|
-
}
|
|
144
|
-
await activateWorker(workspaceDir, groupId, role, params);
|
|
149
|
+
});
|
|
145
150
|
}
|
|
146
151
|
async function auditDispatch(workspaceDir, opts) {
|
|
147
152
|
await auditLog(workspaceDir, "work_start", {
|
package/dist/lib/dispatch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../lib/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../lib/dispatch.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/notify.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../lib/notify.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../lib/notify.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD,6EAA6E;AAC7E,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/E,MAAM,MAAM,WAAW,GACnB;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,GAAG,MAAM,CAAC;CACjC,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAmFN;;;;GAIG;AACH,wBAAsB,MAAM,CAC1B,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE;IACJ,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,UAAU,EAAE,EACrB,IAAI,EAAE;IACJ,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,kBAAkB,CAEpB"}
|
package/dist/lib/notify.js
CHANGED
|
@@ -7,10 +7,8 @@
|
|
|
7
7
|
* - workerStart: Worker spawned/resumed for a task (→ project group)
|
|
8
8
|
* - workerComplete: Worker completed task (→ project group)
|
|
9
9
|
*/
|
|
10
|
-
import { execFile } from "node:child_process";
|
|
11
|
-
import { promisify } from "node:util";
|
|
12
10
|
import { log as auditLog } from "./audit.js";
|
|
13
|
-
|
|
11
|
+
import { runCommand } from "./run-command.js";
|
|
14
12
|
/**
|
|
15
13
|
* Build a human-readable message for a notification event.
|
|
16
14
|
*/
|
|
@@ -58,7 +56,8 @@ function buildMessage(event) {
|
|
|
58
56
|
*/
|
|
59
57
|
async function sendMessage(target, message, channel, workspaceDir) {
|
|
60
58
|
try {
|
|
61
|
-
await
|
|
59
|
+
await runCommand([
|
|
60
|
+
"openclaw",
|
|
62
61
|
"message",
|
|
63
62
|
"send",
|
|
64
63
|
"--channel",
|
|
@@ -68,7 +67,7 @@ async function sendMessage(target, message, channel, workspaceDir) {
|
|
|
68
67
|
"--message",
|
|
69
68
|
message,
|
|
70
69
|
"--json",
|
|
71
|
-
], {
|
|
70
|
+
], { timeoutMs: 30_000 });
|
|
72
71
|
return true;
|
|
73
72
|
}
|
|
74
73
|
catch (err) {
|
package/dist/lib/notify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../lib/notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../lib/notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../lib/onboarding.ts"],"names":[],"mappings":"AAaA,wBAAgB,kBAAkB,CAChC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAGT;AAED,wBAAsB,iBAAiB,CACrC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC,CAWlB;
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../../lib/onboarding.ts"],"names":[],"mappings":"AAaA,wBAAgB,kBAAkB,CAChC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAGT;AAED,wBAAsB,iBAAiB,CACrC,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAwBD,wBAAgB,oBAAoB,CAClC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,MAAM,CAgBR;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CAmHhD"}
|
package/dist/lib/onboarding.js
CHANGED
|
@@ -96,13 +96,29 @@ Ask: "Do you want to configure DevClaw for the current agent, or create a new de
|
|
|
96
96
|
- If none selected, user can add bindings manually later via openclaw.json
|
|
97
97
|
|
|
98
98
|
**Step 2: Model Configuration**
|
|
99
|
-
Show the default level-to-model mapping and ask if they want to customize:
|
|
100
99
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
100
|
+
1. **Call \`autoconfigure_models\`** to automatically discover and assign models:
|
|
101
|
+
- Discovers all authenticated models in OpenClaw
|
|
102
|
+
- Uses AI to intelligently assign them to DevClaw roles
|
|
103
|
+
- Returns a ready-to-use model configuration
|
|
104
|
+
|
|
105
|
+
2. **Handle the result**:
|
|
106
|
+
- If \`success: false\` and \`modelCount: 0\`:
|
|
107
|
+
- **BLOCK setup** - show the authentication instructions from the message
|
|
108
|
+
- **DO NOT proceed** - exit onboarding until user configures API keys
|
|
109
|
+
- If \`success: true\`:
|
|
110
|
+
- Present the model assignment table to the user
|
|
111
|
+
- Store the \`models\` object for Step 3
|
|
112
|
+
|
|
113
|
+
3. **Optional: Prefer specific provider**
|
|
114
|
+
- If user wants only models from one provider (e.g., "only use Anthropic"):
|
|
115
|
+
- Call \`autoconfigure_models({ preferProvider: "anthropic" })\`
|
|
104
116
|
|
|
105
|
-
|
|
117
|
+
4. **Confirm with user**
|
|
118
|
+
- Ask: "Does this look good, or would you like to customize any roles?"
|
|
119
|
+
- If approved → proceed to Step 3 with the \`models\` configuration
|
|
120
|
+
- If they want changes → ask which specific roles to modify
|
|
121
|
+
- If they want different provider → go back to step 3
|
|
106
122
|
|
|
107
123
|
**Step 3: Run Setup**
|
|
108
124
|
Call \`setup\` with the collected answers:
|
|
@@ -110,11 +126,44 @@ Call \`setup\` with the collected answers:
|
|
|
110
126
|
- New agent: \`setup({ newAgentName: "<name>", channelBinding: "telegram"|"whatsapp"|null, migrateFrom: "<agentId>"|null, models: { ... } })\`
|
|
111
127
|
- \`migrateFrom\`: Include if user wants to migrate an existing channel-wide binding
|
|
112
128
|
|
|
113
|
-
**Step 4:
|
|
114
|
-
After setup,
|
|
129
|
+
**Step 4: Telegram Group Setup (IMPORTANT)**
|
|
130
|
+
After setup completes, explain project isolation best practices:
|
|
131
|
+
|
|
132
|
+
📱 **Telegram Group Guidance:**
|
|
133
|
+
DevClaw uses **one Telegram group per project** for isolation and clean backlogs.
|
|
134
|
+
|
|
135
|
+
**Recommended Setup:**
|
|
136
|
+
1. **Create a new Telegram group** for each project
|
|
137
|
+
2. **Add your bot** to the group
|
|
138
|
+
3. **Use mentions** to interact: "@botname status", "@botname pick up #42"
|
|
139
|
+
4. Each group gets its own queue, workers, and audit log
|
|
140
|
+
|
|
141
|
+
**Why separate groups?**
|
|
142
|
+
- Clean issue backlogs per project
|
|
143
|
+
- Isolated worker state (no cross-project confusion)
|
|
144
|
+
- Clear audit trails
|
|
145
|
+
- Team-specific access control
|
|
146
|
+
|
|
147
|
+
**Single-project mode:**
|
|
148
|
+
If you REALLY want all projects in one group (not recommended):
|
|
149
|
+
- You can register multiple projects to the same group ID
|
|
150
|
+
- ⚠️ WARNING: Shared queues, workers will see all issues
|
|
151
|
+
- Only use this for personal/solo projects
|
|
152
|
+
|
|
153
|
+
Ask: "Do you understand the group-per-project model, or do you want single-project mode?"
|
|
154
|
+
- Most users should proceed with the recommended approach
|
|
155
|
+
- Only force single-project if they insist
|
|
156
|
+
|
|
157
|
+
**Step 5: Project Registration**
|
|
158
|
+
Ask: "Would you like to register a project now?"
|
|
115
159
|
If yes, collect: project name, repo path, Telegram group ID, group name, base branch.
|
|
116
160
|
Then call \`project_register\`.
|
|
117
161
|
|
|
162
|
+
💡 **Tip**: For the Telegram group ID:
|
|
163
|
+
- Add the bot to your group
|
|
164
|
+
- Send any message with the bot mentioned
|
|
165
|
+
- Bot can tell you the group ID
|
|
166
|
+
|
|
118
167
|
## Guidelines
|
|
119
168
|
- Be conversational and friendly. Ask one question at a time.
|
|
120
169
|
- Show defaults so the user can accept them quickly.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../lib/onboarding.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,UAAU,kBAAkB,CAChC,YAAsC;IAEtC,MAAM,MAAM,GAAI,YAAoD,EAAE,MAAM,CAAC;IAC7E,OAAO,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,YAAqB;IAErB,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC/B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,EACpC,OAAO,CACR,CAAC;QACF,OAAO,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,SAAS,eAAe,CAAC,YAAsC;IAC7D,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../lib/onboarding.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../lib/providers/github.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../lib/providers/github.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,KAAK,EACV,KAAK,UAAU,EAGhB,MAAM,eAAe,CAAC;AAmBvB,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,QAAQ,CAAS;gBACb,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;YAExB,EAAE;IAKV,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;IASxG,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAOtD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAKzC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IASjF,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEjD,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO;IAC1D,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,GAAG,IAAI;IAI/C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS9C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASvD,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
|
|
@@ -1,13 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* GitHubProvider — IssueProvider implementation using gh CLI.
|
|
3
3
|
*/
|
|
4
|
-
import { execFile } from "node:child_process";
|
|
5
|
-
import { promisify } from "node:util";
|
|
6
|
-
import { writeFile, unlink } from "node:fs/promises";
|
|
7
|
-
import { join } from "node:path";
|
|
8
|
-
import { tmpdir } from "node:os";
|
|
9
4
|
import { STATE_LABELS, LABEL_COLORS, } from "./provider.js";
|
|
10
|
-
|
|
5
|
+
import { runCommand } from "../run-command.js";
|
|
11
6
|
function toIssue(gh) {
|
|
12
7
|
return {
|
|
13
8
|
iid: gh.number, title: gh.title, description: gh.body ?? "",
|
|
@@ -18,8 +13,8 @@ export class GitHubProvider {
|
|
|
18
13
|
repoPath;
|
|
19
14
|
constructor(opts) { this.repoPath = opts.repoPath; }
|
|
20
15
|
async gh(args) {
|
|
21
|
-
const
|
|
22
|
-
return stdout.trim();
|
|
16
|
+
const result = await runCommand(["gh", ...args], { timeoutMs: 30_000, cwd: this.repoPath });
|
|
17
|
+
return result.stdout.trim();
|
|
23
18
|
}
|
|
24
19
|
async ensureLabel(name, color) {
|
|
25
20
|
try {
|
|
@@ -35,24 +30,14 @@ export class GitHubProvider {
|
|
|
35
30
|
await this.ensureLabel(label, LABEL_COLORS[label]);
|
|
36
31
|
}
|
|
37
32
|
async createIssue(title, description, label, assignees) {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (!match)
|
|
47
|
-
throw new Error(`Failed to parse issue URL: ${url}`);
|
|
48
|
-
return this.getIssue(parseInt(match[1], 10));
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
try {
|
|
52
|
-
await unlink(tempFile);
|
|
53
|
-
}
|
|
54
|
-
catch { /* ignore */ }
|
|
55
|
-
}
|
|
33
|
+
const args = ["issue", "create", "--title", title, "--body", description, "--label", label];
|
|
34
|
+
if (assignees?.length)
|
|
35
|
+
args.push("--assignee", assignees.join(","));
|
|
36
|
+
const url = await this.gh(args);
|
|
37
|
+
const match = url.match(/\/issues\/(\d+)$/);
|
|
38
|
+
if (!match)
|
|
39
|
+
throw new Error(`Failed to parse issue URL: ${url}`);
|
|
40
|
+
return this.getIssue(parseInt(match[1], 10));
|
|
56
41
|
}
|
|
57
42
|
async listIssuesByLabel(label) {
|
|
58
43
|
try {
|
|
@@ -105,17 +90,7 @@ export class GitHubProvider {
|
|
|
105
90
|
}
|
|
106
91
|
}
|
|
107
92
|
async addComment(issueId, body) {
|
|
108
|
-
|
|
109
|
-
await writeFile(tempFile, body, "utf-8");
|
|
110
|
-
try {
|
|
111
|
-
await this.gh(["issue", "comment", String(issueId), "--body-file", tempFile]);
|
|
112
|
-
}
|
|
113
|
-
finally {
|
|
114
|
-
try {
|
|
115
|
-
await unlink(tempFile);
|
|
116
|
-
}
|
|
117
|
-
catch { /* ignore */ }
|
|
118
|
-
}
|
|
93
|
+
await this.gh(["issue", "comment", String(issueId), "--body", body]);
|
|
119
94
|
}
|
|
120
95
|
async healthCheck() {
|
|
121
96
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../lib/providers/github.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../lib/providers/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitlab.d.ts","sourceRoot":"","sources":["../../../lib/providers/gitlab.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gitlab.d.ts","sourceRoot":"","sources":["../../../lib/providers/gitlab.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,KAAK,EACV,KAAK,UAAU,EAGhB,MAAM,eAAe,CAAC;AAGvB,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,QAAQ,CAAS;gBACb,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;YAExB,IAAI;IAKZ,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;IAYxG,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAOtD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAKzC,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IASjF,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEjD,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO;IAC1D,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,GAAG,IAAI;IAI/C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS9C,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAYvD,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
|