pantheon-opencode 1.4.3 → 1.5.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.
- package/.pantheon/code-mode/README.md +93 -0
- package/.pantheon/code-mode/checkpoint-session.py +7 -0
- package/.pantheon/code-mode/checkpoint-session.sh +11 -0
- package/.pantheon/code-mode/checkpoint_session.py +481 -0
- package/.pantheon/code-mode/compress-inline.py +450 -0
- package/.pantheon/code-mode/eval-llm-judge.py +255 -0
- package/.pantheon/code-mode/eval-monte-carlo.py +368 -0
- package/.pantheon/code-mode/eval-run.py +197 -0
- package/.pantheon/code-mode/eval-static.py +321 -0
- package/.pantheon/code-mode/example-sync.sh +5 -0
- package/.pantheon/code-mode/session-end-save.py +186 -0
- package/.pantheon/code-mode/session-end-save.sh +18 -0
- package/.pantheon/code-mode/test-allowed.sh +5 -0
- package/.pantheon/code-mode/test-auto-continue-checkpoint.sh +179 -0
- package/.pantheon/code-mode/test-env.sh +7 -0
- package/.pantheon/code-mode/test-prlimit.sh +9 -0
- package/.pantheon/code-mode/test-timeout.sh +6 -0
- package/README.md +161 -1101
- package/README.pt-BR.md +222 -0
- package/bin/pantheon-init.mjs +30 -11
- package/opencode.json +1 -0
- package/package.json +14 -3
- package/plugin.json +15 -0
- package/scripts/_pantheon_paths.py +48 -7
- package/scripts/ci-validate-yaml.py +7 -2
- package/scripts/code_mode_server.py +33 -2
- package/scripts/cost.mjs +30 -14
- package/scripts/doctor.mjs +135 -127
- package/scripts/generate-preset-docs.mjs +127 -66
- package/scripts/generate-prompts.sh +2 -2
- package/scripts/install/cli-ui.mjs +8 -1
- package/scripts/install/config-migration.mjs +401 -0
- package/scripts/install/health-check.mjs +3 -3
- package/scripts/install/model-picker.mjs +72 -23
- package/scripts/install/opencode-version.mjs +47 -0
- package/scripts/install/opencode.mjs +261 -88
- package/scripts/install/plugin.mjs +112 -42
- package/scripts/install/shared.mjs +13 -158
- package/scripts/install-mcp.mjs +44 -232
- package/scripts/mcp_persistence_server.py +382 -16
- package/scripts/mcp_resources_server.py +144 -40
- package/scripts/memory_mcp_server.py +2 -2
- package/scripts/probe-context-rehydrate.mjs +240 -0
- package/scripts/probe-pantheon-cost.mjs +304 -0
- package/scripts/recover-zenodo-deposition.mjs +146 -0
- package/scripts/sync-tui.mjs +32 -7
- package/scripts/test-opencode-v1-v2-sandbox.sh +944 -0
- package/scripts/uninstall.mjs +298 -954
- package/scripts/validate-zenodo-release.mjs +154 -0
- package/scripts/zenodo-artifact.mjs +21 -0
- package/scripts/zenodo-release-state.mjs +53 -0
- package/src/agents/zeus.md +25 -14
- package/src/mcp/_pantheon_paths.py +48 -7
- package/src/mcp/code_mode_server.py +33 -2
- package/src/mcp/eval_store.py +1 -1
- package/src/mcp/mcp_persistence_server.py +382 -16
- package/src/mcp/mcp_resources_server.py +144 -40
- package/src/mcp/pantheon_vision_server.py +1 -1
- package/src/mcp/toon_codec.py +491 -0
- package/src/pantheon/background-job-board.ts +67 -1
- package/src/pantheon/cost-command.ts +60 -39
- package/src/pantheon/delegate-manager.ts +669 -0
- package/src/pantheon/delegation-classifier.ts +307 -0
- package/src/pantheon/delegation-enforce.ts +13 -12
- package/src/pantheon/delegation-finalize.ts +374 -0
- package/src/pantheon/delegation-notify.ts +212 -0
- package/src/pantheon/delegation-toast.ts +73 -0
- package/src/pantheon/delegation.ts +1120 -0
- package/src/pantheon/goal-loop.ts +2 -2
- package/src/pantheon/goal-store.ts +1 -1
- package/src/pantheon/hashline/tool.ts +2 -2
- package/src/pantheon/model-command.ts +2 -1
- package/src/pantheon/permission-eval.ts +284 -0
- package/src/pantheon/step-cap.ts +110 -0
- package/src/pantheon/token-opt.ts +781 -0
- package/src/pantheon/toon-codec.ts +481 -0
- package/src/pantheon/tui-version-check.ts +1 -3
- package/src/pantheon/v2-bridge.ts +129 -0
- package/src/pantheon/v2-events.ts +131 -0
- package/src/pantheon/v2-hooks.ts +287 -0
- package/src/pantheon/v2-tool-definitions.ts +331 -0
- package/src/pantheon/zeus-delegate-with-retry.ts +406 -0
- package/src/plugin-v2/index.ts +21 -0
- package/src/plugin-v2.ts +824 -0
- package/src/plugin.ts +236 -42
- package/src/plugins/tui/dist/server.d.ts +1 -1
- package/src/plugins/tui/dist/server.d.ts.map +1 -1
- package/src/plugins/tui/dist/server.js +1 -1
- package/src/plugins/tui/dist/server.js.map +1 -1
- package/src/plugins/tui/dist/tui.d.ts +10 -7
- package/src/plugins/tui/dist/tui.d.ts.map +1 -1
- package/src/plugins/tui/dist/tui.js +11 -8
- package/src/plugins/tui/dist/tui.js.map +1 -1
- package/src/plugins/tui/dist/tui.tsx +22 -16
- package/src/plugins/tui/package-lock.json +51 -51
- package/src/plugins/tui/package.json +7 -7
- package/src/plugins/tui/src/index.tsx +28 -24
- package/src/skills/README.md +0 -2
- 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
|
-
*
|
|
896
|
-
*
|
|
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 `[
|
|
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
|
|
905
|
-
* board row for the same child (a child WITH a report keeps the
|
|
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 `[
|
|
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: `[
|
|
1889
|
-
* (source 'children-only' — no board report), `[
|
|
1890
|
-
* ([apo-1])
|
|
1891
|
-
*
|
|
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' ? '[
|
|
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 `[
|
|
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: `[
|
|
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.
|
|
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.
|
|
9
|
+
"version": "1.5.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@opencode-ai/plugin": ">=1.14.0",
|
|
13
|
-
"@opentui/core": ">=0.
|
|
14
|
-
"@opentui/solid": ">=0.
|
|
15
|
-
"solid-js": ">=1.9.
|
|
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.
|
|
25
|
-
"@opentui/solid": ">=0.
|
|
26
|
-
"solid-js": ">=1.9.
|
|
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.
|
|
664
|
-
"resolved": "https://registry.npmjs.org/@opentui/core/-/core-0.
|
|
665
|
-
"integrity": "sha512-
|
|
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.
|
|
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.
|
|
676
|
-
"@opentui/core-darwin-x64": "0.
|
|
677
|
-
"@opentui/core-linux-arm64": "0.
|
|
678
|
-
"@opentui/core-linux-arm64-musl": "0.
|
|
679
|
-
"@opentui/core-linux-x64": "0.
|
|
680
|
-
"@opentui/core-linux-x64-musl": "0.
|
|
681
|
-
"@opentui/core-win32-arm64": "0.
|
|
682
|
-
"@opentui/core-win32-x64": "0.
|
|
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.
|
|
690
|
-
"resolved": "https://registry.npmjs.org/@opentui/core-darwin-arm64/-/core-darwin-arm64-0.
|
|
691
|
-
"integrity": "sha512-
|
|
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.
|
|
703
|
-
"resolved": "https://registry.npmjs.org/@opentui/core-darwin-x64/-/core-darwin-x64-0.
|
|
704
|
-
"integrity": "sha512-
|
|
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.
|
|
716
|
-
"resolved": "https://registry.npmjs.org/@opentui/core-linux-arm64/-/core-linux-arm64-0.
|
|
717
|
-
"integrity": "sha512-
|
|
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.
|
|
729
|
-
"resolved": "https://registry.npmjs.org/@opentui/core-linux-arm64-musl/-/core-linux-arm64-musl-0.
|
|
730
|
-
"integrity": "sha512-
|
|
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.
|
|
742
|
-
"resolved": "https://registry.npmjs.org/@opentui/core-linux-x64/-/core-linux-x64-0.
|
|
743
|
-
"integrity": "sha512-
|
|
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.
|
|
755
|
-
"resolved": "https://registry.npmjs.org/@opentui/core-linux-x64-musl/-/core-linux-x64-musl-0.
|
|
756
|
-
"integrity": "sha512-
|
|
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.
|
|
768
|
-
"resolved": "https://registry.npmjs.org/@opentui/core-win32-arm64/-/core-win32-arm64-0.
|
|
769
|
-
"integrity": "sha512-
|
|
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.
|
|
781
|
-
"resolved": "https://registry.npmjs.org/@opentui/core-win32-x64/-/core-win32-x64-0.
|
|
782
|
-
"integrity": "sha512-
|
|
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.
|
|
794
|
-
"resolved": "https://registry.npmjs.org/@opentui/solid/-/solid-0.
|
|
795
|
-
"integrity": "sha512-
|
|
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.
|
|
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.
|
|
1572
|
-
"resolved": "https://registry.npmjs.org/bun-ffi-structs/-/bun-ffi-structs-0.
|
|
1573
|
-
"integrity": "sha512-
|
|
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
|
+
"version": "1.5.0",
|
|
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.
|
|
23
|
-
"@opentui/solid": ">=0.
|
|
24
|
-
"solid-js": ">=1.9.
|
|
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.
|
|
33
|
-
"@opentui/solid": ">=0.
|
|
34
|
-
"solid-js": ">=1.9.
|
|
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
|
-
*
|
|
896
|
-
*
|
|
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 `[
|
|
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
|
|
905
|
-
* board row for the same child (a child WITH a report keeps the
|
|
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
|
|
910
|
-
*
|
|
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 `[
|
|
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
|
|
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
|
|
1166
|
-
* The
|
|
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: `[
|
|
1891
|
-
* (source 'children-only' — no board report), `[
|
|
1892
|
-
* ([apo-1])
|
|
1893
|
-
*
|
|
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' ? '[
|
|
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 `[
|
|
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: `[
|
|
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
|
package/src/skills/README.md
CHANGED
|
@@ -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
|
-
}
|