Architecture: - Graph engine (engine.py) loads graph definitions, instantiates nodes - Versioned nodes: input_v1, thinker_v1, output_v1, memorizer_v1, director_v1 - NODE_REGISTRY for dynamic node lookup by name - Graph API: /api/graph/active, /api/graph/list, /api/graph/switch - Graph definition: graphs/v1_current.py (7 nodes, 13 edges, 3 edge types) S3* Audit system: - Workspace mismatch detection (server vs browser controls) - Code-without-tools retry (Thinker wrote code but no tool calls) - Intent-without-action retry (request intent but Thinker only produced text) - Dashboard feedback: browser sends workspace state on every message - Sensor continuous comparison on 5s tick State machines: - create_machine / add_state / reset_machine / destroy_machine via function calling - Local transitions (go:) resolve without LLM round-trip - Button persistence across turns Database tools: - query_db tool via pymysql to MariaDB K3s pod (eras2_production) - Table rendering in workspace (tab-separated parsing) - Director pre-planning with Opus for complex data requests - Error retry with corrected SQL Frontend: - Cytoscape.js pipeline graph with real-time node animations - Overlay scrollbars (CSS-only, no reflow) - Tool call/result trace events - S3* audit events in trace Testing: - 167 integration tests (11 test suites) - 22 node-level unit tests (test_nodes/) - Three test levels: node unit, graph integration, scenario Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
67 lines
2.8 KiB
HTML
67 lines
2.8 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>cog</title>
|
|
<link rel="stylesheet" href="/static/style.css">
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/cytoscape/3.28.1/cytoscape.min.js"></script>
|
|
</head>
|
|
<body>
|
|
|
|
<div id="top-bar">
|
|
<h1>cog</h1>
|
|
<div id="status">disconnected</div>
|
|
</div>
|
|
|
|
<div id="node-metrics">
|
|
<div class="node-meter" id="meter-input"><span class="nm-label">input</span><div class="nm-bar"><div class="nm-fill"></div></div><span class="nm-text">—</span></div>
|
|
<div class="node-meter" id="meter-thinker"><span class="nm-label">thinker</span><div class="nm-bar"><div class="nm-fill"></div></div><span class="nm-text">—</span></div>
|
|
<div class="node-meter" id="meter-output"><span class="nm-label">output</span><div class="nm-bar"><div class="nm-fill"></div></div><span class="nm-text">—</span></div>
|
|
<div class="node-meter" id="meter-memorizer"><span class="nm-label">memorizer</span><div class="nm-bar"><div class="nm-fill"></div></div><span class="nm-text">—</span></div>
|
|
<div class="node-meter" id="meter-ui"><span class="nm-label">ui</span><div class="nm-bar"><div class="nm-fill"></div></div><span class="nm-text">—</span></div>
|
|
<div class="node-meter" id="meter-sensor"><span class="nm-label">sensor</span><span class="nm-text" style="flex:1">—</span></div>
|
|
</div>
|
|
|
|
<div id="pipeline-graph"></div>
|
|
|
|
<div id="main">
|
|
<div class="panel chat-panel">
|
|
<div class="panel-header chat-h">Chat</div>
|
|
<div id="messages"></div>
|
|
<div id="input-bar">
|
|
<input id="input" placeholder="Type a message..." autocomplete="off">
|
|
<button onclick="send()">Send</button>
|
|
</div>
|
|
</div>
|
|
<div class="panel awareness-panel">
|
|
<div class="panel-header aware-h">Awareness</div>
|
|
<div id="awareness">
|
|
<section id="awareness-state" class="aw-section">
|
|
<h3 class="aw-title">State</h3>
|
|
<div class="aw-body" id="aw-state-body"><span class="aw-empty">waiting for data...</span></div>
|
|
</section>
|
|
<section id="awareness-sensors" class="aw-section">
|
|
<h3 class="aw-title">Sensors</h3>
|
|
<div class="aw-body" id="aw-sensors-body"><span class="aw-empty">waiting for tick...</span></div>
|
|
</section>
|
|
<section id="awareness-processes" class="aw-section">
|
|
<h3 class="aw-title">Processes</h3>
|
|
<div class="aw-body" id="aw-proc-body"><span class="aw-empty">idle</span></div>
|
|
</section>
|
|
<section id="awareness-controls" class="aw-section">
|
|
<h3 class="aw-title">Workspace</h3>
|
|
<div class="aw-body" id="aw-ctrl-body"><span class="aw-empty">no controls</span></div>
|
|
</section>
|
|
</div>
|
|
</div>
|
|
<div class="panel">
|
|
<div class="panel-header trace-h">Trace</div>
|
|
<div id="trace"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<script src="/static/app.js"></script>
|
|
</body>
|
|
</html>
|