Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .zenodo.json
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
{
"title": "Pantheon",
"upload_type": "software",
"description": "Pantheon v1.5.0-beta.19 is an OpenCode plugin and installer for coordinating 14 specialized agents. The repository includes reusable skills, slash-command definitions, MCP server implementations, documentation, and tests. This release records version 1.5.0-beta.19 synchronized across package.json, package-lock.json, plugin.json, pyproject.toml, and src/plugins/tui/package.json.\n\nO Pantheon v1.5.0-beta.19 é um plugin e instalador para OpenCode que coordena 14 agentes especializados. O repositório inclui skills reutilizáveis, definições de comandos slash, implementações de servidores MCP, documentação e testes. Esta release registra a versão 1.5.0-beta.19 sincronizada em package.json, package-lock.json, plugin.json, pyproject.toml e src/plugins/tui/package.json.",
"description": "Pantheon v1.5.0-beta.20 is an OpenCode plugin and installer for coordinating 14 specialized agents. The repository includes reusable skills, slash-command definitions, MCP server implementations, documentation, and tests. This release records version 1.5.0-beta.20 synchronized across package.json, package-lock.json, plugin.json, pyproject.toml, and src/plugins/tui/package.json.\n\nO Pantheon v1.5.0-beta.20 é um plugin e instalador para OpenCode que coordena 14 agentes especializados. O repositório inclui skills reutilizáveis, definições de comandos slash, implementações de servidores MCP, documentação e testes. Esta release registra a versão 1.5.0-beta.20 sincronizada em package.json, package-lock.json, plugin.json, pyproject.toml e src/plugins/tui/package.json.",
"creators": [
{
"name": "Igor Leite da Silva"
}
],
"version": "1.5.0-beta.19",
"version": "1.5.0-beta.20",
"publication_date": "2026-09-16",
"license": "MIT",
"language": "eng",
"keywords": ["opencode", "ai-agents", "multi-agent", "orchestration", "developer-tools"],
"url": "https://github.com/ils15/pantheon-opencode/releases/tag/v1.5.0-beta.19",
"url": "https://github.com/ils15/pantheon-opencode/releases/tag/v1.5.0-beta.20",
"related_identifiers": [
{
"identifier": "https://github.com/ils15/pantheon-opencode",
Expand Down
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## ✅ Closed Issues

## [v1.5.0-beta.20] - 2026-09-16

<!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
move this section to a versioned entry and reset the template below. -->

## 🐞 Fixed

- **Fixed — painel Delegations**: children com status `busy` stale (>30min sem
atualização) agora são classificadas como `completed` (não `running`). O
opencode mantém entradas `busy` no mapa de status para sessões já concluídas;
o TUI agora detecta e marca como done.
## [v1.5.0-beta.19] - 2026-09-16

<!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
Expand Down
8 changes: 4 additions & 4 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ cff-version: 1.2.0
message: "If you use Pantheon, please cite this software."
title: "Pantheon"
abstract: >-
Pantheon v1.5.0-beta.19 is an OpenCode plugin and installer for coordinating
Pantheon v1.5.0-beta.20 is an OpenCode plugin and installer for coordinating
14 specialized agents. The repository includes reusable skills,
slash-command definitions, MCP server implementations, documentation, and
tests. O Pantheon v1.5.0-beta.19 é um plugin e instalador para OpenCode que
tests. O Pantheon v1.5.0-beta.20 é um plugin e instalador para OpenCode que
coordena 14 agentes especializados, com skills reutilizáveis, comandos
slash, servidores MCP, documentação e testes.
version: 1.5.0-beta.19
version: 1.5.0-beta.20
date-released: 2026-09-16
url: https://github.com/ils15/pantheon-opencode/releases/tag/v1.5.0-beta.19
url: https://github.com/ils15/pantheon-opencode/releases/tag/v1.5.0-beta.20
doi: 10.5281/zenodo.22306637
repository-code: https://github.com/ils15/pantheon-opencode
license: MIT
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "pantheon-opencode",
"version": "1.5.0-beta.19",
"version": "1.5.0-beta.20",
"description": "Multi-agent orchestration for OpenCode — 14 specialized agents, TDD, Themis review gates.",
"type": "module",
"publishConfig": {
Expand Down
2 changes: 1 addition & 1 deletion plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "pantheon",
"publisher": "ils15",
"version": "1.5.0-beta.19",
"version": "1.5.0-beta.20",
"displayName": "Pantheon",
"description": "Conductor-Delegate orchestration platform with 14 specialized agents, 21 skills, and OpenCode support.",
"agents": "./src/agents",
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.backends._legacy:_Backend"

[project]
name = "pantheon"
version = "1.5.0-beta.19"
version = "1.5.0-beta.20"
description = "Multi-agent orchestration framework"
requires-python = ">=3.11"
dependencies = []
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/tui/dist/tui.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 8 additions & 2 deletions src/plugins/tui/dist/tui.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions src/plugins/tui/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/plugins/tui/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "pantheon-tui",
"type": "module",
"version": "1.5.0-beta.19",
"version": "1.5.0-beta.20",
"description": "Pantheon TUI plugin — sidebar (version, preset, sessions, real-time delegations) + AI subscription usage gauges incl. OpenCode Go/Zen dollar limits (vendored, MIT)",
"license": "MIT",
"exports": {
Expand Down
14 changes: 13 additions & 1 deletion src/plugins/tui/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2185,7 +2185,19 @@ export function childStatusToState(
graceMs = DELEGATION_CHILD_STATUS_GRACE_MS,
): 'running' | 'completed' | 'retry' {
if (status === 'retry') return 'retry'
if (status === 'busy') return 'running'
if (status === 'busy') {
// A stale "busy" in the status map means the child is likely dead, not
// running. The opencode status map may retain entries for sessions that
// have already terminated. Cross-check against the child's own activity
// timestamps: if the last activity is older than the stale-running
// threshold, treat the child as completed rather than propagating the
// stale busy status as "running" (the "213 children, all active" bug).
if (time) {
const lastActivity = Math.max(time.updated ?? 0, time.created ?? 0)
if (lastActivity > 0 && now - lastActivity > STALE_RUNNING_THRESHOLD_MS) return 'completed'
}
return 'running'
}
if (status !== undefined) return 'completed' // idle + any other explicit terminal
// Absent status: running only while the child's last activity is fresh.
const lastActivity = Math.max(time?.updated ?? 0, time?.created ?? 0)
Expand Down
42 changes: 42 additions & 0 deletions tests/pantheon/tui-delegations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -932,6 +932,48 @@ async function main() {
'completed',
'grace window is injectable (0 = always terminal)',
)

// Stale "busy" in the status map: a "busy" child whose last activity is
// older than STALE_RUNNING_THRESHOLD_MS is likely dead — the status map
// retained a stale entry. Treat as completed, not running.
const STALE = 30 * 60 * 1000
const tNow = STALE + 60_000 // enough headroom so (tNow - STALE - 1) is positive
assert.equal(
childStatusToState('busy', { created: tNow - STALE - 1 }, tNow),
'completed',
'stale "busy" (created past threshold) → completed',
)
assert.equal(
childStatusToState('busy', { updated: tNow - STALE - 1 }, tNow),
'completed',
'stale "busy" (updated past threshold) → completed',
)
assert.equal(
childStatusToState('busy', { created: tNow - 10_000 }, tNow),
'running',
'recent "busy" (within threshold) → running',
)
assert.equal(
childStatusToState('busy', { created: tNow - 10_000, updated: tNow - STALE - 1 }, tNow),
'running',
'"busy" with recent created + stale updated → running (max picks most recent)',
)
assert.equal(
childStatusToState('busy', { created: tNow - STALE - 1, updated: tNow - 10_000 }, tNow),
'running',
'"busy" with stale created + recent updated → running (max picks most recent)',
)
assert.equal(
childStatusToState('busy', { created: tNow - STALE - 1, updated: tNow - STALE - 1 }, tNow),
'completed',
'"busy" with both stale → completed',
)
// Without time info, trust the status map (can't determine staleness).
assert.equal(
childStatusToState('busy'),
'running',
'"busy" without time → running (trust status map)',
)
},
)

Expand Down
Loading