pantheon-opencode 1.5.2 → 1.6.0-beta.10

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 (146) hide show
  1. package/.pantheon/code-mode/README.md +4 -2
  2. package/.pantheon/code-mode/checkpoint_session.py +138 -102
  3. package/.pantheon/code-mode/compress-inline.py +102 -57
  4. package/.pantheon/code-mode/manifest.json +2 -8
  5. package/AGENTS.global.md +182 -0
  6. package/AGENTS.md +10 -891
  7. package/CHANGELOG.md +343 -0
  8. package/README.md +577 -79
  9. package/README.pt-BR.md +345 -60
  10. package/bin/pantheon-init.mjs +26 -3
  11. package/commands/pantheon-audit.md +7 -1
  12. package/commands/pantheon-consolidate.md +1 -1
  13. package/commands/pantheon-deepwork.md +14 -3
  14. package/commands/pantheon-focus.md +17 -0
  15. package/commands/pantheon-optimize.md +2 -2
  16. package/commands/pantheon-vision.md +61 -12
  17. package/package.json +30 -11
  18. package/plugin.json +2 -2
  19. package/pyproject.toml +11 -16
  20. package/scripts/build-agents-md.mjs +376 -58
  21. package/scripts/changelog-merge.mjs +161 -0
  22. package/scripts/check-plugin-v2-coverage.mjs +213 -0
  23. package/scripts/ci-validate-yaml.py +7 -5
  24. package/scripts/{code_mode_server.py → code_mode.py} +119 -27
  25. package/scripts/cost.mjs +244 -41
  26. package/scripts/doctor.mjs +236 -29
  27. package/scripts/install/agents-md.mjs +4 -4
  28. package/scripts/install/cli-ui.mjs +1 -1
  29. package/scripts/install/config-migration.mjs +319 -6
  30. package/scripts/install/health-check.mjs +26 -37
  31. package/scripts/install/interactive.mjs +7 -7
  32. package/scripts/install/migrate.mjs +1 -1
  33. package/scripts/install/opencode-version.mjs +246 -4
  34. package/scripts/install/opencode.mjs +627 -179
  35. package/scripts/install/plugin.mjs +43 -9
  36. package/scripts/install/shared.mjs +120 -12
  37. package/scripts/install/vision-prompt.mjs +161 -0
  38. package/scripts/install-mcp.mjs +28 -9
  39. package/scripts/{mcp_persistence_server.py → mcp_persistence.py} +392 -78
  40. package/{src/mcp/mcp_resources_server.py → scripts/mcp_resources.py} +2 -2
  41. package/scripts/{memory_mcp_server.py → memory_mcp.py} +372 -198
  42. package/scripts/postinstall.mjs +0 -7
  43. package/scripts/probe-context-rehydrate.mjs +36 -13
  44. package/scripts/probe-pantheon-cost.mjs +71 -15
  45. package/scripts/prune.mjs +2 -2
  46. package/scripts/run-node-tests.mjs +189 -0
  47. package/scripts/sync-artifacts.mjs +26 -13
  48. package/scripts/sync-tui.mjs +24 -3
  49. package/scripts/test-opencode-v2-sandbox.sh +1913 -0
  50. package/scripts/validate-routing.mjs +43 -3
  51. package/scripts/validate-sandbox-install.mjs +138 -0
  52. package/scripts/versioning.mjs +13 -1
  53. package/scripts/vision-status.mjs +682 -0
  54. package/skills-lock.json +15 -16
  55. package/src/agents/aphrodite.md +20 -37
  56. package/src/agents/apollo.md +7 -3
  57. package/src/agents/athena.md +63 -35
  58. package/src/agents/demeter.md +8 -28
  59. package/src/agents/gaia.md +1 -1
  60. package/src/agents/hephaestus.md +10 -21
  61. package/src/agents/hermes.md +15 -38
  62. package/src/agents/iris.md +1 -1
  63. package/src/agents/mnemosyne.md +23 -60
  64. package/src/agents/nyx.md +1 -1
  65. package/src/agents/prometheus.md +16 -20
  66. package/src/agents/talos.md +10 -2
  67. package/src/agents/themis.md +5 -5
  68. package/src/agents/zeus.md +99 -130
  69. package/src/instructions/agent-return-format.instructions.md +18 -3
  70. package/src/instructions/backend-standards.instructions.md +2 -0
  71. package/src/instructions/frontend-standards.instructions.md +3 -1
  72. package/src/instructions/memory-protocol.instructions.md +11 -110
  73. package/src/instructions/zeus-anti-stall.instructions.md +14 -61
  74. package/src/instructions/zeus-communication-rules.instructions.md +0 -1
  75. package/src/instructions/zeus-council-synthesis.instructions.md +32 -260
  76. package/src/instructions/zeus-memory-operations.instructions.md +26 -0
  77. package/src/instructions/zeus-timeout-retry.instructions.md +40 -87
  78. package/src/mcp/{code_mode_server.py → code_mode.py} +119 -27
  79. package/src/mcp/eval_store.py +2 -2
  80. package/src/mcp/mcp_codemap_module.py +559 -129
  81. package/src/mcp/{mcp_persistence_server.py → mcp_persistence.py} +392 -78
  82. package/{scripts/mcp_resources_server.py → src/mcp/mcp_resources.py} +2 -2
  83. package/src/mcp/{memory_mcp_server.py → memory_mcp.py} +373 -250
  84. package/src/mcp/{pantheon_vision_server.py → pantheon_vision.py} +396 -40
  85. package/src/mcp/requirements-mcp.txt +10 -6
  86. package/src/mcp/requirements-vision.txt +4 -2
  87. package/src/pantheon/cost-command.ts +399 -101
  88. package/src/pantheon/delegation-enforce.ts +10 -1
  89. package/src/pantheon/model-command.ts +18 -7
  90. package/src/pantheon/presets.d.mts +0 -8
  91. package/src/pantheon/presets.mjs +5 -32
  92. package/src/pantheon/todo-enforcer.ts +1 -1
  93. package/src/pantheon/v2-bounded-read.ts +640 -0
  94. package/src/pantheon/v2-delegation-enforce.ts +214 -0
  95. package/src/pantheon/v2-execute-after.ts +186 -0
  96. package/src/pantheon/v2-tools.ts +429 -0
  97. package/src/pantheon/v2-unsupported.d.mts +11 -0
  98. package/src/pantheon/v2-unsupported.mjs +90 -0
  99. package/src/pantheon/v2-vision.ts +622 -0
  100. package/src/pantheon/vision-local.ts +531 -0
  101. package/src/pantheon/vision.ts +1161 -116
  102. package/src/plugin-v2.ts +1244 -288
  103. package/src/plugin.ts +12 -9
  104. package/src/plugins/tui/dist/server.d.ts +1 -2
  105. package/src/plugins/tui/dist/server.d.ts.map +1 -1
  106. package/src/plugins/tui/dist/tui-v2.d.ts +154 -0
  107. package/src/plugins/tui/dist/tui-v2.d.ts.map +1 -0
  108. package/src/plugins/tui/dist/tui-v2.js +659 -0
  109. package/src/plugins/tui/dist/tui-v2.js.map +1 -0
  110. package/src/plugins/tui/dist/tui.d.ts +85 -82
  111. package/src/plugins/tui/dist/tui.d.ts.map +1 -1
  112. package/src/plugins/tui/dist/tui.js +72 -59
  113. package/src/plugins/tui/index-v2.ts +6 -0
  114. package/src/plugins/tui/package-lock.json +5504 -1341
  115. package/src/plugins/tui/package.json +25 -15
  116. package/src/plugins/tui/src/index-v2.tsx +734 -0
  117. package/src/plugins/tui/src/index.tsx +106 -85
  118. package/src/plugins/tui/src/opencode-v2.d.ts +13 -0
  119. package/src/plugins/tui/tsconfig.build.json +5 -0
  120. package/src/plugins/tui/tsconfig.typecheck.json +5 -0
  121. package/src/plugins/tui/tsdown.config.ts +22 -2
  122. package/src/plugins/tui/tui-v2.ts +2 -0
  123. package/src/plugins/tui/tui.ts +3 -0
  124. package/src/routing.yml +11 -22
  125. package/src/skills/README.md +34 -39
  126. package/src/skills/agent-coordination/SKILL.md +7 -2
  127. package/src/skills/artifact-management/SKILL.md +12 -5
  128. package/src/skills/auto-continue/SKILL.md +54 -95
  129. package/src/skills/code-review-checklist/SKILL.md +5 -5
  130. package/src/skills/context-compression/SKILL.md +26 -879
  131. package/src/skills/session-goal/SKILL.md +14 -5
  132. package/src/skills/spec-driven-development/SKILL.md +3 -1
  133. package/src/skills/tdd-with-agents/SKILL.md +18 -10
  134. package/.pantheon/code-mode/eval-llm-judge.py +0 -255
  135. package/.pantheon/code-mode/eval-monte-carlo.py +0 -368
  136. package/.pantheon/code-mode/eval-run.py +0 -197
  137. package/.pantheon/code-mode/eval-static.py +0 -321
  138. package/.pantheon/code-mode/session-end-save.py +0 -186
  139. package/.pantheon/code-mode/session-end-save.sh +0 -18
  140. package/opencode.json +0 -58
  141. package/scripts/recover-zenodo-deposition.mjs +0 -146
  142. package/scripts/test-opencode-v1-v2-sandbox.sh +0 -862
  143. package/scripts/validate-zenodo-release.mjs +0 -154
  144. package/scripts/zenodo-artifact.mjs +0 -94
  145. package/scripts/zenodo-release-state.mjs +0 -53
  146. package/src/skills/orchestration-workflow/SKILL.md +0 -311
@@ -4,15 +4,15 @@ import { appendFile, mkdir, readFile, readdir, writeFile } from "node:fs/promise
4
4
  import { homedir } from "node:os";
5
5
  import { dirname, join } from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
- import { For, Show, createEffect, createMemo, createResource, createSignal, onCleanup, onMount } from "solid-js";
7
+ import { For, Show, createMemo, createResource, createSignal, onCleanup, onMount } from "solid-js";
8
8
  //#region src/index.tsx
9
9
  /** @jsxImportSource @opentui/solid */
10
10
  /**
11
11
  * pantheon-tui — Pantheon TUI plugin for opencode.
12
12
  *
13
- * Bundled entry: `tsdown` emits `dist/tui.js`, and the package `exports`
14
- * (`./tui` → ./dist/tui.js, `./server` → ./dist/server.js) is the ONLY load
15
- * path — no raw TSX copy is shipped. Because the bundle inlines relative
13
+ * V1 bundle: `tsdown` emits `dist/tui.js`, re-exported by root `tui.ts`.
14
+ * OpenCode V2 uses the separate `src/index-v2.tsx` entry and native CLI plugin
15
+ * API. No raw TSX implementation is shipped. Because the bundle inlines relative
16
16
  * imports, this entry may be split into modules without breaking the loader.
17
17
  *
18
18
  * Slots:
@@ -121,12 +121,14 @@ async function resolvePresetForTui(env, cwd) {
121
121
  }
122
122
  async function detectVersion(api) {
123
123
  try {
124
- const pkgContent = await readFile(fileURLToPath(new URL("../../package.json", import.meta.url)), "utf8");
124
+ const pkgUrl = new URL("../../package.json", import.meta.url);
125
+ const pkgContent = await readFile(fileURLToPath(pkgUrl), "utf8");
125
126
  const pkg = JSON.parse(pkgContent);
126
127
  if (pkg.version) return pkg.version;
127
128
  } catch {}
128
129
  try {
129
- const pkgContent = await readFile(fileURLToPath(new URL("../../../../package.json", import.meta.url)), "utf8");
130
+ const pkgUrl = new URL("../../../../package.json", import.meta.url);
131
+ const pkgContent = await readFile(fileURLToPath(pkgUrl), "utf8");
130
132
  const pkg = JSON.parse(pkgContent);
131
133
  if (pkg.version) return pkg.version;
132
134
  } catch {}
@@ -165,7 +167,7 @@ async function detectVersion(api) {
165
167
  if (ver) return ver;
166
168
  }
167
169
  } catch {}
168
- return "1.5.2";
170
+ return "1.6.0-beta.10";
169
171
  }
170
172
  /**
171
173
  * usage-bar — AI subscription usage gauge for the opencode TUI.
@@ -763,10 +765,7 @@ function parseDelegationMarkdown(raw, fileAlias, sessionID = "") {
763
765
  case "Started":
764
766
  if (value !== "" && started === void 0) started = value;
765
767
  break;
766
- case "Finalized":
767
- finalized = value;
768
- break;
769
- default: break;
768
+ case "Finalized": finalized = value;
770
769
  }
771
770
  }
772
771
  const startedAt = started !== void 0 ? Date.parse(started) : NaN;
@@ -885,7 +884,7 @@ function compareDelegationEntries(a, b) {
885
884
  * then the most recent terminal reports; the remaining tail is collapsed
886
885
  * by the View into a single "… +N more" line. Pure — so the history-only panel (no sessionID) is testable
887
886
  * without the TUI runtime. */
888
- function splitDelegationList(all, maxRecent = 8, now = Date.now(), staleThresholdMs = 1800 * 1e3) {
887
+ function splitDelegationList(all, maxRecent = 8, now = Date.now(), staleThresholdMs = 18e5) {
889
888
  const isActiveState = (st) => st === "running" || st === "retry" || st === "stale-running";
890
889
  return {
891
890
  active: all.filter((d) => isActiveState(d.state)).map((d) => markStaleIfRunning(d, now, staleThresholdMs)).sort(compareDelegationEntries),
@@ -900,20 +899,20 @@ function splitDelegationList(all, maxRecent = 8, now = Date.now(), staleThreshol
900
899
  /** Live-first window used by {@link ceilingDelegationList} (kept for the
901
900
  * ceiling helper and existing tests): active jobs first, then the most
902
901
  * recent terminal reports (capped). Pure. */
903
- function visibleDelegationList(all, maxTerminal = 8, now = Date.now(), staleThresholdMs = 1800 * 1e3) {
902
+ function visibleDelegationList(all, maxTerminal = 8, now = Date.now(), staleThresholdMs = 18e5) {
904
903
  const { active, recent } = splitDelegationList(all, maxTerminal, now, staleThresholdMs);
905
904
  return [...active, ...recent];
906
905
  }
907
906
  /** Default stale-running threshold: 30 minutes. */
908
- const STALE_RUNNING_THRESHOLD_MS = 1800 * 1e3;
907
+ const STALE_RUNNING_THRESHOLD_MS = 18e5;
909
908
  /** Idle silence window: if no updatedAt change in this window, the entry is
910
909
  * considered stale. Combined with the stale-running threshold to produce the
911
910
  * display-only `stale-running` state. */
912
- const IDLE_SILENCE_MS = 60 * 1e3;
911
+ const IDLE_SILENCE_MS = 6e4;
913
912
  /** Visual-only terminal retention windows. Reports remain on disk; these
914
913
  * constants only control which rows enter the TUI window. */
915
- const DELEGATION_DONE_RETENTION_MS = 120 * 1e3;
916
- const DELEGATION_FAILED_RETENTION_MS = 600 * 1e3;
914
+ const DELEGATION_DONE_RETENTION_MS = 12e4;
915
+ const DELEGATION_FAILED_RETENTION_MS = 6e5;
917
916
  /** Grace window for an ABSENT child status. `api.state.session.status()` only
918
917
  * carries the sessions that are currently ALIVE; every finished child of a
919
918
  * long-lived session is missing from that map. A child with no status is
@@ -923,7 +922,7 @@ const DELEGATION_FAILED_RETENTION_MS = 600 * 1e3;
923
922
  * has not been registered by the status API yet: within this window of its
924
923
  * last activity (`time.updated`, falling back to `time.created`) it still
925
924
  * reads as running. */
926
- const DELEGATION_CHILD_STATUS_GRACE_MS = 60 * 1e3;
925
+ const DELEGATION_CHILD_STATUS_GRACE_MS = 6e4;
927
926
  /** Recency window for the children channel. `session.children` returns EVERY
928
927
  * child the focused session ever spawned, so a long session accumulates
929
928
  * hundreds of historical rows that would inflate the panel. A child whose
@@ -931,12 +930,12 @@ const DELEGATION_CHILD_STATUS_GRACE_MS = 60 * 1e3;
931
930
  * is older than this window is dropped BEFORE it can enter the list. 24h
932
931
  * keeps the sidebar scoped to current work while still covering long
933
932
  * delegations. A child with no timestamp at all is kept (fail-open). */
934
- const DELEGATION_CHILDREN_RECENCY_MS = 1440 * 60 * 1e3;
933
+ const DELEGATION_CHILDREN_RECENCY_MS = 864e5;
935
934
  /** Alias-less NATIVE task() live entries never receive a report alias (the
936
935
  * task tool output carries none), so the 30s alias-less prune in
937
936
  * mergeChildDelegationSources must not apply to them — 5 minutes covers a
938
937
  * slow child listing while still bounding the live map. */
939
- const NATIVE_LIVE_ALIASLESS_TTL_MS = 300 * 1e3;
938
+ const NATIVE_LIVE_ALIASLESS_TTL_MS = 3e5;
940
939
  /**
941
940
  * Mark a running entry as `stale-running` if it has been running longer than
942
941
  * the threshold AND has no recent activity (no `updatedAt` change in the last
@@ -1040,7 +1039,7 @@ function delegationStateTone(state) {
1040
1039
  /** Bounded tracker: child session id → latest running tool call. */
1041
1040
  const latestToolActivity = /* @__PURE__ */ new Map();
1042
1041
  const MAX_TOOL_ACTIVITY_ENTRIES = 200;
1043
- const TOOL_ACTIVITY_TTL_MS = 300 * 1e3;
1042
+ const TOOL_ACTIVITY_TTL_MS = 3e5;
1044
1043
  /** First usable summary string from common tool input fields. */
1045
1044
  function summarizeToolInput(input) {
1046
1045
  if (!input) return "";
@@ -1558,9 +1557,7 @@ function formatDelegationHeader(entries) {
1558
1557
  case "failed":
1559
1558
  failed++;
1560
1559
  break;
1561
- case "done":
1562
- done++;
1563
- break;
1560
+ case "done": done++;
1564
1561
  }
1565
1562
  const tail = failed > 0 ? ` · ${failed} failed` : "";
1566
1563
  return `(${active} active · ${done} done${tail})`;
@@ -1808,10 +1805,49 @@ function DelegationRow(props) {
1808
1805
  return _el$13;
1809
1806
  })();
1810
1807
  }
1811
- /** Plugin-level live delegation store shared with the event subscriptions
1812
- * in `tui()`: the map of live entries + a version signal bumped on every
1813
- * mutation. The View subscribes to the version (in an effect) to refresh the
1814
- * durable child list and also reads the map as an optimistic live source. */
1808
+ /** Plugin-level live delegation store shared by event subscriptions and View.
1809
+ * Mutations notify subscribers so the View can refresh its durable child
1810
+ * list while also reading the map as an optimistic live source. */
1811
+ /** Create the observable live store shared by task events and the sidebar. */
1812
+ function createLiveDelegationStore() {
1813
+ const listeners = /* @__PURE__ */ new Set();
1814
+ return {
1815
+ map: /* @__PURE__ */ new Map(),
1816
+ subscribe(listener) {
1817
+ listeners.add(listener);
1818
+ return () => listeners.delete(listener);
1819
+ },
1820
+ bump() {
1821
+ for (const listener of listeners) listener();
1822
+ }
1823
+ };
1824
+ }
1825
+ /** Register the live task-part events that invalidate the sidebar store. */
1826
+ function registerLiveDelegationEvents(api, liveStore) {
1827
+ const unsubLive = [];
1828
+ try {
1829
+ unsubLive.push(api.event.on("message.part.updated", (event) => {
1830
+ const props = event?.properties ?? {};
1831
+ const part = props.part ?? props.info?.part;
1832
+ if (part === void 0) return;
1833
+ const sample = extractToolActivity(part);
1834
+ if (sample !== null) trackToolActivity(latestToolActivity, sample.sessionID, sample.activity);
1835
+ if (reduceDelegationToolPart(liveStore.map, part)) liveStore.bump();
1836
+ }));
1837
+ } catch {}
1838
+ try {
1839
+ unsubLive.push(api.event.on("message.part.removed", (event) => {
1840
+ const props = event?.properties ?? {};
1841
+ const partID = props.partID ?? props.part?.id;
1842
+ if (partID !== void 0 && removeDelegationEntry(liveStore.map, partID)) liveStore.bump();
1843
+ }));
1844
+ } catch {}
1845
+ return () => {
1846
+ for (const unsub of unsubLive) try {
1847
+ unsub();
1848
+ } catch {}
1849
+ };
1850
+ }
1815
1851
  function View(props) {
1816
1852
  const [showSessions, setShowSessions] = createSignal(false);
1817
1853
  const [showDelegations, setShowDelegations] = createSignal(true);
@@ -1941,11 +1977,12 @@ function View(props) {
1941
1977
  cleanup.push(props.api.event.on("session.deleted", eventRefresh));
1942
1978
  cleanup.push(props.api.event.on("session.status", eventRefresh));
1943
1979
  } catch {}
1944
- createEffect(() => {
1945
- props.liveStore.version();
1980
+ cleanup.push(props.liveStore.subscribe(() => {
1946
1981
  eventRefreshCount += 1;
1947
1982
  refreshDelegations();
1948
- });
1983
+ }));
1984
+ eventRefreshCount += 1;
1985
+ refreshDelegations();
1949
1986
  const poll = setInterval(() => {
1950
1987
  setNow(Date.now());
1951
1988
  refreshDelegations();
@@ -2172,34 +2209,10 @@ const tui = (api, _options, _meta) => {
2172
2209
  const [version, setVersion] = createSignal(null);
2173
2210
  detectVersion(api).then((detected) => setVersion(detected)).catch(() => setVersion(null));
2174
2211
  setupUsageBar(api);
2175
- const [liveVersion, setLiveVersion] = createSignal(0);
2176
- const liveStore = {
2177
- map: /* @__PURE__ */ new Map(),
2178
- version: liveVersion,
2179
- bump: () => setLiveVersion((v) => v + 1)
2180
- };
2181
- const unsubLive = [];
2182
- try {
2183
- unsubLive.push(api.event.on("message.part.updated", (event) => {
2184
- const props = event?.properties ?? {};
2185
- const part = props.part ?? props.info?.part;
2186
- if (part === void 0) return;
2187
- const sample = extractToolActivity(part);
2188
- if (sample !== null) trackToolActivity(latestToolActivity, sample.sessionID, sample.activity);
2189
- if (reduceDelegationToolPart(liveStore.map, part)) liveStore.bump();
2190
- }));
2191
- } catch {}
2192
- try {
2193
- unsubLive.push(api.event.on("message.part.removed", (event) => {
2194
- const props = event?.properties ?? {};
2195
- const partID = props.partID ?? props.part?.id;
2196
- if (partID !== void 0 && removeDelegationEntry(liveStore.map, partID)) liveStore.bump();
2197
- }));
2198
- } catch {}
2212
+ const liveStore = createLiveDelegationStore();
2213
+ const unsubscribeLive = registerLiveDelegationEvents(api, liveStore);
2199
2214
  api.lifecycle.onDispose(() => {
2200
- for (const unsub of unsubLive) try {
2201
- unsub();
2202
- } catch {}
2215
+ unsubscribeLive();
2203
2216
  liveStore.map.clear();
2204
2217
  });
2205
2218
  api.slots.register({
@@ -2224,6 +2237,6 @@ const plugin = {
2224
2237
  setup: async () => {}
2225
2238
  };
2226
2239
  //#endregion
2227
- export { DELEGATION_ALIAS_WIDTH, DELEGATION_CHILDREN_RECENCY_MS, DELEGATION_CHILD_STATUS_GRACE_MS, DELEGATION_DESCRIPTION_MAX, DELEGATION_DONE_RETENTION_MS, DELEGATION_ELAPSED_WIDTH, DELEGATION_FAILED_RETENTION_MS, DELEGATION_ROW_GLYPHS, DELEGATION_VISIBLE_CEILING, IDLE_SILENCE_MS, NATIVE_LIVE_ALIASLESS_TTL_MS, STALE_RUNNING_THRESHOLD_MS, buildChildrenPath, ceilingDelegationList, childStatusToState, childrenToDelegationEntries, collectDelegationToolParts, compareDelegationEntries, countDelegationSources, createDelegationRowOpenHandler, plugin as default, delegationActivity, delegationActivityLabel, delegationElapsed, delegationRowGlyph, delegationRowIdentity, delegationRowMarker, delegationRowStatus, delegationSpinnerFrame, delegationStateTone, extractToolActivity, filterDelegationsToSession, fmtElapsed, formatDelegationAlias, formatDelegationElapsed, formatDelegationHeader, formatDelegationRowLead, formatPanelLogLine, isValidSessionId, latestToolActivityFor, markStaleIfRunning, mergeChildDelegationSources, mergeDelegationSources, navigateToDelegationSession, panelLogDir, parseDelegationMarkdown, parseDelegationToolPart, readAllDelegationEntries, readDelegationEntries, reduceDelegationToolPart, removeDelegationEntry, resolveCurrentSessionID, resolveDelegationsDir, resolvePantheonRoot, safeSessionPath, seedLiveDelegationMap, splitDelegationList, toDelegationEntry, trackToolActivity, truncateDelegationDescription, tuiLogPath, visibleDelegationList };
2240
+ export { DELEGATION_ALIAS_WIDTH, DELEGATION_CHILDREN_RECENCY_MS, DELEGATION_CHILD_STATUS_GRACE_MS, DELEGATION_DESCRIPTION_MAX, DELEGATION_DONE_RETENTION_MS, DELEGATION_ELAPSED_WIDTH, DELEGATION_FAILED_RETENTION_MS, DELEGATION_ROW_GLYPHS, DELEGATION_VISIBLE_CEILING, IDLE_SILENCE_MS, NATIVE_LIVE_ALIASLESS_TTL_MS, STALE_RUNNING_THRESHOLD_MS, buildChildrenPath, ceilingDelegationList, childStatusToState, childrenToDelegationEntries, collectDelegationToolParts, compareDelegationEntries, countDelegationSources, createDelegationRowOpenHandler, createLiveDelegationStore, plugin as default, delegationActivity, delegationActivityLabel, delegationElapsed, delegationRowGlyph, delegationRowIdentity, delegationRowMarker, delegationRowStatus, delegationSpinnerFrame, delegationStateTone, extractToolActivity, filterDelegationsToSession, fmtElapsed, formatDelegationAlias, formatDelegationElapsed, formatDelegationHeader, formatDelegationRowLead, formatPanelLogLine, isValidSessionId, latestToolActivityFor, markStaleIfRunning, mergeChildDelegationSources, mergeDelegationSources, navigateToDelegationSession, panelLogDir, parseDelegationMarkdown, parseDelegationToolPart, readAllDelegationEntries, readDelegationEntries, reduceDelegationToolPart, registerLiveDelegationEvents, removeDelegationEntry, resolveCurrentSessionID, resolveDelegationsDir, resolvePantheonRoot, safeSessionPath, seedLiveDelegationMap, splitDelegationList, toDelegationEntry, trackToolActivity, truncateDelegationDescription, tuiLogPath, visibleDelegationList };
2228
2241
 
2229
2242
  //# sourceMappingURL=tui.js.map
@@ -0,0 +1,6 @@
1
+ import { Plugin } from '@opencode/plugin'
2
+
3
+ export default Plugin.define({
4
+ id: 'pantheon.tui.server',
5
+ setup() {},
6
+ })