feat: Implement context detection and onboarding tools for DevClaw

- Add context-guard.ts to detect interaction context (via-agent, direct, group) and generate guardrails.
- Introduce onboarding.ts for conversational onboarding context templates and workspace file checks.
- Enhance setup.ts to support new agent creation with channel binding and migration of existing bindings.
- Create analyze-channel-bindings.ts to analyze channel availability and detect binding conflicts.
- Implement context-test.ts for debugging context detection.
- Develop devclaw_onboard.ts for explicit onboarding tool that guides users through setup.
- Update devclaw_setup.ts to include channel binding and migration support in setup process.
- Modify project-register.ts to enforce project registration from group context and auto-populate group ID.
- Enhance queue-status.ts to provide context-aware status checks and recommendations.
- Update task tools (task-complete, task-create, task-pickup) to clarify group ID usage for Telegram/WhatsApp.
This commit is contained in:
Lauren ten Hoor
2026-02-09 18:34:45 +08:00
parent 32eb079521
commit a9a3fc3f1f
18 changed files with 1532 additions and 44 deletions

View File

@@ -0,0 +1,82 @@
/**
* analyze_channel_bindings — Check channel availability and detect binding conflicts.
*
* Returns analysis of the current channel binding state, including:
* - Whether the channel is configured and enabled
* - Existing channel-wide bindings (potential conflicts)
* - Existing group-specific bindings (no conflicts)
* - Recommendations for what to do
*/
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
import { jsonResult } from "openclaw/plugin-sdk";
import type { ToolContext } from "../types.js";
import {
analyzeChannelBindings,
type ChannelType,
} from "../binding-manager.js";
export function createAnalyzeChannelBindingsTool(api: OpenClawPluginApi) {
return (_ctx: ToolContext) => ({
name: "analyze_channel_bindings",
label: "Analyze Channel Bindings",
description:
"Check if a channel (telegram/whatsapp) is configured and analyze existing bindings. Use this during onboarding when the user selects a channel binding (telegram/whatsapp) to: detect if the channel is configured and enabled, identify existing channel-wide bindings that would conflict, and provide smart recommendations (migrate binding, skip binding, or proceed). Call this BEFORE devclaw_setup when creating a new agent with channel binding.",
parameters: {
type: "object",
properties: {
channel: {
type: "string",
enum: ["telegram", "whatsapp"],
description: "The channel to analyze (telegram or whatsapp)",
},
},
required: ["channel"],
},
async execute(_id: string, params: Record<string, unknown>) {
const channel = params.channel as ChannelType;
const analysis = await analyzeChannelBindings(channel);
const lines = [`**${channel.charAt(0).toUpperCase() + channel.slice(1)} Binding Analysis**`, ``];
if (!analysis.channelConfigured) {
lines.push(`❌ Channel not configured`);
} else if (!analysis.channelEnabled) {
lines.push(`⚠️ Channel configured but disabled`);
} else {
lines.push(`✅ Channel configured and enabled`);
}
lines.push(``);
if (analysis.existingChannelWideBinding) {
lines.push(
`**Existing Channel-Wide Binding:**`,
` Agent: ${analysis.existingChannelWideBinding.agentName} (${analysis.existingChannelWideBinding.agentId})`,
` ⚠️ This agent receives ALL ${channel} messages`,
``,
);
}
if (analysis.groupSpecificBindings.length > 0) {
lines.push(
`**Group-Specific Bindings:**`,
...analysis.groupSpecificBindings.map(
(b) => `${b.agentName} (${b.agentId}) → group ${b.groupId}`,
),
``,
);
}
lines.push(`**Recommendation:**`, analysis.recommendation);
return jsonResult({
success: true,
channel,
...analysis,
summary: lines.join("\n"),
});
},
});
}