@sbugallo/opencode-vpet 0.1.1 → 0.3.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.
Files changed (46) hide show
  1. package/README.md +4 -5
  2. package/dist/adapters/opencode/server-plugin.d.ts +78 -0
  3. package/dist/adapters/opencode/server-plugin.d.ts.map +1 -0
  4. package/dist/adapters/opencode/session-messages.d.ts +4 -9
  5. package/dist/adapters/opencode/session-messages.d.ts.map +1 -1
  6. package/dist/adapters/opencode/usage-event-mapper.d.ts +6 -3
  7. package/dist/adapters/opencode/usage-event-mapper.d.ts.map +1 -1
  8. package/dist/adapters/opencode/vpet-toast.d.ts +4 -2
  9. package/dist/adapters/opencode/vpet-toast.d.ts.map +1 -1
  10. package/dist/cli/install.d.ts.map +1 -1
  11. package/dist/cli.js +3 -3
  12. package/dist/cli.js.map +4 -4
  13. package/dist/commands/vpet-command-result.d.ts +2 -2
  14. package/dist/commands/vpet-command-result.d.ts.map +1 -1
  15. package/dist/commands/vpet-freeze.d.ts +1 -5
  16. package/dist/commands/vpet-freeze.d.ts.map +1 -1
  17. package/dist/commands/vpet-set.d.ts +0 -2
  18. package/dist/commands/vpet-set.d.ts.map +1 -1
  19. package/dist/commands/vpet-spawn.d.ts +0 -2
  20. package/dist/commands/vpet-spawn.d.ts.map +1 -1
  21. package/dist/commands/vpet-unfreeze.d.ts +1 -5
  22. package/dist/commands/vpet-unfreeze.d.ts.map +1 -1
  23. package/dist/index.d.ts +4 -8
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +535 -470
  26. package/dist/index.js.map +22 -21
  27. package/dist/package.json +10 -0
  28. package/dist/rpc.d.ts +32 -0
  29. package/dist/rpc.d.ts.map +1 -0
  30. package/dist/tui/sidebar-card.d.ts +6 -0
  31. package/dist/tui/sidebar-card.d.ts.map +1 -1
  32. package/dist/tui/theme.d.ts +34 -0
  33. package/dist/tui/theme.d.ts.map +1 -0
  34. package/dist/tui/vpet-command-layer.d.ts +33 -5
  35. package/dist/tui/vpet-command-layer.d.ts.map +1 -1
  36. package/dist/tui/vpet-dex-dialog.d.ts +2 -2
  37. package/dist/tui/vpet-dex-dialog.d.ts.map +1 -1
  38. package/dist/tui/vpet-history-dialog.d.ts +2 -2
  39. package/dist/tui/vpet-history-dialog.d.ts.map +1 -1
  40. package/dist/tui.d.ts +23 -12
  41. package/dist/tui.d.ts.map +1 -1
  42. package/dist/tui.js +220 -78
  43. package/dist/tui.js.map +11 -8
  44. package/package.json +9 -12
  45. package/dist/adapters/opencode/create-server-hooks.d.ts +0 -39
  46. package/dist/adapters/opencode/create-server-hooks.d.ts.map +0 -1
package/dist/tui.js CHANGED
@@ -1,7 +1,81 @@
1
1
  // @bun
2
2
  // src/tui.tsx
3
+ import { Plugin } from "@opencode/plugin/tui";
3
4
  import { createSignal } from "solid-js";
4
5
 
6
+ // src/adapters/opencode/vpet-toast.ts
7
+ var toVpetToastPayload = (data) => {
8
+ if (typeof data !== "object" || data === null || Array.isArray(data))
9
+ return;
10
+ const { title, message, variant, duration } = data;
11
+ if (typeof title !== "string" || typeof message !== "string" || variant !== "info" && variant !== "success" && variant !== "warning" || typeof duration !== "number") {
12
+ return;
13
+ }
14
+ return { title, message, variant, duration };
15
+ };
16
+ var assertNever = (value) => {
17
+ throw new Error(`Unhandled VPet toast event: ${JSON.stringify(value)}`);
18
+ };
19
+ var selectName = (node, language) => {
20
+ switch (language) {
21
+ case "en":
22
+ return node.nameEn;
23
+ case "jp":
24
+ return node.nameJp;
25
+ default:
26
+ return assertNever(language);
27
+ }
28
+ };
29
+ var namedPayload = (nodeId, language, catalog) => {
30
+ const node = catalog.byId.get(nodeId);
31
+ return node === undefined ? undefined : selectName(node, language);
32
+ };
33
+ var formatVpetToast = (event, language, catalog) => {
34
+ switch (event.kind) {
35
+ case "spawn": {
36
+ const name = namedPayload(event.nodeId, language, catalog);
37
+ return name === undefined ? undefined : {
38
+ title: "VPet",
39
+ message: `Spawned ${name} (Generation ${event.generation}).`,
40
+ variant: "success",
41
+ duration: 5000
42
+ };
43
+ }
44
+ case "freeze":
45
+ return { title: "VPet", message: "Digimon progression frozen.", variant: "info", duration: 3000 };
46
+ case "unfreeze":
47
+ return { title: "VPet", message: "Digimon progression resumed.", variant: "info", duration: 3000 };
48
+ case "set": {
49
+ const name = namedPayload(event.nodeId, language, catalog);
50
+ return name === undefined ? undefined : {
51
+ title: "VPet",
52
+ message: `VPet set to ${name} (${event.nodeId}).`,
53
+ variant: "info",
54
+ duration: 3000
55
+ };
56
+ }
57
+ case "evolution": {
58
+ const fromName = namedPayload(event.fromNodeId, language, catalog);
59
+ const toName = namedPayload(event.toNodeId, language, catalog);
60
+ return fromName === undefined || toName === undefined ? undefined : {
61
+ title: "Digi-evolution",
62
+ message: `${fromName} evolved into ${toName}!`,
63
+ variant: "success",
64
+ duration: 5000
65
+ };
66
+ }
67
+ default:
68
+ return assertNever(event);
69
+ }
70
+ };
71
+ var createBestEffortVpetToastNotifier = (transport) => {
72
+ return async (payload) => await Promise.resolve().then(() => transport(payload)).then(() => {
73
+ return;
74
+ }, () => {
75
+ return;
76
+ });
77
+ };
78
+
5
79
  // src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts
6
80
  import { existsSync } from "fs";
7
81
 
@@ -57877,6 +57951,28 @@ var MONSTER_FRAME_CATALOG = new MonsterFrameCatalog(MONSTER_FRAME_DATA.map(([spr
57877
57951
  frames.map(([frameName, content]) => [frameName, new MonsterFrame(content)])
57878
57952
  ]));
57879
57953
 
57954
+ // src/rpc.ts
57955
+ import { Rpc } from "@opencode/plugin/rpc";
57956
+ var VpetRpc = Rpc.define({
57957
+ id: "vpet",
57958
+ methods: {},
57959
+ events: {
57960
+ toast: {
57961
+ schema: {
57962
+ type: "object",
57963
+ properties: {
57964
+ title: { type: "string" },
57965
+ message: { type: "string" },
57966
+ variant: { enum: ["info", "success", "warning"] },
57967
+ duration: { type: "number" }
57968
+ },
57969
+ required: ["title", "message", "variant", "duration"],
57970
+ additionalProperties: false
57971
+ }
57972
+ }
57973
+ }
57974
+ });
57975
+
57880
57976
  // src/tui/sidebar-card.tsx
57881
57977
  import { createTextAttributes } from "@opentui/core";
57882
57978
  import { createEffect } from "solid-js";
@@ -57980,7 +58076,6 @@ var ARTWORK_COLUMNS = 16;
57980
58076
  var NEXT_CHECK_PREFIX = "Next check: ";
57981
58077
  var URL_LABEL = "Encyclopedia entry";
57982
58078
  var LINK_ATTRIBUTES = createTextAttributes({ underline: true });
57983
- var LINK_COLOR = "#5f87ff";
57984
58079
  var formatCount = (value) => value.toLocaleString("en-US");
57985
58080
  var positionedOutput = (animation) => {
57986
58081
  if ("result" in animation)
@@ -58036,10 +58131,12 @@ var VpetSidebarCard = (props) => {
58036
58131
  let artworkWidth;
58037
58132
  let nextCheckWidth;
58038
58133
  let reportedArtworkWidth;
58039
- const updateText = (renderable, content) => {
58134
+ const updateText = (renderable, content, color) => {
58040
58135
  if (renderable === undefined)
58041
58136
  return;
58042
58137
  renderable.content = content;
58138
+ if (color !== undefined)
58139
+ renderable.fg = color;
58043
58140
  renderable.requestRender();
58044
58141
  };
58045
58142
  const handleUrlClick = () => {
@@ -58050,23 +58147,25 @@ var VpetSidebarCard = (props) => {
58050
58147
  };
58051
58148
  const renderCard = () => {
58052
58149
  const model = props.model();
58150
+ const theme = props.theme?.();
58151
+ const textColor = theme?.current.text;
58053
58152
  for (const [index, content] of artworkRows(props.animation(), Math.floor(artworkWidth?.width ?? 0)).entries()) {
58054
- updateText(artwork[index], content);
58153
+ updateText(artwork[index], content, textColor);
58055
58154
  }
58056
58155
  switch (model.kind) {
58057
58156
  case "no_partner":
58058
- updateText(name, model.messageLine);
58157
+ updateText(name, model.messageLine, textColor);
58059
58158
  updateText(stage, "");
58060
58159
  updateText(nextCheck, "");
58061
58160
  updateText(gauge, "");
58062
58161
  updateText(url, "");
58063
58162
  return;
58064
58163
  case "partner":
58065
- updateText(name, model.isSetOverride ? `${model.name} (set)` : model.name);
58066
- updateText(stage, model.frozen ? `${model.stage} (frozen)` : model.stage);
58067
- updateText(nextCheck, buildNextCheckLine(model, nextCheckWidth?.width ?? 0));
58068
- updateText(gauge, model.isTerminal ? "-/-" : `${formatCount(model.gauge)}/${formatCount(model.threshold)}`);
58069
- updateText(url, URL_LABEL);
58164
+ updateText(name, model.isSetOverride ? `${model.name} (set)` : model.name, textColor);
58165
+ updateText(stage, model.frozen ? `${model.stage} (frozen)` : model.stage, textColor);
58166
+ updateText(nextCheck, buildNextCheckLine(model, nextCheckWidth?.width ?? 0), textColor);
58167
+ updateText(gauge, model.isTerminal ? "-/-" : `${formatCount(model.gauge)}/${formatCount(model.threshold)}`, textColor);
58168
+ updateText(url, URL_LABEL, theme?.current.accent);
58070
58169
  return;
58071
58170
  }
58072
58171
  };
@@ -58140,7 +58239,6 @@ var VpetSidebarCard = (props) => {
58140
58239
  /* @__PURE__ */ jsxDEV("text", {
58141
58240
  wrapMode: "none",
58142
58241
  truncate: true,
58143
- fg: LINK_COLOR,
58144
58242
  attributes: LINK_ATTRIBUTES,
58145
58243
  onMouseDown: handleUrlClick,
58146
58244
  ref: (renderable) => {
@@ -58194,7 +58292,7 @@ var normalizedRandom = (random) => {
58194
58292
  };
58195
58293
 
58196
58294
  // src/tui/monster-walking-policy.ts
58197
- var assertNever = (value) => {
58295
+ var assertNever2 = (value) => {
58198
58296
  throw new Error(`Unexpected walking policy variant: ${JSON.stringify(value)}`);
58199
58297
  };
58200
58298
  var initialWalkingPolicy = (frameName) => ({
@@ -58229,7 +58327,7 @@ var tickWalkingPolicy = (state, sprite, catalog) => {
58229
58327
  case "queued_action":
58230
58328
  return { kind: "action", action: state };
58231
58329
  default:
58232
- return assertNever(state.bout);
58330
+ return assertNever2(state.bout);
58233
58331
  }
58234
58332
  };
58235
58333
  var resizeWalkingPolicy = (state, width, random) => {
@@ -58246,7 +58344,7 @@ var resizeWalkingPolicy = (state, width, random) => {
58246
58344
  case "suspended":
58247
58345
  return planBout({ ...resized, bout: { kind: "suspended" } }, random);
58248
58346
  default:
58249
- return assertNever(state.bout);
58347
+ return assertNever2(state.bout);
58250
58348
  }
58251
58349
  };
58252
58350
  var resizeActionBoundary = (state, width) => {
@@ -58299,7 +58397,7 @@ var normalizedRandom2 = (random) => {
58299
58397
  // src/tui/monster-animation.ts
58300
58398
  var ORIGIN = { offset: 0, facing: "left" };
58301
58399
  var SLEEP_AFTER_MS = 300000;
58302
- var assertNever2 = (value) => {
58400
+ var assertNever3 = (value) => {
58303
58401
  throw new Error(`Unexpected monster animation variant: ${JSON.stringify(value)}`);
58304
58402
  };
58305
58403
  var sameIdentity = (left, right) => left.sprite === right.sprite && left.isDigitama === right.isDigitama;
@@ -58333,7 +58431,7 @@ class MonsterAnimationController {
58333
58431
  this.#state = this.#resize(event.width);
58334
58432
  break;
58335
58433
  default:
58336
- return assertNever2(event);
58434
+ return assertNever3(event);
58337
58435
  }
58338
58436
  return this.output();
58339
58437
  }
@@ -58368,7 +58466,7 @@ class MonsterAnimationController {
58368
58466
  facing: state.boundary.facing
58369
58467
  };
58370
58468
  default:
58371
- return assertNever2(state);
58469
+ return assertNever3(state);
58372
58470
  }
58373
58471
  }
58374
58472
  setSprite(sprite) {
@@ -58422,7 +58520,7 @@ class MonsterAnimationController {
58422
58520
  case "sleeping":
58423
58521
  return { ...state, phase: state.phase === 0 ? 1 : 0 };
58424
58522
  default:
58425
- return assertNever2(state);
58523
+ return assertNever3(state);
58426
58524
  }
58427
58525
  }
58428
58526
  #tickWalking(state) {
@@ -58433,7 +58531,7 @@ class MonsterAnimationController {
58433
58531
  case "action":
58434
58532
  return this.#startAction(state.identity, tick.action);
58435
58533
  default:
58436
- return assertNever2(tick);
58534
+ return assertNever3(tick);
58437
58535
  }
58438
58536
  }
58439
58537
  #resize(width) {
@@ -58494,7 +58592,7 @@ class MonsterAnimationController {
58494
58592
  case "sleeping":
58495
58593
  return state.identity;
58496
58594
  default:
58497
- return assertNever2(state);
58595
+ return assertNever3(state);
58498
58596
  }
58499
58597
  }
58500
58598
  #firstWalkFrame(sprite) {
@@ -58618,9 +58716,20 @@ var buildSidebarCardModel = (inputs, settings = DEFAULT_VPET_SETTINGS) => {
58618
58716
  };
58619
58717
  };
58620
58718
 
58719
+ // src/tui/theme.ts
58720
+ var toVpetTheme = (theme) => ({
58721
+ current: {
58722
+ text: theme.text.base,
58723
+ accent: theme.hue.accent[200] ?? theme.text.action.primary.base,
58724
+ primary: theme.text.action.primary.base,
58725
+ success: theme.text.feedback.success.base,
58726
+ textMuted: theme.text.muted
58727
+ }
58728
+ });
58729
+
58621
58730
  // src/tui/dex-view-model.ts
58622
58731
  var REDACTED_NAME = "------";
58623
- var assertNever3 = (value) => {
58732
+ var assertNever4 = (value) => {
58624
58733
  throw new Error(`Unexpected archive result: ${JSON.stringify(value)}`);
58625
58734
  };
58626
58735
  var compareCatalogNodes = (left, right) => {
@@ -58666,12 +58775,12 @@ var buildDexViewModel = (archive, catalog, settings) => {
58666
58775
  case "unavailable":
58667
58776
  return { kind: "unavailable", message: archive.message };
58668
58777
  default:
58669
- return assertNever3(archive);
58778
+ return assertNever4(archive);
58670
58779
  }
58671
58780
  };
58672
58781
 
58673
58782
  // src/tui/history-view-model.ts
58674
- var assertNever4 = (value) => {
58783
+ var assertNever5 = (value) => {
58675
58784
  throw new Error(`Unexpected archive result: ${JSON.stringify(value)}`);
58676
58785
  };
58677
58786
  var comparePartners = (left, right) => {
@@ -58716,7 +58825,7 @@ var buildHistoryViewModel = (archive, catalog, settings) => {
58716
58825
  case "unavailable":
58717
58826
  return { kind: "unavailable", message: archive.message };
58718
58827
  default:
58719
- return assertNever4(archive);
58828
+ return assertNever5(archive);
58720
58829
  }
58721
58830
  };
58722
58831
 
@@ -59016,7 +59125,7 @@ var registerVpetCommandLayer = ({
59016
59125
  const model = buildDexViewModel(readArchive(reader), catalog, settings);
59017
59126
  isDialogOpen = true;
59018
59127
  api.ui.dialog.replace(() => /* @__PURE__ */ jsxDEV4(VpetDexDialog, {
59019
- theme: api.theme,
59128
+ theme: api.theme(),
59020
59129
  model,
59021
59130
  onClose: closeDialog
59022
59131
  }, undefined, false, undefined, this), closeDialog);
@@ -59028,32 +59137,32 @@ var registerVpetCommandLayer = ({
59028
59137
  const model = buildHistoryViewModel(readArchive(reader), catalog, settings);
59029
59138
  isDialogOpen = true;
59030
59139
  api.ui.dialog.replace(() => /* @__PURE__ */ jsxDEV4(VpetHistoryDialog, {
59031
- theme: api.theme,
59140
+ theme: api.theme(),
59032
59141
  model,
59033
59142
  onClose: closeDialog
59034
59143
  }, undefined, false, undefined, this), closeDialog);
59035
59144
  api.ui.dialog.setSize("medium");
59036
59145
  };
59037
59146
  const disposeLayer = api.keymap.registerLayer({
59038
- name: "opencode-vpet.layer",
59039
- namespace: "opencode-vpet",
59147
+ mode: "global",
59148
+ priority: 10,
59040
59149
  commands: [
59041
59150
  {
59042
- name: "vpet.dex",
59151
+ id: "vpet.dex",
59043
59152
  title: "VPet Dex",
59044
59153
  description: "Browse the VPet discovery archive.",
59045
- category: "VPet",
59046
- namespace: "palette",
59047
- slashName: "vpet-dex",
59154
+ group: "VPet",
59155
+ palette: true,
59156
+ slash: { name: "vpet-dex" },
59048
59157
  run: openDex
59049
59158
  },
59050
59159
  {
59051
- name: "vpet.history",
59160
+ id: "vpet.history",
59052
59161
  title: "VPet History",
59053
59162
  description: "Browse VPet generation history.",
59054
- category: "VPet",
59055
- namespace: "palette",
59056
- slashName: "vpet-history",
59163
+ group: "VPet",
59164
+ palette: true,
59165
+ slash: { name: "vpet-history" },
59057
59166
  run: openHistory
59058
59167
  }
59059
59168
  ]
@@ -59071,7 +59180,7 @@ var registerVpetCommandLayer = ({
59071
59180
  import { jsxDEV as jsxDEV5 } from "@opentui/solid/jsx-dev-runtime";
59072
59181
  var VISUAL_INTERVAL_MS = 500;
59073
59182
  var getStringOption = (options, name) => {
59074
- const value = options?.[name];
59183
+ const value = options[name];
59075
59184
  return typeof value === "string" ? value : undefined;
59076
59185
  };
59077
59186
  var readerOptions = (options) => {
@@ -59139,10 +59248,11 @@ var createTui = (loadInputs, settings, scheduling = {}) => async (api) => {
59139
59248
  api.renderer.requestRender();
59140
59249
  };
59141
59250
  const unsubscribes = [
59142
- api.event.on("message.updated", activity),
59143
- api.event.on("message.part.updated", activity),
59251
+ api.event.on("session.text.delta", activity),
59252
+ api.event.on("session.tool.called", activity),
59253
+ api.event.on("session.execution.succeeded", activity),
59144
59254
  api.event.on("session.status", (event) => {
59145
- switch (event.properties.status.type) {
59255
+ switch (event.data.status.type) {
59146
59256
  case "busy":
59147
59257
  case "retry":
59148
59258
  activity();
@@ -59150,7 +59260,7 @@ var createTui = (loadInputs, settings, scheduling = {}) => async (api) => {
59150
59260
  case "idle":
59151
59261
  return;
59152
59262
  default: {
59153
- const unexpectedStatus = event.properties.status;
59263
+ const unexpectedStatus = event.data.status;
59154
59264
  return unexpectedStatus;
59155
59265
  }
59156
59266
  }
@@ -59159,11 +59269,7 @@ var createTui = (loadInputs, settings, scheduling = {}) => async (api) => {
59159
59269
  poller.start();
59160
59270
  const disposeLayer = api.keymap === undefined || api.ui === undefined || api.theme === undefined ? () => {
59161
59271
  return;
59162
- } : scheduling.archiveReader === undefined ? api.keymap.registerLayer({
59163
- name: "opencode-vpet.layer",
59164
- namespace: "opencode-vpet",
59165
- commands: []
59166
- }) : registerVpetCommandLayer({
59272
+ } : scheduling.archiveReader === undefined ? api.keymap.registerLayer({ commands: [] }) : registerVpetCommandLayer({
59167
59273
  api: { keymap: api.keymap, ui: api.ui, theme: api.theme },
59168
59274
  reader: scheduling.archiveReader,
59169
59275
  catalog: DIGIMON_CATALOG,
@@ -59186,6 +59292,7 @@ var createTui = (loadInputs, settings, scheduling = {}) => async (api) => {
59186
59292
  return /* @__PURE__ */ jsxDEV5(VpetSidebarCard, {
59187
59293
  model: () => buildSidebarCardModel(inputs(), settings),
59188
59294
  animation,
59295
+ theme: api.theme,
59189
59296
  onArtworkWidthChange: (width) => {
59190
59297
  if (disposed)
59191
59298
  return;
@@ -59197,45 +59304,80 @@ var createTui = (loadInputs, settings, scheduling = {}) => async (api) => {
59197
59304
  }
59198
59305
  });
59199
59306
  };
59200
- var tui = async (api, options) => {
59201
- const reader = createSqliteSidebarSnapshotReader(readerOptions(options));
59202
- const archiveReader = createSqliteVpetArchiveReader(readerOptions(options));
59203
- const settings = await loadGlobalVpetSettings();
59204
- await createTui(() => getSidebarCardInputs(reader, DIGIMON_CATALOG), settings, { archiveReader })({
59205
- event: {
59206
- on: (...subscription) => {
59207
- switch (subscription[0]) {
59208
- case "message.updated":
59209
- return api.event.on(subscription[0], subscription[1]);
59210
- case "message.part.updated":
59211
- return api.event.on(subscription[0], subscription[1]);
59212
- case "session.status":
59213
- return api.event.on(subscription[0], subscription[1]);
59307
+ var plugin = Plugin.define({
59308
+ id: "opencode-vpet.tui",
59309
+ async setup(context) {
59310
+ const reader = createSqliteSidebarSnapshotReader(readerOptions(context.options));
59311
+ const archiveReader = createSqliteVpetArchiveReader(readerOptions(context.options));
59312
+ const settings = await loadGlobalVpetSettings();
59313
+ const cleanups = [];
59314
+ const pushCleanup = (cleanup) => {
59315
+ cleanups.push(cleanup);
59316
+ return () => {
59317
+ const index = cleanups.indexOf(cleanup);
59318
+ if (index >= 0)
59319
+ cleanups.splice(index, 1);
59320
+ };
59321
+ };
59322
+ pushCleanup(context.client.rpc(VpetRpc).events.on("toast", (event) => {
59323
+ const payload = toVpetToastPayload(event.data);
59324
+ if (payload !== undefined)
59325
+ context.ui.toast.show(payload);
59326
+ }));
59327
+ await createTui(() => getSidebarCardInputs(reader, DIGIMON_CATALOG), settings, { archiveReader })({
59328
+ event: {
59329
+ on: (...subscription) => {
59330
+ switch (subscription[0]) {
59331
+ case "session.status":
59332
+ return context.data.on("session.status", subscription[1]);
59333
+ case "session.text.delta":
59334
+ return context.data.on("session.text.delta", subscription[1]);
59335
+ case "session.tool.called":
59336
+ return context.data.on("session.tool.called", subscription[1]);
59337
+ case "session.execution.succeeded":
59338
+ return context.data.on("session.execution.succeeded", subscription[1]);
59339
+ }
59214
59340
  }
59215
- }
59216
- },
59217
- renderer: api.renderer,
59218
- lifecycle: api.lifecycle,
59219
- slots: api.slots,
59220
- keymap: { registerLayer: api.keymap.registerLayer.bind(api.keymap) },
59221
- ui: {
59222
- dialog: {
59223
- replace: api.ui.dialog.replace.bind(api.ui.dialog),
59224
- clear: api.ui.dialog.clear.bind(api.ui.dialog),
59225
- setSize: api.ui.dialog.setSize.bind(api.ui.dialog)
59226
59341
  },
59227
- Dialog: api.ui.Dialog
59228
- },
59229
- theme: api.theme
59230
- });
59231
- };
59232
- var plugin = { id: "opencode-vpet", tui };
59342
+ renderer: context.renderer,
59343
+ lifecycle: { onDispose: pushCleanup },
59344
+ slots: {
59345
+ register: (registered) => {
59346
+ pushCleanup(context.ui.slot({
59347
+ prepend: "sidebar.content",
59348
+ render: () => registered.slots.sidebar_content()
59349
+ }));
59350
+ return "opencode-vpet";
59351
+ }
59352
+ },
59353
+ keymap: {
59354
+ registerLayer: (layer) => {
59355
+ context.keymap.layer(() => layer);
59356
+ return () => {
59357
+ return;
59358
+ };
59359
+ }
59360
+ },
59361
+ ui: {
59362
+ dialog: {
59363
+ replace: (render, onClose) => context.ui.dialog.show(render, onClose),
59364
+ clear: () => context.ui.dialog.clear(),
59365
+ setSize: (size) => context.ui.dialog.set({ size })
59366
+ }
59367
+ },
59368
+ theme: () => toVpetTheme(context.theme)
59369
+ });
59370
+ return () => {
59371
+ for (let index = cleanups.length - 1;index >= 0; index -= 1)
59372
+ cleanups[index]?.();
59373
+ };
59374
+ }
59375
+ });
59233
59376
  var tui_default = plugin;
59234
59377
  export {
59235
- tui,
59236
59378
  tui_default as default,
59237
59379
  createTui
59238
59380
  };
59239
59381
 
59240
- //# debugId=B06D4BB88D9B412A64756E2164756E21
59382
+ //# debugId=06835980CA6F808D64756E2164756E21
59241
59383
  //# sourceMappingURL=tui.js.map