pantheon-opencode 1.5.2 → 1.6.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) 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/CHANGELOG.md +59 -0
  6. package/README.md +115 -55
  7. package/README.pt-BR.md +86 -43
  8. package/commands/pantheon-optimize.md +2 -2
  9. package/package.json +13 -1
  10. package/plugin.json +1 -1
  11. package/pyproject.toml +8 -15
  12. package/scripts/build-agents-md.mjs +2 -2
  13. package/scripts/check-plugin-v2-coverage.mjs +213 -0
  14. package/scripts/ci-validate-yaml.py +7 -5
  15. package/scripts/code_mode_server.py +116 -24
  16. package/scripts/doctor.mjs +85 -28
  17. package/scripts/install/cli-ui.mjs +1 -1
  18. package/scripts/install/config-migration.mjs +124 -3
  19. package/scripts/install/health-check.mjs +6 -19
  20. package/scripts/install/interactive.mjs +6 -6
  21. package/scripts/install/migrate.mjs +1 -1
  22. package/scripts/install/opencode.mjs +43 -10
  23. package/scripts/mcp_persistence_server.py +390 -76
  24. package/scripts/memory_mcp_server.py +370 -196
  25. package/scripts/postinstall.mjs +0 -7
  26. package/scripts/probe-context-rehydrate.mjs +28 -11
  27. package/scripts/prune.mjs +2 -2
  28. package/scripts/test-opencode-v2-sandbox.sh +1759 -0
  29. package/scripts/validate-routing.mjs +40 -0
  30. package/skills-lock.json +9 -10
  31. package/src/agents/aphrodite.md +0 -1
  32. package/src/agents/apollo.md +0 -1
  33. package/src/agents/athena.md +0 -1
  34. package/src/agents/demeter.md +0 -1
  35. package/src/agents/gaia.md +0 -1
  36. package/src/agents/hephaestus.md +0 -1
  37. package/src/agents/hermes.md +0 -1
  38. package/src/agents/iris.md +0 -1
  39. package/src/agents/mnemosyne.md +15 -17
  40. package/src/agents/nyx.md +0 -1
  41. package/src/agents/prometheus.md +0 -1
  42. package/src/agents/talos.md +0 -1
  43. package/src/agents/themis.md +0 -1
  44. package/src/agents/zeus.md +1 -3
  45. package/src/mcp/code_mode_server.py +116 -24
  46. package/src/mcp/mcp_codemap_module.py +559 -129
  47. package/src/mcp/mcp_persistence_server.py +390 -76
  48. package/src/mcp/memory_mcp_server.py +371 -248
  49. package/src/mcp/pantheon_vision_server.py +136 -24
  50. package/src/mcp/requirements-mcp.txt +5 -3
  51. package/src/mcp/requirements-vision.txt +2 -0
  52. package/src/pantheon/model-command.ts +18 -7
  53. package/src/pantheon/presets.d.mts +0 -8
  54. package/src/pantheon/presets.mjs +0 -29
  55. package/src/pantheon/todo-enforcer.ts +1 -1
  56. package/src/pantheon/vision.ts +1 -1
  57. package/src/plugin-v2.ts +134 -104
  58. package/src/plugins/tui/dist/tui.js +1 -1
  59. package/src/plugins/tui/package-lock.json +23 -23
  60. package/src/plugins/tui/package.json +12 -12
  61. package/src/routing.yml +0 -16
  62. package/src/skills/README.md +31 -36
  63. package/src/skills/auto-continue/SKILL.md +27 -77
  64. package/.pantheon/code-mode/eval-llm-judge.py +0 -255
  65. package/.pantheon/code-mode/eval-monte-carlo.py +0 -368
  66. package/.pantheon/code-mode/eval-run.py +0 -197
  67. package/.pantheon/code-mode/eval-static.py +0 -321
  68. package/.pantheon/code-mode/session-end-save.py +0 -186
  69. package/.pantheon/code-mode/session-end-save.sh +0 -18
  70. package/scripts/recover-zenodo-deposition.mjs +0 -146
  71. package/scripts/test-opencode-v1-v2-sandbox.sh +0 -862
  72. package/scripts/validate-zenodo-release.mjs +0 -154
  73. package/scripts/zenodo-artifact.mjs +0 -94
  74. package/scripts/zenodo-release-state.mjs +0 -53
  75. package/src/skills/orchestration-workflow/SKILL.md +0 -311
package/src/plugin-v2.ts CHANGED
@@ -4,27 +4,38 @@
4
4
  * Registers:
5
5
  * - 6 orchestration tools via V2 tool.transform (with V1 bridge fallback)
6
6
  * - 4 event subscriptions (session.created, idle, error, compacted)
7
- * - Session hooks (prompt, context) and tool hooks (execute.before/after)
7
+ * - Session hooks (prompt, context, compaction) and tool hooks (execute.before/after)
8
8
  * - Permission hooks for custom authorization
9
9
  *
10
- * V2 Plugin API surface (confirmed by investigation):
11
- * ctx.tool.transform / ctx.event.subscribe / ctx.session.hook /
12
- * ctx.tool.hook / ctx.permission.hook
10
+ * The transitional SDK types used here expose these domains:
11
+ * ctx.agent / ctx.command / ctx.model / ctx.reference / ctx.skill /
12
+ * ctx.tool / ctx.event / ctx.permission / ctx.session
13
13
  *
14
- * When a V2 API domain is unavailable, the feature is gracefully skipped
15
- * and documented in V2_UNSUPPORTED_FEATURES. The plugin never breaks.
14
+ * A separate OpenCode 2.0.18 host runtime probe confirmed ctx.integration and
15
+ * ctx.skill have callable `.transform` methods; only ctx.catalog was absent.
16
+ * The probe's callback effects were
17
+ * not observed for any domain. This runtime probe is not an SDK compatibility
18
+ * claim. Pantheon's Phase 1/config transform
19
+ * registrations cover agent, command, and reference; `ctx.tool.transform` is
20
+ * attempted separately in Phase 2. Integration and skill transform callbacks
21
+ * are not registered by Pantheon, so their effects remain unproven. The
22
+ * narrower `SkillEditor.source()` helper is absent from the inspected SDK
23
+ * editor shape, so directory-source registration remains unsupported; that
24
+ * does not imply that `ctx.skill` or its transform is absent.
25
+ *
26
+ * V2_UNSUPPORTED_FEATURES distinguishes adapter limitations from observed
27
+ * host-absent APIs; setup handles optional registrations on a best-effort basis.
16
28
  *
17
29
  * @module plugin-v2
18
30
  */
19
31
 
32
+ import { appendFileSync } from 'node:fs'
20
33
  import { fileURLToPath } from 'node:url'
21
34
  import type {
22
35
  AgentDraft,
23
- CatalogDraft,
24
36
  CommandDraft,
25
37
  PluginContext,
26
38
  ReferenceDraft,
27
- SkillDraft,
28
39
  } from '@opencode-ai/plugin/v2/promise'
29
40
  import { define } from '@opencode-ai/plugin/v2/promise'
30
41
  import {
@@ -36,34 +47,53 @@ import {
36
47
  // ─── Unsupported Features Registry ───────────────────────────────────────
37
48
 
38
49
  /**
39
- * Features not yet supported by the installed V2 plugin API.
40
- * Updated dynamically at setup time based on actual API availability.
41
- * Initialized with features known to be absent from the V2 promise API;
42
- * additional features are appended during setup if their API is missing.
50
+ * Features not implemented by the current Pantheon V2 adapter or absent from
51
+ * the observed host. A listed feature is not necessarily a host-absent API.
52
+ * Additional features are appended during setup when a required API is missing.
43
53
  */
44
- export const V2_UNSUPPORTED_FEATURES: string[] = ['legacy-hooks']
54
+ export const V2_UNSUPPORTED_FEATURES: string[] = [
55
+ 'legacy-hooks',
56
+ // `catalog` alone was absent in the OpenCode 2.0.18 runtime probe.
57
+ 'catalog-transform',
58
+ // The host exposes callable transforms for integration and skill, but
59
+ // Pantheon does not register/use them and no host callback effects were
60
+ // observed. These entries describe adapter support, not host availability.
61
+ 'integration-transform',
62
+ // The inspected SkillEditor shape has no `source()` helper for adding a
63
+ // directory source. This is narrower than (and distinct from) ctx.skill's
64
+ // host availability or callable transform.
65
+ 'skill-transform',
66
+ ]
45
67
 
46
68
  // ─── Constants ───────────────────────────────────────────────────────────
47
69
 
48
70
  const POLICY_MARKER = '<!-- pantheon-v2-policy -->'
49
71
  const POLICY = `${POLICY_MARKER}\nFollow Pantheon routing policy: delegate implementation work to the named specialist and do not claim work was performed without verification.`
50
72
 
73
+ /** 2.0.16 `system` on a session hook payload is `Array<SystemPart>`. */
74
+ interface SystemPart {
75
+ type: 'text'
76
+ text: string
77
+ }
78
+
79
+ function isTextPart(entry: unknown): entry is SystemPart {
80
+ return (
81
+ typeof entry === 'object' &&
82
+ entry !== null &&
83
+ typeof (entry as { text?: unknown }).text === 'string'
84
+ )
85
+ }
86
+
51
87
  /**
52
- * SystemPart shape sniffing (beta 19192 `Schema validation failed` in
53
- * system[N]): host sends SystemPart objects ({type,text}) but pinned SDK
54
- * (@opencode-ai/plugin 1.18.18) only knows string/string[]. Detect at runtime.
55
- * Never throws (fail-open).
88
+ * Extract text from a `system` entry. The host's own coercion accepts a bare
89
+ * string, but the canonical 2.0.16 shape is `{ type: 'text', text }`; the
90
+ * string branch is retained so the handler still works against a host that
91
+ * sends primitives. Never throws.
56
92
  */
57
93
  function systemEntryText(entry: unknown): string | null {
58
94
  try {
59
95
  if (typeof entry === 'string') return entry
60
- if (
61
- typeof entry === 'object' &&
62
- entry !== null &&
63
- typeof (entry as { text?: unknown }).text === 'string'
64
- ) {
65
- return (entry as { text: string }).text
66
- }
96
+ if (isTextPart(entry)) return entry.text
67
97
  return null
68
98
  } catch {
69
99
  return null
@@ -81,19 +111,30 @@ function hasPolicyMarker(arr: unknown[]): boolean {
81
111
  }
82
112
  }
83
113
 
84
- function usesObjectShape(arr: unknown[]): boolean {
85
- try {
86
- return arr.some(
87
- (s) =>
88
- typeof s === 'object' && s !== null && typeof (s as { text?: unknown }).text === 'string',
89
- )
90
- } catch {
91
- return false
114
+ /**
115
+ * Normalize a `system` value to the 2.0.16 `Array<SystemPart>` shape.
116
+ *
117
+ * `SessionContext.system` is `Array<SystemPart>` where a part is
118
+ * `{ type: 'text', text }`. A raw string (the whole value, or an element) is
119
+ * not that shape, so it is upgraded: element strings become parts, and a bare
120
+ * string value becomes a one-element part array. Non-array, non-string values
121
+ * are returned unchanged.
122
+ *
123
+ * Returns the normalized array, or `null` when `system` is neither a string
124
+ * nor an array (nothing to normalize).
125
+ */
126
+ function normalizeSystemToParts(system: unknown): unknown[] | null {
127
+ if (typeof system === 'string') {
128
+ return [{ type: 'text', text: system } satisfies SystemPart]
92
129
  }
93
- }
94
-
95
- function toSystemEntry(text: string, useObject: boolean): string | { type: 'text'; text: string } {
96
- return useObject ? { type: 'text', text } : text
130
+ if (!Array.isArray(system)) return null
131
+ for (let i = 0; i < system.length; i++) {
132
+ const entry = system[i]
133
+ if (typeof entry === 'string') {
134
+ system[i] = { type: 'text', text: entry } satisfies SystemPart
135
+ }
136
+ }
137
+ return system
97
138
  }
98
139
 
99
140
  /**
@@ -191,16 +232,6 @@ function transformAgents(draft: AgentDraft): void {
191
232
  }
192
233
  }
193
234
 
194
- function transformCatalog(draft: CatalogDraft, options: PluginContext['options']): void {
195
- const configured = options.default_model
196
- if (typeof configured !== 'string') return
197
- const separator = configured.indexOf('/')
198
- if (separator <= 0 || separator === configured.length - 1) return
199
- const providerID = configured.slice(0, separator)
200
- const modelID = configured.slice(separator + 1)
201
- if (draft.model.get(providerID, modelID)) draft.model.default.set(providerID, modelID)
202
- }
203
-
204
235
  function transformCommands(draft: CommandDraft): void {
205
236
  // Beta 19192 guard (issue #92): draft may not have `list`, or list()
206
237
  // may return a non-iterable. Never throw — mark unsupported and return.
@@ -237,41 +268,6 @@ function transformCommands(draft: CommandDraft): void {
237
268
  }
238
269
  }
239
270
 
240
- function transformSkills(draft: SkillDraft): void {
241
- // Beta 19192 guard (issue #92): draft may not have `list`, or list()
242
- // may return a non-iterable. Never throw — mark unsupported and return.
243
- let sources: Array<{ type: string; path: string }>
244
- try {
245
- const maybeList = (draft as unknown as { list?: unknown }).list
246
- if (typeof maybeList !== 'function') {
247
- markUnsupported('skill-transform-list')
248
- return
249
- }
250
- const result = (maybeList as (this: unknown) => unknown).call(draft)
251
- if (
252
- result == null ||
253
- typeof (result as { [Symbol.iterator]?: unknown })[Symbol.iterator] !== 'function'
254
- ) {
255
- markUnsupported('skill-transform-list')
256
- return
257
- }
258
- sources = Array.isArray(result)
259
- ? (result as Array<{ type: string; path: string }>)
260
- : Array.from(result as Iterable<{ type: string; path: string }>)
261
- } catch {
262
- markUnsupported('skill-transform-list')
263
- return
264
- }
265
- try {
266
- const path = fileURLToPath(new URL('./skills', import.meta.url))
267
- if (!sources.some((source) => source.type === 'directory' && source.path === path)) {
268
- draft.source({ type: 'directory', path })
269
- }
270
- } catch {
271
- markUnsupported('skill-transform')
272
- }
273
- }
274
-
275
271
  function transformReferences(draft: ReferenceDraft): void {
276
272
  draft.add('pantheon-agents', {
277
273
  type: 'local',
@@ -453,21 +449,32 @@ async function registerV2SessionHooks(context: PluginContext): Promise<boolean>
453
449
  // "context" hook — inject routing policy + compaction state
454
450
  await sessionCtx.hook('context', (event: unknown) => {
455
451
  try {
456
- // Beta 19192 hardening + SystemPart sniffing: host may send string[],
457
- // SystemPart objects ({type,text}), mixed arrays, a single string, or
458
- // a non-array system. Preserve string-path behavior; inject object
459
- // shape when the array contains objects (else `Schema validation
460
- // failed` in system[N]). Never throw to the host (fail-open).
461
- const ctx = event as { system?: unknown } | null | undefined
462
- const rawSystem: unknown = ctx?.system
463
- if (typeof rawSystem === 'string' && ctx != null) {
464
- ctx.system = rawSystem.includes(POLICY_MARKER) ? [rawSystem] : [rawSystem, POLICY]
465
- } else if (Array.isArray(rawSystem)) {
466
- if (!hasPolicyMarker(rawSystem)) {
467
- rawSystem.push(toSystemEntry(POLICY, usesObjectShape(rawSystem)))
452
+ // Opt-in lifetime proof for the host-backed hook canary (MODE=real).
453
+ // Inert unless PANTHEON_HOOK_CANARY_LIFETIME_PROOF is set.
454
+ if (process.env.PANTHEON_HOOK_CANARY_LIFETIME_PROOF) {
455
+ try {
456
+ appendFileSync(
457
+ process.env.PANTHEON_HOOK_CANARY_LIFETIME_PROOF,
458
+ 'plugin-v2:session.hook:context\n',
459
+ )
460
+ } catch {
461
+ // Best-effort instrumentation.
468
462
  }
469
463
  }
470
- // Non-string, non-array system (or null event): ignore silently.
464
+ // 2.0.16 payload is `{ system: Array<SystemPart> }`. Normalize any
465
+ // string entries to `{ type: 'text', text }` parts and append the
466
+ // policy as a part. Junk entries are ignored; a non-array,
467
+ // non-string system is left untouched. Never throws (fail-open).
468
+ const ctx = event as { system?: unknown } | null | undefined
469
+ if (ctx == null) return
470
+ const normalized = normalizeSystemToParts(ctx.system)
471
+ if (normalized == null) return
472
+ // A bare string is replaced by its part array; an array is mutated in
473
+ // place (the host may read the original reference).
474
+ if (typeof ctx.system === 'string') ctx.system = normalized
475
+ if (!hasPolicyMarker(normalized)) {
476
+ normalized.push({ type: 'text', text: POLICY } satisfies SystemPart)
477
+ }
471
478
  } catch {
472
479
  // Fail-open: never throw to the host.
473
480
  }
@@ -699,17 +706,19 @@ export const plugin = define({
699
706
 
700
707
  async setup(context: PluginContext): Promise<void> {
701
708
  // ─── Phase 1: V2 Transforms (isolated per-domain, best-effort) ────
702
- // Each domain registers independently: a failure in one transform
703
- // (e.g. draft.list missing on beta 19192 → TypeError) must never
704
- // reject setup() nor prevent the other domains from registering.
709
+ // Each transform registration is individually wrapped and settled via Promise.allSettled:
710
+ // a rejection marks only that transform unsupported
711
+ // and does not reject setup() or prevent later hook registrations.
705
712
  // See issue #92.
713
+ //
714
+ // Pantheon's Phase 1/config transform registrations cover agent, command,
715
+ // and reference; ctx.tool.transform is attempted separately in Phase 2.
716
+ // The 2.0.18 runtime probe found ctx.integration and ctx.skill with
717
+ // callable transforms, but no callback effects were observed; neither is
718
+ // registered here. Only ctx.catalog was absent in that probe.
719
+ // The hook canary tests hook firing only, not transform callback effects.
706
720
  const phase1Transforms: Array<{ feature: string; register: () => Promise<unknown> }> = [
707
721
  { feature: 'agent-transform', register: () => context.agent.transform(transformAgents) },
708
- {
709
- feature: 'catalog-transform',
710
- register: () =>
711
- context.catalog.transform((draft) => transformCatalog(draft, context.options)),
712
- },
713
722
  {
714
723
  feature: 'command-transform',
715
724
  register: () => context.command.transform(transformCommands),
@@ -718,7 +727,6 @@ export const plugin = define({
718
727
  feature: 'reference-transform',
719
728
  register: () => context.reference.transform(transformReferences),
720
729
  },
721
- { feature: 'skill-transform', register: () => context.skill.transform(transformSkills) },
722
730
  ]
723
731
  const phase1Results = await Promise.allSettled(
724
732
  phase1Transforms.map((t) => Promise.resolve().then(() => t.register())),
@@ -771,9 +779,31 @@ export const plugin = define({
771
779
  | undefined
772
780
  if (compactionCtx?.hook) {
773
781
  try {
774
- await compactionCtx.hook('compacting', (_event: unknown) => {
782
+ // 2.0.16 `SessionHooks` key is `compaction` (the migration doc maps
783
+ // `experimental.session.compacting` → `ctx.session.hook("compaction")`).
784
+ // `compacting` is not a valid key: the registry accepts any string and
785
+ // silently drops unknown names, so the old name was a permanent no-op.
786
+ // Proven by the canary's negative control.
787
+ await compactionCtx.hook('compaction', (_event: unknown) => {
775
788
  // Compaction context build — injects active goals, pending todos,
776
789
  // and in-flight delegations. Wired through V1 infrastructure.
790
+ //
791
+ // Opt-in lifetime proof for the host-backed hook canary
792
+ // (tests/pantheon/plugin-v2-hook-canary.test.mjs, MODE=real). It is
793
+ // inert unless PANTHEON_HOOK_CANARY_LIFETIME_PROOF is set, so
794
+ // production behaviour is unchanged. This exists because a rename to
795
+ // `compacting` was a silent no-op for an unknown length of time: the
796
+ // canary can now observe that THIS registration fired.
797
+ if (process.env.PANTHEON_HOOK_CANARY_LIFETIME_PROOF) {
798
+ try {
799
+ appendFileSync(
800
+ process.env.PANTHEON_HOOK_CANARY_LIFETIME_PROOF,
801
+ 'plugin-v2:session.hook:compaction\n',
802
+ )
803
+ } catch {
804
+ // Proof is best-effort: never let instrumentation break the host.
805
+ }
806
+ }
777
807
  })
778
808
  } catch {
779
809
  markUnsupported('compaction-hook')
@@ -165,7 +165,7 @@ async function detectVersion(api) {
165
165
  if (ver) return ver;
166
166
  }
167
167
  } catch {}
168
- return "1.5.2";
168
+ return "1.6.0-beta.2";
169
169
  }
170
170
  /**
171
171
  * usage-bar — AI subscription usage gauge for the opencode TUI.
@@ -1,32 +1,32 @@
1
1
  {
2
2
  "name": "pantheon-tui",
3
- "version": "1.5.2",
3
+ "version": "1.6.0-beta.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pantheon-tui",
9
- "version": "1.5.2",
9
+ "version": "1.6.0-beta.2",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@opencode-ai/plugin": ">=1.14.0",
13
- "@opentui/core": ">=0.5.10",
14
- "@opentui/solid": ">=0.5.10",
15
- "solid-js": ">=1.9.12"
12
+ "@opencode-ai/plugin": "1.18.30",
13
+ "@opentui/core": "0.5.10",
14
+ "@opentui/solid": "0.5.10",
15
+ "solid-js": "1.9.12"
16
16
  },
17
17
  "devDependencies": {
18
- "rolldown-plugin-solid": "^0.2.1",
19
- "tsdown": "^0.22.14"
18
+ "rolldown-plugin-solid": "0.2.1",
19
+ "tsdown": "0.22.14"
20
20
  },
21
21
  "engines": {
22
22
  "node": "^22.22.2 || ^24.15.0 || >=26.0.0"
23
23
  },
24
24
  "peerDependencies": {
25
- "@opencode-ai/plugin": ">=1.14.0",
26
- "@opencode-ai/sdk": ">=1.14.0",
27
- "@opentui/core": ">=0.5.10",
28
- "@opentui/solid": ">=0.5.10",
29
- "solid-js": ">=1.9.12"
25
+ "@opencode-ai/plugin": "1.18.30",
26
+ "@opencode-ai/sdk": "1.18.30",
27
+ "@opentui/core": "0.5.10",
28
+ "@opentui/solid": "0.5.10",
29
+ "solid-js": "1.9.12"
30
30
  }
31
31
  },
32
32
  "node_modules/@ai-sdk/provider": {
@@ -626,13 +626,13 @@
626
626
  }
627
627
  },
628
628
  "node_modules/@opencode-ai/plugin": {
629
- "version": "1.18.7",
630
- "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.18.7.tgz",
631
- "integrity": "sha512-kXm5hqur5JiF/xJPaQYkuNn7vSl4ya09YgL/pIvIrggWCLFsfo1gXqNbONRcGW7m5Ih2k6kgMXFyjB9or1+dEg==",
629
+ "version": "1.18.30",
630
+ "resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.18.30.tgz",
631
+ "integrity": "sha512-bXWcA2VD478PXXke1qAYANTq58fCcbgY0GAUqZIFZqPpo48FoG8RH37nNZ78eHtz+ddiKIhFTBZJRaHF3IgFqw==",
632
632
  "license": "MIT",
633
633
  "dependencies": {
634
634
  "@ai-sdk/provider": "3.0.8",
635
- "@opencode-ai/sdk": "1.18.7",
635
+ "@opencode-ai/sdk": "1.18.30",
636
636
  "effect": "4.0.0-beta.83",
637
637
  "zod": "4.1.8"
638
638
  },
@@ -654,9 +654,9 @@
654
654
  }
655
655
  },
656
656
  "node_modules/@opencode-ai/sdk": {
657
- "version": "1.18.7",
658
- "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.18.7.tgz",
659
- "integrity": "sha512-5txVELvCxzC3O/MYnRKdTvBN3TqQjE3PaEks3kDRA/moWzMSUhdm15xCth/Mz/NPYyGTn2u4IdScdV9vLTfLRg==",
657
+ "version": "1.18.30",
658
+ "resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.18.30.tgz",
659
+ "integrity": "sha512-uviJ+PZLc/D1szt33WGzzt/rqJ+IaNmRGBb+UcOXrcQANl8XXKJrp4CNQQ2UAnUJ3Ek+VqcamIwjtKHUW/OjOQ==",
660
660
  "license": "MIT",
661
661
  "dependencies": {
662
662
  "cross-spawn": "7.0.6"
@@ -1529,9 +1529,9 @@
1529
1529
  }
1530
1530
  },
1531
1531
  "node_modules/brace-expansion": {
1532
- "version": "2.1.4",
1533
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz",
1534
- "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==",
1532
+ "version": "2.1.7",
1533
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz",
1534
+ "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==",
1535
1535
  "license": "MIT",
1536
1536
  "dependencies": {
1537
1537
  "balanced-match": "^1.0.0"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pantheon-tui",
3
3
  "type": "module",
4
- "version": "1.5.2",
4
+ "version": "1.6.0-beta.2",
5
5
  "description": "Pantheon TUI plugin — sidebar (version, preset, sessions, real-time delegations) + AI subscription usage gauges incl. OpenCode Go/Zen dollar limits (vendored, MIT)",
6
6
  "license": "MIT",
7
7
  "engines": {
@@ -20,20 +20,20 @@
20
20
  "typecheck": "tsc --noEmit"
21
21
  },
22
22
  "peerDependencies": {
23
- "@opencode-ai/plugin": ">=1.14.0",
24
- "@opencode-ai/sdk": ">=1.14.0",
25
- "@opentui/core": ">=0.5.10",
26
- "@opentui/solid": ">=0.5.10",
27
- "solid-js": ">=1.9.12"
23
+ "@opencode-ai/plugin": "1.18.30",
24
+ "@opencode-ai/sdk": "1.18.30",
25
+ "@opentui/core": "0.5.10",
26
+ "@opentui/solid": "0.5.10",
27
+ "solid-js": "1.9.12"
28
28
  },
29
29
  "devDependencies": {
30
- "rolldown-plugin-solid": "^0.2.1",
31
- "tsdown": "^0.22.14"
30
+ "rolldown-plugin-solid": "0.2.1",
31
+ "tsdown": "0.22.14"
32
32
  },
33
33
  "dependencies": {
34
- "@opencode-ai/plugin": ">=1.14.0",
35
- "@opentui/core": ">=0.5.10",
36
- "@opentui/solid": ">=0.5.10",
37
- "solid-js": ">=1.9.12"
34
+ "@opencode-ai/plugin": "1.18.30",
35
+ "@opentui/core": "0.5.10",
36
+ "@opentui/solid": "0.5.10",
37
+ "solid-js": "1.9.12"
38
38
  }
39
39
  }
package/src/routing.yml CHANGED
@@ -99,7 +99,6 @@ presets:
99
99
  agents:
100
100
  zeus:
101
101
  role: Central orchestrator
102
- max_steps: 40 # R4: step budget — at max_steps the agent is forced to summarize-and-stop. Tracker is permanent-per-process (no reset wiring).
103
102
  reasoning_effort: medium
104
103
  user_invocable: true
105
104
  can_delegate: true
@@ -134,11 +133,9 @@ agents:
134
133
  - artifact-management
135
134
  - context-compression
136
135
  - auto-continue
137
- - orchestration-workflow
138
136
  - incremental-implementation
139
137
  athena:
140
138
  role: Strategic planner
141
- max_steps: 15 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
142
139
  reasoning_effort: high
143
140
  user_invocable: true
144
141
  can_delegate: true
@@ -158,7 +155,6 @@ agents:
158
155
  - memory-bank
159
156
  apollo:
160
157
  role: Investigation scout
161
- max_steps: 25 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
162
158
  reasoning_effort: low
163
159
  user_invocable: false
164
160
  can_delegate: false
@@ -176,7 +172,6 @@ agents:
176
172
  - auto-continue
177
173
  hermes:
178
174
  role: Backend specialist
179
- max_steps: 60 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
180
175
  reasoning_effort: medium
181
176
  user_invocable: true
182
177
  can_delegate: true
@@ -199,7 +194,6 @@ agents:
199
194
  - incremental-implementation
200
195
  aphrodite:
201
196
  role: Frontend specialist
202
- max_steps: 60 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
203
197
  reasoning_effort: medium
204
198
  user_invocable: true
205
199
  can_delegate: false
@@ -220,7 +214,6 @@ agents:
220
214
  - file-prompts
221
215
  demeter:
222
216
  role: Database specialist
223
- max_steps: 50 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
224
217
  reasoning_effort: medium
225
218
  user_invocable: true
226
219
  can_delegate: false
@@ -240,7 +233,6 @@ agents:
240
233
  - incremental-implementation
241
234
  themis:
242
235
  role: Quality gate
243
- max_steps: 25 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
244
236
  reasoning_effort: high
245
237
  user_invocable: true
246
238
  can_delegate: false
@@ -262,7 +254,6 @@ agents:
262
254
  - context-compression
263
255
  prometheus:
264
256
  role: Infrastructure specialist
265
- max_steps: 30 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
266
257
  reasoning_effort: medium
267
258
  user_invocable: true
268
259
  can_delegate: false
@@ -281,7 +272,6 @@ agents:
281
272
  - incremental-implementation
282
273
  hephaestus:
283
274
  role: AI pipelines
284
- max_steps: 50 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
285
275
  reasoning_effort: medium
286
276
  user_invocable: true
287
277
  can_delegate: false
@@ -300,7 +290,6 @@ agents:
300
290
  - auto-continue
301
291
  nyx:
302
292
  role: Observability
303
- max_steps: 25 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
304
293
  reasoning_effort: low
305
294
  user_invocable: true
306
295
  can_delegate: false
@@ -319,7 +308,6 @@ agents:
319
308
  - auto-continue
320
309
  gaia:
321
310
  role: Remote sensing domain specialist
322
- max_steps: 25 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
323
311
  reasoning_effort: low
324
312
  user_invocable: false
325
313
  can_delegate: false
@@ -334,7 +322,6 @@ agents:
334
322
  - auto-continue
335
323
  iris:
336
324
  role: GitHub operations
337
- max_steps: 20 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
338
325
  reasoning_effort: low
339
326
  user_invocable: true
340
327
  can_delegate: false
@@ -352,7 +339,6 @@ agents:
352
339
  - artifact-management
353
340
  mnemosyne:
354
341
  role: Memory bank
355
- max_steps: 20 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
356
342
  reasoning_effort: low
357
343
  user_invocable: true
358
344
  can_delegate: false
@@ -376,7 +362,6 @@ agents:
376
362
  - session-goal
377
363
  talos:
378
364
  role: Hotfix agent
379
- max_steps: 15 # R4: step budget — at max_steps the agent is forced to summarize-and-stop
380
365
  reasoning_effort: low
381
366
  user_invocable: true
382
367
  can_delegate: false
@@ -530,7 +515,6 @@ background_job_board:
530
515
  background_delegation:
531
516
  timeout_ms: 900000 # 15 min
532
517
  poll_ms: 250
533
- max_compaction_items: 10
534
518
  prune_ttl_ms: 86400000 # 24h
535
519
  read_only_agents: [apollo, gaia]
536
520
  session_max: 3