Three issues making HF→agent wakeup unusable in practice, surfaced by
DinD sim end-to-end test (recruiter agent + slot for 招募 manager task):
1. **Plugin re-woke the same slot every 30s.** The inline runCheck only
destructured agentId from scheduleCache.getAgentsWithDueSlots() and
dropped the slots array, then called wakeAgent without recording the
wake. The simplified inline scheduler also never PATCHes slot status
server-side from not_started→ongoing, so the next 30s check sees the
slot still due and wakes again. After 4 wakes the agent's wakeup
session was full of WAKEUP_OK noise.
Fix: keep slots in runCheck, add an in-memory wakedSlotKeys set
keyed by (agentId, slotId|virtual_id|scheduled_at). Dedupe on this
set; clear it inside the sync interval (fresh wake budget per sync).
Server-side slot transition still TODO (requires re-introducing the
CalendarScheduler class path or PATCH /calendar/slots/.../agent-update
here); the dedupe at least stops the wake spam.
2. **Wakeup message had no slot context.** The wakeup body just said
'follow hf-wakeup workflow' with no slot id/event_data/task_code.
The agent then had to call harborforge_calendar_status to learn
anything — which itself is broken in the simplified scheduler (it
queries a CalendarScheduler instance that never gets created).
Fix: pass dueSlots into wakeAgent and inline the highest-priority
slot's {slot_id, scheduled_at, priority, slot_type, event_data} as
a JSON block in the wakeup message. The agent reads event_data.
task_code directly and routes via workflow_lookup without any
round-trip. Per PLG-CAL-001 docs in hf-hangman-lab SKILL.md, this
is the documented contract; we are bringing the message in line.
3. **contracts.tools listed 5 of the 9 registered tools.** Manifest had
harborforge_status/telemetry/monitor_telemetry/calendar_status/
calendar_complete. Code also registers calendar_abort, calendar_pause,
calendar_resume, harborforge_restart_status. With the new OpenClaw
plugin host enforcement (same gotcha that bit Meridian — see
zhi/Meridian#2), undeclared tools are silently dropped from the
agent's tool list, so abort/pause/resume cannot be called by the
agent. plugin doctor was emitting:
'plugin tool is undeclared (harbor-forge): harborforge_calendar_abort'
for each missing tool.
Fix: add the 4 missing tool names to contracts.tools.
Also use api.config as the primary config source in wakeAgent (current
public API), falling back to runtime.config.loadConfig() for older
hosts — same pattern as the Meridian fix.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
84 lines
2.9 KiB
JSON
84 lines
2.9 KiB
JSON
{
|
|
"id": "harbor-forge",
|
|
"name": "HarborForge",
|
|
"description": "HarborForge plugin for OpenClaw - project management, monitoring, and CLI integration",
|
|
"activation": {
|
|
"onStartup": true
|
|
},
|
|
"contracts": {
|
|
"tools": [
|
|
"harborforge_status",
|
|
"harborforge_telemetry",
|
|
"harborforge_monitor_telemetry",
|
|
"harborforge_calendar_status",
|
|
"harborforge_calendar_complete",
|
|
"harborforge_calendar_abort",
|
|
"harborforge_calendar_pause",
|
|
"harborforge_calendar_resume",
|
|
"harborforge_restart_status"
|
|
]
|
|
},
|
|
"configSchema": {
|
|
"type": "object",
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"enabled": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Enable the HarborForge plugin"
|
|
},
|
|
"backendUrl": {
|
|
"type": "string",
|
|
"default": "https://monitor.hangman-lab.top",
|
|
"description": "HarborForge backend base URL (shared by Monitor and Calendar API)"
|
|
},
|
|
"identifier": {
|
|
"type": "string",
|
|
"description": "Server/claw identifier. Used as claw_identifier in Calendar heartbeat and as MonitoredServer.identifier. Auto-detected from hostname if not set."
|
|
},
|
|
"apiKey": {
|
|
"type": "string",
|
|
"description": "API Key from HarborForge Monitor admin panel (optional but required for Monitor authentication)"
|
|
},
|
|
"monitor_port": {
|
|
"type": "number",
|
|
"description": "Local port for communication between HarborForge Monitor and this plugin"
|
|
},
|
|
"reportIntervalSec": {
|
|
"type": "number",
|
|
"default": 30,
|
|
"description": "How often to report metrics (seconds)"
|
|
},
|
|
"httpFallbackIntervalSec": {
|
|
"type": "number",
|
|
"default": 60,
|
|
"description": "HTTP heartbeat interval when WS unavailable"
|
|
},
|
|
"logLevel": {
|
|
"type": "string",
|
|
"enum": ["debug", "info", "warn", "error"],
|
|
"default": "info",
|
|
"description": "Logging level"
|
|
},
|
|
"calendarEnabled": {
|
|
"type": "boolean",
|
|
"default": true,
|
|
"description": "Enable Calendar heartbeat integration (PLG-CAL-001). When enabled, plugin sends periodic heartbeat to /calendar/agent/heartbeat to receive pending TimeSlots."
|
|
},
|
|
"calendarHeartbeatIntervalSec": {
|
|
"type": "number",
|
|
"default": 60,
|
|
"description": "How often to send Calendar heartbeat to backend (seconds). Defaults to 60s (1 minute)."
|
|
},
|
|
"calendarApiKey": {
|
|
"type": "string",
|
|
"description": "API key for Calendar API authentication. If not set, uses apiKey or plugin auto-authentication via X-Agent-ID header."
|
|
},
|
|
"managedMonitor": {
|
|
"type": "string",
|
|
"description": "Absolute path to an installed HarborForge.Monitor binary managed by this plugin installer. If set, gateway_start/gateway_stop hooks will start/stop the monitor process automatically."
|
|
}
|
|
}
|
|
}
|
|
}
|