opencode-subagents-sidebar-plugin 0.1.1 → 0.1.2
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/dist/activity.js +25 -41
- package/dist/activity.js.map +1 -1
- package/dist/tasks.d.ts +5 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +23 -0
- package/dist/tasks.js.map +1 -0
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +315 -147
- package/dist/tui.js.map +1 -1
- package/package.json +6 -2
package/dist/activity.js
CHANGED
|
@@ -1,54 +1,38 @@
|
|
|
1
1
|
function stringValue(value) {
|
|
2
|
-
|
|
2
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
3
3
|
}
|
|
4
4
|
export function normalizeActivity(value) {
|
|
5
|
-
|
|
6
|
-
.replace(/\s+/g, " ")
|
|
7
|
-
.replace(/^[#>*_`\-\s]+/, "")
|
|
8
|
-
.replace(/[*_`]/g, "")
|
|
9
|
-
.trim();
|
|
5
|
+
return value.replace(/\s+/g, " ").replace(/^[#>*_`\-\s]+/, "").replace(/[*_`]/g, "").trim();
|
|
10
6
|
}
|
|
11
7
|
export function normalizeMeaningful(value) {
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
const text = stringValue(value);
|
|
9
|
+
return text ? stringValue(normalizeActivity(text)) : undefined;
|
|
14
10
|
}
|
|
15
11
|
function toolName(value) {
|
|
16
|
-
|
|
17
|
-
.replace(/^multi_tool_use\./, "")
|
|
18
|
-
.replace(/[._-]+/g, " ")
|
|
19
|
-
.replace(/\b\w/g, (character) => character.toUpperCase());
|
|
12
|
+
return value.replace(/^multi_tool_use\./, "").replace(/[._-]+/g, " ").replace(/\b\w/g, character => character.toUpperCase());
|
|
20
13
|
}
|
|
21
14
|
export function activityForPart(part) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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}…`;
|
|
15
|
+
if (part.type === "text" || part.type === "reasoning") return normalizeMeaningful(part.text);
|
|
16
|
+
if (part.type === "subtask") {
|
|
17
|
+
const description = normalizeMeaningful(part.description);
|
|
18
|
+
return description ? `Delegating · ${description}` : "Delegating";
|
|
19
|
+
}
|
|
20
|
+
if (part.type === "retry") return `Retrying · attempt ${part.attempt}`;
|
|
21
|
+
if (part.type === "compaction") return "Compacting context…";
|
|
22
|
+
if (part.type !== "tool") return undefined;
|
|
23
|
+
const name = toolName(part.tool);
|
|
24
|
+
if (part.state.status === "pending") return `${name}…`;
|
|
25
|
+
if (part.state.status === "error") return `${name} failed`;
|
|
26
|
+
const title = normalizeMeaningful(part.state.title);
|
|
27
|
+
return title ? `${name} · ${title}` : `${name}…`;
|
|
41
28
|
}
|
|
42
29
|
export function elapsedLabel(milliseconds) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if (hours < 24)
|
|
51
|
-
return `${hours}h ${minutes % 60}m`;
|
|
52
|
-
return `${Math.floor(hours / 24)}d ${hours % 24}h`;
|
|
30
|
+
const seconds = Math.max(0, Math.floor(milliseconds / 1_000));
|
|
31
|
+
if (seconds < 60) return `${seconds}s`;
|
|
32
|
+
const minutes = Math.floor(seconds / 60);
|
|
33
|
+
if (minutes < 60) return `${minutes}m ${seconds % 60}s`;
|
|
34
|
+
const hours = Math.floor(minutes / 60);
|
|
35
|
+
if (hours < 24) return `${hours}h ${minutes % 60}m`;
|
|
36
|
+
return `${Math.floor(hours / 24)}d ${hours % 24}h`;
|
|
53
37
|
}
|
|
54
38
|
//# sourceMappingURL=activity.js.map
|
package/dist/activity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.js","
|
|
1
|
+
{"version":3,"file":"activity.js","names":["stringValue","value","trim","undefined","normalizeActivity","replace","normalizeMeaningful","text","toolName","character","toUpperCase","activityForPart","part","type","description","attempt","name","tool","state","status","title","elapsedLabel","milliseconds","seconds","Math","max","floor","minutes","hours"],"sources":["../src/activity.ts"],"sourcesContent":["import type { Part } from \"@opencode-ai/sdk/v2\"\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined\n}\n\nexport function normalizeActivity(value: string): string {\n return value\n .replace(/\\s+/g, \" \")\n .replace(/^[#>*_`\\-\\s]+/, \"\")\n .replace(/[*_`]/g, \"\")\n .trim()\n}\n\nexport function normalizeMeaningful(value: unknown): string | undefined {\n const text = stringValue(value)\n return text ? stringValue(normalizeActivity(text)) : undefined\n}\n\nfunction toolName(value: string): string {\n return value\n .replace(/^multi_tool_use\\./, \"\")\n .replace(/[._-]+/g, \" \")\n .replace(/\\b\\w/g, (character) => character.toUpperCase())\n}\n\nexport function activityForPart(part: Part): string | undefined {\n if (part.type === \"text\" || part.type === \"reasoning\") return normalizeMeaningful(part.text)\n if (part.type === \"subtask\") {\n const description = normalizeMeaningful(part.description)\n return description ? `Delegating · ${description}` : \"Delegating\"\n }\n if (part.type === \"retry\") return `Retrying · attempt ${part.attempt}`\n if (part.type === \"compaction\") return \"Compacting context…\"\n if (part.type !== \"tool\") return undefined\n\n const name = toolName(part.tool)\n if (part.state.status === \"pending\") return `${name}…`\n if (part.state.status === \"error\") return `${name} failed`\n const title = normalizeMeaningful(part.state.title)\n return title ? `${name} · ${title}` : `${name}…`\n}\n\nexport function elapsedLabel(milliseconds: number): string {\n const seconds = Math.max(0, Math.floor(milliseconds / 1_000))\n if (seconds < 60) return `${seconds}s`\n const minutes = Math.floor(seconds / 60)\n if (minutes < 60) return `${minutes}m ${seconds % 60}s`\n const hours = Math.floor(minutes / 60)\n if (hours < 24) return `${hours}h ${minutes % 60}m`\n return `${Math.floor(hours / 24)}d ${hours % 24}h`\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/tasks.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Part, SessionStatus, ToolPart } from "@opencode-ai/sdk/v2";
|
|
2
|
+
export type VisibleTaskPart = ToolPart;
|
|
3
|
+
export declare function taskSessionID(part: ToolPart): string | undefined;
|
|
4
|
+
export declare function isVisibleTask(part: Part, sessionStatus: (sessionID: string) => SessionStatus | undefined): part is VisibleTaskPart;
|
|
5
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAExE,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAA;AAUtC,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAGhE;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,GAC9D,IAAI,IAAI,eAAe,CASzB"}
|
package/dist/tasks.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function objectValue(value) {
|
|
2
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
3
|
+
}
|
|
4
|
+
function taskMetadata(part) {
|
|
5
|
+
return {
|
|
6
|
+
...objectValue(part.metadata),
|
|
7
|
+
...objectValue(objectValue(part.state).metadata)
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function taskSessionID(part) {
|
|
11
|
+
const sessionID = taskMetadata(part).sessionId;
|
|
12
|
+
return typeof sessionID === "string" && sessionID.trim() ? sessionID.trim() : undefined;
|
|
13
|
+
}
|
|
14
|
+
export function isVisibleTask(part, sessionStatus) {
|
|
15
|
+
if (part.type !== "tool" || part.tool !== "task") return false;
|
|
16
|
+
if (part.state.status === "pending" || part.state.status === "running") return true;
|
|
17
|
+
if (part.state.status !== "completed" || taskMetadata(part).background !== true) return false;
|
|
18
|
+
const childSessionID = taskSessionID(part);
|
|
19
|
+
if (!childSessionID) return false;
|
|
20
|
+
const status = sessionStatus(childSessionID);
|
|
21
|
+
return status !== undefined && status.type !== "idle";
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","names":["objectValue","value","Array","isArray","taskMetadata","part","metadata","state","taskSessionID","sessionID","sessionId","trim","undefined","isVisibleTask","sessionStatus","type","tool","status","background","childSessionID"],"sources":["../src/tasks.ts"],"sourcesContent":["import type { Part, SessionStatus, ToolPart } from \"@opencode-ai/sdk/v2\"\n\nexport type VisibleTaskPart = ToolPart\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : {}\n}\n\nfunction taskMetadata(part: ToolPart): Record<string, unknown> {\n return { ...objectValue(part.metadata), ...objectValue(objectValue(part.state).metadata) }\n}\n\nexport function taskSessionID(part: ToolPart): string | undefined {\n const sessionID = taskMetadata(part).sessionId\n return typeof sessionID === \"string\" && sessionID.trim() ? sessionID.trim() : undefined\n}\n\nexport function isVisibleTask(\n part: Part,\n sessionStatus: (sessionID: string) => SessionStatus | undefined,\n): part is VisibleTaskPart {\n if (part.type !== \"tool\" || part.tool !== \"task\") return false\n if (part.state.status === \"pending\" || part.state.status === \"running\") return true\n if (part.state.status !== \"completed\" || taskMetadata(part).background !== true) return false\n\n const childSessionID = taskSessionID(part)\n if (!childSessionID) return false\n const status = sessionStatus(childSessionID)\n return status !== undefined && status.type !== \"idle\"\n}\n"],"mappings":"AAIA,SAASA,WAAWA,CAACC,KAAc,EAA2B;EAC5D,OAAOA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,CAACC,KAAK,CAACC,OAAO,CAACF,KAAK,CAAC,GAAIA,KAAK,GAA+B,CAAC,CAAC;AAC9G;AAEA,SAASG,YAAYA,CAACC,IAAc,EAA2B;EAC7D,OAAO;IAAE,GAAGL,WAAW,CAACK,IAAI,CAACC,QAAQ,CAAC;IAAE,GAAGN,WAAW,CAACA,WAAW,CAACK,IAAI,CAACE,KAAK,CAAC,CAACD,QAAQ;EAAE,CAAC;AAC5F;AAEA,OAAO,SAASE,aAAaA,CAACH,IAAc,EAAsB;EAChE,MAAMI,SAAS,GAAGL,YAAY,CAACC,IAAI,CAAC,CAACK,SAAS;EAC9C,OAAO,OAAOD,SAAS,KAAK,QAAQ,IAAIA,SAAS,CAACE,IAAI,CAAC,CAAC,GAAGF,SAAS,CAACE,IAAI,CAAC,CAAC,GAAGC,SAAS;AACzF;AAEA,OAAO,SAASC,aAAaA,CAC3BR,IAAU,EACVS,aAA+D,EACtC;EACzB,IAAIT,IAAI,CAACU,IAAI,KAAK,MAAM,IAAIV,IAAI,CAACW,IAAI,KAAK,MAAM,EAAE,OAAO,KAAK;EAC9D,IAAIX,IAAI,CAACE,KAAK,CAACU,MAAM,KAAK,SAAS,IAAIZ,IAAI,CAACE,KAAK,CAACU,MAAM,KAAK,SAAS,EAAE,OAAO,IAAI;EACnF,IAAIZ,IAAI,CAACE,KAAK,CAACU,MAAM,KAAK,WAAW,IAAIb,YAAY,CAACC,IAAI,CAAC,CAACa,UAAU,KAAK,IAAI,EAAE,OAAO,KAAK;EAE7F,MAAMC,cAAc,GAAGX,aAAa,CAACH,IAAI,CAAC;EAC1C,IAAI,CAACc,cAAc,EAAE,OAAO,KAAK;EACjC,MAAMF,MAAM,GAAGH,aAAa,CAACK,cAAc,CAAC;EAC5C,OAAOF,MAAM,KAAKL,SAAS,IAAIK,MAAM,CAACF,IAAI,KAAK,MAAM;AACvD","ignoreList":[]}
|
package/dist/tui.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AA4SvF,QAAA,MAAM,MAAM;;;CAGe,CAAA;AAE3B,eAAe,MAAM,CAAA"}
|
package/dist/tui.js
CHANGED
|
@@ -1,178 +1,346 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createComponent as _$createComponent } from "@opentui/solid";
|
|
2
|
+
import { effect as _$effect } from "@opentui/solid";
|
|
3
|
+
import { createTextNode as _$createTextNode } from "@opentui/solid";
|
|
4
|
+
import { insertNode as _$insertNode } from "@opentui/solid";
|
|
5
|
+
import { insert as _$insert } from "@opentui/solid";
|
|
6
|
+
import { memo as _$memo } from "@opentui/solid";
|
|
7
|
+
import { setProp as _$setProp } from "@opentui/solid";
|
|
8
|
+
import { createElement as _$createElement } from "@opentui/solid";
|
|
9
|
+
/** @jsxImportSource @opentui/solid */
|
|
10
|
+
|
|
2
11
|
import { activityForPart, elapsedLabel, normalizeMeaningful } from "./activity.js";
|
|
12
|
+
import { isVisibleTask, taskSessionID } from "./tasks.js";
|
|
3
13
|
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
14
|
function stringValue(value) {
|
|
10
|
-
|
|
15
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
11
16
|
}
|
|
12
17
|
function objectValue(value) {
|
|
13
|
-
|
|
18
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
14
19
|
}
|
|
15
20
|
function taskAgent(part) {
|
|
16
|
-
|
|
21
|
+
return stringValue(part.state.input.subagent_type) ?? "subagent";
|
|
17
22
|
}
|
|
18
23
|
function taskDescription(part) {
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
function taskSessionID(part) {
|
|
22
|
-
return stringValue(objectValue(part.state).metadata && objectValue(objectValue(part.state).metadata).sessionId);
|
|
24
|
+
return normalizeMeaningful(part.state.input.description) ?? normalizeMeaningful(objectValue(part.state).title) ?? "Working";
|
|
23
25
|
}
|
|
24
26
|
function taskModel(part) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
const metadata = objectValue(objectValue(part.state).metadata);
|
|
28
|
+
const model = objectValue(metadata.model);
|
|
29
|
+
const providerID = stringValue(model.providerID);
|
|
30
|
+
const modelID = stringValue(model.modelID);
|
|
31
|
+
return providerID && modelID ? {
|
|
32
|
+
providerID,
|
|
33
|
+
modelID
|
|
34
|
+
} : undefined;
|
|
30
35
|
}
|
|
31
36
|
function latestActivity(api, sessionID, fallback) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
continue;
|
|
44
|
-
const activity = activityForPart(candidate);
|
|
45
|
-
if (activity)
|
|
46
|
-
return activity;
|
|
47
|
-
}
|
|
37
|
+
if (!sessionID) return fallback;
|
|
38
|
+
const messages = api.state.session.messages(sessionID);
|
|
39
|
+
for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex -= 1) {
|
|
40
|
+
const message = messages[messageIndex];
|
|
41
|
+
if (message?.role !== "assistant") continue;
|
|
42
|
+
const parts = api.state.part(message.id);
|
|
43
|
+
for (let partIndex = parts.length - 1; partIndex >= 0; partIndex -= 1) {
|
|
44
|
+
const candidate = parts[partIndex];
|
|
45
|
+
if (!candidate) continue;
|
|
46
|
+
const activity = activityForPart(candidate);
|
|
47
|
+
if (activity) return activity;
|
|
48
48
|
}
|
|
49
|
-
|
|
49
|
+
}
|
|
50
|
+
return fallback;
|
|
50
51
|
}
|
|
51
52
|
function modelLabel(api, part) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
53
|
+
let model = taskModel(part);
|
|
54
|
+
const childSessionID = taskSessionID(part);
|
|
55
|
+
if (!model && childSessionID) {
|
|
56
|
+
const messages = api.state.session.messages(childSessionID);
|
|
57
|
+
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
58
|
+
const message = messages[index];
|
|
59
|
+
if (message?.role === "assistant") {
|
|
60
|
+
model = {
|
|
61
|
+
providerID: message.providerID,
|
|
62
|
+
modelID: message.modelID
|
|
63
|
+
};
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
63
66
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
+
}
|
|
68
|
+
if (!model) return "starting…";
|
|
69
|
+
return api.state.provider.find(provider => provider.id === model.providerID)?.models[model.modelID]?.name ?? model.modelID;
|
|
67
70
|
}
|
|
68
71
|
function TaskCard(props) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
72
|
+
// The call ID is stable, while the actual ToolPart is re-read after each event.
|
|
73
|
+
// This prevents cards from retaining a stale part object after a state update.
|
|
74
|
+
const livePart = createMemo(() => props.tasksByCallID().get(props.callID));
|
|
75
|
+
const childSessionID = () => taskSessionID(livePart());
|
|
76
|
+
const isCurrent = () => childSessionID() === props.currentSessionID;
|
|
77
|
+
const model = () => {
|
|
78
|
+
props.revision();
|
|
79
|
+
return modelLabel(props.api, livePart());
|
|
80
|
+
};
|
|
81
|
+
const activity = () => {
|
|
82
|
+
props.revision();
|
|
83
|
+
return latestActivity(props.api, childSessionID(), taskDescription(livePart()));
|
|
84
|
+
};
|
|
85
|
+
const elapsed = () => elapsedLabel(props.now() - props.startedAt(livePart()));
|
|
86
|
+
return (() => {
|
|
87
|
+
var _el$ = _$createElement("box"),
|
|
88
|
+
_el$2 = _$createElement("box"),
|
|
89
|
+
_el$3 = _$createElement("text"),
|
|
90
|
+
_el$4 = _$createElement("span"),
|
|
91
|
+
_el$5 = _$createElement("span"),
|
|
92
|
+
_el$6 = _$createTextNode(` `),
|
|
93
|
+
_el$7 = _$createElement("b"),
|
|
94
|
+
_el$8 = _$createElement("text"),
|
|
95
|
+
_el$9 = _$createElement("box"),
|
|
96
|
+
_el$0 = _$createElement("text"),
|
|
97
|
+
_el$1 = _$createElement("text");
|
|
98
|
+
_$insertNode(_el$, _el$2);
|
|
99
|
+
_$insertNode(_el$, _el$9);
|
|
100
|
+
_$setProp(_el$, "width", "100%");
|
|
101
|
+
_$setProp(_el$, "height", 2);
|
|
102
|
+
_$setProp(_el$, "overflow", "hidden");
|
|
103
|
+
_$insertNode(_el$2, _el$3);
|
|
104
|
+
_$insertNode(_el$2, _el$8);
|
|
105
|
+
_$setProp(_el$2, "width", "100%");
|
|
106
|
+
_$setProp(_el$2, "height", 1);
|
|
107
|
+
_$setProp(_el$2, "flexDirection", "row");
|
|
108
|
+
_$setProp(_el$2, "overflow", "hidden");
|
|
109
|
+
_$insertNode(_el$3, _el$4);
|
|
110
|
+
_$insertNode(_el$3, _el$5);
|
|
111
|
+
_$setProp(_el$3, "flexGrow", 1);
|
|
112
|
+
_$setProp(_el$3, "flexShrink", 1);
|
|
113
|
+
_$setProp(_el$3, "minWidth", 0);
|
|
114
|
+
_$setProp(_el$3, "wrapMode", "none");
|
|
115
|
+
_$setProp(_el$3, "truncate", true);
|
|
116
|
+
_$insert(_el$4, (() => {
|
|
117
|
+
var _c$ = _$memo(() => !!isCurrent());
|
|
118
|
+
return () => _c$() ? "›" : livePart().state.status === "pending" ? "…" : "●";
|
|
119
|
+
})());
|
|
120
|
+
_$insertNode(_el$5, _el$6);
|
|
121
|
+
_$insertNode(_el$5, _el$7);
|
|
122
|
+
_$insert(_el$7, () => taskAgent(livePart()));
|
|
123
|
+
_$setProp(_el$8, "flexShrink", 0);
|
|
124
|
+
_$setProp(_el$8, "maxWidth", 20);
|
|
125
|
+
_$setProp(_el$8, "marginLeft", 1);
|
|
126
|
+
_$setProp(_el$8, "wrapMode", "none");
|
|
127
|
+
_$setProp(_el$8, "truncate", true);
|
|
128
|
+
_$insert(_el$8, model);
|
|
129
|
+
_$insertNode(_el$9, _el$0);
|
|
130
|
+
_$insertNode(_el$9, _el$1);
|
|
131
|
+
_$setProp(_el$9, "width", "100%");
|
|
132
|
+
_$setProp(_el$9, "height", 1);
|
|
133
|
+
_$setProp(_el$9, "flexDirection", "row");
|
|
134
|
+
_$setProp(_el$9, "overflow", "hidden");
|
|
135
|
+
_$setProp(_el$0, "flexGrow", 1);
|
|
136
|
+
_$setProp(_el$0, "flexShrink", 1);
|
|
137
|
+
_$setProp(_el$0, "minWidth", 0);
|
|
138
|
+
_$setProp(_el$0, "wrapMode", "none");
|
|
139
|
+
_$setProp(_el$0, "truncate", true);
|
|
140
|
+
_$insert(_el$0, activity);
|
|
141
|
+
_$setProp(_el$1, "width", 8);
|
|
142
|
+
_$setProp(_el$1, "flexShrink", 0);
|
|
143
|
+
_$setProp(_el$1, "marginLeft", 1);
|
|
144
|
+
_$setProp(_el$1, "wrapMode", "none");
|
|
145
|
+
_$setProp(_el$1, "truncate", true);
|
|
146
|
+
_$insert(_el$1, elapsed);
|
|
147
|
+
_$effect(_p$ => {
|
|
148
|
+
var _v$ = {
|
|
149
|
+
fg: livePart().state.status === "pending" ? props.api.theme.current.warning : props.api.theme.current.success
|
|
150
|
+
},
|
|
151
|
+
_v$2 = {
|
|
152
|
+
fg: props.api.theme.current.text
|
|
153
|
+
},
|
|
154
|
+
_v$3 = props.api.theme.current.textMuted,
|
|
155
|
+
_v$4 = props.api.theme.current.textMuted,
|
|
156
|
+
_v$5 = props.api.theme.current.textMuted;
|
|
157
|
+
_v$ !== _p$.e && (_p$.e = _$setProp(_el$4, "style", _v$, _p$.e));
|
|
158
|
+
_v$2 !== _p$.t && (_p$.t = _$setProp(_el$5, "style", _v$2, _p$.t));
|
|
159
|
+
_v$3 !== _p$.a && (_p$.a = _$setProp(_el$8, "fg", _v$3, _p$.a));
|
|
160
|
+
_v$4 !== _p$.o && (_p$.o = _$setProp(_el$0, "fg", _v$4, _p$.o));
|
|
161
|
+
_v$5 !== _p$.i && (_p$.i = _$setProp(_el$1, "fg", _v$5, _p$.i));
|
|
162
|
+
return _p$;
|
|
163
|
+
}, {
|
|
164
|
+
e: undefined,
|
|
165
|
+
t: undefined,
|
|
166
|
+
a: undefined,
|
|
167
|
+
o: undefined,
|
|
168
|
+
i: undefined
|
|
169
|
+
});
|
|
170
|
+
return _el$;
|
|
171
|
+
})();
|
|
88
172
|
}
|
|
89
173
|
function RunningSubagents(props) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
174
|
+
const [scopeSessionID, setScopeSessionID] = createSignal();
|
|
175
|
+
const [hydratedMessages, setHydratedMessages] = createSignal([]);
|
|
176
|
+
const [revision, setRevision] = createSignal(0);
|
|
177
|
+
const [now, setNow] = createSignal(Date.now());
|
|
178
|
+
const firstSeen = new Map();
|
|
179
|
+
let sessionRequest = 0;
|
|
180
|
+
const loadMessages = async (sessionID, request) => {
|
|
181
|
+
if (props.api.state.session.messages(sessionID).length) return;
|
|
182
|
+
try {
|
|
183
|
+
const result = await props.api.client.session.messages({
|
|
184
|
+
sessionID,
|
|
185
|
+
directory: props.api.state.path.directory
|
|
186
|
+
}, {
|
|
187
|
+
throwOnError: true
|
|
188
|
+
});
|
|
189
|
+
if (props.api.lifecycle.signal.aborted || request !== sessionRequest || scopeSessionID() !== sessionID) return;
|
|
190
|
+
setHydratedMessages(result.data);
|
|
191
|
+
setRevision(value => value + 1);
|
|
192
|
+
} catch {
|
|
193
|
+
// Live session events can populate the public TUI state after a failed hydration.
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
const selectSession = async (sessionID, known) => {
|
|
197
|
+
const currentRequest = ++sessionRequest;
|
|
198
|
+
setScopeSessionID(undefined);
|
|
199
|
+
setHydratedMessages([]);
|
|
200
|
+
let session = known ?? props.api.state.session.get(sessionID);
|
|
201
|
+
if (!session) {
|
|
202
|
+
try {
|
|
203
|
+
const result = await props.api.client.session.get({
|
|
204
|
+
sessionID,
|
|
205
|
+
directory: props.api.state.path.directory
|
|
206
|
+
}, {
|
|
207
|
+
throwOnError: true
|
|
208
|
+
});
|
|
209
|
+
session = result.data;
|
|
210
|
+
} catch {
|
|
211
|
+
// Leave the scope unset so a failed child lookup cannot show its own tasks.
|
|
212
|
+
// A later session event retries after local state is populated.
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (props.api.lifecycle.signal.aborted || currentRequest !== sessionRequest) return;
|
|
217
|
+
const parentSessionID = session.parentID ?? session.id;
|
|
218
|
+
setScopeSessionID(parentSessionID);
|
|
219
|
+
setRevision(value => value + 1);
|
|
220
|
+
void loadMessages(parentSessionID, currentRequest);
|
|
221
|
+
};
|
|
222
|
+
createEffect(on(() => props.sessionID, sessionID => void selectSession(sessionID)));
|
|
223
|
+
const running = createMemo(() => {
|
|
224
|
+
revision();
|
|
225
|
+
const sessionID = scopeSessionID();
|
|
226
|
+
if (!sessionID) return [];
|
|
227
|
+
const messages = props.api.state.session.messages(sessionID);
|
|
228
|
+
const parts = messages.length ? messages.flatMap(message => props.api.state.part(message.id)) : hydratedMessages().flatMap(message => message.parts);
|
|
229
|
+
return parts.filter(part => isVisibleTask(part, props.api.state.session.status));
|
|
230
|
+
});
|
|
231
|
+
const tasksByCallID = createMemo(() => new Map(running().map(part => [part.callID, part])));
|
|
232
|
+
const taskCallIDs = createMemo(() => running().map(part => part.callID));
|
|
233
|
+
const activeChildSessions = createMemo(() => new Set(running().map(taskSessionID).filter(sessionID => Boolean(sessionID))));
|
|
234
|
+
const startedAt = part => {
|
|
235
|
+
if (part.state.status !== "pending") return part.state.time.start;
|
|
236
|
+
const existing = firstSeen.get(part.callID);
|
|
237
|
+
if (existing !== undefined) return existing;
|
|
238
|
+
const value = now();
|
|
239
|
+
firstSeen.set(part.callID, value);
|
|
240
|
+
return value;
|
|
241
|
+
};
|
|
242
|
+
const unregister = [];
|
|
243
|
+
let timer;
|
|
244
|
+
onMount(() => {
|
|
245
|
+
const syncCurrentSession = session => {
|
|
246
|
+
if (session.id === props.sessionID) void selectSession(session.id, session);
|
|
247
|
+
if (session.parentID === scopeSessionID() || activeChildSessions().has(session.id)) {
|
|
248
|
+
setRevision(value => value + 1);
|
|
249
|
+
}
|
|
114
250
|
};
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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;
|
|
251
|
+
const refreshSession = sessionID => {
|
|
252
|
+
if (sessionID === scopeSessionID() || activeChildSessions().has(sessionID)) {
|
|
253
|
+
setRevision(value => value + 1);
|
|
254
|
+
}
|
|
135
255
|
};
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
256
|
+
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)));
|
|
257
|
+
timer = setInterval(() => setNow(Date.now()), 1_000);
|
|
258
|
+
});
|
|
259
|
+
onCleanup(() => {
|
|
260
|
+
sessionRequest += 1;
|
|
261
|
+
if (timer) clearInterval(timer);
|
|
262
|
+
for (const dispose of unregister) dispose();
|
|
263
|
+
});
|
|
264
|
+
return (() => {
|
|
265
|
+
var _el$10 = _$createElement("box"),
|
|
266
|
+
_el$11 = _$createElement("text"),
|
|
267
|
+
_el$12 = _$createElement("b"),
|
|
268
|
+
_el$14 = _$createElement("span");
|
|
269
|
+
_$insertNode(_el$10, _el$11);
|
|
270
|
+
_$setProp(_el$10, "overflow", "hidden");
|
|
271
|
+
_$insertNode(_el$11, _el$12);
|
|
272
|
+
_$insertNode(_el$11, _el$14);
|
|
273
|
+
_$insertNode(_el$12, _$createTextNode(`Subagents`));
|
|
274
|
+
_$insert(_el$14, (() => {
|
|
275
|
+
var _c$2 = _$memo(() => !!running().length);
|
|
276
|
+
return () => _c$2() ? ` (${running().length} running)` : "";
|
|
277
|
+
})());
|
|
278
|
+
_$insert(_el$10, _$createComponent(Show, {
|
|
279
|
+
get when() {
|
|
280
|
+
return taskCallIDs().length > 0;
|
|
281
|
+
},
|
|
282
|
+
get fallback() {
|
|
283
|
+
return (() => {
|
|
284
|
+
var _el$15 = _$createElement("text");
|
|
285
|
+
_$insertNode(_el$15, _$createTextNode(`No subagent running`));
|
|
286
|
+
_$effect(_$p => _$setProp(_el$15, "fg", props.api.theme.current.textMuted, _$p));
|
|
287
|
+
return _el$15;
|
|
288
|
+
})();
|
|
289
|
+
},
|
|
290
|
+
get children() {
|
|
291
|
+
return _$createComponent(For, {
|
|
292
|
+
get each() {
|
|
293
|
+
return taskCallIDs();
|
|
294
|
+
},
|
|
295
|
+
children: callID => _$createComponent(TaskCard, {
|
|
296
|
+
get api() {
|
|
297
|
+
return props.api;
|
|
298
|
+
},
|
|
299
|
+
callID: callID,
|
|
300
|
+
get currentSessionID() {
|
|
301
|
+
return props.sessionID;
|
|
302
|
+
},
|
|
303
|
+
tasksByCallID: tasksByCallID,
|
|
304
|
+
revision: revision,
|
|
305
|
+
now: now,
|
|
306
|
+
startedAt: startedAt
|
|
307
|
+
})
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}), null);
|
|
311
|
+
_$effect(_p$ => {
|
|
312
|
+
var _v$6 = props.api.theme.current.text,
|
|
313
|
+
_v$7 = {
|
|
314
|
+
fg: props.api.theme.current.textMuted
|
|
150
315
|
};
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
clearInterval(timer);
|
|
158
|
-
for (const dispose of unregister)
|
|
159
|
-
dispose();
|
|
316
|
+
_v$6 !== _p$.e && (_p$.e = _$setProp(_el$11, "fg", _v$6, _p$.e));
|
|
317
|
+
_v$7 !== _p$.t && (_p$.t = _$setProp(_el$14, "style", _v$7, _p$.t));
|
|
318
|
+
return _p$;
|
|
319
|
+
}, {
|
|
320
|
+
e: undefined,
|
|
321
|
+
t: undefined
|
|
160
322
|
});
|
|
161
|
-
return
|
|
323
|
+
return _el$10;
|
|
324
|
+
})();
|
|
162
325
|
}
|
|
163
|
-
const tui = async
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
326
|
+
const tui = async api => {
|
|
327
|
+
api.slots.register({
|
|
328
|
+
order: 90,
|
|
329
|
+
slots: {
|
|
330
|
+
sidebar_footer(_ctx, props) {
|
|
331
|
+
return _$createComponent(RunningSubagents, {
|
|
332
|
+
api: api,
|
|
333
|
+
get sessionID() {
|
|
334
|
+
return props.session_id;
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
});
|
|
172
340
|
};
|
|
173
341
|
const plugin = {
|
|
174
|
-
|
|
175
|
-
|
|
342
|
+
id: "opencode-subagents-sidebar-plugin",
|
|
343
|
+
tui
|
|
176
344
|
};
|
|
177
345
|
export default plugin;
|
|
178
346
|
//# sourceMappingURL=tui.js.map
|
package/dist/tui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAClF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAKpG,SAAS,YAAY,CAAC,IAAU;IAC9B,OAAO,CACL,IAAI,CAAC,IAAI,KAAK,MAAM;QACpB,IAAI,CAAC,IAAI,KAAK,MAAM;QACpB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CACrE,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AAC7E,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC9G,CAAC;AAED,SAAS,SAAS,CAAC,IAAoB;IACrC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,UAAU,CAAA;AAClE,CAAC;AAED,SAAS,eAAe,CAAC,IAAoB;IAC3C,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,SAAS,CAAA;AAC7H,CAAC;AAED,SAAS,aAAa,CAAC,IAAoB;IACzC,OAAO,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAA;AACjH,CAAC;AAED,SAAS,SAAS,CAAC,IAAoB;IACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAA;IAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACzC,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAChD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC1C,OAAO,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AACpE,CAAC;AAED,SAAS,cAAc,CAAC,GAAiB,EAAE,SAA6B,EAAE,QAAgB;IACxF,IAAI,CAAC,SAAS;QAAE,OAAO,QAAQ,CAAA;IAE/B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IACtD,KAAK,IAAI,YAAY,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,YAAY,IAAI,CAAC,EAAE,YAAY,IAAI,CAAC,EAAE,CAAC;QAClF,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAA;QACtC,IAAI,OAAO,EAAE,IAAI,KAAK,WAAW;YAAE,SAAQ;QAE3C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACxC,KAAK,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,CAAC;YACtE,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAA;YAClC,IAAI,CAAC,SAAS;gBAAE,SAAQ;YACxB,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;YAC3C,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAA;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,GAAiB,EAAE,IAAoB;IACzD,IAAI,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC3B,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAC1C,IAAI,CAAC,KAAK,IAAI,cAAc,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;QAC3D,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;YAC/B,IAAI,OAAO,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;gBAClC,KAAK,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAA;gBACpE,MAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK;QAAE,OAAO,WAAW,CAAA;IAC9B,OAAO,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,CAAA;AAC9H,CAAC;AAED,SAAS,QAAQ,CAAC,KAQjB;IACC,gFAAgF;IAChF,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1E,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAG,CAAC,CAAA;IACvD,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,KAAK,KAAK,CAAC,gBAAgB,CAAA;IACnE,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,KAAK,CAAC,QAAQ,EAAE,CAAA;QAChB,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAG,CAAC,CAAA;IAC3C,CAAC,CAAA;IACD,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,KAAK,CAAC,QAAQ,EAAE,CAAA;QAChB,OAAO,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,eAAe,CAAC,QAAQ,EAAG,CAAC,CAAC,CAAA;IAClF,CAAC,CAAA;IACD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAG,CAAC,CAAC,CAAA;IAE9E,OAAO,CACL,eAAK,KAAK,EAAC,MAAM,EAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAC,QAAQ,aAC5C,eAAK,KAAK,EAAC,MAAM,EAAC,MAAM,EAAE,CAAC,EAAE,aAAa,EAAC,KAAK,EAAC,QAAQ,EAAC,QAAQ,aAChE,gBAAM,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAC,MAAM,EAAC,QAAQ,mBACrE,eACE,KAAK,EAAE;oCACL,EAAE,EACA,QAAQ,EAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;wCACpC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO;wCACjC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO;iCACtC,YAEA,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAClE,EACP,gBAAM,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,aAC9C,GAAG,EACJ,sBAAI,SAAS,CAAC,QAAQ,EAAG,CAAC,GAAK,IAC1B,IACF,EACP,eACE,UAAU,EAAE,CAAC,EACb,QAAQ,EAAE,EAAE,EACZ,UAAU,EAAE,CAAC,EACb,QAAQ,EAAC,MAAM,EACf,QAAQ,QACR,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,YAEpC,KAAK,EAAE,GACH,IACH,EACN,eAAK,KAAK,EAAC,MAAM,EAAC,MAAM,EAAE,CAAC,EAAE,aAAa,EAAC,KAAK,EAAC,QAAQ,EAAC,QAAQ,aAChE,eACE,QAAQ,EAAE,CAAC,EACX,UAAU,EAAE,CAAC,EACb,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAC,MAAM,EACf,QAAQ,QACR,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,YAEpC,QAAQ,EAAE,GACN,EACP,eACE,KAAK,EAAE,CAAC,EACR,UAAU,EAAE,CAAC,EACb,UAAU,EAAE,CAAC,EACb,QAAQ,EAAC,MAAM,EACf,QAAQ,QACR,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,YAEpC,OAAO,EAAE,GACL,IACH,IACF,CACP,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA+C;IACvE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACzE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;IAC/C,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC3C,IAAI,cAAc,GAAG,CAAC,CAAA;IAEtB,MAAM,aAAa,GAAG,KAAK,EAAE,SAAiB,EAAE,KAAe,EAAiB,EAAE;QAChF,MAAM,cAAc,GAAG,EAAE,cAAc,CAAA;QACvC,IAAI,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAE7D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;oBAChD,SAAS;oBACT,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS;iBAC1C,CAAC,CAAA;gBACF,OAAO,GAAG,MAAM,CAAC,IAAI,CAAA;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,gEAAgE;YAClE,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,IAAI,cAAc,KAAK,cAAc;YAAE,OAAM;QACnF,iBAAiB,CAAC,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAA;QACjD,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;IACnC,CAAC,CAAA;IAED,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAErF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;QAC9B,QAAQ,EAAE,CAAA;QACV,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO;aAC3B,QAAQ,CAAC,cAAc,EAAE,CAAC;aAC1B,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;aACtD,MAAM,CAAC,YAAY,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IACF,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7F,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1E,MAAM,mBAAmB,GAAG,UAAU,CACpC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAuB,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAC3G,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,IAAoB,EAAU,EAAE;QACjD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAA;QACjE,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC3C,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAA;QAC3C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAA;QACnB,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACjC,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IAED,MAAM,UAAU,GAAsB,EAAE,CAAA;IACxC,IAAI,KAAiD,CAAA;IAErD,OAAO,CAAC,GAAG,EAAE;QACX,MAAM,kBAAkB,GAAG,CAAC,OAAgB,EAAE,EAAE;YAC9C,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS;gBAAE,KAAK,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;YAC3E,IAAI,OAAO,CAAC,QAAQ,KAAK,cAAc,EAAE,IAAI,mBAAmB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnF,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;YACnC,CAAC;QACH,CAAC,CAAA;QACD,MAAM,cAAc,GAAG,CAAC,SAAiB,EAAE,EAAE;YAC3C,IAAI,SAAS,KAAK,cAAc,EAAE,IAAI,mBAAmB,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3E,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;YACnC,CAAC;QACH,CAAC,CAAA;QAED,UAAU,CAAC,IAAI,CACb,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAC3F,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAC3F,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAC5F,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EACjG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAClG,CAAA;QACD,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,IAAI,CAAC,CAAA;QACnB,IAAI,KAAK;YAAE,aAAa,CAAC,KAAK,CAAC,CAAA;QAC/B,KAAK,MAAM,OAAO,IAAI,UAAU;YAAE,OAAO,EAAE,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,OAAO,CACL,eAAK,QAAQ,EAAC,QAAQ,aACpB,gBAAM,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,aACpC,oCAAgB,EAChB,eAAM,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,YACnD,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC,EAAE,GACpD,IACF,EAEP,KAAC,IAAI,IACH,IAAI,EAAE,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,EAC9B,QAAQ,EAAE,eAAM,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,oCAA4B,YAEjF,KAAC,GAAG,IAAC,IAAI,EAAE,WAAW,EAAE,YACrB,CAAC,MAAM,EAAE,EAAE,CAAC,CACX,KAAC,QAAQ,IACP,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,KAAK,CAAC,SAAS,EACjC,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,GACpB,CACH,GACG,GACD,IACH,CACP,CAAA;AACH,CAAC;AAED,MAAM,GAAG,GAAc,KAAK,EAAE,GAAG,EAAE,EAAE;IACnC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjB,KAAK,EAAE,EAAE;QACT,KAAK,EAAE;YACL,cAAc,CAAC,IAAI,EAAE,KAAK;gBACxB,OAAO,KAAC,gBAAgB,IAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,UAAU,GAAI,CAAA;YACpE,CAAC;SACF;KACF,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,MAAM,GAAG;IACb,EAAE,EAAE,mCAAmC;IACvC,GAAG;CACsB,CAAA;AAE3B,eAAe,MAAM,CAAA"}
|
|
1
|
+
{"version":3,"file":"tui.js","names":["activityForPart","elapsedLabel","normalizeMeaningful","isVisibleTask","taskSessionID","createEffect","createMemo","createSignal","For","on","onCleanup","onMount","Show","stringValue","value","trim","undefined","objectValue","Array","isArray","taskAgent","part","state","input","subagent_type","taskDescription","description","title","taskModel","metadata","model","providerID","modelID","latestActivity","api","sessionID","fallback","messages","session","messageIndex","length","message","role","parts","id","partIndex","candidate","activity","modelLabel","childSessionID","index","provider","find","models","name","TaskCard","props","livePart","tasksByCallID","get","callID","isCurrent","currentSessionID","revision","elapsed","now","startedAt","_el$","_$createElement","_el$2","_el$3","_el$4","_el$5","_el$6","_$createTextNode","_el$7","_el$8","_el$9","_el$0","_el$1","_$insertNode","_$setProp","_$insert","_c$","_$memo","status","_$effect","_p$","_v$","fg","theme","current","warning","success","_v$2","text","_v$3","textMuted","_v$4","_v$5","e","t","a","o","i","RunningSubagents","scopeSessionID","setScopeSessionID","hydratedMessages","setHydratedMessages","setRevision","setNow","Date","firstSeen","Map","sessionRequest","loadMessages","request","result","client","directory","path","throwOnError","lifecycle","signal","aborted","data","selectSession","known","currentRequest","parentSessionID","parentID","running","flatMap","filter","map","taskCallIDs","activeChildSessions","Set","Boolean","time","start","existing","set","unregister","timer","syncCurrentSession","has","refreshSession","push","event","properties","info","setInterval","clearInterval","dispose","_el$10","_el$11","_el$12","_el$14","_c$2","_$createComponent","when","_el$15","_$p","children","each","_v$6","_v$7","tui","slots","register","order","sidebar_footer","_ctx","session_id","plugin"],"sources":["../src/tui.tsx"],"sourcesContent":["/** @jsxImportSource @opentui/solid */\n\nimport type { TuiPlugin, TuiPluginApi, TuiPluginModule } from \"@opencode-ai/plugin/tui\"\nimport type { Message, Part, Session } from \"@opencode-ai/sdk/v2\"\nimport { activityForPart, elapsedLabel, normalizeMeaningful } from \"./activity.js\"\nimport { isVisibleTask, taskSessionID, type VisibleTaskPart } from \"./tasks.js\"\nimport { createEffect, createMemo, createSignal, For, on, onCleanup, onMount, Show } from \"solid-js\"\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : {}\n}\n\nfunction taskAgent(part: VisibleTaskPart): string {\n return stringValue(part.state.input.subagent_type) ?? \"subagent\"\n}\n\nfunction taskDescription(part: VisibleTaskPart): string {\n return normalizeMeaningful(part.state.input.description) ?? normalizeMeaningful(objectValue(part.state).title) ?? \"Working\"\n}\n\nfunction taskModel(part: VisibleTaskPart): { providerID: string; modelID: string } | undefined {\n const metadata = objectValue(objectValue(part.state).metadata)\n const model = objectValue(metadata.model)\n const providerID = stringValue(model.providerID)\n const modelID = stringValue(model.modelID)\n return providerID && modelID ? { providerID, modelID } : undefined\n}\n\nfunction latestActivity(api: TuiPluginApi, sessionID: string | undefined, fallback: string): string {\n if (!sessionID) return fallback\n\n const messages = api.state.session.messages(sessionID)\n for (let messageIndex = messages.length - 1; messageIndex >= 0; messageIndex -= 1) {\n const message = messages[messageIndex]\n if (message?.role !== \"assistant\") continue\n\n const parts = api.state.part(message.id)\n for (let partIndex = parts.length - 1; partIndex >= 0; partIndex -= 1) {\n const candidate = parts[partIndex]\n if (!candidate) continue\n const activity = activityForPart(candidate)\n if (activity) return activity\n }\n }\n return fallback\n}\n\nfunction modelLabel(api: TuiPluginApi, part: VisibleTaskPart): string {\n let model = taskModel(part)\n const childSessionID = taskSessionID(part)\n if (!model && childSessionID) {\n const messages = api.state.session.messages(childSessionID)\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index]\n if (message?.role === \"assistant\") {\n model = { providerID: message.providerID, modelID: message.modelID }\n break\n }\n }\n }\n\n if (!model) return \"starting…\"\n return api.state.provider.find((provider) => provider.id === model.providerID)?.models[model.modelID]?.name ?? model.modelID\n}\n\nfunction TaskCard(props: {\n api: TuiPluginApi\n callID: string\n currentSessionID: string\n tasksByCallID: () => Map<string, VisibleTaskPart>\n revision: () => number\n now: () => number\n startedAt: (part: VisibleTaskPart) => number\n}) {\n // The call ID is stable, while the actual ToolPart is re-read after each event.\n // This prevents cards from retaining a stale part object after a state update.\n const livePart = createMemo(() => props.tasksByCallID().get(props.callID))\n const childSessionID = () => taskSessionID(livePart()!)\n const isCurrent = () => childSessionID() === props.currentSessionID\n const model = () => {\n props.revision()\n return modelLabel(props.api, livePart()!)\n }\n const activity = () => {\n props.revision()\n return latestActivity(props.api, childSessionID(), taskDescription(livePart()!))\n }\n const elapsed = () => elapsedLabel(props.now() - props.startedAt(livePart()!))\n\n return (\n <box width=\"100%\" height={2} overflow=\"hidden\">\n <box width=\"100%\" height={1} flexDirection=\"row\" overflow=\"hidden\">\n <text flexGrow={1} flexShrink={1} minWidth={0} wrapMode=\"none\" truncate>\n <span\n style={{\n fg:\n livePart()!.state.status === \"pending\"\n ? props.api.theme.current.warning\n : props.api.theme.current.success,\n }}\n >\n {isCurrent() ? \"›\" : livePart()!.state.status === \"pending\" ? \"…\" : \"●\"}\n </span>\n <span style={{ fg: props.api.theme.current.text }}>\n {\" \"}\n <b>{taskAgent(livePart()!)}</b>\n </span>\n </text>\n <text\n flexShrink={0}\n maxWidth={20}\n marginLeft={1}\n wrapMode=\"none\"\n truncate\n fg={props.api.theme.current.textMuted}\n >\n {model()}\n </text>\n </box>\n <box width=\"100%\" height={1} flexDirection=\"row\" overflow=\"hidden\">\n <text\n flexGrow={1}\n flexShrink={1}\n minWidth={0}\n wrapMode=\"none\"\n truncate\n fg={props.api.theme.current.textMuted}\n >\n {activity()}\n </text>\n <text\n width={8}\n flexShrink={0}\n marginLeft={1}\n wrapMode=\"none\"\n truncate\n fg={props.api.theme.current.textMuted}\n >\n {elapsed()}\n </text>\n </box>\n </box>\n )\n}\n\nfunction RunningSubagents(props: { api: TuiPluginApi; sessionID: string }) {\n const [scopeSessionID, setScopeSessionID] = createSignal<string>()\n const [hydratedMessages, setHydratedMessages] = createSignal<ReadonlyArray<{ info: Message; parts: ReadonlyArray<Part> }>>([])\n const [revision, setRevision] = createSignal(0)\n const [now, setNow] = createSignal(Date.now())\n const firstSeen = new Map<string, number>()\n let sessionRequest = 0\n\n const loadMessages = async (sessionID: string, request: number): Promise<void> => {\n if (props.api.state.session.messages(sessionID).length) return\n\n try {\n const result = await props.api.client.session.messages(\n { sessionID, directory: props.api.state.path.directory },\n { throwOnError: true },\n )\n if (props.api.lifecycle.signal.aborted || request !== sessionRequest || scopeSessionID() !== sessionID) return\n setHydratedMessages(result.data)\n setRevision((value) => value + 1)\n } catch {\n // Live session events can populate the public TUI state after a failed hydration.\n }\n }\n\n const selectSession = async (sessionID: string, known?: Session): Promise<void> => {\n const currentRequest = ++sessionRequest\n setScopeSessionID(undefined)\n setHydratedMessages([])\n let session = known ?? props.api.state.session.get(sessionID)\n\n if (!session) {\n try {\n const result = await props.api.client.session.get(\n { sessionID, directory: props.api.state.path.directory },\n { throwOnError: true },\n )\n session = result.data\n } catch {\n // Leave the scope unset so a failed child lookup cannot show its own tasks.\n // A later session event retries after local state is populated.\n return\n }\n }\n\n if (props.api.lifecycle.signal.aborted || currentRequest !== sessionRequest) return\n const parentSessionID = session.parentID ?? session.id\n setScopeSessionID(parentSessionID)\n setRevision((value) => value + 1)\n void loadMessages(parentSessionID, currentRequest)\n }\n\n createEffect(on(() => props.sessionID, (sessionID) => void selectSession(sessionID)))\n\n const running = createMemo(() => {\n revision()\n const sessionID = scopeSessionID()\n if (!sessionID) return []\n\n const messages = props.api.state.session.messages(sessionID)\n const parts = messages.length\n ? messages.flatMap((message) => props.api.state.part(message.id))\n : hydratedMessages().flatMap((message) => message.parts)\n return parts.filter((part) => isVisibleTask(part, props.api.state.session.status))\n })\n const tasksByCallID = createMemo(() => new Map(running().map((part) => [part.callID, part])))\n const taskCallIDs = createMemo(() => running().map((part) => part.callID))\n const activeChildSessions = createMemo(\n () => new Set(running().map(taskSessionID).filter((sessionID): sessionID is string => Boolean(sessionID))),\n )\n\n const startedAt = (part: VisibleTaskPart): number => {\n if (part.state.status !== \"pending\") return part.state.time.start\n const existing = firstSeen.get(part.callID)\n if (existing !== undefined) return existing\n const value = now()\n firstSeen.set(part.callID, value)\n return value\n }\n\n const unregister: Array<() => void> = []\n let timer: ReturnType<typeof setInterval> | undefined\n\n onMount(() => {\n const syncCurrentSession = (session: Session) => {\n if (session.id === props.sessionID) void selectSession(session.id, session)\n if (session.parentID === scopeSessionID() || activeChildSessions().has(session.id)) {\n setRevision((value) => value + 1)\n }\n }\n const refreshSession = (sessionID: string) => {\n if (sessionID === scopeSessionID() || activeChildSessions().has(sessionID)) {\n setRevision((value) => value + 1)\n }\n }\n\n unregister.push(\n props.api.event.on(\"session.created\", (event) => syncCurrentSession(event.properties.info)),\n props.api.event.on(\"session.updated\", (event) => syncCurrentSession(event.properties.info)),\n props.api.event.on(\"message.updated\", (event) => refreshSession(event.properties.sessionID)),\n props.api.event.on(\"message.part.updated\", (event) => refreshSession(event.properties.sessionID)),\n props.api.event.on(\"message.part.removed\", (event) => refreshSession(event.properties.sessionID)),\n )\n timer = setInterval(() => setNow(Date.now()), 1_000)\n })\n\n onCleanup(() => {\n sessionRequest += 1\n if (timer) clearInterval(timer)\n for (const dispose of unregister) dispose()\n })\n\n return (\n <box overflow=\"hidden\">\n <text fg={props.api.theme.current.text}>\n <b>Subagents</b>\n <span style={{ fg: props.api.theme.current.textMuted }}>\n {running().length ? ` (${running().length} running)` : \"\"}\n </span>\n </text>\n\n <Show\n when={taskCallIDs().length > 0}\n fallback={<text fg={props.api.theme.current.textMuted}>No subagent running</text>}\n >\n <For each={taskCallIDs()}>\n {(callID) => (\n <TaskCard\n api={props.api}\n callID={callID}\n currentSessionID={props.sessionID}\n tasksByCallID={tasksByCallID}\n revision={revision}\n now={now}\n startedAt={startedAt}\n />\n )}\n </For>\n </Show>\n </box>\n )\n}\n\nconst tui: TuiPlugin = async (api) => {\n api.slots.register({\n order: 90,\n slots: {\n sidebar_footer(_ctx, props) {\n return <RunningSubagents api={api} sessionID={props.session_id} />\n },\n },\n })\n}\n\nconst plugin = {\n id: \"opencode-subagents-sidebar-plugin\",\n tui,\n} satisfies TuiPluginModule\n\nexport default plugin\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-subagents-sidebar-plugin",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "OpenCode TUI sidebar footer for active subagents.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"opencode",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
"scripts": {
|
|
37
37
|
"clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
38
|
-
"build": "npm run clean && tsc --project tsconfig.build.json",
|
|
38
|
+
"build": "npm run clean && tsc --project tsconfig.build.json && babel src --extensions .ts,.tsx --out-dir dist --source-maps",
|
|
39
39
|
"typecheck": "tsc --noEmit --project tsconfig.json",
|
|
40
40
|
"test": "npm run build && node --test test/*.test.mjs",
|
|
41
41
|
"check": "npm run typecheck && npm test"
|
|
@@ -46,6 +46,10 @@
|
|
|
46
46
|
"solid-js": "1.9.12"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
+
"@babel/cli": "7.28.0",
|
|
50
|
+
"@babel/core": "7.28.0",
|
|
51
|
+
"@babel/preset-typescript": "7.27.1",
|
|
52
|
+
"babel-preset-solid": "1.9.12",
|
|
49
53
|
"typescript": "5.9.3"
|
|
50
54
|
}
|
|
51
55
|
}
|