pantheon-opencode 1.5.0-beta.5 → 1.5.0-beta.6
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/CHANGELOG.md +25 -0
- package/README.md +7 -2
- package/README.pt-BR.md +7 -2
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/pyproject.toml +1 -1
- package/scripts/install/opencode.mjs +15 -0
- package/src/plugins/tui/dist/tui.d.ts +39 -7
- package/src/plugins/tui/dist/tui.d.ts.map +1 -1
- package/src/plugins/tui/dist/tui.js +253 -97
- package/src/plugins/tui/dist/tui.tsx +188 -16
- package/src/plugins/tui/package-lock.json +2 -2
- package/src/plugins/tui/package.json +1 -1
- package/src/plugins/tui/src/index.tsx +188 -16
package/CHANGELOG.md
CHANGED
|
@@ -18,6 +18,31 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
18
18
|
|
|
19
19
|
## ✅ Closed Issues
|
|
20
20
|
|
|
21
|
+
## [v1.5.0-beta.6] - 2026-09-12
|
|
22
|
+
|
|
23
|
+
<!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
|
|
24
|
+
move this section to a versioned entry and reset the template below. -->
|
|
25
|
+
|
|
26
|
+
## 🆕 What's New
|
|
27
|
+
|
|
28
|
+
- **Delegation panel v2:** live tool activity per running delegation
|
|
29
|
+
(`↳ bash npm test` — what the child is doing right now), a paginated
|
|
30
|
+
`Archived (n)` section for terminal reports beyond the recent 8, and a
|
|
31
|
+
distinct `retry` state (⟳ marker, RETRYING label) instead of lumping
|
|
32
|
+
retries into running.
|
|
33
|
+
|
|
34
|
+
## 🐞 Fixed
|
|
35
|
+
|
|
36
|
+
- **Stale plugin refs from old installs:** the installer now prunes
|
|
37
|
+
`pantheon-opencode` plugin references pointing at other installed copies of
|
|
38
|
+
the package (older nvm prefixes, npx cache hashes). Previously every init
|
|
39
|
+
accumulated refs from past installs and the oldest — without the newest
|
|
40
|
+
fixes — won the plugin load race, silently disabling native-task
|
|
41
|
+
mirroring. Third-party plugins sharing the same file names remain
|
|
42
|
+
protected.
|
|
43
|
+
- **Docs:** `@beta` dist-tag guidance on all npx commands — plain
|
|
44
|
+
`npx pantheon-opencode` resolves the stable release and silently downgrades
|
|
45
|
+
the installed TUI copy.
|
|
21
46
|
## [v1.5.0-beta.5] - 2026-09-12
|
|
22
47
|
|
|
23
48
|
<!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
|
package/README.md
CHANGED
|
@@ -218,8 +218,13 @@ V1 plugin into V2 or provide V2 with V1 hooks.
|
|
|
218
218
|
One command keeps an existing installation current:
|
|
219
219
|
|
|
220
220
|
```bash
|
|
221
|
-
|
|
222
|
-
|
|
221
|
+
# Without a global install, ALWAYS pin the dist-tag — plain `npx
|
|
222
|
+
# pantheon-opencode` resolves `latest`, which is the stable release (1.4.3):
|
|
223
|
+
npx pantheon-opencode@beta update # npm beta channel + config refresh
|
|
224
|
+
npx pantheon-opencode@beta update --stable # stable channel instead
|
|
225
|
+
|
|
226
|
+
# With a global install, use the global bin (defaults to the beta channel):
|
|
227
|
+
pantheon-opencode update
|
|
223
228
|
```
|
|
224
229
|
|
|
225
230
|
`update` compares your installed version with the npm dist-tag, runs
|
package/README.pt-BR.md
CHANGED
|
@@ -184,8 +184,13 @@ converte um plugin V1 em V2 nem dá hooks V1 ao V2.
|
|
|
184
184
|
Um comando mantém uma instalação existente em dia:
|
|
185
185
|
|
|
186
186
|
```bash
|
|
187
|
-
|
|
188
|
-
|
|
187
|
+
# Sem instalação global, SEMPRE fixe o dist-tag — `npx pantheon-opencode`
|
|
188
|
+
# puro resolve a tag `latest`, que é o release estável (1.4.3):
|
|
189
|
+
npx pantheon-opencode@beta update # canal beta do npm + refresh do config
|
|
190
|
+
npx pantheon-opencode@beta update --stable # canal estável
|
|
191
|
+
|
|
192
|
+
# Com instalação global, use o bin global (o padrão é o canal beta):
|
|
193
|
+
pantheon-opencode update
|
|
189
194
|
```
|
|
190
195
|
|
|
191
196
|
O `update` compara a versão instalada com o dist-tag do npm, roda
|
package/package.json
CHANGED
package/plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pantheon",
|
|
3
3
|
"publisher": "ils15",
|
|
4
|
-
"version": "1.5.0-beta.
|
|
4
|
+
"version": "1.5.0-beta.6",
|
|
5
5
|
"displayName": "Pantheon",
|
|
6
6
|
"description": "Conductor-Delegate orchestration platform with 14 specialized agents, 21 skills, and OpenCode support.",
|
|
7
7
|
"agents": "./src/agents",
|
package/pyproject.toml
CHANGED
|
@@ -217,6 +217,21 @@ function managedPluginIdentity(ref) {
|
|
|
217
217
|
if (absolutePath === normalizePluginPath(resolve(ROOT, PANTHEON_V2_LEGACY_FILE))) {
|
|
218
218
|
return PANTHEON_V2_PLUGIN
|
|
219
219
|
}
|
|
220
|
+
// beta.5: stale refs from OTHER installed copies of this package (older
|
|
221
|
+
// nvm prefixes, npx cache hashes). Only paths inside
|
|
222
|
+
// `node_modules/pantheon-opencode/` count as installed copies — a dev
|
|
223
|
+
// checkout elsewhere (e.g. a vendor folder named pantheon-opencode) remains
|
|
224
|
+
// protected by the third-party rule above.
|
|
225
|
+
const installedMarker = '/node_modules/pantheon-opencode/'
|
|
226
|
+
const withSlashes = normalizePluginPath(normalized)
|
|
227
|
+
const markerIndex = withSlashes.lastIndexOf(installedMarker)
|
|
228
|
+
if (markerIndex !== -1) {
|
|
229
|
+
const suffix = withSlashes.slice(markerIndex + installedMarker.length)
|
|
230
|
+
if (suffix === PANTHEON_V1_PLUGIN) return PANTHEON_V1_PLUGIN
|
|
231
|
+
if (suffix === PANTHEON_V1_HOOKS) return PANTHEON_V1_HOOKS
|
|
232
|
+
if (suffix === PANTHEON_V2_PLUGIN) return PANTHEON_V2_PLUGIN
|
|
233
|
+
if (suffix === PANTHEON_V2_LEGACY_FILE) return PANTHEON_V2_PLUGIN
|
|
234
|
+
}
|
|
220
235
|
}
|
|
221
236
|
|
|
222
237
|
return null
|
|
@@ -11,7 +11,7 @@ type DelegationEntry = {
|
|
|
11
11
|
taskID?: string;
|
|
12
12
|
/** Agent name, e.g. "apollo". */
|
|
13
13
|
agent: string;
|
|
14
|
-
state: 'running' | 'completed' | 'error' | 'startup_failed' | 'startup_unknown' | 'cancelled' | 'stale-running';
|
|
14
|
+
state: 'running' | 'retry' | 'completed' | 'error' | 'startup_failed' | 'startup_unknown' | 'cancelled' | 'stale-running';
|
|
15
15
|
/** Epoch ms of the `Started` header. */
|
|
16
16
|
startedAt: number;
|
|
17
17
|
/** Epoch ms of the `Finalized` header — null while still running. */
|
|
@@ -73,10 +73,18 @@ declare function tuiLogPath(projectRoot: string): string;
|
|
|
73
73
|
* falling back to startedAt, descending). Shared by the md reader and
|
|
74
74
|
* mergeDelegationSources. */
|
|
75
75
|
declare function compareDelegationEntries(a: DelegationEntry, b: DelegationEntry): number;
|
|
76
|
-
/**
|
|
77
|
-
* recent terminal reports
|
|
78
|
-
*
|
|
79
|
-
*
|
|
76
|
+
/** Split the panel list: active jobs (running/retry, stale-marked) first,
|
|
77
|
+
* then the most recent terminal reports, then the archived tail (paginated
|
|
78
|
+
* in the View). Pure — so the history-only panel (no sessionID) is testable
|
|
79
|
+
* without the TUI runtime. */
|
|
80
|
+
declare function splitDelegationList(all: readonly DelegationEntry[], maxRecent?: number, now?: number, staleThresholdMs?: number): {
|
|
81
|
+
active: DelegationEntry[];
|
|
82
|
+
recent: DelegationEntry[];
|
|
83
|
+
archived: DelegationEntry[];
|
|
84
|
+
};
|
|
85
|
+
/** The list the panel actually renders (kept for the header count and
|
|
86
|
+
* existing tests): active jobs first, then the most recent terminal
|
|
87
|
+
* reports (capped) — the archived tail is rendered separately. Pure. */
|
|
80
88
|
declare function visibleDelegationList(all: readonly DelegationEntry[], maxTerminal?: number, now?: number, staleThresholdMs?: number): DelegationEntry[];
|
|
81
89
|
/** Default stale-running threshold: 30 minutes. */
|
|
82
90
|
declare const STALE_RUNNING_THRESHOLD_MS: number;
|
|
@@ -106,6 +114,30 @@ declare function delegationActivity(entry: DelegationEntry): DelegationActivity;
|
|
|
106
114
|
declare function delegationActivityLabel(entry: DelegationEntry): string;
|
|
107
115
|
/** Return a deterministic spinner frame. The View ticks this every 140ms. */
|
|
108
116
|
declare function delegationSpinnerFrame(now: number): string;
|
|
117
|
+
type ToolActivity = {
|
|
118
|
+
tool: string;
|
|
119
|
+
summary: string;
|
|
120
|
+
at: number;
|
|
121
|
+
};
|
|
122
|
+
/** Reduce one message.part.updated tool part to displayable activity.
|
|
123
|
+
* Returns null for non-tool parts, completed/error parts (no live activity)
|
|
124
|
+
* or parts without a session id. Pure. */
|
|
125
|
+
declare function extractToolActivity(part: {
|
|
126
|
+
type?: string;
|
|
127
|
+
tool?: string;
|
|
128
|
+
sessionID?: string;
|
|
129
|
+
state?: {
|
|
130
|
+
status?: string;
|
|
131
|
+
input?: Record<string, unknown>;
|
|
132
|
+
};
|
|
133
|
+
}, now?: number): {
|
|
134
|
+
sessionID: string;
|
|
135
|
+
activity: ToolActivity;
|
|
136
|
+
} | null;
|
|
137
|
+
/** Record an activity sample (bounded map, oldest dropped). */
|
|
138
|
+
declare function trackToolActivity(map: Map<string, ToolActivity>, sessionID: string, activity: ToolActivity): void;
|
|
139
|
+
/** Latest live activity for a child session, or null when absent/stale. */
|
|
140
|
+
declare function latestToolActivityFor(map: Map<string, ToolActivity>, sessionID: string | undefined, now?: number, ttlMs?: number): ToolActivity | null;
|
|
109
141
|
/** Merge the immediate tool-event channel into the child-session channel.
|
|
110
142
|
*
|
|
111
143
|
* Children remain the durable source, while live entries make a delegation
|
|
@@ -278,7 +310,7 @@ type ChildDelegationLike = {
|
|
|
278
310
|
* (the child is actively working), idle → completed, unknown → running
|
|
279
311
|
* (fail-open: a freshly-seen child is assumed active; the 1s poll + md
|
|
280
312
|
* correct it as soon as terminal data exists). */
|
|
281
|
-
declare function childStatusToState(status: string | undefined): 'running' | 'completed';
|
|
313
|
+
declare function childStatusToState(status: string | undefined): 'running' | 'completed' | 'retry';
|
|
282
314
|
/** Row tag for a delegation entry: `[native]` for native task() children
|
|
283
315
|
* (source 'children-only' — no board report), `[pantheon:<alias>]` for board
|
|
284
316
|
* rows ([pantheon:apo-1]) — the same tags the manager prints in
|
|
@@ -324,5 +356,5 @@ declare const plugin: TuiPluginModule & {
|
|
|
324
356
|
setup: () => Promise<void>;
|
|
325
357
|
};
|
|
326
358
|
//#endregion
|
|
327
|
-
export { ChildDelegationLike, DelegationActivity, DelegationEntry, DelegationToolPart, IDLE_SILENCE_MS, LiveDelegationEntry, LiveDelegationStore, ParsedDelegationToolPart, STALE_RUNNING_THRESHOLD_MS, TuiSessionSources, buildChildrenPath, childStatusToState, childrenToDelegationEntries, collectDelegationToolParts, compareDelegationEntries, plugin as default, delegationActivity, delegationActivityLabel, delegationElapsed, delegationSpinnerFrame, delegationTag, fmtElapsed, isValidSessionId, markStaleIfRunning, mergeChildDelegationSources, mergeDelegationSources, navigateToDelegationSession, panelLogDir, parseDelegationMarkdown, parseDelegationToolPart, readAllDelegationEntries, readDelegationEntries, reduceDelegationToolPart, removeDelegationEntry, resolveCurrentSessionID, resolveDelegationsDir, safeSessionPath, seedLiveDelegationMap, toDelegationEntry, tuiLogPath, visibleDelegationList };
|
|
359
|
+
export { ChildDelegationLike, DelegationActivity, DelegationEntry, DelegationToolPart, IDLE_SILENCE_MS, LiveDelegationEntry, LiveDelegationStore, ParsedDelegationToolPart, STALE_RUNNING_THRESHOLD_MS, ToolActivity, TuiSessionSources, buildChildrenPath, childStatusToState, childrenToDelegationEntries, collectDelegationToolParts, compareDelegationEntries, plugin as default, delegationActivity, delegationActivityLabel, delegationElapsed, delegationSpinnerFrame, delegationTag, extractToolActivity, fmtElapsed, isValidSessionId, latestToolActivityFor, markStaleIfRunning, mergeChildDelegationSources, mergeDelegationSources, navigateToDelegationSession, panelLogDir, parseDelegationMarkdown, parseDelegationToolPart, readAllDelegationEntries, readDelegationEntries, reduceDelegationToolPart, removeDelegationEntry, resolveCurrentSessionID, resolveDelegationsDir, safeSessionPath, seedLiveDelegationMap, splitDelegationList, toDelegationEntry, trackToolActivity, tuiLogPath, visibleDelegationList };
|
|
328
360
|
//# sourceMappingURL=tui.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.d.ts","names":[],"sources":["../src/index.tsx"],"mappings":";;KAo7BY;;EAEV;;EAEA;;;;EAIA;;EAEA;EACA;;
|
|
1
|
+
{"version":3,"file":"tui.d.ts","names":[],"sources":["../src/index.tsx"],"mappings":";;KAo7BY;;EAEV;;EAEA;;;;EAIA;;EAEA;EACA;;EAUA;;EAEA;EACA;EACA;;EAEA;;;;EAIA;;;;;;;;;;;iBAsBc,wBACd,aACA,oBACA,qBACC;;;;;;iBAkHmB,sBAAsB,cAAc,QAAQ;;;;;;;;iBAwC5C,yBAAyB,eAAe,QAAQ;;;;;;;;iBAWtD,sBACd;EAAS;EAAoB;eAC7B;;;;;;iBAYc,YAAY;;;iBAMZ,WAAW;;;;iBAOX,yBAAyB,GAAG,iBAAiB,GAAG;;;;;iBAahD,oBACd,cAAc,mBACd,oBACA,cACA;EACG,QAAQ;EAAmB,QAAQ;EAAmB,UAAU;;;;;iBAerD,sBACd,cAAc,mBACd,sBACA,cACA,4BACC;;cAMU;;;;cAKA;;;;;;;;;iBAUG,mBACd,OAAO,iBACP,aACA,uBACC;;;iBAWa,WAAW;;;iBAcX,kBAAkB,OAAO,iBAAiB;;;KAQ9C;iBAQI,mBAAmB,OAAO,kBAAkB;iBAc5C,wBAAwB,OAAO;;iBAqB/B,uBAAuB;KAY3B;EACV;EACA;EACA;;;;;iBA0Bc,oBACd;EACE;EACA;EACA;EACA;IAAU;IAAiB,QAAQ;;GAErC;EACG;EAAmB,UAAU;;;iBAYlB,kBACd,KAAK,YAAY,eACjB,mBACA,UAAU;;iBAWI,sBACd,KAAK,YAAY,eACjB,+BACA,cACA,iBACC;;;;;;;iBAca,4BACd,mBAAmB,mBACnB,eAAe,wBACd;;KAmFS;EACV;EACA;EACA;EACA;EACA;EACA;IACE;IACA,QAAQ;IACR;IACA;IACA;MAAS;MAAgB;;;;;KAKjB;;EAEV;;EAEA;;EAEA;EACA;;EAEA;EACA;;EAEA;;EAEA;EACA;EACA;EACA;;EAEA;;;KAIU;EACV;EACA;EACA;EACA;;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;;;;;iBAac,wBACd,MAAM,oBACN,eACC;;;iBA+Ea,yBACd,KAAK,YAAY,sBACjB,MAAM,oBACN;;;iBA+Fc,sBACd,KAAK,YAAY,sBACjB;;;;;;iBAiBc,2BACd;EAAqB;EAAa;iBAClC,YAAY,uDACX;;;;;iBA2Ba,sBACd,KAAK,YAAY,sBACjB,gBAAgB,sBAChB;;;iBAWc,kBAAkB,MAAM,sBAAsB;;;;;;iBAqB9C,uBACd,eAAe,uBACf,aAAa,oBACZ;;;;;;;;;iBA8Da,iBAAiB,cAAc;;;;KAOnC;;EAEV;EACA;;IAEE;MAAU;;;IAEV;MAAU;QAAY;QAAe,SAAS;;;;;;;;;;iBASlC,wBAAwB,SAAS;;;;;;;;iBAmBjC,gBAAgB;EAAgB;IAAQ;;;;;;;iBASxC,kBAAkB;EAAkC;IAAQ;;;;KAKhE;;EAEV;;EAEA;;;EAGA;;;EAGA;EACA;IACE;IACA;;;;;;;iBAQY,mBAAmB;;;;;;;iBAYnB,cAAc,OAAO;;;;;;;;;;;;;;iBAiBrB,4BACd,mBAAmB,mCACnB,aAAa,mBACb,eACC;;;;;;iBA0Ca,4BACd;EAAS,YAAY,cAAc,SAAS;eAC5C;;;;;KAiMU;EACV,KAAK,YAAY;;EAEjB;;EAEA;;cA0fI,QAAQ;EAAoB;EAAY,aAAa"}
|