diff --git a/packages/server/package.json b/packages/server/package.json
index e24a076..5d3850b 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,6 +1,6 @@
{
"name": "threadle",
- "version": "1.0.10",
+ "version": "1.0.11",
"description": "Local-first node-graph patchbay for Claude Code, opencode, Cursor Agent, Antigravity, Codex, Copilot, and Grok Build sessions.",
"type": "module",
"license": "MIT",
diff --git a/packages/shared/package.json b/packages/shared/package.json
index 9e535ca..c3eb9e7 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,6 +1,6 @@
{
"name": "@threadle/shared",
- "version": "1.0.10",
+ "version": "1.0.11",
"private": true,
"type": "module",
"main": "./src/index.ts",
diff --git a/packages/web/package.json b/packages/web/package.json
index 7fcebe1..1ffc47e 100644
--- a/packages/web/package.json
+++ b/packages/web/package.json
@@ -1,6 +1,6 @@
{
"name": "@threadle/web",
- "version": "1.0.10",
+ "version": "1.0.11",
"private": true,
"type": "module",
"scripts": {
diff --git a/packages/web/src/panels/AgentsGraph.vue b/packages/web/src/panels/AgentsGraph.vue
new file mode 100644
index 0000000..7b78ef4
--- /dev/null
+++ b/packages/web/src/panels/AgentsGraph.vue
@@ -0,0 +1,991 @@
+
+
+
+
+
+
+
+
+ defs → instances → subs
+
+
+
+
+
(hoverId = p.node.id)"
+ @node-mouse-leave="hoverId = undefined"
+ >
+
+
+
+
+
+
+
+
+ ⟨/⟩
+
+
+
+
+ {{ data.agent.name }}
+
+
+ {{ providerShort(data.agent.provider) }}
+ · session tag
+ · {{ data.agent.scope }}
+ ● {{ data.liveCount }} live
+
+
+
+
+
+
+
+
+
+
+
+ {{ data.sub ? "⎇" : "❯" }}
+
+
+
+
+
+ {{ data.session.title ?? shortId(data.session.id) }}
+
+
+
+
+
+ ↑ {{ shortId(data.session.parentId) }}
+
+
+ {{ shortId(data.session.id) }}
+
+ · {{ basename(data.session.projectDir) }}
+
+
+
+ · ⟨/⟩ {{ data.session.agent }}
+
+
+
+
+
+
+
+
+
+ no agents match these filters
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/web/src/panels/PluginsBrowser.vue b/packages/web/src/panels/PluginsBrowser.vue
index beb877c..da50e38 100644
--- a/packages/web/src/panels/PluginsBrowser.vue
+++ b/packages/web/src/panels/PluginsBrowser.vue
@@ -124,6 +124,10 @@ const filtered = computed(() => {
});
});
+function childCount(e: PluginEntry, kind: PluginChildKind): number {
+ return e.children.filter((c) => c.kind === kind).length;
+}
+
interface ProvGroup {
provider: string;
entries: PluginEntry[];
@@ -284,12 +288,15 @@ const loading = computed(() => items.value === undefined);
nameverstateoriginkids
+ >origincommandsagentschildren
diff --git a/packages/web/src/views/dashboard/AgentsView.vue b/packages/web/src/views/dashboard/AgentsView.vue
index b418610..bfde2b9 100644
--- a/packages/web/src/views/dashboard/AgentsView.vue
+++ b/packages/web/src/views/dashboard/AgentsView.vue
@@ -22,7 +22,9 @@
? 'Filter memory…'
: agentBrowse === 'plugins'
? 'Filter plugins…'
- : 'Filter runs…'
+ : agentBrowse === 'graph'
+ ? 'Filter graph…'
+ : 'Filter runs…'
"
spellcheck="false"
/>
@@ -59,6 +61,14 @@
>
live{{ agentInstances.live ? ` · ${agentInstances.live}` : "" }}
+
+
+
+
+
+
+
+
+
+
+
+
-
+
- {{ s.agent }}
+ {{ s.agent || "—" }}
sub
+ parent
{{ s.title ?? shortId(s.id) }}
{{ s.projectDir?.split("/").pop() ?? "—" }}
@@ -210,32 +333,6 @@
-
-
-
-
-
-
{{ pickedRun.title ?? shortId(pickedRun.id) }}
-
-
- sub
- ⟨/⟩ {{ pickedRun.agent }}
-
-
-
-
-
-
-
@@ -345,76 +442,129 @@
no prompt body recorded for this agent
+
-
+
+
+
+
+
{{ pickedRun.title ?? shortId(pickedRun.id) }}
+
+
+ sub
+ ⟨/⟩ {{ pickedRun.agent }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ⟨/⟩ {{ agentPicked.name }}
+
+
+
+ provider{{ agentPicked.provider }}
+ kind{{ agentPicked.kind ?? "—" }}
+ scope{{ agentPicked.scope }}
+ model{{ agentPicked.model ?? "session default" }}
+ source{{ agentPicked.source }}
+ used
+ {{ agentUsage(agentPicked).count
+ ? `${agentUsage(agentPicked).count} sessions · last ${agentUsage(agentPicked).last} · ${fmtTokens(agentUsage(agentPicked).tokensOut)} tok out`
+ : "never" }}
+
+
+
+
+
+
+
+
+
+ recent ({{ agentUsage(agentPicked).count
+ }} · {{ agentUsage(agentPicked).live }} live)
+
+
+
+
+
+ system prompt / definition
+ {{ agentPicked.raw.slice(0, 12000) }}
+
+ no prompt body recorded for this agent
+
+
-