@aerovato/operator-opencode-v2 2.0.0 → 2.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/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/tui.js +178 -114
- package/dist/tui.js.map +3 -3
- package/package.json +1 -1
package/dist/tui.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
// src/tui.tsx
|
|
2
|
+
import { effect as _$effect } from "@opentui/solid";
|
|
3
|
+
import { insert as _$insert } from "@opentui/solid";
|
|
4
|
+
import { createTextNode as _$createTextNode } from "@opentui/solid";
|
|
5
|
+
import { insertNode as _$insertNode } from "@opentui/solid";
|
|
6
|
+
import { setProp as _$setProp } from "@opentui/solid";
|
|
7
|
+
import { createElement as _$createElement } from "@opentui/solid";
|
|
8
|
+
import { createComponent as _$createComponent } from "@opentui/solid";
|
|
2
9
|
import { Plugin } from "@opencode/plugin/tui";
|
|
3
10
|
import { createEffect, Show } from "solid-js";
|
|
4
11
|
import { createStore } from "solid-js/store";
|
|
5
12
|
// package.json
|
|
6
13
|
var package_default = {
|
|
7
14
|
name: "@aerovato/operator-opencode-v2",
|
|
8
|
-
version: "2.
|
|
15
|
+
version: "2.1.0",
|
|
9
16
|
description: "Operator Memory adapter for OpenCode V2.",
|
|
10
17
|
license: "BSD-3-Clause",
|
|
11
18
|
author: "Aerovato Research",
|
|
@@ -110,7 +117,6 @@ var OperatorNotifications = Rpc.define({
|
|
|
110
117
|
});
|
|
111
118
|
|
|
112
119
|
// src/tui.tsx
|
|
113
|
-
import { jsxDEV } from "@opentui/solid/jsx-dev-runtime";
|
|
114
120
|
var OperatorTuiPlugin = Plugin.define({
|
|
115
121
|
id: "aerovato.operator-memory",
|
|
116
122
|
setup(context) {
|
|
@@ -132,12 +138,19 @@ var OperatorTuiPlugin = Plugin.define({
|
|
|
132
138
|
detail: statuses[key]?.detail ?? `v${package_default.version}`
|
|
133
139
|
});
|
|
134
140
|
}
|
|
135
|
-
const operation = client.status({
|
|
141
|
+
const operation = client.status({
|
|
142
|
+
refresh: force
|
|
143
|
+
}, location === undefined ? undefined : {
|
|
144
|
+
location
|
|
145
|
+
}).then((value) => {
|
|
136
146
|
const current = parseStatus(value);
|
|
137
147
|
setStatuses(key, current === null ? {
|
|
138
148
|
connection: "unavailable",
|
|
139
149
|
detail: statuses[key]?.detail ?? `v${package_default.version}`
|
|
140
|
-
} : {
|
|
150
|
+
} : {
|
|
151
|
+
connection: "ready",
|
|
152
|
+
...current
|
|
153
|
+
});
|
|
141
154
|
}).catch(() => {
|
|
142
155
|
setStatuses(key, {
|
|
143
156
|
connection: "unavailable",
|
|
@@ -147,47 +160,47 @@ var OperatorTuiPlugin = Plugin.define({
|
|
|
147
160
|
pending.set(key, operation);
|
|
148
161
|
};
|
|
149
162
|
refresh(context.location, false);
|
|
150
|
-
const cleanups = [
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
163
|
+
const cleanups = [context.data.listen((event) => {
|
|
164
|
+
if (event.details.type !== "rpc.aerovato.operator-memory.toast")
|
|
165
|
+
return;
|
|
166
|
+
const toast = parseToast(event.details.data);
|
|
167
|
+
if (toast === null)
|
|
168
|
+
return;
|
|
169
|
+
context.ui.toast.show({
|
|
170
|
+
...toast,
|
|
171
|
+
duration: 1e4
|
|
172
|
+
});
|
|
173
|
+
}), context.data.on("server.connected", () => refresh(context.location, true)), context.data.on("session.status", (event) => {
|
|
174
|
+
const session = context.data.session.get(event.data.sessionID);
|
|
175
|
+
if (session?.parentID !== undefined)
|
|
176
|
+
return;
|
|
177
|
+
if (event.data.status.type !== "idle") {
|
|
178
|
+
activeSessions.add(event.data.sessionID);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (!activeSessions.delete(event.data.sessionID))
|
|
182
|
+
return;
|
|
183
|
+
refresh(session?.location ?? context.location, true);
|
|
184
|
+
}), context.ui.slot({
|
|
185
|
+
append: "home.footer.status",
|
|
186
|
+
render: () => {
|
|
187
|
+
createEffect(() => refresh(context.location, false));
|
|
188
|
+
return _$createComponent(ReadyIndicator, {
|
|
175
189
|
context,
|
|
176
190
|
status: () => status(context.location)
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
];
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}), context.ui.slot({
|
|
194
|
+
append: "sidebar.content",
|
|
195
|
+
render: (input) => {
|
|
196
|
+
const location = () => context.data.session.get(input.sessionID)?.location ?? context.location;
|
|
197
|
+
createEffect(() => refresh(location(), false));
|
|
198
|
+
return _$createComponent(PartitionStatusView, {
|
|
199
|
+
context,
|
|
200
|
+
status: () => status(location())
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
})];
|
|
191
204
|
return () => cleanups.forEach((cleanup) => {
|
|
192
205
|
cleanup();
|
|
193
206
|
});
|
|
@@ -210,88 +223,130 @@ function ReadyIndicator(props) {
|
|
|
210
223
|
return props.context.theme.text.feedback.error.default;
|
|
211
224
|
return props.context.theme.text.subdued;
|
|
212
225
|
};
|
|
213
|
-
return
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
226
|
+
return (() => {
|
|
227
|
+
var _el$ = _$createElement("box"), _el$2 = _$createElement("text"), _el$3 = _$createElement("span"), _el$5 = _$createTextNode(` `), _el$6 = _$createElement("b");
|
|
228
|
+
_$insertNode(_el$, _el$2);
|
|
229
|
+
_$setProp(_el$, "flexShrink", 0);
|
|
230
|
+
_$insertNode(_el$2, _el$3);
|
|
231
|
+
_$insertNode(_el$2, _el$5);
|
|
232
|
+
_$insertNode(_el$2, _el$6);
|
|
233
|
+
_$insertNode(_el$3, _$createTextNode(`•`));
|
|
234
|
+
_$insert(_el$6, () => statusLabel(props.status()));
|
|
235
|
+
_$effect((_p$) => {
|
|
236
|
+
var _v$ = props.context.theme.text.default, _v$2 = {
|
|
237
|
+
fg: color()
|
|
238
|
+
};
|
|
239
|
+
_v$ !== _p$.e && (_p$.e = _$setProp(_el$2, "fg", _v$, _p$.e));
|
|
240
|
+
_v$2 !== _p$.t && (_p$.t = _$setProp(_el$3, "style", _v$2, _p$.t));
|
|
241
|
+
return _p$;
|
|
242
|
+
}, {
|
|
243
|
+
e: undefined,
|
|
244
|
+
t: undefined
|
|
245
|
+
});
|
|
246
|
+
return _el$;
|
|
247
|
+
})();
|
|
229
248
|
}
|
|
230
249
|
function PartitionStatusView(props) {
|
|
231
250
|
const hasError = () => {
|
|
232
251
|
const status = props.status();
|
|
233
252
|
return status.connection === "unavailable" || status.connection === "ready" && [status.user, status.private, status.shared].includes("error");
|
|
234
253
|
};
|
|
235
|
-
return
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
},
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
254
|
+
return (() => {
|
|
255
|
+
var _el$7 = _$createElement("box"), _el$8 = _$createElement("text"), _el$9 = _$createElement("b");
|
|
256
|
+
_$insertNode(_el$7, _el$8);
|
|
257
|
+
_$setProp(_el$7, "gap", 0);
|
|
258
|
+
_$insertNode(_el$8, _el$9);
|
|
259
|
+
_$insertNode(_el$9, _$createTextNode(`Operator Status`));
|
|
260
|
+
_$insert(_el$7, _$createComponent(StatusRow, {
|
|
261
|
+
get context() {
|
|
262
|
+
return props.context;
|
|
263
|
+
},
|
|
264
|
+
label: "User",
|
|
265
|
+
get status() {
|
|
266
|
+
return partition(props.status(), "user");
|
|
267
|
+
}
|
|
268
|
+
}), null);
|
|
269
|
+
_$insert(_el$7, _$createComponent(StatusRow, {
|
|
270
|
+
get context() {
|
|
271
|
+
return props.context;
|
|
272
|
+
},
|
|
273
|
+
label: "Private",
|
|
274
|
+
get status() {
|
|
275
|
+
return partition(props.status(), "private");
|
|
276
|
+
}
|
|
277
|
+
}), null);
|
|
278
|
+
_$insert(_el$7, _$createComponent(StatusRow, {
|
|
279
|
+
get context() {
|
|
280
|
+
return props.context;
|
|
281
|
+
},
|
|
282
|
+
label: "Shared",
|
|
283
|
+
get status() {
|
|
284
|
+
return partition(props.status(), "shared");
|
|
285
|
+
}
|
|
286
|
+
}), null);
|
|
287
|
+
_$insert(_el$7, _$createComponent(Show, {
|
|
288
|
+
get when() {
|
|
289
|
+
return hasError();
|
|
290
|
+
},
|
|
291
|
+
get children() {
|
|
292
|
+
var _el$1 = _$createElement("text");
|
|
293
|
+
_$insertNode(_el$1, _$createTextNode(`Run /operator:repair to repair`));
|
|
294
|
+
_$effect((_$p) => _$setProp(_el$1, "fg", props.context.theme.text.feedback.warning.default, _$p));
|
|
295
|
+
return _el$1;
|
|
296
|
+
}
|
|
297
|
+
}), null);
|
|
298
|
+
_$effect((_$p) => _$setProp(_el$8, "fg", props.context.theme.text.default, _$p));
|
|
299
|
+
return _el$7;
|
|
300
|
+
})();
|
|
268
301
|
}
|
|
269
302
|
function StatusRow(props) {
|
|
270
303
|
const display = () => {
|
|
271
304
|
if (props.status === "checking") {
|
|
272
|
-
return {
|
|
305
|
+
return {
|
|
306
|
+
color: props.context.theme.text.subdued,
|
|
307
|
+
label: "Checking"
|
|
308
|
+
};
|
|
273
309
|
}
|
|
274
310
|
if (props.status === "error") {
|
|
275
|
-
return {
|
|
311
|
+
return {
|
|
312
|
+
color: props.context.theme.text.feedback.error.default,
|
|
313
|
+
label: "Error"
|
|
314
|
+
};
|
|
276
315
|
}
|
|
277
|
-
return props.status === "loaded" ? {
|
|
316
|
+
return props.status === "loaded" ? {
|
|
317
|
+
color: props.context.theme.text.feedback.success.default,
|
|
318
|
+
label: "Loaded"
|
|
319
|
+
} : {
|
|
320
|
+
color: props.context.theme.text.feedback.warning.default,
|
|
321
|
+
label: "Uninitialized"
|
|
322
|
+
};
|
|
278
323
|
};
|
|
279
|
-
return
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
324
|
+
return (() => {
|
|
325
|
+
var _el$11 = _$createElement("text"), _el$12 = _$createElement("span"), _el$14 = _$createTextNode(` `), _el$15 = _$createTextNode(` `), _el$16 = _$createElement("span");
|
|
326
|
+
_$insertNode(_el$11, _el$12);
|
|
327
|
+
_$insertNode(_el$11, _el$14);
|
|
328
|
+
_$insertNode(_el$11, _el$15);
|
|
329
|
+
_$insertNode(_el$11, _el$16);
|
|
330
|
+
_$insertNode(_el$12, _$createTextNode(`•`));
|
|
331
|
+
_$insert(_el$11, () => props.label, _el$15);
|
|
332
|
+
_$insert(_el$16, () => display().label);
|
|
333
|
+
_$effect((_p$) => {
|
|
334
|
+
var _v$3 = props.context.theme.text.default, _v$4 = {
|
|
335
|
+
fg: display().color
|
|
336
|
+
}, _v$5 = {
|
|
337
|
+
fg: props.context.theme.text.subdued
|
|
338
|
+
};
|
|
339
|
+
_v$3 !== _p$.e && (_p$.e = _$setProp(_el$11, "fg", _v$3, _p$.e));
|
|
340
|
+
_v$4 !== _p$.t && (_p$.t = _$setProp(_el$12, "style", _v$4, _p$.t));
|
|
341
|
+
_v$5 !== _p$.a && (_p$.a = _$setProp(_el$16, "style", _v$5, _p$.a));
|
|
342
|
+
return _p$;
|
|
343
|
+
}, {
|
|
344
|
+
e: undefined,
|
|
345
|
+
t: undefined,
|
|
346
|
+
a: undefined
|
|
347
|
+
});
|
|
348
|
+
return _el$11;
|
|
349
|
+
})();
|
|
295
350
|
}
|
|
296
351
|
function partition(status, name) {
|
|
297
352
|
return status.connection === "ready" ? status[name] : "checking";
|
|
@@ -310,7 +365,12 @@ function parseStatus(value) {
|
|
|
310
365
|
return null;
|
|
311
366
|
if (!("shared" in value) || !isPartitionStatus(value.shared))
|
|
312
367
|
return null;
|
|
313
|
-
return {
|
|
368
|
+
return {
|
|
369
|
+
detail: value.detail,
|
|
370
|
+
user: value.user,
|
|
371
|
+
private: value.private,
|
|
372
|
+
shared: value.shared
|
|
373
|
+
};
|
|
314
374
|
}
|
|
315
375
|
function isPartitionStatus(value) {
|
|
316
376
|
return value === "loaded" || value === "uninitialized" || value === "error";
|
|
@@ -324,7 +384,11 @@ function parseToast(value) {
|
|
|
324
384
|
return null;
|
|
325
385
|
if (!("variant" in value) || !isVariant(value.variant))
|
|
326
386
|
return null;
|
|
327
|
-
return {
|
|
387
|
+
return {
|
|
388
|
+
title: value.title,
|
|
389
|
+
message: value.message,
|
|
390
|
+
variant: value.variant
|
|
391
|
+
};
|
|
328
392
|
}
|
|
329
393
|
function isVariant(value) {
|
|
330
394
|
return value === "info" || value === "success" || value === "warning" || value === "error";
|
|
@@ -334,4 +398,4 @@ export {
|
|
|
334
398
|
statusLabel
|
|
335
399
|
};
|
|
336
400
|
|
|
337
|
-
//# debugId=
|
|
401
|
+
//# debugId=A4DA93D4F5754C1A64756E2164756E21
|
package/dist/tui.js.map
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/tui.tsx", "../src/notifications.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { Plugin } from \"@opencode/plugin/tui\";\nimport type { Context } from \"@opencode/plugin/tui/context\";\nimport { createEffect, Show } from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\n\nimport packageJson from \"../package.json\" with { type: \"json\" };\nimport {\n OperatorNotifications,\n type OperatorStatus,\n type OperatorToast,\n type PartitionStatus,\n} from \"./notifications.ts\";\n\ntype Location = Context[\"location\"];\ntype StatusState =\n | { readonly connection: \"connecting\" | \"unavailable\"; readonly detail: string }\n | ({ readonly connection: \"ready\" } & OperatorStatus);\n\nconst OperatorTuiPlugin = Plugin.define({\n id: \"aerovato.operator-memory\",\n setup(context) {\n const [statuses, setStatuses] = createStore<Record<string, StatusState>>({});\n const activeSessions = new Set<string>();\n const pending = new Map<string, Promise<void>>();\n const client = context.client.rpc(OperatorNotifications);\n const status = (location: Location) =>\n statuses[locationKey(location)] ?? {\n connection: \"connecting\",\n detail: `v${packageJson.version}`,\n };\n const refresh = (location: Location, force: boolean): void => {\n const key = locationKey(location);\n if (pending.has(key)) return;\n if (statuses[key]?.connection !== \"ready\") {\n setStatuses(key, {\n connection: \"connecting\",\n detail: statuses[key]?.detail ?? `v${packageJson.version}`,\n });\n }\n const operation = client\n .status({ refresh: force }, location === undefined ? undefined : { location })\n .then(value => {\n const current = parseStatus(value);\n setStatuses(\n key,\n current === null\n ? {\n connection: \"unavailable\",\n detail: statuses[key]?.detail ?? `v${packageJson.version}`,\n }\n : { connection: \"ready\", ...current },\n );\n })\n .catch(() => {\n setStatuses(key, {\n connection: \"unavailable\",\n detail: statuses[key]?.detail ?? `v${packageJson.version}`,\n });\n })\n .finally(() => pending.delete(key));\n pending.set(key, operation);\n };\n\n refresh(context.location, false);\n const cleanups = [\n context.data.listen(event => {\n if (event.details.type !== \"rpc.aerovato.operator-memory.toast\") return;\n const toast = parseToast(event.details.data);\n if (toast === null) return;\n context.ui.toast.show({ ...toast, duration: 10_000 });\n }),\n context.data.on(\"server.connected\", () => refresh(context.location, true)),\n context.data.on(\"session.status\", event => {\n const session = context.data.session.get(event.data.sessionID);\n if (session?.parentID !== undefined) return;\n if (event.data.status.type !== \"idle\") {\n activeSessions.add(event.data.sessionID);\n return;\n }\n if (!activeSessions.delete(event.data.sessionID)) return;\n refresh(session?.location ?? context.location, true);\n }),\n context.ui.slot({\n append: \"home.footer\",\n render: () => <ReadyIndicator context={context} status={() => status(context.location)} />,\n }),\n context.ui.slot({\n append: \"sidebar.content\",\n render: input => {\n const location = () =>\n context.data.session.get(input.sessionID)?.location ?? context.location;\n createEffect(() => refresh(location(), false));\n return <PartitionStatusView context={context} status={() => status(location())} />;\n },\n }),\n ];\n return () =>\n cleanups.forEach(cleanup => {\n cleanup();\n });\n },\n});\n\nexport default OperatorTuiPlugin;\n\nexport function statusLabel(status: StatusState): string {\n const suffix = status.detail.length > 0 ? ` (${status.detail})` : \"\";\n if (status.connection === \"connecting\") return `Operator Connecting...${suffix}`;\n if (status.connection === \"unavailable\") return `Operator Unavailable${suffix}`;\n return `Operator Ready${suffix}`;\n}\n\nfunction ReadyIndicator(props: { readonly context: Context; readonly status: () => StatusState }) {\n const color = () => {\n if (props.status().connection === \"ready\")\n return props.context.theme.text.feedback.success.default;\n if (props.status().connection === \"unavailable\")\n return props.context.theme.text.feedback.error.default;\n return props.context.theme.text.subdued;\n };\n return (\n <box flexShrink={0}>\n <text fg={props.context.theme.text.default}>\n <span style={{ fg: color() }}>•</span> <b>{statusLabel(props.status())}</b>\n </text>\n </box>\n );\n}\n\nfunction PartitionStatusView(props: {\n readonly context: Context;\n readonly status: () => StatusState;\n}) {\n const hasError = () => {\n const status = props.status();\n return (\n status.connection === \"unavailable\"\n || (status.connection === \"ready\"\n && [status.user, status.private, status.shared].includes(\"error\"))\n );\n };\n return (\n <box gap={0}>\n <text fg={props.context.theme.text.default}>\n <b>Operator Status</b>\n </text>\n <StatusRow context={props.context} label=\"User\" status={partition(props.status(), \"user\")} />\n <StatusRow\n context={props.context}\n label=\"Private\"\n status={partition(props.status(), \"private\")}\n />\n <StatusRow\n context={props.context}\n label=\"Shared\"\n status={partition(props.status(), \"shared\")}\n />\n <Show when={hasError()}>\n <text fg={props.context.theme.text.feedback.warning.default}>\n Run /operator:repair to repair\n </text>\n </Show>\n </box>\n );\n}\n\nfunction StatusRow(props: {\n readonly context: Context;\n readonly label: string;\n readonly status: PartitionStatus | \"checking\";\n}) {\n const display = () => {\n if (props.status === \"checking\") {\n return { color: props.context.theme.text.subdued, label: \"Checking\" };\n }\n if (props.status === \"error\") {\n return { color: props.context.theme.text.feedback.error.default, label: \"Error\" };\n }\n return props.status === \"loaded\"\n ? { color: props.context.theme.text.feedback.success.default, label: \"Loaded\" }\n : { color: props.context.theme.text.feedback.warning.default, label: \"Uninitialized\" };\n };\n return (\n <text fg={props.context.theme.text.default}>\n <span style={{ fg: display().color }}>•</span> {props.label}{\" \"}\n <span style={{ fg: props.context.theme.text.subdued }}>{display().label}</span>\n </text>\n );\n}\n\nfunction partition(\n status: StatusState,\n name: \"user\" | \"private\" | \"shared\",\n): PartitionStatus | \"checking\" {\n return status.connection === \"ready\" ? status[name] : \"checking\";\n}\n\nfunction locationKey(location: Location): string {\n return JSON.stringify(location ?? null);\n}\n\nfunction parseStatus(value: unknown): OperatorStatus | null {\n if (value === null || typeof value !== \"object\") return null;\n if (!(\"detail\" in value) || typeof value.detail !== \"string\") return null;\n if (!(\"user\" in value) || !isPartitionStatus(value.user)) return null;\n if (!(\"private\" in value) || !isPartitionStatus(value.private)) return null;\n if (!(\"shared\" in value) || !isPartitionStatus(value.shared)) return null;\n return { detail: value.detail, user: value.user, private: value.private, shared: value.shared };\n}\n\nfunction isPartitionStatus(value: unknown): value is PartitionStatus {\n return value === \"loaded\" || value === \"uninitialized\" || value === \"error\";\n}\n\nfunction parseToast(value: unknown): OperatorToast | null {\n if (value === null || typeof value !== \"object\") return null;\n if (!(\"title\" in value) || typeof value.title !== \"string\") return null;\n if (!(\"message\" in value) || typeof value.message !== \"string\") return null;\n if (!(\"variant\" in value) || !isVariant(value.variant)) return null;\n return { title: value.title, message: value.message, variant: value.variant };\n}\n\nfunction isVariant(value: unknown): value is OperatorToast[\"variant\"] {\n return value === \"info\" || value === \"success\" || value === \"warning\" || value === \"error\";\n}\n",
|
|
5
|
+
"import { effect as _$effect } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\nimport { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { Plugin } from \"@opencode/plugin/tui\";\nimport { createEffect, Show } from \"solid-js\";\nimport { createStore } from \"solid-js/store\";\nimport packageJson from \"../package.json\" with { type: \"json\" };\nimport { OperatorNotifications } from \"./notifications.ts\";\nconst OperatorTuiPlugin = Plugin.define({\n id: \"aerovato.operator-memory\",\n setup(context) {\n const [statuses, setStatuses] = createStore({});\n const activeSessions = new Set();\n const pending = new Map();\n const client = context.client.rpc(OperatorNotifications);\n const status = location => statuses[locationKey(location)] ?? {\n connection: \"connecting\",\n detail: `v${packageJson.version}`\n };\n const refresh = (location, force) => {\n const key = locationKey(location);\n if (pending.has(key)) return;\n if (statuses[key]?.connection !== \"ready\") {\n setStatuses(key, {\n connection: \"connecting\",\n detail: statuses[key]?.detail ?? `v${packageJson.version}`\n });\n }\n const operation = client.status({\n refresh: force\n }, location === undefined ? undefined : {\n location\n }).then(value => {\n const current = parseStatus(value);\n setStatuses(key, current === null ? {\n connection: \"unavailable\",\n detail: statuses[key]?.detail ?? `v${packageJson.version}`\n } : {\n connection: \"ready\",\n ...current\n });\n }).catch(() => {\n setStatuses(key, {\n connection: \"unavailable\",\n detail: statuses[key]?.detail ?? `v${packageJson.version}`\n });\n }).finally(() => pending.delete(key));\n pending.set(key, operation);\n };\n refresh(context.location, false);\n const cleanups = [context.data.listen(event => {\n if (event.details.type !== \"rpc.aerovato.operator-memory.toast\") return;\n const toast = parseToast(event.details.data);\n if (toast === null) return;\n context.ui.toast.show({\n ...toast,\n duration: 10_000\n });\n }), context.data.on(\"server.connected\", () => refresh(context.location, true)), context.data.on(\"session.status\", event => {\n const session = context.data.session.get(event.data.sessionID);\n if (session?.parentID !== undefined) return;\n if (event.data.status.type !== \"idle\") {\n activeSessions.add(event.data.sessionID);\n return;\n }\n if (!activeSessions.delete(event.data.sessionID)) return;\n refresh(session?.location ?? context.location, true);\n }), context.ui.slot({\n append: \"home.footer.status\",\n render: () => {\n createEffect(() => refresh(context.location, false));\n return _$createComponent(ReadyIndicator, {\n context: context,\n status: () => status(context.location)\n });\n }\n }), context.ui.slot({\n append: \"sidebar.content\",\n render: input => {\n const location = () => context.data.session.get(input.sessionID)?.location ?? context.location;\n createEffect(() => refresh(location(), false));\n return _$createComponent(PartitionStatusView, {\n context: context,\n status: () => status(location())\n });\n }\n })];\n return () => cleanups.forEach(cleanup => {\n cleanup();\n });\n }\n});\nexport default OperatorTuiPlugin;\nexport function statusLabel(status) {\n const suffix = status.detail.length > 0 ? ` (${status.detail})` : \"\";\n if (status.connection === \"connecting\") return `Operator Connecting...${suffix}`;\n if (status.connection === \"unavailable\") return `Operator Unavailable${suffix}`;\n return `Operator Ready${suffix}`;\n}\nfunction ReadyIndicator(props) {\n const color = () => {\n if (props.status().connection === \"ready\") return props.context.theme.text.feedback.success.default;\n if (props.status().connection === \"unavailable\") return props.context.theme.text.feedback.error.default;\n return props.context.theme.text.subdued;\n };\n return (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"text\"),\n _el$3 = _$createElement(\"span\"),\n _el$5 = _$createTextNode(` `),\n _el$6 = _$createElement(\"b\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"flexShrink\", 0);\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$5);\n _$insertNode(_el$2, _el$6);\n _$insertNode(_el$3, _$createTextNode(`•`));\n _$insert(_el$6, () => statusLabel(props.status()));\n _$effect(_p$ => {\n var _v$ = props.context.theme.text.default,\n _v$2 = {\n fg: color()\n };\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$2, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$3, \"style\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })();\n}\nfunction PartitionStatusView(props) {\n const hasError = () => {\n const status = props.status();\n return status.connection === \"unavailable\" || status.connection === \"ready\" && [status.user, status.private, status.shared].includes(\"error\");\n };\n return (() => {\n var _el$7 = _$createElement(\"box\"),\n _el$8 = _$createElement(\"text\"),\n _el$9 = _$createElement(\"b\");\n _$insertNode(_el$7, _el$8);\n _$setProp(_el$7, \"gap\", 0);\n _$insertNode(_el$8, _el$9);\n _$insertNode(_el$9, _$createTextNode(`Operator Status`));\n _$insert(_el$7, _$createComponent(StatusRow, {\n get context() {\n return props.context;\n },\n label: \"User\",\n get status() {\n return partition(props.status(), \"user\");\n }\n }), null);\n _$insert(_el$7, _$createComponent(StatusRow, {\n get context() {\n return props.context;\n },\n label: \"Private\",\n get status() {\n return partition(props.status(), \"private\");\n }\n }), null);\n _$insert(_el$7, _$createComponent(StatusRow, {\n get context() {\n return props.context;\n },\n label: \"Shared\",\n get status() {\n return partition(props.status(), \"shared\");\n }\n }), null);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return hasError();\n },\n get children() {\n var _el$1 = _$createElement(\"text\");\n _$insertNode(_el$1, _$createTextNode(`Run /operator:repair to repair`));\n _$effect(_$p => _$setProp(_el$1, \"fg\", props.context.theme.text.feedback.warning.default, _$p));\n return _el$1;\n }\n }), null);\n _$effect(_$p => _$setProp(_el$8, \"fg\", props.context.theme.text.default, _$p));\n return _el$7;\n })();\n}\nfunction StatusRow(props) {\n const display = () => {\n if (props.status === \"checking\") {\n return {\n color: props.context.theme.text.subdued,\n label: \"Checking\"\n };\n }\n if (props.status === \"error\") {\n return {\n color: props.context.theme.text.feedback.error.default,\n label: \"Error\"\n };\n }\n return props.status === \"loaded\" ? {\n color: props.context.theme.text.feedback.success.default,\n label: \"Loaded\"\n } : {\n color: props.context.theme.text.feedback.warning.default,\n label: \"Uninitialized\"\n };\n };\n return (() => {\n var _el$11 = _$createElement(\"text\"),\n _el$12 = _$createElement(\"span\"),\n _el$14 = _$createTextNode(` `),\n _el$15 = _$createTextNode(` `),\n _el$16 = _$createElement(\"span\");\n _$insertNode(_el$11, _el$12);\n _$insertNode(_el$11, _el$14);\n _$insertNode(_el$11, _el$15);\n _$insertNode(_el$11, _el$16);\n _$insertNode(_el$12, _$createTextNode(`•`));\n _$insert(_el$11, () => props.label, _el$15);\n _$insert(_el$16, () => display().label);\n _$effect(_p$ => {\n var _v$3 = props.context.theme.text.default,\n _v$4 = {\n fg: display().color\n },\n _v$5 = {\n fg: props.context.theme.text.subdued\n };\n _v$3 !== _p$.e && (_p$.e = _$setProp(_el$11, \"fg\", _v$3, _p$.e));\n _v$4 !== _p$.t && (_p$.t = _$setProp(_el$12, \"style\", _v$4, _p$.t));\n _v$5 !== _p$.a && (_p$.a = _$setProp(_el$16, \"style\", _v$5, _p$.a));\n return _p$;\n }, {\n e: undefined,\n t: undefined,\n a: undefined\n });\n return _el$11;\n })();\n}\nfunction partition(status, name) {\n return status.connection === \"ready\" ? status[name] : \"checking\";\n}\nfunction locationKey(location) {\n return JSON.stringify(location ?? null);\n}\nfunction parseStatus(value) {\n if (value === null || typeof value !== \"object\") return null;\n if (!(\"detail\" in value) || typeof value.detail !== \"string\") return null;\n if (!(\"user\" in value) || !isPartitionStatus(value.user)) return null;\n if (!(\"private\" in value) || !isPartitionStatus(value.private)) return null;\n if (!(\"shared\" in value) || !isPartitionStatus(value.shared)) return null;\n return {\n detail: value.detail,\n user: value.user,\n private: value.private,\n shared: value.shared\n };\n}\nfunction isPartitionStatus(value) {\n return value === \"loaded\" || value === \"uninitialized\" || value === \"error\";\n}\nfunction parseToast(value) {\n if (value === null || typeof value !== \"object\") return null;\n if (!(\"title\" in value) || typeof value.title !== \"string\") return null;\n if (!(\"message\" in value) || typeof value.message !== \"string\") return null;\n if (!(\"variant\" in value) || !isVariant(value.variant)) return null;\n return {\n title: value.title,\n message: value.message,\n variant: value.variant\n };\n}\nfunction isVariant(value) {\n return value === \"info\" || value === \"success\" || value === \"warning\" || value === \"error\";\n}",
|
|
6
6
|
"import { Rpc } from \"@opencode/plugin/rpc\";\n\nexport const OperatorNotifications = Rpc.define({\n id: \"aerovato.operator-memory\",\n methods: {\n status: {\n input: {\n type: \"object\",\n properties: { refresh: { type: \"boolean\" } },\n required: [\"refresh\"],\n },\n output: {\n type: \"object\",\n properties: {\n detail: { type: \"string\" },\n user: { enum: [\"loaded\", \"uninitialized\", \"error\"] },\n private: { enum: [\"loaded\", \"uninitialized\", \"error\"] },\n shared: { enum: [\"loaded\", \"uninitialized\", \"error\"] },\n },\n required: [\"detail\", \"user\", \"private\", \"shared\"],\n },\n },\n },\n events: {\n toast: {\n schema: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n message: { type: \"string\" },\n variant: { enum: [\"info\", \"success\", \"warning\", \"error\"] },\n },\n required: [\"title\", \"message\", \"variant\"],\n },\n },\n },\n});\n\nexport type OperatorToast = {\n readonly title: string;\n readonly message: string;\n readonly variant: \"info\" | \"success\" | \"warning\" | \"error\";\n};\n\nexport type PartitionStatus = \"loaded\" | \"uninitialized\" | \"error\";\n\nexport type OperatorStatus = {\n readonly detail: string;\n readonly user: PartitionStatus;\n readonly private: PartitionStatus;\n readonly shared: PartitionStatus;\n};\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": ";AAAA;
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "A4DA93D4F5754C1A64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|