loadouts 0.3.0 → 0.4.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 (190) hide show
  1. package/bundled/embedded/pi/loadouts-runtime.ts +6543 -1504
  2. package/bundled/extensions/loadouts-runtime/index.ts +6543 -1504
  3. package/bundled/loadouts/opencode-runtime.yaml +2 -4
  4. package/bundled/opencode/plugins/loadouts/index.js +39198 -0
  5. package/bundled/opencode/plugins/loadouts/package.json +9 -0
  6. package/bundled/{embedded/opencode/loadouts-runtime.tsx → opencode/plugins/loadouts/tui.js} +4008 -1556
  7. package/dist/builtins/agent-transforms.d.ts.map +1 -1
  8. package/dist/builtins/agent-transforms.js +31 -10
  9. package/dist/builtins/agent-transforms.js.map +1 -1
  10. package/dist/builtins/index.d.ts.map +1 -1
  11. package/dist/builtins/index.js +14 -5
  12. package/dist/builtins/index.js.map +1 -1
  13. package/dist/builtins/kinds/opencode-cli-config.d.ts +3 -0
  14. package/dist/builtins/kinds/opencode-cli-config.d.ts.map +1 -0
  15. package/dist/builtins/kinds/opencode-cli-config.js +10 -0
  16. package/dist/builtins/kinds/opencode-cli-config.js.map +1 -0
  17. package/dist/builtins/kinds/opencode-plugin-dir.d.ts +3 -0
  18. package/dist/builtins/kinds/opencode-plugin-dir.d.ts.map +1 -0
  19. package/dist/builtins/kinds/opencode-plugin-dir.js +11 -0
  20. package/dist/builtins/kinds/opencode-plugin-dir.js.map +1 -0
  21. package/dist/builtins/tools/opencode.d.ts.map +1 -1
  22. package/dist/builtins/tools/opencode.js +10 -7
  23. package/dist/builtins/tools/opencode.js.map +1 -1
  24. package/dist/cli/commands/activate.d.ts.map +1 -1
  25. package/dist/cli/commands/activate.js +0 -7
  26. package/dist/cli/commands/activate.js.map +1 -1
  27. package/dist/cli/commands/session.d.ts +3 -0
  28. package/dist/cli/commands/session.d.ts.map +1 -0
  29. package/dist/cli/commands/session.js +68 -0
  30. package/dist/cli/commands/session.js.map +1 -0
  31. package/dist/cli/commands/status.js +1 -1
  32. package/dist/cli/commands/status.js.map +1 -1
  33. package/dist/cli/commands/sync.d.ts.map +1 -1
  34. package/dist/cli/commands/sync.js +5 -5
  35. package/dist/cli/commands/sync.js.map +1 -1
  36. package/dist/cli/index.d.ts.map +1 -1
  37. package/dist/cli/index.js +2 -0
  38. package/dist/cli/index.js.map +1 -1
  39. package/dist/core/discovery.js +1 -1
  40. package/dist/core/discovery.js.map +1 -1
  41. package/dist/core/import-discovery.d.ts.map +1 -1
  42. package/dist/core/import-discovery.js +2 -0
  43. package/dist/core/import-discovery.js.map +1 -1
  44. package/dist/core/registry.d.ts +5 -0
  45. package/dist/core/registry.d.ts.map +1 -1
  46. package/dist/core/registry.js.map +1 -1
  47. package/dist/core/render.d.ts.map +1 -1
  48. package/dist/core/render.js +29 -1
  49. package/dist/core/render.js.map +1 -1
  50. package/dist/core/resolve.d.ts.map +1 -1
  51. package/dist/core/resolve.js +1 -0
  52. package/dist/core/resolve.js.map +1 -1
  53. package/dist/core/runtime.d.ts +4 -0
  54. package/dist/core/runtime.d.ts.map +1 -1
  55. package/dist/core/runtime.js +10 -3
  56. package/dist/core/runtime.js.map +1 -1
  57. package/dist/core/schema.d.ts +59 -0
  58. package/dist/core/schema.d.ts.map +1 -1
  59. package/dist/core/schema.js +5 -0
  60. package/dist/core/schema.js.map +1 -1
  61. package/dist/core/types.d.ts +13 -0
  62. package/dist/core/types.d.ts.map +1 -1
  63. package/dist/integrations/opencode/advertisement.d.ts +7 -0
  64. package/dist/integrations/opencode/advertisement.d.ts.map +1 -0
  65. package/dist/integrations/opencode/advertisement.js +17 -0
  66. package/dist/integrations/opencode/advertisement.js.map +1 -0
  67. package/dist/integrations/opencode/client.d.ts +12 -0
  68. package/dist/integrations/opencode/client.d.ts.map +1 -0
  69. package/dist/integrations/opencode/client.js +48 -0
  70. package/dist/integrations/opencode/client.js.map +1 -0
  71. package/dist/integrations/opencode/command.d.ts +11 -0
  72. package/dist/integrations/opencode/command.d.ts.map +1 -0
  73. package/dist/integrations/opencode/command.js +19 -0
  74. package/dist/integrations/opencode/command.js.map +1 -0
  75. package/dist/integrations/opencode/delta.d.ts +15 -0
  76. package/dist/integrations/opencode/delta.d.ts.map +1 -0
  77. package/dist/integrations/opencode/delta.js +75 -0
  78. package/dist/integrations/opencode/delta.js.map +1 -0
  79. package/dist/integrations/opencode/session.d.ts +207 -0
  80. package/dist/integrations/opencode/session.d.ts.map +1 -0
  81. package/dist/integrations/opencode/session.js +201 -0
  82. package/dist/integrations/opencode/session.js.map +1 -0
  83. package/dist/lib/gitignore.d.ts +7 -3
  84. package/dist/lib/gitignore.d.ts.map +1 -1
  85. package/dist/lib/gitignore.js +15 -7
  86. package/dist/lib/gitignore.js.map +1 -1
  87. package/dist/tui/core/actions.d.ts +3 -4
  88. package/dist/tui/core/actions.d.ts.map +1 -1
  89. package/dist/tui/core/actions.js +21 -15
  90. package/dist/tui/core/actions.js.map +1 -1
  91. package/dist/tui/core/controller.d.ts +28 -0
  92. package/dist/tui/core/controller.d.ts.map +1 -0
  93. package/dist/tui/core/controller.js +78 -0
  94. package/dist/tui/core/controller.js.map +1 -0
  95. package/dist/tui/core/data.d.ts +4 -2
  96. package/dist/tui/core/data.d.ts.map +1 -1
  97. package/dist/tui/core/data.js +14 -3
  98. package/dist/tui/core/data.js.map +1 -1
  99. package/dist/tui/core/host.d.ts +5 -11
  100. package/dist/tui/core/host.d.ts.map +1 -1
  101. package/dist/tui/core/intent.d.ts +18 -3
  102. package/dist/tui/core/intent.d.ts.map +1 -1
  103. package/dist/tui/core/keymap.d.ts +2 -1
  104. package/dist/tui/core/keymap.d.ts.map +1 -1
  105. package/dist/tui/core/keymap.js +38 -6
  106. package/dist/tui/core/keymap.js.map +1 -1
  107. package/dist/tui/core/model.d.ts +18 -6
  108. package/dist/tui/core/model.d.ts.map +1 -1
  109. package/dist/tui/core/model.js +4 -3
  110. package/dist/tui/core/model.js.map +1 -1
  111. package/dist/tui/core/selection.d.ts +12 -0
  112. package/dist/tui/core/selection.d.ts.map +1 -0
  113. package/dist/tui/core/selection.js +42 -0
  114. package/dist/tui/core/selection.js.map +1 -0
  115. package/dist/tui/core/update.d.ts.map +1 -1
  116. package/dist/tui/core/update.js +140 -126
  117. package/dist/tui/core/update.js.map +1 -1
  118. package/dist/tui/core/view.d.ts.map +1 -1
  119. package/dist/tui/core/view.js +43 -31
  120. package/dist/tui/core/view.js.map +1 -1
  121. package/dist/tui/core/viewport.d.ts +5 -0
  122. package/dist/tui/core/viewport.d.ts.map +1 -0
  123. package/dist/tui/core/viewport.js +33 -0
  124. package/dist/tui/core/viewport.js.map +1 -0
  125. package/dist/tui/core/viewspec.d.ts +5 -0
  126. package/dist/tui/core/viewspec.d.ts.map +1 -1
  127. package/dist/tui/hosts/pi/embed-entry.d.ts.map +1 -1
  128. package/dist/tui/hosts/pi/embed-entry.js +74 -197
  129. package/dist/tui/hosts/pi/embed-entry.js.map +1 -1
  130. package/dist/tui/hosts/pi/inject.d.ts +46 -29
  131. package/dist/tui/hosts/pi/inject.d.ts.map +1 -1
  132. package/dist/tui/hosts/pi/inject.js +25 -47
  133. package/dist/tui/hosts/pi/inject.js.map +1 -1
  134. package/dist/tui/hosts/standalone.d.ts.map +1 -1
  135. package/dist/tui/hosts/standalone.js +75 -111
  136. package/dist/tui/hosts/standalone.js.map +1 -1
  137. package/dist/tui/skins/pi-tui/input.js +4 -0
  138. package/dist/tui/skins/pi-tui/input.js.map +1 -1
  139. package/dist/tui/skins/pi-tui/render.d.ts +6 -3
  140. package/dist/tui/skins/pi-tui/render.d.ts.map +1 -1
  141. package/dist/tui/skins/pi-tui/render.js +32 -24
  142. package/dist/tui/skins/pi-tui/render.js.map +1 -1
  143. package/docs/archive/opencode-v2-runtime-beta-18707.md +813 -0
  144. package/docs/authoring.md +47 -44
  145. package/docs/commands.md +21 -1
  146. package/docs/compatibility.md +2 -2
  147. package/docs/concepts.md +2 -2
  148. package/docs/opencode-v2-probes.md +253 -0
  149. package/docs/opencode-v2-runtime.md +129 -0
  150. package/docs/registry.md +1366 -0
  151. package/docs/runtime.md +112 -82
  152. package/docs/troubleshooting.md +17 -15
  153. package/docs/tui-architecture.md +10 -8
  154. package/package.json +12 -7
  155. package/bundled/opencode/commands/loadouts.md +0 -3
  156. package/bundled/opencode/plugins/loadouts-runtime-tui.tsx +0 -14461
  157. package/bundled/opencode/plugins/loadouts-runtime.ts +0 -533
  158. package/bundled/opencode/tui.jsonc +0 -5
  159. package/dist/builtins/kinds/opencode-tui-config.d.ts +0 -3
  160. package/dist/builtins/kinds/opencode-tui-config.d.ts.map +0 -1
  161. package/dist/builtins/kinds/opencode-tui-config.js +0 -8
  162. package/dist/builtins/kinds/opencode-tui-config.js.map +0 -1
  163. package/dist/integrations/opencode-runtime/bridge.d.ts +0 -17
  164. package/dist/integrations/opencode-runtime/bridge.d.ts.map +0 -1
  165. package/dist/integrations/opencode-runtime/bridge.js +0 -60
  166. package/dist/integrations/opencode-runtime/bridge.js.map +0 -1
  167. package/dist/integrations/opencode-runtime/command.d.ts +0 -4
  168. package/dist/integrations/opencode-runtime/command.d.ts.map +0 -1
  169. package/dist/integrations/opencode-runtime/command.js +0 -200
  170. package/dist/integrations/opencode-runtime/command.js.map +0 -1
  171. package/dist/integrations/opencode-runtime/index.d.ts +0 -6
  172. package/dist/integrations/opencode-runtime/index.d.ts.map +0 -1
  173. package/dist/integrations/opencode-runtime/index.js +0 -5
  174. package/dist/integrations/opencode-runtime/index.js.map +0 -1
  175. package/dist/integrations/opencode-runtime/plugin.d.ts +0 -59
  176. package/dist/integrations/opencode-runtime/plugin.d.ts.map +0 -1
  177. package/dist/integrations/opencode-runtime/plugin.js +0 -238
  178. package/dist/integrations/opencode-runtime/plugin.js.map +0 -1
  179. package/dist/integrations/opencode-runtime/state.d.ts +0 -8
  180. package/dist/integrations/opencode-runtime/state.d.ts.map +0 -1
  181. package/dist/integrations/opencode-runtime/state.js +0 -27
  182. package/dist/integrations/opencode-runtime/state.js.map +0 -1
  183. package/dist/integrations/opencode-runtime/types.d.ts +0 -38
  184. package/dist/integrations/opencode-runtime/types.d.ts.map +0 -1
  185. package/dist/integrations/opencode-runtime/types.js +0 -2
  186. package/dist/integrations/opencode-runtime/types.js.map +0 -1
  187. package/dist/tui/hosts/_probe/embed-entry.d.ts +0 -5
  188. package/dist/tui/hosts/_probe/embed-entry.d.ts.map +0 -1
  189. package/dist/tui/hosts/_probe/embed-entry.js +0 -8
  190. package/dist/tui/hosts/_probe/embed-entry.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { footerKeyHints, keymap } from "./keymap.js";
2
+ import { cursorRow, rowLayer, SCOPES, sessionScope, visibleRows } from "./selection.js";
2
3
  const SECTIONS = [
3
4
  { id: "active", title: "Active" },
4
5
  { id: "available", title: "Available" },
@@ -8,16 +9,26 @@ export function view(model) {
8
9
  const panes = SECTIONS.map(({ id, title }) => pane(model, id, title));
9
10
  const row = cursorRow(model);
10
11
  return {
12
+ tabs: [
13
+ ...SCOPES.map((scope) => ({ text: `${model.filter.scope === scope ? "[" : " "}${scope ? scope[0].toUpperCase() + scope.slice(1) : "All"}${model.filter.scope === scope ? "]" : " "} `, style: model.filter.scope === scope ? "accent" : "muted" })),
14
+ { text: " ‹ [ / ] ›", style: "dim" },
15
+ ],
16
+ mode: [
17
+ { text: `MODE: ${model.mode}`, style: "accent" },
18
+ { text: model.sessionAvailable ? " m switch" : "", style: "dim" },
19
+ { text: model.mode === "filesystem" ? " · row scope → destination" : ` · source: ${sessionScope(model)}`, style: "muted" },
20
+ ],
11
21
  panes,
12
- detail: row ? detail(row, model.detail?.rowId === row.id) : emptyDetail(model),
13
- footer: { equipped: equipped(model), keys: footerKeyHints(), filter: { active: model.filtering, text: model.filter.text } },
22
+ detail: row ? { ...detail(row, model.detail?.rowId === row.id, rowLayer(model, row)), scroll: model.detail?.rowId === row.id ? model.detail.scroll : 0 } : emptyDetail(model),
23
+ footer: { equipped: equipped(model), keys: footerKeyHints(model), filter: { active: model.filtering, text: model.filter.text } },
14
24
  overlay: overlay(model),
15
25
  };
16
26
  }
17
27
  function pane(model, section, title) {
18
28
  const rows = visibleRows(model, section);
19
29
  return {
20
- title: `${title} (${rows.length})`,
30
+ title: `${SECTIONS.findIndex((item) => item.id === section) + 1} ${title} (${rows.length})`,
31
+ focused: model.cursor.section === section,
21
32
  rows: rows.map((row, index) => ({
22
33
  id: row.id,
23
34
  glyph: glyph(row),
@@ -26,9 +37,11 @@ function pane(model, section, title) {
26
37
  })),
27
38
  };
28
39
  }
29
- function detail(row, expanded) {
40
+ function detail(row, expanded, target) {
30
41
  const blocks = [
31
42
  kv("scope", row.scope),
43
+ kv("equipped", row.equipped.join(" / ") || "—"),
44
+ kv("action target", target),
32
45
  kv("status", row.issue ? `${row.status}: ${row.issue}` : row.status),
33
46
  ];
34
47
  if (row.description)
@@ -59,6 +72,7 @@ function overlay(model) {
59
72
  return {
60
73
  kind: "help",
61
74
  title: "Keymap",
75
+ scroll: model.overlayScroll,
62
76
  lines: keymap.map((binding) => [
63
77
  { text: binding.keys.join("/"), style: "accent" },
64
78
  { text: ` ${binding.label}`, style: "text" },
@@ -69,30 +83,44 @@ function overlay(model) {
69
83
  return {
70
84
  kind: "diff",
71
85
  title: model.busy ? "Diff (loading)" : "Diff",
86
+ scroll: model.overlayScroll,
72
87
  lines: (model.diffLines?.length ? model.diffLines : [model.busy?.label ?? "No diff loaded"]).map((line) => [{ text: line, style: lineStyle(line) }]),
73
88
  };
74
89
  }
75
- if (model.overlay === "confirm")
76
- return { kind: "confirm", title: "Confirm", lines: [[{ text: "Press enter to confirm", style: "warning" }]] };
90
+ if (model.overlay === "confirm" && model.confirm) {
91
+ const action = model.confirm.action === "diffPreview" ? "Diff" : model.confirm.action === "sync" ? "Sync" : "Clear";
92
+ return {
93
+ kind: "confirm", title: `${action} · choose scope`,
94
+ lines: [
95
+ [{ text: "Which filesystem scope?", style: "text" }],
96
+ ...["global", "project"].map((scope) => [{ text: `${model.confirm?.scope === scope ? "▸" : " "} ${scope}`, style: model.confirm?.scope === scope ? "accent" : "muted" }]),
97
+ [{ text: `${action} all equipped loadouts in ${model.confirm.scope}.`, style: "warning" }],
98
+ [{ text: "h/l or j/k choose · enter confirms", style: "dim" }],
99
+ ],
100
+ };
101
+ }
77
102
  return undefined;
78
103
  }
79
104
  function equipped(model) {
80
- const active = model.rows.filter((row) => row.activation);
81
- const names = active.map((row) => row.name).join(" + ") || "none";
82
- const tools = Array.from(new Set(active.flatMap((row) => row.tools))).sort().join(", ") || "no tools";
105
+ const active = model.rows.filter((row) => row.equipped.length);
83
106
  const drift = active.some((row) => row.status === "drift");
84
107
  return [
85
108
  { text: "EQUIPPED: ", style: "accent" },
86
- { text: names, style: active.length ? "success" : "dim" },
87
- { text: ` -> ${tools} `, style: "muted" },
88
- { text: `[${model.mode === "runtime" ? "session" : "fs"}] `, style: "dim" },
109
+ ...["global", "project", "session"].map((layer) => ({
110
+ text: `${layer[0].toUpperCase()} ${active.filter((row) => row.equipped.includes(layer)).map((row) => row.name).join("·") || "—"} `,
111
+ style: (model.mode === "session" ? layer === "session" : layer !== "session") ? "accent" : "muted",
112
+ })),
113
+ { text: `[${model.mode}] `, style: "dim" },
89
114
  { text: drift ? "drift" : "in sync", style: drift ? "warning" : "success" },
115
+ ...(model.busy ? [{ text: ` ${model.busy.label}…`, style: "warning" }] : []),
116
+ ...(model.lastResult ? [{ text: ` ${model.lastResult.text}`, style: model.lastResult.variant === "error" ? "error" : "muted" }] : []),
90
117
  ...(model.filtering || model.filter.text
91
118
  ? [
92
119
  { text: " /", style: "accent" },
93
120
  { text: model.filter.text || " ", style: model.filter.text ? "text" : "dim" },
94
121
  ]
95
122
  : []),
123
+ ...(model.filter.tool ? [{ text: ` tool:${model.filter.tool}`, style: "accent" }] : []),
96
124
  ];
97
125
  }
98
126
  function artifactKindColumn(kind) {
@@ -106,10 +134,10 @@ function rowSpans(row) {
106
134
  count(row.counts.extensions, "ext"),
107
135
  ].filter(Boolean).join(" ") || "empty";
108
136
  return [
109
- { text: row.name, style: row.activation ? "success" : "text" },
137
+ { text: row.name, style: row.equipped.length ? "success" : "text" },
110
138
  { text: ` ${row.scope}`, style: "dim" },
111
139
  { text: ` ${counts}`, style: "muted" },
112
- ...(row.activation ? [{ text: ` [${row.activation === "runtime" ? "session" : "fs"}]`, style: "accent" }] : []),
140
+ ...(row.equipped.length ? [{ text: ` [${row.equipped.map((layer) => layer[0].toUpperCase()).join("/")}]`, style: "accent" }] : []),
113
141
  ...(row.issue ? [{ text: ` ${row.issue}`, style: "warning" }] : []),
114
142
  ];
115
143
  }
@@ -118,26 +146,10 @@ function glyph(row) {
118
146
  return { char: "!", style: "error" };
119
147
  if (row.status === "drift")
120
148
  return { char: "~", style: "warning" };
121
- if (row.activation)
149
+ if (row.equipped.length)
122
150
  return { char: "✓", style: "success" };
123
151
  return { char: "-", style: "dim" };
124
152
  }
125
- function visibleRows(model, section) {
126
- return model.sections[section]
127
- .map((id) => model.rows.find((row) => row.id === id))
128
- .filter((row) => Boolean(row))
129
- .filter((row) => {
130
- if (model.filter.scope && row.scope !== model.filter.scope)
131
- return false;
132
- if (model.filter.tool && !row.tools.includes(model.filter.tool))
133
- return false;
134
- const text = model.filter.text.trim().toLowerCase();
135
- return !text || `${row.name} ${row.description ?? ""}`.toLowerCase().includes(text);
136
- });
137
- }
138
- function cursorRow(model) {
139
- return visibleRows(model, model.cursor.section)[model.cursor.index];
140
- }
141
153
  function kv(key, value) {
142
154
  return [{ text: `${key}: `, style: "dim" }, { text: value, style: "text" }];
143
155
  }
@@ -1 +1 @@
1
- {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/tui/core/view.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../src/tui/core/view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { SpecPane } from "./viewspec.js";
2
+ /** Share a bounded viewport across sections, always keeping the selected row visible. */
3
+ export declare function windowPanes(panes: SpecPane[], height: number): SpecPane[];
4
+ export declare function windowLines<T>(lines: T[], height: number, scroll?: number): T[];
5
+ //# sourceMappingURL=viewport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../../../src/tui/core/viewport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAmBzE;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,CAAC,EAAE,CAI1E"}
@@ -0,0 +1,33 @@
1
+ /** Share a bounded viewport across sections, always keeping the selected row visible. */
2
+ export function windowPanes(panes, height) {
3
+ // At tiny heights retain just the focused section rather than lose the cursor.
4
+ const shown = height < panes.length * 2 ? panes.filter((pane) => pane.focused) : panes;
5
+ const budgets = shown.map(() => 1);
6
+ let remaining = Math.max(0, Math.floor(height) - shown.length * 2);
7
+ while (remaining > 0) {
8
+ let used = false;
9
+ for (let i = 0; i < shown.length && remaining > 0; i++) {
10
+ if (budgets[i] < shown[i].rows.length) {
11
+ budgets[i]++;
12
+ remaining--;
13
+ used = true;
14
+ }
15
+ }
16
+ if (!used)
17
+ break;
18
+ }
19
+ return shown.map((pane, i) => {
20
+ const count = budgets[i];
21
+ if (pane.rows.length <= count)
22
+ return pane;
23
+ const selected = Math.max(0, pane.rows.findIndex((row) => row.selected));
24
+ const start = Math.max(0, Math.min(selected - Math.floor(count / 2), pane.rows.length - count));
25
+ return { ...pane, title: `${pane.title} · ${start + 1}–${start + count}`, rows: pane.rows.slice(start, start + count) };
26
+ });
27
+ }
28
+ export function windowLines(lines, height, scroll = 0) {
29
+ const count = Math.max(1, Math.floor(height));
30
+ const start = Math.max(0, Math.min(scroll, lines.length - count));
31
+ return lines.slice(start, start + count);
32
+ }
33
+ //# sourceMappingURL=viewport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../../../src/tui/core/viewport.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,MAAM,UAAU,WAAW,CAAC,KAAiB,EAAE,MAAc;IAC3D,+EAA+E;IAC/E,MAAM,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACvF,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnE,OAAO,SAAS,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACvD,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAC,SAAS,EAAE,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC;YAAC,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,IAAI;YAAE,MAAM;IACnB,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK;YAAE,OAAO,IAAI,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QAChG,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,MAAM,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC;IAC1H,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAI,KAAU,EAAE,MAAc,EAAE,MAAM,GAAG,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC;AAC3C,CAAC"}
@@ -14,11 +14,13 @@ export interface SpecRow {
14
14
  }
15
15
  export interface SpecPane {
16
16
  title: string;
17
+ focused: boolean;
17
18
  rows: SpecRow[];
18
19
  }
19
20
  export interface SpecDetail {
20
21
  title: string;
21
22
  blocks: SpecSpan[][];
23
+ scroll?: number;
22
24
  }
23
25
  export interface SpecFooter {
24
26
  equipped: SpecSpan[];
@@ -32,6 +34,8 @@ export interface SpecFooter {
32
34
  };
33
35
  }
34
36
  export interface ViewSpec {
37
+ tabs: SpecSpan[];
38
+ mode: SpecSpan[];
35
39
  panes: SpecPane[];
36
40
  detail?: SpecDetail;
37
41
  footer: SpecFooter;
@@ -39,6 +43,7 @@ export interface ViewSpec {
39
43
  kind: "help" | "diff" | "confirm";
40
44
  title: string;
41
45
  lines: SpecSpan[][];
46
+ scroll?: number;
42
47
  };
43
48
  }
44
49
  //# sourceMappingURL=viewspec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewspec.d.ts","sourceRoot":"","sources":["../../../src/tui/core/viewspec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC;IAC3C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;KACrB,CAAC;CACH"}
1
+ {"version":3,"file":"viewspec.d.ts","sourceRoot":"","sources":["../../../src/tui/core/viewspec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC;IAC3C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"embed-entry.d.ts","sourceRoot":"","sources":["../../../../src/tui/hosts/pi/embed-entry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAoD,MAAM,iCAAiC,CAAC;AAsBtH,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAqClE"}
1
+ {"version":3,"file":"embed-entry.d.ts","sourceRoot":"","sources":["../../../../src/tui/hosts/pi/embed-entry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,iCAAiC,CAAC;AAe7F,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAqClE"}
@@ -1,219 +1,96 @@
1
- import * as path from "node:path";
2
- import { getContext } from "../../../core/discovery.js";
3
- import { CliRuntimeBridge } from "../../../integrations/opencode-runtime/bridge.js";
4
- import { handleRuntimeCommand } from "../../../integrations/opencode-runtime/command.js";
5
- import { createRuntimeSessionStore, getRuntimeSessionState } from "../../../integrations/opencode-runtime/state.js";
6
- import { executeEffect } from "../../core/actions.js";
7
- import { loadDashboardData } from "../../core/data.js";
8
- import { createInitialModel } from "../../core/model.js";
9
- import { defaultThemeTokens } from "../../core/theme.js";
10
- import { update } from "../../core/update.js";
11
- import { view } from "../../core/view.js";
12
- import { isCtrlC, intentFromPiTuiInput } from "../../skins/pi-tui/input.js";
1
+ import { z } from "zod";
2
+ import { DashboardController } from "../../core/controller.js";
3
+ import { intentFromPiTuiInput, isCtrlC } from "../../skins/pi-tui/input.js";
13
4
  import { piHostThemeToPiTuiTheme } from "../../skins/pi-tui/pi-theme-adapter.js";
14
5
  import { renderDashboard, renderOverlay } from "../../skins/pi-tui/render.js";
15
- import { PI_RUNTIME_SESSION_ID, PiRuntimeInjector, piRuntimeResourcePaths, piRuntimeSystemBlock } from "./inject.js";
16
- const STATUS_KEY = "loadouts";
6
+ import { PiSessionActivator } from "./inject.js";
7
+ import { parseEquipCommand } from "../../../integrations/opencode/command.js";
8
+ import { registerBuiltins } from "../../../builtins/index.js";
9
+ import { createPluginAPI } from "../../../core/plugin.js";
10
+ import { registry } from "../../../core/registry.js";
11
+ const ENTRY = "loadouts.equipment";
12
+ const savedSchema = z.object({ names: z.array(z.string()), scope: z.enum(["project", "global"]) });
17
13
  export default function loadoutsPiExtension(pi) {
18
- const store = createRuntimeSessionStore();
19
- const scopeState = { scope: "local" };
20
- const bridge = new CliRuntimeBridge({ tool: "pi" });
21
- pi.on("before_agent_start", async (event) => {
22
- const block = piRuntimeSystemBlock(store);
23
- if (!block)
24
- return undefined;
25
- return { systemPrompt: `${event.systemPrompt}\n\n${block}` };
14
+ if (!registry.getTool("pi"))
15
+ registerBuiltins(createPluginAPI(registry));
16
+ let activator;
17
+ let restoring = false;
18
+ pi.on("session_start", async (_event, ctx) => {
19
+ activator = new PiSessionActivator(ctx.cwd, (status) => {
20
+ if (!restoring)
21
+ pi.appendEntry(ENTRY, status ? { names: status.names, scope: status.scope } : null);
22
+ ctx.ui.setStatus("loadouts", status ? `EQUIPPED S ${status.names.join("·")}` : undefined);
23
+ });
24
+ const entry = [...ctx.sessionManager.getBranch()].reverse().find((item) => item.type === "custom" && item.customType === ENTRY);
25
+ if (entry?.type !== "custom")
26
+ return;
27
+ const parsed = savedSchema.safeParse(entry.data);
28
+ if (!parsed.success || !parsed.data.names.length)
29
+ return;
30
+ restoring = true;
31
+ try {
32
+ await activator.equip(ctx.sessionManager.getSessionId(), parsed.data.names, { scope: parsed.data.scope });
33
+ }
34
+ catch (error) {
35
+ ctx.ui.notify(String(error), "error");
36
+ }
37
+ finally {
38
+ restoring = false;
39
+ }
40
+ });
41
+ pi.on("before_agent_start", (event, ctx) => {
42
+ const block = activator?.systemBlock(ctx.sessionManager.getSessionId());
43
+ return block ? { systemPrompt: `${event.systemPrompt}\n\n${block}` } : undefined;
26
44
  });
27
- pi.on("resources_discover", async () => piRuntimeResourcePaths(store));
28
45
  pi.registerCommand("loadouts", {
29
- description: "Open the loadouts dashboard or manage runtime loadouts",
46
+ description: "Loadout dashboard; equip, unequip, status",
30
47
  handler: async (args, ctx) => {
31
- if (args.trim().length === 0) {
32
- await openDashboard(ctx, store, scopeState);
33
- return;
34
- }
35
48
  try {
36
- const result = await handleRuntimeCommand({
37
- argumentsText: args,
38
- cwd: ctx.cwd,
39
- bridge,
40
- store,
41
- sessionID: PI_RUNTIME_SESSION_ID,
42
- });
43
- if (result.command.action === "activate")
44
- scopeState.scope = result.command.scope;
45
- updateStatus(ctx, statusFromStore(store, scopeState.scope));
46
- ctx.ui.notify(result.text, "info");
49
+ const command = parseEquipCommand(args);
50
+ const sessionID = ctx.sessionManager.getSessionId();
51
+ if (command.action === "dashboard" || command.action === "quick") {
52
+ await dashboard(ctx, activator);
53
+ return;
54
+ }
55
+ if (command.action === "equip")
56
+ await activator.equip(sessionID, command.names, { scope: command.scope });
57
+ if (command.action === "unequip")
58
+ await activator.unequip(sessionID);
59
+ ctx.ui.notify((await activator.status(sessionID))?.names.join(" + ") || "No session loadouts", "info");
47
60
  }
48
- catch (err) {
49
- ctx.ui.notify(err instanceof Error ? err.message : String(err), "error");
61
+ catch (error) {
62
+ ctx.ui.notify(error instanceof Error ? error.message : String(error), "error");
50
63
  }
51
64
  },
52
65
  });
53
66
  }
54
- async function openDashboard(ctx, store, scopeState) {
67
+ async function dashboard(ctx, activator) {
55
68
  if (ctx.mode !== "tui") {
56
- ctx.ui.notify("/loadouts dashboard is only available in Pi TUI mode.", "warning");
69
+ ctx.ui.notify("The dashboard requires Pi TUI mode.", "warning");
57
70
  return;
58
71
  }
59
- let overlayHandle;
60
- await ctx.ui.custom((tui, theme, _keybindings, done) => {
61
- const piTheme = piHostThemeToPiTuiTheme(theme);
62
- const injector = new PiRuntimeInjector({
63
- cwd: ctx.cwd,
64
- store,
65
- scopeState,
66
- onChange: (status) => updateStatus(ctx, status),
72
+ await ctx.ui.custom((tui, theme, _keys, done) => {
73
+ const colors = piHostThemeToPiTuiTheme(theme);
74
+ const controller = new DashboardController({
75
+ cwd: ctx.cwd, session: { id: ctx.sessionManager.getSessionId(), activator },
76
+ changed: () => tui.requestRender(), exit: () => { controller.dispose(); done(undefined); },
77
+ edit: async (file) => { ctx.ui.notify(`Edit ${file} in your editor.`, "info"); },
67
78
  });
68
- const host = {
69
- theme: () => defaultThemeTokens,
70
- requestRender: () => {
71
- tui.requestRender();
79
+ const component = {
80
+ render: (width) => {
81
+ const spec = controller.spec;
82
+ const height = Math.max(1, Math.floor(tui.terminal.rows * 0.86));
83
+ return spec.overlay ? renderOverlay(spec.overlay, width, colors, height) : renderDashboard(spec, width, colors, height);
72
84
  },
73
- exit: () => done(undefined),
74
- openEditor: async (filePath) => {
75
- ctx.ui.notify(`Edit ${filePath} from a terminal editor; embedded Pi edit is not available yet.`, "warning");
85
+ handleInput: (input) => {
86
+ const intent = isCtrlC(input) ? { t: "quit" } : intentFromPiTuiInput(input, controller.spec);
87
+ if (intent)
88
+ void controller.dispatch(intent);
76
89
  },
77
- data: { rows: [], active: [], tools: [], issues: [], warnings: [] },
78
- runtime: injector,
90
+ invalidate() { },
79
91
  };
80
- let model;
81
- const component = new PiDashboardComponent(piTheme, dispatch);
82
- void initialize();
92
+ void controller.refresh();
83
93
  return component;
84
- async function initialize() {
85
- host.data = applyRuntimeStatus(await loadDashboardData(ctx.cwd), injector.status());
86
- model = createInitialModel(host.data, { mode: "runtime", scope: "project" });
87
- renderNow();
88
- }
89
- function dispatch(intent) {
90
- if (!model)
91
- return;
92
- if (isQuitIntent(intent, model)) {
93
- done(undefined);
94
- return;
95
- }
96
- const result = update(model, intent);
97
- model = result.model;
98
- if (model.quitRequested) {
99
- done(undefined);
100
- return;
101
- }
102
- renderNow();
103
- if (result.effect)
104
- void runEffect(result.effect);
105
- }
106
- async function runEffect(effect) {
107
- let actionIntent;
108
- try {
109
- if (effect.t === "editFile")
110
- await host.openEditor(effect.path);
111
- actionIntent = await executeEffect(effect, {
112
- fs: await actionContext(effect, model.scope, ctx.cwd),
113
- runtime: host.runtime,
114
- });
115
- }
116
- catch (err) {
117
- actionIntent = {
118
- t: "effectDone",
119
- effect: effect.t,
120
- ok: false,
121
- message: err instanceof Error ? err.message : String(err),
122
- };
123
- }
124
- if (effect.t === "reload" || effect.t === "editFile") {
125
- host.data = applyRuntimeStatus(await loadDashboardData(ctx.cwd), injector.status());
126
- const next = createInitialModel(host.data, { mode: "runtime", scope: model.scope });
127
- model = { ...next, filter: model.filter, filtering: model.filtering, cursor: model.cursor, overlay: model.overlay, diffLines: model.diffLines };
128
- }
129
- const result = update(model, actionIntent);
130
- model = result.model;
131
- renderNow();
132
- }
133
- function renderNow() {
134
- component.setSpec(view(model));
135
- updateStatus(ctx, injector.status());
136
- host.requestRender();
137
- }
138
- }, {
139
- overlay: true,
140
- overlayOptions: { width: "94%", maxHeight: "86%", minWidth: 42, margin: 1 },
141
- onHandle: (handle) => {
142
- overlayHandle = handle;
143
- },
144
- });
145
- }
146
- class PiDashboardComponent {
147
- spec = view(createInitialModel({ rows: [], active: [], tools: [], issues: [], warnings: [] }, { mode: "runtime" }));
148
- theme;
149
- onIntent;
150
- constructor(theme, onIntent) {
151
- this.theme = theme;
152
- this.onIntent = onIntent;
153
- }
154
- setSpec(spec) {
155
- this.spec = spec;
156
- }
157
- render(width) {
158
- return this.spec.overlay
159
- ? renderOverlay(this.spec.overlay, width, this.theme)
160
- : renderDashboard(this.spec, width, this.theme);
161
- }
162
- handleInput(data) {
163
- if (isCtrlC(data)) {
164
- this.onIntent({ t: "quit" });
165
- return;
166
- }
167
- const intent = intentFromPiTuiInput(data, this.spec);
168
- if (intent)
169
- this.onIntent(intent);
170
- }
171
- invalidate() { }
172
- }
173
- function isQuitIntent(intent, model) {
174
- return intent.t === "quit" && !model.overlay && !model.filtering;
175
- }
176
- async function actionContext(effect, fallbackScope, cwd) {
177
- if (effect.t === "reload" || effect.t === "editFile") {
178
- return {
179
- scope: fallbackScope,
180
- configPath: cwd,
181
- statePath: path.join(cwd, ".state.json"),
182
- projectRoot: cwd,
183
- };
184
- }
185
- const scope = "scope" in effect ? effect.scope : fallbackScope;
186
- return getContext(scope, cwd);
187
- }
188
- function applyRuntimeStatus(data, status) {
189
- if (status.active.length === 0)
190
- return data;
191
- const scope = status.scope === "global" ? "global" : "project";
192
- const active = new Set(status.active);
193
- return {
194
- ...data,
195
- rows: data.rows.map((row) => active.has(row.name) && row.scope === scope
196
- ? { ...row, status: "active", activation: "runtime" }
197
- : row),
198
- active: Array.from(new Set([...data.active, ...status.active])).sort(),
199
- };
200
- }
201
- function statusFromStore(store, scope) {
202
- const state = getRuntimeSessionState(store, PI_RUNTIME_SESSION_ID);
203
- return {
204
- active: state?.activeNames ?? [],
205
- scope,
206
- updatedAt: state?.activatedAt,
207
- };
208
- }
209
- function updateStatus(ctx, status) {
210
- if (status.active.length === 0) {
211
- ctx.ui.setStatus(STATUS_KEY, undefined);
212
- ctx.ui.setWidget(STATUS_KEY, undefined);
213
- return;
214
- }
215
- const names = status.active.join(" + ");
216
- ctx.ui.setStatus(STATUS_KEY, `EQUIPPED ${names}`);
217
- ctx.ui.setWidget(STATUS_KEY, [`EQUIPPED: ${names}`, `mode: runtime (${status.scope})`], { placement: "belowEditor" });
94
+ }, { overlay: true, overlayOptions: { width: "94%", maxHeight: "86%", minWidth: 42, margin: 1 } });
218
95
  }
219
96
  //# sourceMappingURL=embed-entry.js.map