pantheon-opencode 1.4.3 → 1.5.0-beta.1

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 (111) hide show
  1. package/.pantheon/code-mode/.gitkeep +0 -0
  2. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/checkpoint-1.json +8 -0
  3. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/checkpoint-10.json +8 -0
  4. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/checkpoint-11.json +8 -0
  5. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/checkpoint-2.json +8 -0
  6. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/checkpoint-3.json +8 -0
  7. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/checkpoint-4.json +8 -0
  8. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/checkpoint-5.json +8 -0
  9. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/checkpoint-6.json +8 -0
  10. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/checkpoint-7.json +8 -0
  11. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/checkpoint-8.json +8 -0
  12. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/checkpoint-9.json +8 -0
  13. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/heartbeat.json +8 -0
  14. package/.pantheon/code-mode/.pantheon/deepwork/initial-token-40k/session.json +11 -0
  15. package/.pantheon/code-mode/README.md +93 -0
  16. package/.pantheon/code-mode/checkpoint-session.py +7 -0
  17. package/.pantheon/code-mode/checkpoint-session.sh +11 -0
  18. package/.pantheon/code-mode/checkpoint_session.py +481 -0
  19. package/.pantheon/code-mode/compress-inline.py +450 -0
  20. package/.pantheon/code-mode/eval-llm-judge.py +255 -0
  21. package/.pantheon/code-mode/eval-monte-carlo.py +368 -0
  22. package/.pantheon/code-mode/eval-run.py +197 -0
  23. package/.pantheon/code-mode/eval-static.py +321 -0
  24. package/.pantheon/code-mode/example-sync.sh +5 -0
  25. package/.pantheon/code-mode/session-end-save.py +186 -0
  26. package/.pantheon/code-mode/session-end-save.sh +18 -0
  27. package/.pantheon/code-mode/test-allowed.sh +5 -0
  28. package/.pantheon/code-mode/test-auto-continue-checkpoint.sh +179 -0
  29. package/.pantheon/code-mode/test-env.sh +7 -0
  30. package/.pantheon/code-mode/test-prlimit.sh +9 -0
  31. package/.pantheon/code-mode/test-timeout.sh +6 -0
  32. package/README.md +158 -1101
  33. package/README.pt-BR.md +222 -0
  34. package/bin/pantheon-init.mjs +30 -11
  35. package/opencode.json +1 -0
  36. package/package.json +14 -3
  37. package/plugin.json +15 -0
  38. package/scripts/_pantheon_paths.py +48 -7
  39. package/scripts/ci-validate-yaml.py +7 -2
  40. package/scripts/code_mode_server.py +33 -2
  41. package/scripts/doctor.mjs +135 -127
  42. package/scripts/generate-preset-docs.mjs +127 -66
  43. package/scripts/generate-prompts.sh +2 -2
  44. package/scripts/install/cli-ui.mjs +8 -1
  45. package/scripts/install/config-migration.mjs +401 -0
  46. package/scripts/install/health-check.mjs +3 -3
  47. package/scripts/install/model-picker.mjs +72 -23
  48. package/scripts/install/opencode-version.mjs +47 -0
  49. package/scripts/install/opencode.mjs +261 -88
  50. package/scripts/install/plugin.mjs +112 -42
  51. package/scripts/install/shared.mjs +13 -158
  52. package/scripts/install-mcp.mjs +44 -232
  53. package/scripts/mcp_persistence_server.py +344 -15
  54. package/scripts/mcp_resources_server.py +144 -40
  55. package/scripts/memory_mcp_server.py +2 -2
  56. package/scripts/recover-zenodo-deposition.mjs +146 -0
  57. package/scripts/sync-tui.mjs +32 -7
  58. package/scripts/test-opencode-v1-v2-sandbox.sh +591 -0
  59. package/scripts/uninstall.mjs +298 -954
  60. package/scripts/validate-zenodo-release.mjs +154 -0
  61. package/scripts/zenodo-artifact.mjs +21 -0
  62. package/scripts/zenodo-release-state.mjs +53 -0
  63. package/src/agents/zeus.md +25 -14
  64. package/src/mcp/_pantheon_paths.py +48 -7
  65. package/src/mcp/code_mode_server.py +33 -2
  66. package/src/mcp/eval_store.py +1 -1
  67. package/src/mcp/mcp_persistence_server.py +344 -15
  68. package/src/mcp/mcp_resources_server.py +144 -40
  69. package/src/mcp/pantheon_vision_server.py +1 -1
  70. package/src/mcp/toon_codec.py +491 -0
  71. package/src/pantheon/background-job-board.ts +67 -1
  72. package/src/pantheon/cost-command.ts +13 -9
  73. package/src/pantheon/delegate-manager.ts +384 -0
  74. package/src/pantheon/delegate-task-adapter.ts +444 -0
  75. package/src/pantheon/delegation-classifier.ts +307 -0
  76. package/src/pantheon/delegation-enforce.ts +13 -12
  77. package/src/pantheon/delegation-finalize.ts +374 -0
  78. package/src/pantheon/delegation-notify.ts +212 -0
  79. package/src/pantheon/delegation-toast.ts +73 -0
  80. package/src/pantheon/delegation.ts +1120 -0
  81. package/src/pantheon/goal-loop.ts +2 -2
  82. package/src/pantheon/goal-store.ts +1 -1
  83. package/src/pantheon/hashline/tool.ts +2 -2
  84. package/src/pantheon/model-command.ts +2 -1
  85. package/src/pantheon/permission-eval.ts +284 -0
  86. package/src/pantheon/step-cap.ts +110 -0
  87. package/src/pantheon/token-opt.ts +555 -0
  88. package/src/pantheon/toon-codec.ts +481 -0
  89. package/src/pantheon/tui-version-check.ts +1 -3
  90. package/src/pantheon/v2-bridge.ts +129 -0
  91. package/src/pantheon/v2-events.ts +131 -0
  92. package/src/pantheon/v2-hooks.ts +287 -0
  93. package/src/pantheon/v2-tool-definitions.ts +331 -0
  94. package/src/pantheon/zeus-delegate-with-retry.ts +406 -0
  95. package/src/plugin-v2/index.ts +21 -0
  96. package/src/plugin-v2.ts +836 -0
  97. package/src/plugin.ts +241 -42
  98. package/src/plugins/tui/dist/server.d.ts +1 -1
  99. package/src/plugins/tui/dist/server.d.ts.map +1 -1
  100. package/src/plugins/tui/dist/server.js +1 -1
  101. package/src/plugins/tui/dist/server.js.map +1 -1
  102. package/src/plugins/tui/dist/tui.d.ts +10 -7
  103. package/src/plugins/tui/dist/tui.d.ts.map +1 -1
  104. package/src/plugins/tui/dist/tui.js +11 -8
  105. package/src/plugins/tui/dist/tui.js.map +1 -1
  106. package/src/plugins/tui/dist/tui.tsx +22 -16
  107. package/src/plugins/tui/package-lock.json +51 -51
  108. package/src/plugins/tui/package.json +7 -7
  109. package/src/plugins/tui/src/index.tsx +28 -24
  110. package/src/skills/README.md +0 -2
  111. package/src/pantheon/tool-context.ts +0 -41
@@ -892,18 +892,18 @@ async function setupUsageBar(api: TuiPluginApi) {
892
892
  * (`client.session.children` + `session.parentID === current`).
893
893
  * Live status comes from `api.state.session.status(childID)`
894
894
  * (busy/retry → running; idle → terminal). This does NOT depend on
895
- * tool-part events, which runtime 1.18.13 may not deliver for
896
- * pantheon_delegate (the "(0) even while delegating" symptom).
895
+ * tool-part events, which runtime 1.18.13 may not deliver for
896
+ * pantheon_delegate (the "(0) even while delegating" symptom).
897
897
  *
898
898
  * 1b. NATIVE task() CHILDREN — `session.children` returns ALL children,
899
899
  * and the native `task()` tool ALSO spawns a child session with
900
900
  * parentID = caller. A child WITHOUT a board report is a native
901
901
  * task() child: childrenToDelegationEntries tags it source
902
- * 'children-only' with the `[task]` row tag (distinct info color),
902
+ * 'children-only' with the `[native]` row tag (distinct info color),
903
903
  * so native task() work is visible in the panel alongside board
904
- * delegates ([apo-1]) — never filtered out, never duplicated with a
905
- * board row for the same child (a child WITH a report keeps the md
906
- * entry, source 'md').
904
+ * delegates ([pantheon:apo-1]) — never filtered out, never duplicated
905
+ * with a board row for the same child (a child WITH a report keeps the
906
+ * md entry, source 'md').
907
907
  *
908
908
  * 2. ENRICHMENT + HISTORY — markdown reports the job board persists under
909
909
  * `.pantheon/delegations/<sessionID>/<alias>.md` (written by
@@ -975,7 +975,7 @@ export type DelegationEntry = {
975
975
  read?: boolean
976
976
  /** Internal provenance used to keep a finalized md report authoritative.
977
977
  * 'children-only' = a native task() child session with NO board report
978
- * (rendered with the distinct `[task]` tag); 'md' = board report wins. */
978
+ * (rendered with the distinct `[native]` tag); 'md' = board report wins. */
979
979
  source?: 'child' | 'live' | 'md' | 'children-only'
980
980
  }
981
981
 
@@ -1885,12 +1885,14 @@ export function childStatusToState(status: string | undefined): 'running' | 'com
1885
1885
  return 'running' // busy, retry, or unknown
1886
1886
  }
1887
1887
 
1888
- /** Row tag for a delegation entry: `[task]` for native task() children
1889
- * (source 'children-only' — no board report), `[<alias>]` for board rows
1890
- * ([apo-1]). The panel renders the tag with a distinct style so native
1891
- * task() children are visually separable from pantheon_delegate jobs. */
1888
+ /** Row tag for a delegation entry: `[native]` for native task() children
1889
+ * (source 'children-only' — no board report), `[pantheon:<alias>]` for board
1890
+ * rows ([pantheon:apo-1]) — the same tags the manager prints in
1891
+ * pantheon_delegation_list, so panel rows and CLI list lines match. The
1892
+ * panel renders the tag with a distinct style so native task() children are
1893
+ * visually separable from pantheon_delegate jobs. */
1892
1894
  export function delegationTag(entry: DelegationEntry): string {
1893
- return entry.source === 'children-only' ? '[task]' : `[${entry.alias}]`
1895
+ return entry.source === 'children-only' ? '[native]' : `[pantheon:${entry.alias}]`
1894
1896
  }
1895
1897
 
1896
1898
  /** Turn child sessions (PRIMARY) enriched with md reports into the display
@@ -1902,7 +1904,7 @@ export function delegationTag(entry: DelegationEntry): string {
1902
1904
  * time.created. A report-less child is a NATIVE task() child (every
1903
1905
  * child of the current session — pantheon_delegate OR the native `task()`
1904
1906
  * tool — carries parentID = caller), so it gets source 'children-only'
1905
- * and the `[task]` tag instead of a board alias.
1907
+ * and the `[native]` tag instead of a board alias.
1906
1908
  * Terminal md state wins over the derived state; a running md defers to
1907
1909
  * the child's live status. Sorted running-first (compareDelegationEntries).
1908
1910
  * Pure — no I/O. */
@@ -2092,8 +2094,8 @@ function DelegationRow(props: {
2092
2094
  }
2093
2095
  })
2094
2096
 
2095
- // The row tag: `[task]` for native task() children (no board report),
2096
- // `[apo-1]`-style alias for pantheon_delegate board rows. Rendered with
2097
+ // The row tag: `[native]` for native task() children (no board report),
2098
+ // `[pantheon:apo-1]`-style alias for pantheon_delegate board rows. Rendered with
2097
2099
  // the info color so task() children are visually distinct from delegates.
2098
2100
  const tagColor = createMemo(() => (props.job.source === 'children-only' ? theme().info : color()))
2099
2101
 
@@ -2591,9 +2593,13 @@ const tui: TuiPlugin = (api, _options, _meta) => {
2591
2593
  })
2592
2594
  }
2593
2595
 
2594
- const plugin: TuiPluginModule & { id: string } = {
2596
+ const plugin: TuiPluginModule & { id: string; setup: () => Promise<void> } = {
2595
2597
  id: 'pantheon.tui',
2596
2598
  tui,
2599
+ // Beta loader contract: every `plugins` directory entry must expose a
2600
+ // no-op `setup` so the entry loads as `pantheon.tui` with zero errors
2601
+ // (sandbox probe evidence). The TUI itself boots via `tui()`.
2602
+ setup: async () => {},
2597
2603
  }
2598
2604
 
2599
2605
  export default plugin
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "pantheon-tui",
3
- "version": "1.4.3",
3
+ "version": "1.5.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pantheon-tui",
9
- "version": "1.4.3",
9
+ "version": "1.5.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@opencode-ai/plugin": ">=1.14.0",
13
- "@opentui/core": ">=0.4.5",
14
- "@opentui/solid": ">=0.4.5",
15
- "solid-js": ">=1.9.0"
13
+ "@opentui/core": ">=0.5.10",
14
+ "@opentui/solid": ">=0.5.10",
15
+ "solid-js": ">=1.9.12"
16
16
  },
17
17
  "devDependencies": {
18
18
  "rolldown-plugin-solid": "^0.2.1",
@@ -21,9 +21,9 @@
21
21
  "peerDependencies": {
22
22
  "@opencode-ai/plugin": ">=1.14.0",
23
23
  "@opencode-ai/sdk": ">=1.14.0",
24
- "@opentui/core": ">=0.4.5",
25
- "@opentui/solid": ">=0.4.5",
26
- "solid-js": ">=1.9.0"
24
+ "@opentui/core": ">=0.5.10",
25
+ "@opentui/solid": ">=0.5.10",
26
+ "solid-js": ">=1.9.12"
27
27
  }
28
28
  },
29
29
  "node_modules/@ai-sdk/provider": {
@@ -660,35 +660,35 @@
660
660
  }
661
661
  },
662
662
  "node_modules/@opentui/core": {
663
- "version": "0.4.5",
664
- "resolved": "https://registry.npmjs.org/@opentui/core/-/core-0.4.5.tgz",
665
- "integrity": "sha512-JsgRTPkA6e+Vxmumxai6SElOSlRQkbzNKHlCfemlArRiLhfC1IZ9RXJo2QH4xSu+uBOWAM90uss73/pPlkdEig==",
663
+ "version": "0.5.10",
664
+ "resolved": "https://registry.npmjs.org/@opentui/core/-/core-0.5.10.tgz",
665
+ "integrity": "sha512-C3a2UbmefeAjIxAgm4BqjuSxKT4oqutfvYFwVvUgMxmGRHkNbBc/s7sukV0JgwcxFcV3uMFrXxo+E+BQtvuOiw==",
666
666
  "license": "MIT",
667
667
  "dependencies": {
668
- "bun-ffi-structs": "0.2.4",
668
+ "bun-ffi-structs": "0.3.1",
669
669
  "diff": "9.0.0",
670
670
  "marked": "17.0.1",
671
671
  "string-width": "7.2.0",
672
672
  "strip-ansi": "7.1.2"
673
673
  },
674
674
  "optionalDependencies": {
675
- "@opentui/core-darwin-arm64": "0.4.5",
676
- "@opentui/core-darwin-x64": "0.4.5",
677
- "@opentui/core-linux-arm64": "0.4.5",
678
- "@opentui/core-linux-arm64-musl": "0.4.5",
679
- "@opentui/core-linux-x64": "0.4.5",
680
- "@opentui/core-linux-x64-musl": "0.4.5",
681
- "@opentui/core-win32-arm64": "0.4.5",
682
- "@opentui/core-win32-x64": "0.4.5"
675
+ "@opentui/core-darwin-arm64": "0.5.10",
676
+ "@opentui/core-darwin-x64": "0.5.10",
677
+ "@opentui/core-linux-arm64": "0.5.10",
678
+ "@opentui/core-linux-arm64-musl": "0.5.10",
679
+ "@opentui/core-linux-x64": "0.5.10",
680
+ "@opentui/core-linux-x64-musl": "0.5.10",
681
+ "@opentui/core-win32-arm64": "0.5.10",
682
+ "@opentui/core-win32-x64": "0.5.10"
683
683
  },
684
684
  "peerDependencies": {
685
685
  "web-tree-sitter": "0.25.10"
686
686
  }
687
687
  },
688
688
  "node_modules/@opentui/core-darwin-arm64": {
689
- "version": "0.4.5",
690
- "resolved": "https://registry.npmjs.org/@opentui/core-darwin-arm64/-/core-darwin-arm64-0.4.5.tgz",
691
- "integrity": "sha512-8KUG0oRidnR+oW1RSZJ72/PhZLl+qRRMk5U/mieF4c0SJ5V3tYACpBZAKzQfHNd1f7QzD8FHZct1lPpQgtmkWg==",
689
+ "version": "0.5.10",
690
+ "resolved": "https://registry.npmjs.org/@opentui/core-darwin-arm64/-/core-darwin-arm64-0.5.10.tgz",
691
+ "integrity": "sha512-Vyb+nTbhab8ZcRy5gg1loEEGwRcIbjAeVRIBfHBcbFDqmITBOg7x2gqJ+x/TnoOy4uwMhCmICUN2wiyREw3r1Q==",
692
692
  "cpu": [
693
693
  "arm64"
694
694
  ],
@@ -699,9 +699,9 @@
699
699
  ]
700
700
  },
701
701
  "node_modules/@opentui/core-darwin-x64": {
702
- "version": "0.4.5",
703
- "resolved": "https://registry.npmjs.org/@opentui/core-darwin-x64/-/core-darwin-x64-0.4.5.tgz",
704
- "integrity": "sha512-R2bocsg55gwjOqCp/MWFgFYzRmsduKegB6nzgFAPCvAD/L5Jf30xpWJWFlSg3x8vxe1L9WJ84dfqa4M7mZZ3wA==",
702
+ "version": "0.5.10",
703
+ "resolved": "https://registry.npmjs.org/@opentui/core-darwin-x64/-/core-darwin-x64-0.5.10.tgz",
704
+ "integrity": "sha512-tTFLcM7Oj1gTyhm/bUdAt3C6grZdCxPk6+/g2azcZBUlI3/62LwbeRS6HbQKFFmm+1fUmX8cq6kWrtul885mVg==",
705
705
  "cpu": [
706
706
  "x64"
707
707
  ],
@@ -712,9 +712,9 @@
712
712
  ]
713
713
  },
714
714
  "node_modules/@opentui/core-linux-arm64": {
715
- "version": "0.4.5",
716
- "resolved": "https://registry.npmjs.org/@opentui/core-linux-arm64/-/core-linux-arm64-0.4.5.tgz",
717
- "integrity": "sha512-R4MZ25a4CzOAGVjW9aj1hUfzQGVfCJwrwBDbNs2SXaIvzcZqkxCVtU4FoQ5LsaD0j/BdNQVg2CIfFkFsm1fDuQ==",
715
+ "version": "0.5.10",
716
+ "resolved": "https://registry.npmjs.org/@opentui/core-linux-arm64/-/core-linux-arm64-0.5.10.tgz",
717
+ "integrity": "sha512-ncJXcgudhBf2GdJyF3xVQN/Ec+1F7GOL+pRrURmgBYSj2v1w6EyoDQFAACtPTK2c3R38W6fvZwL4JSLlm4EFXQ==",
718
718
  "cpu": [
719
719
  "arm64"
720
720
  ],
@@ -725,9 +725,9 @@
725
725
  ]
726
726
  },
727
727
  "node_modules/@opentui/core-linux-arm64-musl": {
728
- "version": "0.4.5",
729
- "resolved": "https://registry.npmjs.org/@opentui/core-linux-arm64-musl/-/core-linux-arm64-musl-0.4.5.tgz",
730
- "integrity": "sha512-ieqdyKI6EIYPalYAETB2wsdP83hr5Ifi+dFnBFUmdEEFHsoKwBmn2S7bsTOYlX7Bg03F4/YPIg+IvRpeC+cUJw==",
728
+ "version": "0.5.10",
729
+ "resolved": "https://registry.npmjs.org/@opentui/core-linux-arm64-musl/-/core-linux-arm64-musl-0.5.10.tgz",
730
+ "integrity": "sha512-dGMphDKexSdeYqwl0wgoFBP88Ta/cdi1Zc1mk29/ENkSCGz+74zlCHgqTHRNGLmI8W5TfuUtCyktQH11/Z+TBQ==",
731
731
  "cpu": [
732
732
  "arm64"
733
733
  ],
@@ -738,9 +738,9 @@
738
738
  ]
739
739
  },
740
740
  "node_modules/@opentui/core-linux-x64": {
741
- "version": "0.4.5",
742
- "resolved": "https://registry.npmjs.org/@opentui/core-linux-x64/-/core-linux-x64-0.4.5.tgz",
743
- "integrity": "sha512-SNyuQoxMKI1vuJhgxSSW96adWM6LqFl2SoS3GM4tGeneGOanVVG2Y06PvlytXvF4cKik97t0rqkVMRetmOs93w==",
741
+ "version": "0.5.10",
742
+ "resolved": "https://registry.npmjs.org/@opentui/core-linux-x64/-/core-linux-x64-0.5.10.tgz",
743
+ "integrity": "sha512-5qtYaOgwVycZD1GaGshTRsi0rXPAmVExO03N1JQaHu+NYxK/vXSOc7Bu4QW0sPXx3Sp0SpzpP+FHjXABfoK66g==",
744
744
  "cpu": [
745
745
  "x64"
746
746
  ],
@@ -751,9 +751,9 @@
751
751
  ]
752
752
  },
753
753
  "node_modules/@opentui/core-linux-x64-musl": {
754
- "version": "0.4.5",
755
- "resolved": "https://registry.npmjs.org/@opentui/core-linux-x64-musl/-/core-linux-x64-musl-0.4.5.tgz",
756
- "integrity": "sha512-mKVKcIcPiSVVZZsdPSBoWwoa2/TCeQAaMDeHF7PFw2kt5bTXZPP7xxWfRQLCNIcA1eaGl59UuwUWHDR2Ve548Q==",
754
+ "version": "0.5.10",
755
+ "resolved": "https://registry.npmjs.org/@opentui/core-linux-x64-musl/-/core-linux-x64-musl-0.5.10.tgz",
756
+ "integrity": "sha512-Oj4H9hApuvuTKPWxh4SoZAgGJorR7vbvnrZA/cAkSMAk2VGSoHRRcqeXQbcH8IcdjVZ0KFpv8Zkl/D5Ye+2mew==",
757
757
  "cpu": [
758
758
  "x64"
759
759
  ],
@@ -764,9 +764,9 @@
764
764
  ]
765
765
  },
766
766
  "node_modules/@opentui/core-win32-arm64": {
767
- "version": "0.4.5",
768
- "resolved": "https://registry.npmjs.org/@opentui/core-win32-arm64/-/core-win32-arm64-0.4.5.tgz",
769
- "integrity": "sha512-GHTTsqeR45q2Iek9Rb7ty+x/hAKn2jZ1ujlCgPR8LBKyF7h0E1dNFryoZ7ehMc3kJndP1sKn836IemKFqxuDdQ==",
767
+ "version": "0.5.10",
768
+ "resolved": "https://registry.npmjs.org/@opentui/core-win32-arm64/-/core-win32-arm64-0.5.10.tgz",
769
+ "integrity": "sha512-A9VhgvTxQoUdZ+8LmUumEng1sQNbj9QQQT3NYG9mSxI54qTANi7vOWNSphMiY6RMVsr22pgm6nUvSSvJXv7Jog==",
770
770
  "cpu": [
771
771
  "arm64"
772
772
  ],
@@ -777,9 +777,9 @@
777
777
  ]
778
778
  },
779
779
  "node_modules/@opentui/core-win32-x64": {
780
- "version": "0.4.5",
781
- "resolved": "https://registry.npmjs.org/@opentui/core-win32-x64/-/core-win32-x64-0.4.5.tgz",
782
- "integrity": "sha512-Y8T/yXCDGagRGiQrtmuB6AhRcPucKFs/Dre3v8kJwNYqDccI4FzUPKclZ7djfmRZNjl7JUqPhZZP/PwDpQocMg==",
780
+ "version": "0.5.10",
781
+ "resolved": "https://registry.npmjs.org/@opentui/core-win32-x64/-/core-win32-x64-0.5.10.tgz",
782
+ "integrity": "sha512-u3KHa7kEeWrmKVDRJYpxSGO+g5E9cMGlrmTsPN3GVPHUmQMiREUawLXUvsU8+IHaQnqG3Q5nuE1yf4fPBzS+Qw==",
783
783
  "cpu": [
784
784
  "x64"
785
785
  ],
@@ -790,14 +790,14 @@
790
790
  ]
791
791
  },
792
792
  "node_modules/@opentui/solid": {
793
- "version": "0.4.5",
794
- "resolved": "https://registry.npmjs.org/@opentui/solid/-/solid-0.4.5.tgz",
795
- "integrity": "sha512-B0RSkXnrtPVfEJOX+Hj+axjLJ3lzbG1BZw5I7Pvb9OPp48Vzg2cW2a3cSa86/q48ndLt647i/XwFPIw/jqnI5g==",
793
+ "version": "0.5.10",
794
+ "resolved": "https://registry.npmjs.org/@opentui/solid/-/solid-0.5.10.tgz",
795
+ "integrity": "sha512-KrmMIsHiKBHOABTC0brOwqWm+sGq1ZX2sGCAx6WgtBbE3STMup9n8TAy/6gUYhwcjC9zugT53ytfSVwCwVWZUg==",
796
796
  "license": "MIT",
797
797
  "dependencies": {
798
798
  "@babel/core": "7.28.0",
799
799
  "@babel/preset-typescript": "7.27.1",
800
- "@opentui/core": "0.4.5",
800
+ "@opentui/core": "0.5.10",
801
801
  "babel-plugin-module-resolver": "5.0.2",
802
802
  "babel-preset-solid": "1.9.12",
803
803
  "entities": "7.0.1",
@@ -1568,9 +1568,9 @@
1568
1568
  }
1569
1569
  },
1570
1570
  "node_modules/bun-ffi-structs": {
1571
- "version": "0.2.4",
1572
- "resolved": "https://registry.npmjs.org/bun-ffi-structs/-/bun-ffi-structs-0.2.4.tgz",
1573
- "integrity": "sha512-AJzsqoVFs1KBbJbWHIYrVZLDC3NhTqqh25awRXqzoLzmBAKr5oqk6+CwuYHAekKx+VBCYVohBoKuRq40dV+TYg==",
1571
+ "version": "0.3.1",
1572
+ "resolved": "https://registry.npmjs.org/bun-ffi-structs/-/bun-ffi-structs-0.3.1.tgz",
1573
+ "integrity": "sha512-3gM7PpVWLyrwxWjcilSiGuhWanhZivvo6l0u573NziPH6f/gwk6McbaYgn7oJWov6pKGRTDbrg94W5DcJsKTtQ==",
1574
1574
  "license": "MIT",
1575
1575
  "peerDependencies": {
1576
1576
  "typescript": "^5"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pantheon-tui",
3
3
  "type": "module",
4
- "version": "1.4.3",
4
+ "version": "1.5.0-beta.1",
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
  "exports": {
@@ -19,9 +19,9 @@
19
19
  "peerDependencies": {
20
20
  "@opencode-ai/plugin": ">=1.14.0",
21
21
  "@opencode-ai/sdk": ">=1.14.0",
22
- "@opentui/core": ">=0.4.5",
23
- "@opentui/solid": ">=0.4.5",
24
- "solid-js": ">=1.9.0"
22
+ "@opentui/core": ">=0.5.10",
23
+ "@opentui/solid": ">=0.5.10",
24
+ "solid-js": ">=1.9.12"
25
25
  },
26
26
  "devDependencies": {
27
27
  "rolldown-plugin-solid": "^0.2.1",
@@ -29,8 +29,8 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@opencode-ai/plugin": ">=1.14.0",
32
- "@opentui/core": ">=0.4.5",
33
- "@opentui/solid": ">=0.4.5",
34
- "solid-js": ">=1.9.0"
32
+ "@opentui/core": ">=0.5.10",
33
+ "@opentui/solid": ">=0.5.10",
34
+ "solid-js": ">=1.9.12"
35
35
  }
36
36
  }
@@ -892,23 +892,22 @@ async function setupUsageBar(api: TuiPluginApi) {
892
892
  * (`client.session.children` + `session.parentID === current`).
893
893
  * Live status comes from `api.state.session.status(childID)`
894
894
  * (busy/retry → running; idle → terminal). This does NOT depend on
895
- * tool-part events, which runtime 1.18.13 may not deliver for
896
- * pantheon_delegate (the "(0) even while delegating" symptom).
895
+ * tool-part events, which runtime 1.18.13 may not deliver for
896
+ * pantheon_delegate (the "(0) even while delegating" symptom).
897
897
  *
898
898
  * 1b. NATIVE task() CHILDREN — `session.children` returns ALL children,
899
899
  * and the native `task()` tool ALSO spawns a child session with
900
900
  * parentID = caller. A child WITHOUT a board report is a native
901
901
  * task() child: childrenToDelegationEntries tags it source
902
- * 'children-only' with the `[task]` row tag (distinct info color),
902
+ * 'children-only' with the `[native]` row tag (distinct info color),
903
903
  * so native task() work is visible in the panel alongside board
904
- * delegates ([apo-1]) — never filtered out, never duplicated with a
905
- * board row for the same child (a child WITH a report keeps the md
906
- * entry, source 'md').
904
+ * delegates ([pantheon:apo-1]) — never filtered out, never duplicated
905
+ * with a board row for the same child (a child WITH a report keeps the
906
+ * md entry, source 'md').
907
907
  *
908
- * 2. ENRICHMENT + HISTORY — markdown reports under
909
- * `.pantheon/delegations/<sessionID>/<alias>.md`. These are LEGACY files
910
- * (the writer, src/pantheon/delegation-finalize.ts, was removed); the
911
- * panel still reads them for history. Each child
908
+ * 2. ENRICHMENT + HISTORY — markdown reports the job board persists under
909
+ * `.pantheon/delegations/<sessionID>/<alias>.md` (written by
910
+ * src/pantheon/delegation-finalize.ts at terminal state). Each child
912
911
  * is matched to its report by the `Task ID` header (== child session
913
912
  * id == board task id), which supplies the alias (apo-N), agent,
914
913
  * description and terminal duration/timedOut. No report → the child
@@ -976,7 +975,7 @@ export type DelegationEntry = {
976
975
  read?: boolean
977
976
  /** Internal provenance used to keep a finalized md report authoritative.
978
977
  * 'children-only' = a native task() child session with NO board report
979
- * (rendered with the distinct `[task]` tag); 'md' = board report wins. */
978
+ * (rendered with the distinct `[native]` tag); 'md' = board report wins. */
980
979
  source?: 'child' | 'live' | 'md' | 'children-only'
981
980
  }
982
981
 
@@ -1152,8 +1151,7 @@ export async function readDelegationEntries(dir: string): Promise<DelegationEntr
1152
1151
 
1153
1152
  /** Read delegation reports from EVERY session under
1154
1153
  * `<root>/.pantheon/delegations/<sessionID>/<alias>.md` — the panel's
1155
- * HISTORY channel (reads legacy files; the writer, delegation-finalize.ts,
1156
- * was removed). Unlike the children/live channels it does NOT depend on a
1154
+ * HISTORY channel. Unlike the children/live channels it does NOT depend on a
1157
1155
  * resolved sessionID: with no focused session (null/placeholder), the panel
1158
1156
  * still shows the reports from all past sessions (running first, Finalized
1159
1157
  * desc — the sort applied by readDelegationEntries). Fail-open: a
@@ -1162,8 +1160,8 @@ export async function readAllDelegationEntries(root: string): Promise<Delegation
1162
1160
  return readDelegationEntries(join(root, '.pantheon', 'delegations'))
1163
1161
  }
1164
1162
 
1165
- /** Resolve the directory holding delegation md reports.
1166
- * The reports live under `.pantheon/delegations` RELATIVE to the server cwd,
1163
+ /** Resolve the directory where the job board writes delegation md reports.
1164
+ * The board writes `.pantheon/delegations` RELATIVE to the server cwd,
1167
1165
  * which the TUI exposes as `TuiState.path.directory`. `project` does NOT
1168
1166
  * exist on `TuiState.path` (the old `state?.project ?? state?.worktree`
1169
1167
  * resolution was always undefined for the first term) and `worktree` is
@@ -1887,12 +1885,14 @@ export function childStatusToState(status: string | undefined): 'running' | 'com
1887
1885
  return 'running' // busy, retry, or unknown
1888
1886
  }
1889
1887
 
1890
- /** Row tag for a delegation entry: `[task]` for native task() children
1891
- * (source 'children-only' — no board report), `[<alias>]` for board rows
1892
- * ([apo-1]). The panel renders the tag with a distinct style so native
1893
- * task() children are visually separable from pantheon_delegate jobs. */
1888
+ /** Row tag for a delegation entry: `[native]` for native task() children
1889
+ * (source 'children-only' — no board report), `[pantheon:<alias>]` for board
1890
+ * rows ([pantheon:apo-1]) — the same tags the manager prints in
1891
+ * pantheon_delegation_list, so panel rows and CLI list lines match. The
1892
+ * panel renders the tag with a distinct style so native task() children are
1893
+ * visually separable from pantheon_delegate jobs. */
1894
1894
  export function delegationTag(entry: DelegationEntry): string {
1895
- return entry.source === 'children-only' ? '[task]' : `[${entry.alias}]`
1895
+ return entry.source === 'children-only' ? '[native]' : `[pantheon:${entry.alias}]`
1896
1896
  }
1897
1897
 
1898
1898
  /** Turn child sessions (PRIMARY) enriched with md reports into the display
@@ -1904,7 +1904,7 @@ export function delegationTag(entry: DelegationEntry): string {
1904
1904
  * time.created. A report-less child is a NATIVE task() child (every
1905
1905
  * child of the current session — pantheon_delegate OR the native `task()`
1906
1906
  * tool — carries parentID = caller), so it gets source 'children-only'
1907
- * and the `[task]` tag instead of a board alias.
1907
+ * and the `[native]` tag instead of a board alias.
1908
1908
  * Terminal md state wins over the derived state; a running md defers to
1909
1909
  * the child's live status. Sorted running-first (compareDelegationEntries).
1910
1910
  * Pure — no I/O. */
@@ -2094,8 +2094,8 @@ function DelegationRow(props: {
2094
2094
  }
2095
2095
  })
2096
2096
 
2097
- // The row tag: `[task]` for native task() children (no board report),
2098
- // `[apo-1]`-style alias for pantheon_delegate board rows. Rendered with
2097
+ // The row tag: `[native]` for native task() children (no board report),
2098
+ // `[pantheon:apo-1]`-style alias for pantheon_delegate board rows. Rendered with
2099
2099
  // the info color so task() children are visually distinct from delegates.
2100
2100
  const tagColor = createMemo(() => (props.job.source === 'children-only' ? theme().info : color()))
2101
2101
 
@@ -2593,9 +2593,13 @@ const tui: TuiPlugin = (api, _options, _meta) => {
2593
2593
  })
2594
2594
  }
2595
2595
 
2596
- const plugin: TuiPluginModule & { id: string } = {
2596
+ const plugin: TuiPluginModule & { id: string; setup: () => Promise<void> } = {
2597
2597
  id: 'pantheon.tui',
2598
2598
  tui,
2599
+ // Beta loader contract: every `plugins` directory entry must expose a
2600
+ // no-op `setup` so the entry loads as `pantheon.tui` with zero errors
2601
+ // (sandbox probe evidence). The TUI itself boots via `tui()`.
2602
+ setup: async () => {},
2599
2603
  }
2600
2604
 
2601
2605
  export default plugin
@@ -119,9 +119,7 @@ The `SKILL.md` file contains YAML frontmatter with `name`, `description`, and pl
119
119
 
120
120
  - **On-demand loading**: Skills are loaded when an agent's task matches the skill's description. The agent invokes the skill via the `skill` tool, injecting the domain knowledge into context.
121
121
  - **Agent frontmatter**: Agents declare which skills they use via the `skills:` field in their `.agent.md` frontmatter. The platform uses this to determine relevance.
122
- - **VS Code Copilot**: Automatically injects skill content when the agent detects a matching task description. Skills appear in the Available Skills list and can be loaded via `/skill` commands.
123
122
  - **OpenCode platform**: Skills are listed in the system prompt's `<available_skills>` block. The agent invokes `skill` with the matching name to load the full content.
124
- - **Other platforms**: Each platform loads skills differently. Refer to platform-specific documentation for integration details.
125
123
 
126
124
  ## Quick Reference Table
127
125
 
@@ -1,41 +0,0 @@
1
- /**
2
- * Shared tool-context types and path guards used by the preserved tool
3
- * modules (cost-command, goal-loop, model-command, goal-store).
4
- *
5
- * These were previously exported from the removed delegation modules; they
6
- * are hoisted here so the surviving subsystems keep a single source of truth
7
- * without depending on the deleted delegate machinery.
8
- *
9
- * @module tool-context
10
- */
11
-
12
- /**
13
- * The structural tool-execution context a tool's `execute` receives. Mirrors
14
- * the OpenCode SDK's ToolContext but keeps every field optional so the
15
- * structural test/embedding surface can be supplied by older hosts.
16
- */
17
- export interface ToolContextLike {
18
- sessionID: string
19
- directory?: string
20
- worktree?: string
21
- /**
22
- * The OpenCode SDK's ToolContext declares this as required. It remains
23
- * optional here because the structural test/embedding surface can be
24
- * supplied by older hosts; enforcement must skip when it is absent.
25
- */
26
- agent?: string
27
- }
28
-
29
- /**
30
- * Path-traversal guard for session IDs embedded in file paths. Throws on
31
- * `..`, `/`, `\`. Used by goal-store to keep goal files inside their dir.
32
- */
33
- export function assertSafeParentSessionID(parentSessionID: string): void {
34
- if (
35
- parentSessionID.includes('..') ||
36
- parentSessionID.includes('/') ||
37
- parentSessionID.includes('\\')
38
- ) {
39
- throw new Error(`Invalid parentSessionID: ${parentSessionID}`)
40
- }
41
- }