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 +21 -0
- package/README.md +48 -0
- package/dist/activity.d.ts +6 -0
- package/dist/activity.d.ts.map +1 -0
- package/dist/activity.js +54 -0
- package/dist/activity.js.map +1 -0
- package/dist/tui.d.ts +8 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +178 -0
- package/dist/tui.js.map +1 -0
- package/package.json +51 -0
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"}
|
package/dist/activity.js
ADDED
|
@@ -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 @@
|
|
|
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
|
package/dist/tui.js.map
ADDED
|
@@ -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
|
+
}
|