Status: Current reference. For active product truth and operational boundaries, start with
docs/current-source-of-truth.md.
graph TD
U["User (API / Webchat / Discord / CLI)"] --> H["HTTP Server + WS Upgrade\nsrc/api/http/friday-http-server.ts"]
U --> C["Channel Plugins\nwebchat/discord adapters"]
H --> R["Route Registry\nsrc/api/runtime/friday-api-runtime.ts"]
C --> HB["Hub Bootstrap Orchestrator\nsrc/hub/friday-hub-bootstrap.ts"]
R --> AR["Agent Routes\n/workflow-runs routes\n/setup routes"]
AR --> AG["Agent Runtime\nsrc/agent/runtime/friday-agent-runtime.ts"]
AR --> WF["Workflow Runtime + Execution Service\nsrc/workflows/runtime + services"]
HB --> AG
HB --> SCH["Unified Scheduler\nsrc/jobs/scheduler/friday-job-scheduler-service.ts"]
SCH --> AG
AG --> TR["Tool Registry + Tool Adapters\nsrc/agent/tools/*"]
TR --> EXT["External Boundaries\nBrowser / Fetch / FS / Channel APIs"]
AG --> DB["SQLite State (runs/sessions/memory/events)"]
WF --> DB
HB --> OUT["Outbound Delivery\nchannelRegistry.send"]
OUT --> U
H --> OBS["requestId envelope + error mapper"]
| Component | Responsibility | Key Function(s) |
|---|---|---|
| HTTP Router | request parsing, auth/rate-limit middleware, requestId, route matching, WS upgrade |
createFridayHttpServer (src/api/http/friday-http-server.ts) |
| API Runtime Composer | wires route handlers to real runtime services | createFridayApiRuntime (src/api/runtime/friday-api-runtime.ts) |
| Agent Planner/Executor Loop | LLM turn loop, policy checks, tool dispatch, terminal state persistence | executeRun (src/agent/runtime/friday-agent-runtime.ts:148) |
| Tool Executor | per tool timeout, events, fallback, result capping | executeToolCall (src/agent/runtime/friday-agent-runtime.ts:1507) |
| Tool Adapters | concrete side effects (browser/fetch/file/exec/workflow/memory/channel) | createFridayAgentToolRegistry (src/agent/tools/friday-agent-tool-registry.ts:97) |
| Workflow Orchestration | DAG plan + node execution + run lifecycle | startRun (src/workflows/services/friday-workflow-execution-service.ts:819) |
| Workflow Evidence | run evidence payload/export/download fallback | exportRunEvidence / downloadRunEvidenceExport (src/workflows/runtime/friday-workflow-runtime.ts:1610,1733) |
| Channel Delivery | inbound normalize, run execute, outbound user-visible text/image send | channelMessageHandler (src/hub/friday-hub-bootstrap.ts:1992) |
| Scheduler | cron/every/at scheduling, timeout/backoff/catch-up, dynamic jobs | createFridayJobSchedulerService (src/jobs/scheduler/friday-job-scheduler-service.ts:51) |
| Key | Scope | Produced At | Consumed By | Storage |
|---|---|---|---|---|
requestId |
HTTP request scope | createFridayHttpServer |
all API responses/error payloads | response envelope |
runId (agent) |
agent run scope | executeRun |
tool events, run query APIs, SSE, channel failure audit trace | agent run tables + events |
sessionKey |
conversation scope | API input or synthesized | history load, memory tools, channel mapping | session tables |
runId (workflow) |
workflow run scope | workflow execution startRun |
timeline/evidence APIs, run nodes | workflow run tables + event log |
correlationId (workflow field) |
workflow integration scope | workflow start input | run entity + integrations | workflow run row |
channelCorrelationId |
channel inbound message scope | channelMessageHandler |
channel diagnostics/audit details | channel audit payload details |
- Agent runtime enters boundary in
executeToolCall. - Boundary types:
- Process/OS:
exec, file tools. - Browser runtime:
browsertool via Playwright manager. - Network:
web_fetch+ SSRF guard. - Internal service bridge:
workflow,memory,sessions.
- Hard guards:
- per-tool timeout (
FRIDAY_AGENT_TOOL_TIMEOUT_MS) - policy/readOnly blocking
- result-size capping
- tool_start/tool_end events
- API boundary: route handler returns
{ok,data,error,requestId}envelope. - Channel boundary:
channelRegistry.sendsends outbound text/images to webchat/discord adapters. - Artifact boundary: screenshot/evidence files persisted and surfaced as paths/URIs.
| Failure Type | Current Handling |
|---|---|
| LLM/tool failure | run marked failed; error response returned; tool errors surfaced to model/user |
| Tool timeout/hang | per-tool abort controller + timeout in executeToolCall |
| Workflow async crash | catches log with E-WF-RUN-ASYNC-001..004, finalizes run failed |
| Scheduler job timeout/failure | marks timed_out/failed + exponential backoff |
| Stale run on reboot | agentRuntime.resumeStaleRunsOnBoot() marks stale runs failed |
| Output send failure | logs E-CH-OUTBOUND-001 with structured context; persists fallback text to session; retries outbound send; second failure logs E-CH-OUTBOUND-RETRY-001 |
| Unwired observability route | explicit 404 message "Observability API is not enabled..." |
| Signal | Where |
|---|---|
Agent lifecycle events (started/planning/executing/tool_start/tool_end/completed/failed) |
FridayAgentEventEmitter from runtime |
| Workflow timeline stream | event repository queried by /v1/workflow-runs/:runId/timeline |
| HTTP request-level tracing | requestId envelope in all API responses |
| Structured error code surface | FridayDomainError + API error mapper |
| Channel failure audit | stateDir/.friday/audit.jsonl with errorCode/routeId/correlationId/channelCorrelationId/runId |
- No-tool false completion was a real stability hole; now guarded by evidence re-prompt and unverified note.
web_fetchtransient failures now have controlledbrowserfallback, but SSRF/security blocks are never bypassed.- Feedback-record claims now require persistence tool evidence (
feedbackormemory_store) to avoid false acknowledgements.