Vendor OpenClaw source as Adolf fork baseline
Some checks failed
ClawSweeper Dispatch / dispatch (push) Has been cancelled
CodeQL / Security High (actions) (push) Has been cancelled
CodeQL / Security High (channel-runtime-boundary) (push) Has been cancelled
CodeQL / Security High (core-auth-secrets) (push) Has been cancelled
CodeQL / Security High (mcp-process-tool-boundary) (push) Has been cancelled
CodeQL / Security High (network-ssrf-boundary) (push) Has been cancelled
CodeQL / Security High (plugin-trust-boundary) (push) Has been cancelled
CodeQL / Security High (process-exec-boundary) (push) Has been cancelled
Docs Sync Publish Repo / sync-publish-repo (push) Has been cancelled
Docs / docs (push) Has been cancelled
OpenClaw Stable Main Closeout / Resolve stable release closeout inputs (push) Has been cancelled
OpenClaw Stable Main Closeout / Verify stable main closeout (push) Has been cancelled
Workflow Sanity / no-tabs (push) Has been cancelled
Workflow Sanity / actionlint (push) Has been cancelled
Workflow Sanity / generated-doc-baselines (push) Has been cancelled
CI / runner-admission (push) Has been cancelled
CI / preflight (push) Has been cancelled
CI / security-fast (push) Has been cancelled
CI / pnpm-store-warmup (push) Has been cancelled
CI / build-artifacts (push) Has been cancelled
CI / native-i18n (push) Has been cancelled
CI / ${{ matrix.check_name }} (push) Has been cancelled
CI / ${{ matrix.checkName }} (push) Has been cancelled
CI / checks-node-compat-node22 (push) Has been cancelled
CI / check-bundled-channel-config-metadata (push) Has been cancelled
CI / check-dependencies (push) Has been cancelled
CI / check-guards (push) Has been cancelled
CI / check-lint (push) Has been cancelled
CI / check-prod-types (push) Has been cancelled
CI / check-shrinkwrap (push) Has been cancelled
CI / check-test-types (push) Has been cancelled
CI / check-additional-boundaries-a (push) Has been cancelled
CI / check-additional-boundaries-bcd (push) Has been cancelled
CI / check-additional-extension-bundled (push) Has been cancelled
CI / check-additional-extension-channels (push) Has been cancelled
CI / check-additional-extension-package-boundary (push) Has been cancelled
CI / check-additional-runtime-topology-architecture (push) Has been cancelled
CI / check-session-accessor-boundary (push) Has been cancelled
CI / check-session-transcript-reader-boundary (push) Has been cancelled
CI / check-docs (push) Has been cancelled
CI / skills-python (push) Has been cancelled
CI / macos-swift (push) Has been cancelled
CI / ios-build (push) Has been cancelled
CI / ci-timings-summary (push) Has been cancelled
Native App Locale Refresh / Refresh native fa (push) Has been cancelled
Native App Locale Refresh / Refresh native fr (push) Has been cancelled
Native App Locale Refresh / Refresh native hi (push) Has been cancelled
Native App Locale Refresh / Refresh native id (push) Has been cancelled
Native App Locale Refresh / Refresh native it (push) Has been cancelled
Native App Locale Refresh / Refresh native ja-JP (push) Has been cancelled
Control UI Locale Refresh / plan (push) Has been cancelled
Control UI Locale Refresh / Refresh ${{ matrix.locale }} (push) Has been cancelled
Control UI Locale Refresh / Commit control UI locale refresh (push) Has been cancelled
Live Media Runner Image / Build live media runner image (push) Has been cancelled
Native App Locale Refresh / Refresh native ar (push) Has been cancelled
Native App Locale Refresh / Refresh native de (push) Has been cancelled
Native App Locale Refresh / Refresh native es (push) Has been cancelled
Native App Locale Refresh / Refresh native ko (push) Has been cancelled
Native App Locale Refresh / Refresh native nl (push) Has been cancelled
Native App Locale Refresh / Refresh native pl (push) Has been cancelled
Native App Locale Refresh / Refresh native pt-BR (push) Has been cancelled
Native App Locale Refresh / Refresh native ru (push) Has been cancelled
Native App Locale Refresh / Refresh native sv (push) Has been cancelled
Native App Locale Refresh / Refresh native th (push) Has been cancelled
Native App Locale Refresh / Refresh native tr (push) Has been cancelled
Native App Locale Refresh / Refresh native uk (push) Has been cancelled
Native App Locale Refresh / Refresh native vi (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-CN (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-TW (push) Has been cancelled
Native App Locale Refresh / Commit native locale refresh (push) Has been cancelled
Plugin Init Scaffold Validation / Validate provider scaffold (push) Has been cancelled
Plugin NPM Release / preview_plugins_npm (push) Has been cancelled
Plugin NPM Release / Validate release publish approval (push) Has been cancelled
Plugin NPM Release / preview_plugin_pack (push) Has been cancelled
Plugin NPM Release / publish_plugins_npm (push) Has been cancelled
Sandbox Common Smoke / sandbox-common-smoke (push) Has been cancelled
Website Installer Sync / static (push) Has been cancelled
Website Installer Sync / linux-docker (push) Has been cancelled
Website Installer Sync / macos-installer (push) Has been cancelled
Website Installer Sync / windows-installer (push) Has been cancelled
Website Installer Sync / sync-website (push) Has been cancelled
Some checks failed
ClawSweeper Dispatch / dispatch (push) Has been cancelled
CodeQL / Security High (actions) (push) Has been cancelled
CodeQL / Security High (channel-runtime-boundary) (push) Has been cancelled
CodeQL / Security High (core-auth-secrets) (push) Has been cancelled
CodeQL / Security High (mcp-process-tool-boundary) (push) Has been cancelled
CodeQL / Security High (network-ssrf-boundary) (push) Has been cancelled
CodeQL / Security High (plugin-trust-boundary) (push) Has been cancelled
CodeQL / Security High (process-exec-boundary) (push) Has been cancelled
Docs Sync Publish Repo / sync-publish-repo (push) Has been cancelled
Docs / docs (push) Has been cancelled
OpenClaw Stable Main Closeout / Resolve stable release closeout inputs (push) Has been cancelled
OpenClaw Stable Main Closeout / Verify stable main closeout (push) Has been cancelled
Workflow Sanity / no-tabs (push) Has been cancelled
Workflow Sanity / actionlint (push) Has been cancelled
Workflow Sanity / generated-doc-baselines (push) Has been cancelled
CI / runner-admission (push) Has been cancelled
CI / preflight (push) Has been cancelled
CI / security-fast (push) Has been cancelled
CI / pnpm-store-warmup (push) Has been cancelled
CI / build-artifacts (push) Has been cancelled
CI / native-i18n (push) Has been cancelled
CI / ${{ matrix.check_name }} (push) Has been cancelled
CI / ${{ matrix.checkName }} (push) Has been cancelled
CI / checks-node-compat-node22 (push) Has been cancelled
CI / check-bundled-channel-config-metadata (push) Has been cancelled
CI / check-dependencies (push) Has been cancelled
CI / check-guards (push) Has been cancelled
CI / check-lint (push) Has been cancelled
CI / check-prod-types (push) Has been cancelled
CI / check-shrinkwrap (push) Has been cancelled
CI / check-test-types (push) Has been cancelled
CI / check-additional-boundaries-a (push) Has been cancelled
CI / check-additional-boundaries-bcd (push) Has been cancelled
CI / check-additional-extension-bundled (push) Has been cancelled
CI / check-additional-extension-channels (push) Has been cancelled
CI / check-additional-extension-package-boundary (push) Has been cancelled
CI / check-additional-runtime-topology-architecture (push) Has been cancelled
CI / check-session-accessor-boundary (push) Has been cancelled
CI / check-session-transcript-reader-boundary (push) Has been cancelled
CI / check-docs (push) Has been cancelled
CI / skills-python (push) Has been cancelled
CI / macos-swift (push) Has been cancelled
CI / ios-build (push) Has been cancelled
CI / ci-timings-summary (push) Has been cancelled
Native App Locale Refresh / Refresh native fa (push) Has been cancelled
Native App Locale Refresh / Refresh native fr (push) Has been cancelled
Native App Locale Refresh / Refresh native hi (push) Has been cancelled
Native App Locale Refresh / Refresh native id (push) Has been cancelled
Native App Locale Refresh / Refresh native it (push) Has been cancelled
Native App Locale Refresh / Refresh native ja-JP (push) Has been cancelled
Control UI Locale Refresh / plan (push) Has been cancelled
Control UI Locale Refresh / Refresh ${{ matrix.locale }} (push) Has been cancelled
Control UI Locale Refresh / Commit control UI locale refresh (push) Has been cancelled
Live Media Runner Image / Build live media runner image (push) Has been cancelled
Native App Locale Refresh / Refresh native ar (push) Has been cancelled
Native App Locale Refresh / Refresh native de (push) Has been cancelled
Native App Locale Refresh / Refresh native es (push) Has been cancelled
Native App Locale Refresh / Refresh native ko (push) Has been cancelled
Native App Locale Refresh / Refresh native nl (push) Has been cancelled
Native App Locale Refresh / Refresh native pl (push) Has been cancelled
Native App Locale Refresh / Refresh native pt-BR (push) Has been cancelled
Native App Locale Refresh / Refresh native ru (push) Has been cancelled
Native App Locale Refresh / Refresh native sv (push) Has been cancelled
Native App Locale Refresh / Refresh native th (push) Has been cancelled
Native App Locale Refresh / Refresh native tr (push) Has been cancelled
Native App Locale Refresh / Refresh native uk (push) Has been cancelled
Native App Locale Refresh / Refresh native vi (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-CN (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-TW (push) Has been cancelled
Native App Locale Refresh / Commit native locale refresh (push) Has been cancelled
Plugin Init Scaffold Validation / Validate provider scaffold (push) Has been cancelled
Plugin NPM Release / preview_plugins_npm (push) Has been cancelled
Plugin NPM Release / Validate release publish approval (push) Has been cancelled
Plugin NPM Release / preview_plugin_pack (push) Has been cancelled
Plugin NPM Release / publish_plugins_npm (push) Has been cancelled
Sandbox Common Smoke / sandbox-common-smoke (push) Has been cancelled
Website Installer Sync / static (push) Has been cancelled
Website Installer Sync / linux-docker (push) Has been cancelled
Website Installer Sync / macos-installer (push) Has been cancelled
Website Installer Sync / windows-installer (push) Has been cancelled
Website Installer Sync / sync-website (push) Has been cancelled
Adolf is a fork/vendored clone of github.com/openclaw/openclaw (v2026.6.11), free to diverge. Tree copied sans upstream .git; upstream remote added for future syncs. Node pinned to 24 (.nvmrc); engines already require >=22.19. Preserves docs/ARCHITECTURE.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LeqyaxJF2nbRXJtae2kNB2
This commit is contained in:
162
extensions/workboard/src/command.ts
Normal file
162
extensions/workboard/src/command.ts
Normal file
@@ -0,0 +1,162 @@
|
||||
// Workboard plugin module implements command behavior.
|
||||
import type { OpenClawPluginApi } from "../api.js";
|
||||
import { resolveWorkboardCardByIdOrPrefix } from "./card-lookup.js";
|
||||
import { dispatchAndStartWorkboardCards, type WorkboardSubagentRuntime } from "./dispatcher.js";
|
||||
import type { WorkboardStore } from "./store.js";
|
||||
import type { WorkboardCard } from "./types.js";
|
||||
|
||||
const ADMIN_SCOPE = "operator.admin";
|
||||
const WRITE_SCOPE = "operator.write";
|
||||
|
||||
type WorkboardCommandApi = {
|
||||
runtime: {
|
||||
subagent: WorkboardSubagentRuntime;
|
||||
};
|
||||
};
|
||||
|
||||
function splitArgs(input: string | undefined): string[] {
|
||||
return (input ?? "").trim().split(/\s+/).filter(Boolean);
|
||||
}
|
||||
|
||||
function formatCardLine(card: WorkboardCard): string {
|
||||
const boardId = card.metadata?.automation?.boardId ?? "default";
|
||||
const agent = card.agentId ? ` @${card.agentId}` : "";
|
||||
return `${card.id.slice(0, 8)} ${card.status.padEnd(8)} ${card.priority.padEnd(6)} [${boardId}]${agent} ${card.title}`;
|
||||
}
|
||||
|
||||
function formatCardDetails(card: WorkboardCard): string {
|
||||
const lines = [
|
||||
card.title,
|
||||
`id: ${card.id}`,
|
||||
`status: ${card.status}`,
|
||||
`priority: ${card.priority}`,
|
||||
`board: ${card.metadata?.automation?.boardId ?? "default"}`,
|
||||
];
|
||||
if (card.agentId) {
|
||||
lines.push(`agent: ${card.agentId}`);
|
||||
}
|
||||
if (card.sessionKey) {
|
||||
lines.push(`session: ${card.sessionKey}`);
|
||||
}
|
||||
if (card.runId) {
|
||||
lines.push(`run: ${card.runId}`);
|
||||
}
|
||||
if (card.notes) {
|
||||
lines.push("", card.notes);
|
||||
}
|
||||
return lines.join("\n");
|
||||
}
|
||||
|
||||
function normalizeTitle(tokens: string[]): string {
|
||||
return tokens.join(" ").trim();
|
||||
}
|
||||
|
||||
function canMutateWorkboard(params: {
|
||||
senderIsOwner?: boolean;
|
||||
gatewayClientScopes?: readonly string[];
|
||||
}): boolean {
|
||||
const scopes = params.gatewayClientScopes;
|
||||
if (scopes) {
|
||||
return scopes.includes(ADMIN_SCOPE) || scopes.includes(WRITE_SCOPE);
|
||||
}
|
||||
return params.senderIsOwner === true;
|
||||
}
|
||||
|
||||
function requireWriteAccess(params: {
|
||||
senderIsOwner?: boolean;
|
||||
gatewayClientScopes?: readonly string[];
|
||||
}): { text: string; isError: true } | undefined {
|
||||
if (canMutateWorkboard(params)) {
|
||||
return undefined;
|
||||
}
|
||||
return {
|
||||
text: `This command requires gateway scope: ${WRITE_SCOPE}.`,
|
||||
isError: true,
|
||||
};
|
||||
}
|
||||
|
||||
export async function handleWorkboardCommand(params: {
|
||||
api: WorkboardCommandApi;
|
||||
store: WorkboardStore;
|
||||
args?: string;
|
||||
senderIsOwner?: boolean;
|
||||
gatewayClientScopes?: readonly string[];
|
||||
}): Promise<{ text: string; isError?: boolean }> {
|
||||
const [action = "list", ...rest] = splitArgs(params.args);
|
||||
if (action === "help") {
|
||||
return {
|
||||
text: [
|
||||
"/workboard list",
|
||||
"/workboard show <card-id>",
|
||||
"/workboard create <title>",
|
||||
"/workboard dispatch",
|
||||
].join("\n"),
|
||||
};
|
||||
}
|
||||
if (action === "list") {
|
||||
const cards = (await params.store.list()).filter((card) => !card.metadata?.archivedAt);
|
||||
const rows = cards.slice(0, 12).map(formatCardLine);
|
||||
return { text: rows.length ? rows.join("\n") : "No Workboard cards." };
|
||||
}
|
||||
if (action === "show" || action === "read") {
|
||||
const id = rest[0];
|
||||
if (!id) {
|
||||
return { text: "Usage: /workboard show <card-id>", isError: true };
|
||||
}
|
||||
const cards = await params.store.list();
|
||||
const { card, error } = resolveWorkboardCardByIdOrPrefix(cards, id);
|
||||
return card ? { text: formatCardDetails(card) } : { text: error, isError: true };
|
||||
}
|
||||
if (action === "create") {
|
||||
const accessError = requireWriteAccess(params);
|
||||
if (accessError) {
|
||||
return accessError;
|
||||
}
|
||||
const title = normalizeTitle(rest);
|
||||
if (!title) {
|
||||
return { text: "Usage: /workboard create <title>", isError: true };
|
||||
}
|
||||
const card = await params.store.create({ title });
|
||||
return { text: `Created ${card.id.slice(0, 8)} ${card.title}` };
|
||||
}
|
||||
if (action === "dispatch") {
|
||||
const accessError = requireWriteAccess(params);
|
||||
if (accessError) {
|
||||
return accessError;
|
||||
}
|
||||
const result = await dispatchAndStartWorkboardCards({
|
||||
store: params.store,
|
||||
subagent: params.api.runtime.subagent,
|
||||
});
|
||||
return {
|
||||
text: [
|
||||
`dispatch: started=${result.started.length} failures=${result.startFailures.length} promoted=${result.promoted.length} blocked=${result.blocked.length}`,
|
||||
...result.started.map((run) => `started ${run.cardId.slice(0, 8)} run=${run.runId}`),
|
||||
...result.startFailures.map(
|
||||
(failure) => `failed ${failure.cardId.slice(0, 8)} ${failure.error}`,
|
||||
),
|
||||
].join("\n"),
|
||||
};
|
||||
}
|
||||
return { text: `Unknown Workboard action: ${action}`, isError: true };
|
||||
}
|
||||
|
||||
export function registerWorkboardCommand(params: {
|
||||
api: OpenClawPluginApi;
|
||||
store: WorkboardStore;
|
||||
}): void {
|
||||
params.api.registerCommand({
|
||||
name: "workboard",
|
||||
description: "List, create, inspect, and dispatch Workboard cards.",
|
||||
acceptsArgs: true,
|
||||
exposeSenderIsOwner: true,
|
||||
handler: async (ctx) =>
|
||||
await handleWorkboardCommand({
|
||||
api: params.api,
|
||||
store: params.store,
|
||||
args: ctx.args,
|
||||
senderIsOwner: ctx.senderIsOwner,
|
||||
gatewayClientScopes: ctx.gatewayClientScopes,
|
||||
}),
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user