opencode-subagents-sidebar-plugin 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 caoool
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # OpenCode Subagents Sidebar
2
+
3
+ An OpenCode 1.17.15+ TUI-only plugin that adds a **Subagents** section to the
4
+ sidebar footer. It shows pending and running task subagents for the current
5
+ parent session (or when viewing one of its child sessions).
6
+
7
+ Each subagent uses a compact two-line card: status and role with its model,
8
+ then its newest meaningful activity with elapsed runtime. Completed tasks are
9
+ hidden.
10
+
11
+ ## Install
12
+
13
+ ```sh
14
+ opencode plugin opencode-subagents-sidebar-plugin --global
15
+ ```
16
+
17
+ Quit and restart OpenCode after installing; plugins are loaded at startup.
18
+
19
+ For a manual TUI plugin entry, add this package's TUI export to `tui.json`.
20
+ The `plugin_enabled` entry is optional; include it to use this plugin without
21
+ OpenCode's built-in sidebar context:
22
+
23
+ ```json
24
+ {
25
+ "$schema": "https://opencode.ai/tui.json",
26
+ "plugin_enabled": { "internal:sidebar-context": false },
27
+ "plugin": ["opencode-subagents-sidebar-plugin"]
28
+ }
29
+ ```
30
+
31
+ Restart OpenCode after changing `tui.json`.
32
+
33
+ The source repository is available at
34
+ <https://github.com/caoool/opencode-subagents-sidebar-plugin>.
35
+
36
+ ## Development
37
+
38
+ ```sh
39
+ npm install
40
+ npm run typecheck
41
+ npm run build
42
+ npm test
43
+ npm run check
44
+ npm pack --dry-run
45
+ ```
46
+
47
+ `dist/` is committed intentionally: OpenCode installs Git packages with
48
+ lifecycle scripts disabled.
@@ -0,0 +1,6 @@
1
+ import type { Part } from "@opencode-ai/sdk/v2";
2
+ export declare function normalizeActivity(value: string): string;
3
+ export declare function normalizeMeaningful(value: unknown): string | undefined;
4
+ export declare function activityForPart(part: Part): string | undefined;
5
+ export declare function elapsedLabel(milliseconds: number): string;
6
+ //# sourceMappingURL=activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAM/C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGtE;AASD,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAe9D;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAQzD"}
@@ -0,0 +1,54 @@
1
+ function stringValue(value) {
2
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
3
+ }
4
+ export function normalizeActivity(value) {
5
+ return value
6
+ .replace(/\s+/g, " ")
7
+ .replace(/^[#>*_`\-\s]+/, "")
8
+ .replace(/[*_`]/g, "")
9
+ .trim();
10
+ }
11
+ export function normalizeMeaningful(value) {
12
+ const text = stringValue(value);
13
+ return text ? stringValue(normalizeActivity(text)) : undefined;
14
+ }
15
+ function toolName(value) {
16
+ return value
17
+ .replace(/^multi_tool_use\./, "")
18
+ .replace(/[._-]+/g, " ")
19
+ .replace(/\b\w/g, (character) => character.toUpperCase());
20
+ }
21
+ export function activityForPart(part) {
22
+ if (part.type === "text" || part.type === "reasoning")
23
+ return normalizeMeaningful(part.text);
24
+ if (part.type === "subtask") {
25
+ const description = normalizeMeaningful(part.description);
26
+ return description ? `Delegating · ${description}` : "Delegating";
27
+ }
28
+ if (part.type === "retry")
29
+ return `Retrying · attempt ${part.attempt}`;
30
+ if (part.type === "compaction")
31
+ return "Compacting context…";
32
+ if (part.type !== "tool")
33
+ return undefined;
34
+ const name = toolName(part.tool);
35
+ if (part.state.status === "pending")
36
+ return `${name}…`;
37
+ if (part.state.status === "error")
38
+ return `${name} failed`;
39
+ const title = normalizeMeaningful(part.state.title);
40
+ return title ? `${name} · ${title}` : `${name}…`;
41
+ }
42
+ export function elapsedLabel(milliseconds) {
43
+ const seconds = Math.max(0, Math.floor(milliseconds / 1_000));
44
+ if (seconds < 60)
45
+ return `${seconds}s`;
46
+ const minutes = Math.floor(seconds / 60);
47
+ if (minutes < 60)
48
+ return `${minutes}m ${seconds % 60}s`;
49
+ const hours = Math.floor(minutes / 60);
50
+ if (hours < 24)
51
+ return `${hours}h ${minutes % 60}m`;
52
+ return `${Math.floor(hours / 24)}d ${hours % 24}h`;
53
+ }
54
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"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"}
package/dist/tui.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /** @jsxImportSource @opentui/solid */
2
+ import type { TuiPlugin } from "@opencode-ai/plugin/tui";
3
+ declare const plugin: {
4
+ id: string;
5
+ tui: TuiPlugin;
6
+ };
7
+ export default plugin;
8
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAiC,MAAM,yBAAyB,CAAA;AA+RvF,QAAA,MAAM,MAAM;;;CAGe,CAAA;AAE3B,eAAe,MAAM,CAAA"}
package/dist/tui.js ADDED
@@ -0,0 +1,178 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/solid/jsx-runtime";
2
+ import { activityForPart, elapsedLabel, normalizeMeaningful } from "./activity.js";
3
+ import { createEffect, createMemo, createSignal, For, on, onCleanup, onMount, Show } from "solid-js";
4
+ function isActiveTask(part) {
5
+ return (part.type === "tool" &&
6
+ part.tool === "task" &&
7
+ (part.state.status === "pending" || part.state.status === "running"));
8
+ }
9
+ function stringValue(value) {
10
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
11
+ }
12
+ function objectValue(value) {
13
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
14
+ }
15
+ function taskAgent(part) {
16
+ return stringValue(part.state.input.subagent_type) ?? "subagent";
17
+ }
18
+ function taskDescription(part) {
19
+ return normalizeMeaningful(part.state.input.description) ?? normalizeMeaningful(objectValue(part.state).title) ?? "Working";
20
+ }
21
+ function taskSessionID(part) {
22
+ return stringValue(objectValue(part.state).metadata && objectValue(objectValue(part.state).metadata).sessionId);
23
+ }
24
+ function taskModel(part) {
25
+ const metadata = objectValue(objectValue(part.state).metadata);
26
+ const model = objectValue(metadata.model);
27
+ const providerID = stringValue(model.providerID);
28
+ const modelID = stringValue(model.modelID);
29
+ return providerID && modelID ? { providerID, modelID } : undefined;
30
+ }
31
+ function latestActivity(api, sessionID, fallback) {
32
+ if (!sessionID)
33
+ return fallback;
34
+ const messages = api.state.session.messages(sessionID);
35
+ for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex -= 1) {
36
+ const message = messages[messageIndex];
37
+ if (message?.role !== "assistant")
38
+ continue;
39
+ const parts = api.state.part(message.id);
40
+ for (let partIndex = parts.length - 1; partIndex >= 0; partIndex -= 1) {
41
+ const candidate = parts[partIndex];
42
+ if (!candidate)
43
+ continue;
44
+ const activity = activityForPart(candidate);
45
+ if (activity)
46
+ return activity;
47
+ }
48
+ }
49
+ return fallback;
50
+ }
51
+ function modelLabel(api, part) {
52
+ let model = taskModel(part);
53
+ const childSessionID = taskSessionID(part);
54
+ if (!model && childSessionID) {
55
+ const messages = api.state.session.messages(childSessionID);
56
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
57
+ const message = messages[index];
58
+ if (message?.role === "assistant") {
59
+ model = { providerID: message.providerID, modelID: message.modelID };
60
+ break;
61
+ }
62
+ }
63
+ }
64
+ if (!model)
65
+ return "starting…";
66
+ return api.state.provider.find((provider) => provider.id === model.providerID)?.models[model.modelID]?.name ?? model.modelID;
67
+ }
68
+ function TaskCard(props) {
69
+ // The call ID is stable, while the actual ToolPart is re-read after each event.
70
+ // This prevents cards from retaining a stale part object after a state update.
71
+ const livePart = createMemo(() => props.tasksByCallID().get(props.callID));
72
+ const childSessionID = () => taskSessionID(livePart());
73
+ const isCurrent = () => childSessionID() === props.currentSessionID;
74
+ const model = () => {
75
+ props.revision();
76
+ return modelLabel(props.api, livePart());
77
+ };
78
+ const activity = () => {
79
+ props.revision();
80
+ return latestActivity(props.api, childSessionID(), taskDescription(livePart()));
81
+ };
82
+ const elapsed = () => elapsedLabel(props.now() - props.startedAt(livePart()));
83
+ return (_jsxs("box", { width: "100%", height: 2, overflow: "hidden", children: [_jsxs("box", { width: "100%", height: 1, flexDirection: "row", overflow: "hidden", children: [_jsxs("text", { flexGrow: 1, flexShrink: 1, minWidth: 0, wrapMode: "none", truncate: true, children: [_jsx("span", { style: {
84
+ fg: livePart().state.status === "pending"
85
+ ? props.api.theme.current.warning
86
+ : props.api.theme.current.success,
87
+ }, children: isCurrent() ? "›" : livePart().state.status === "pending" ? "…" : "●" }), _jsxs("span", { style: { fg: props.api.theme.current.text }, children: [" ", _jsx("b", { children: taskAgent(livePart()) })] })] }), _jsx("text", { flexShrink: 0, maxWidth: 20, marginLeft: 1, wrapMode: "none", truncate: true, fg: props.api.theme.current.textMuted, children: model() })] }), _jsxs("box", { width: "100%", height: 1, flexDirection: "row", overflow: "hidden", children: [_jsx("text", { flexGrow: 1, flexShrink: 1, minWidth: 0, wrapMode: "none", truncate: true, fg: props.api.theme.current.textMuted, children: activity() }), _jsx("text", { width: 8, flexShrink: 0, marginLeft: 1, wrapMode: "none", truncate: true, fg: props.api.theme.current.textMuted, children: elapsed() })] })] }));
88
+ }
89
+ function RunningSubagents(props) {
90
+ const [scopeSessionID, setScopeSessionID] = createSignal(props.sessionID);
91
+ const [revision, setRevision] = createSignal(0);
92
+ const [now, setNow] = createSignal(Date.now());
93
+ const firstSeen = new Map();
94
+ let sessionRequest = 0;
95
+ const selectSession = async (sessionID, known) => {
96
+ const currentRequest = ++sessionRequest;
97
+ let session = known ?? props.api.state.session.get(sessionID);
98
+ if (!session) {
99
+ try {
100
+ const result = await props.api.client.session.get({
101
+ sessionID,
102
+ directory: props.api.state.path.directory,
103
+ });
104
+ session = result.data;
105
+ }
106
+ catch {
107
+ // A later session event retries after local state is populated.
108
+ }
109
+ }
110
+ if (props.api.lifecycle.signal.aborted || currentRequest !== sessionRequest)
111
+ return;
112
+ setScopeSessionID(session?.parentID ?? sessionID);
113
+ setRevision((value) => value + 1);
114
+ };
115
+ createEffect(on(() => props.sessionID, (sessionID) => void selectSession(sessionID)));
116
+ const running = createMemo(() => {
117
+ revision();
118
+ return props.api.state.session
119
+ .messages(scopeSessionID())
120
+ .flatMap((message) => props.api.state.part(message.id))
121
+ .filter(isActiveTask);
122
+ });
123
+ const tasksByCallID = createMemo(() => new Map(running().map((part) => [part.callID, part])));
124
+ const taskCallIDs = createMemo(() => running().map((part) => part.callID));
125
+ const activeChildSessions = createMemo(() => new Set(running().map(taskSessionID).filter((sessionID) => Boolean(sessionID))));
126
+ const startedAt = (part) => {
127
+ if (part.state.status === "running")
128
+ return part.state.time.start;
129
+ const existing = firstSeen.get(part.callID);
130
+ if (existing !== undefined)
131
+ return existing;
132
+ const value = now();
133
+ firstSeen.set(part.callID, value);
134
+ return value;
135
+ };
136
+ const unregister = [];
137
+ let timer;
138
+ onMount(() => {
139
+ const syncCurrentSession = (session) => {
140
+ if (session.id === props.sessionID)
141
+ void selectSession(session.id, session);
142
+ if (session.parentID === scopeSessionID() || activeChildSessions().has(session.id)) {
143
+ setRevision((value) => value + 1);
144
+ }
145
+ };
146
+ const refreshSession = (sessionID) => {
147
+ if (sessionID === scopeSessionID() || activeChildSessions().has(sessionID)) {
148
+ setRevision((value) => value + 1);
149
+ }
150
+ };
151
+ unregister.push(props.api.event.on("session.created", (event) => syncCurrentSession(event.properties.info)), props.api.event.on("session.updated", (event) => syncCurrentSession(event.properties.info)), props.api.event.on("message.updated", (event) => refreshSession(event.properties.sessionID)), props.api.event.on("message.part.updated", (event) => refreshSession(event.properties.sessionID)), props.api.event.on("message.part.removed", (event) => refreshSession(event.properties.sessionID)));
152
+ timer = setInterval(() => setNow(Date.now()), 1_000);
153
+ });
154
+ onCleanup(() => {
155
+ sessionRequest += 1;
156
+ if (timer)
157
+ clearInterval(timer);
158
+ for (const dispose of unregister)
159
+ dispose();
160
+ });
161
+ return (_jsxs("box", { overflow: "hidden", children: [_jsxs("text", { fg: props.api.theme.current.text, children: [_jsx("b", { children: "Subagents" }), _jsx("span", { style: { fg: props.api.theme.current.textMuted }, children: running().length ? ` (${running().length} running)` : "" })] }), _jsx(Show, { when: taskCallIDs().length > 0, fallback: _jsx("text", { fg: props.api.theme.current.textMuted, children: "No subagent running" }), children: _jsx(For, { each: taskCallIDs(), children: (callID) => (_jsx(TaskCard, { api: props.api, callID: callID, currentSessionID: props.sessionID, tasksByCallID: tasksByCallID, revision: revision, now: now, startedAt: startedAt })) }) })] }));
162
+ }
163
+ const tui = async (api) => {
164
+ api.slots.register({
165
+ order: 90,
166
+ slots: {
167
+ sidebar_footer(_ctx, props) {
168
+ return _jsx(RunningSubagents, { api: api, sessionID: props.session_id });
169
+ },
170
+ },
171
+ });
172
+ };
173
+ const plugin = {
174
+ id: "opencode-subagents-sidebar-plugin",
175
+ tui,
176
+ };
177
+ export default plugin;
178
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.tsx"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "opencode-subagents-sidebar-plugin",
3
+ "version": "0.1.0",
4
+ "description": "OpenCode TUI sidebar footer for active subagents.",
5
+ "keywords": [
6
+ "opencode",
7
+ "opencode-plugin",
8
+ "tui",
9
+ "subagents"
10
+ ],
11
+ "license": "MIT",
12
+ "type": "module",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/caoool/opencode-subagents-sidebar-plugin.git"
16
+ },
17
+ "exports": {
18
+ "./tui": {
19
+ "types": "./dist/tui.d.ts",
20
+ "import": "./dist/tui.js",
21
+ "default": "./dist/tui.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "LICENSE",
27
+ "README.md"
28
+ ],
29
+ "engines": {
30
+ "opencode": ">=1.17.15"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public",
34
+ "provenance": true
35
+ },
36
+ "scripts": {
37
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
38
+ "build": "npm run clean && tsc --project tsconfig.build.json",
39
+ "typecheck": "tsc --noEmit --project tsconfig.json",
40
+ "test": "npm run build && node --test test/*.test.mjs",
41
+ "check": "npm run typecheck && npm test"
42
+ },
43
+ "dependencies": {
44
+ "@opencode-ai/plugin": "1.17.15",
45
+ "@opentui/solid": "0.4.3",
46
+ "solid-js": "1.9.12"
47
+ },
48
+ "devDependencies": {
49
+ "typescript": "5.9.3"
50
+ }
51
+ }