pantheon-opencode 1.1.1-beta.10 → 1.1.1-beta.12
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/opencode.json +49 -2
- package/package.json +1 -1
- package/pantheon.schema.json +1 -1
- package/src/agents/mnemosyne.md +9 -1
- package/src/agents/nyx.md +7 -1
- package/src/agents/themis.md +8 -2
- package/src/agents/zeus.md +10 -0
- package/src/plugins/tui/dist/tui.d.ts.map +1 -1
- package/src/plugins/tui/dist/tui.js +187 -141
- package/src/plugins/tui/dist/tui.tsx +120 -45
- package/src/plugins/tui/src/index.tsx +120 -45
- package/src/routing.yml +11 -30
- package/commands/pantheon-audit.md +0 -25
- package/commands/pantheon-deepwork.md +0 -79
- package/commands/pantheon-focus.md +0 -9
- package/commands/pantheon-forget.md +0 -58
- package/commands/pantheon-optimize.md +0 -79
- package/commands/pantheon-remember.md +0 -44
- package/commands/pantheon-search.md +0 -48
- package/commands/pantheon-status.md +0 -71
- package/commands/pantheon.md +0 -49
- package/scripts/check-version-consistency.sh +0 -23
- package/scripts/generate-routing-docs.mjs +0 -104
- package/scripts/manifest.mjs +0 -597
- package/scripts/memory_cache.py +0 -78
- package/scripts/paths.py +0 -64
- package/scripts/prune_context.py +0 -72
- package/scripts/release-bundle.mjs +0 -109
- package/scripts/todo_enforcer.py +0 -242
- package/scripts/validate_agent_frontmatter.py +0 -226
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/** @jsxImportSource @opentui/solid */
|
|
4
4
|
|
|
5
5
|
import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from '@opencode-ai/plugin/tui'
|
|
6
|
-
import { createMemo, createResource, createSignal, For, Show } from 'solid-js'
|
|
6
|
+
import { createMemo, createResource, createSignal, For, onCleanup, onMount, Show } from 'solid-js'
|
|
7
7
|
|
|
8
8
|
/* ─── Constants ─────────────────────────────────────────── */
|
|
9
9
|
|
|
@@ -77,7 +77,13 @@ function buildBar(pct: number): string {
|
|
|
77
77
|
|
|
78
78
|
/* ─── Version Detection ────────────────────────────────────
|
|
79
79
|
* 100% dinâmico — zero fallback hardcoded.
|
|
80
|
-
* Se falhar, retorna null e a View omite a versão.
|
|
80
|
+
* Se falhar, retorna null e a View omite a versão.
|
|
81
|
+
*
|
|
82
|
+
* Try order:
|
|
83
|
+
* 1. api.client.file.read package.json
|
|
84
|
+
* 2. git describe --tags
|
|
85
|
+
* 3. opencode --version
|
|
86
|
+
* 4. null */
|
|
81
87
|
|
|
82
88
|
async function detectVersion(api: TuiPluginApi): Promise<string | null> {
|
|
83
89
|
// Try 1: package.json do projeto (via worktree path)
|
|
@@ -100,6 +106,17 @@ async function detectVersion(api: TuiPluginApi): Promise<string | null> {
|
|
|
100
106
|
}
|
|
101
107
|
} catch { /* fall through */ }
|
|
102
108
|
|
|
109
|
+
// Try 3: opencode --version
|
|
110
|
+
try {
|
|
111
|
+
const proc = (api as any).client?.process
|
|
112
|
+
if (typeof proc?.exec === 'function') {
|
|
113
|
+
const r = await proc.exec({ command: 'opencode', args: ['--version'], timeoutMs: 3000 })
|
|
114
|
+
const stdout = (r.stdout ?? r.output ?? '') as string
|
|
115
|
+
const ver = stdout.trim().replace(/^v/, '')
|
|
116
|
+
if (ver) return ver
|
|
117
|
+
}
|
|
118
|
+
} catch { /* fall through */ }
|
|
119
|
+
|
|
103
120
|
return null // sem fallback — versão não aparece
|
|
104
121
|
}
|
|
105
122
|
|
|
@@ -165,25 +182,32 @@ function ContextBar(props: { api: TuiPluginApi; sessionID: string }) {
|
|
|
165
182
|
)
|
|
166
183
|
}
|
|
167
184
|
|
|
168
|
-
/* ───
|
|
185
|
+
/* ─── Session Row (single session with live status indicator) ─ */
|
|
169
186
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
+
function SessionRow(props: { api: TuiPluginApi; session: any }) {
|
|
188
|
+
const theme = () => props.api.theme.current
|
|
189
|
+
|
|
190
|
+
const status = createMemo(() => {
|
|
191
|
+
try {
|
|
192
|
+
const s = (props.api.state as any).session?.status?.(props.session.id)
|
|
193
|
+
if (s?.type) return s.type as string
|
|
194
|
+
} catch { /* ignore */ }
|
|
195
|
+
return null
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
const statusIcon = createMemo(() => {
|
|
199
|
+
switch (status()) {
|
|
200
|
+
case 'busy': return '\u25cf ' // ● — running
|
|
201
|
+
case 'retry': return '\u26a0 ' // ⚠ — needs attention
|
|
202
|
+
default: return '' // idle/unknown — no icon
|
|
203
|
+
}
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
return (
|
|
207
|
+
<text fg={theme().textMuted}>
|
|
208
|
+
{`${statusIcon()}${props.session?.id?.slice(0, 8) ?? '????'}... ${props.session?.title?.slice(0, 26) ?? '(untitled)'}`}
|
|
209
|
+
</text>
|
|
210
|
+
)
|
|
187
211
|
}
|
|
188
212
|
|
|
189
213
|
/* ─── Main Sidebar View ──────────────────────────────────── */
|
|
@@ -200,15 +224,73 @@ function View(props: { api: TuiPluginApi; sessionID: string; version: string | n
|
|
|
200
224
|
props.api.state.vcs?.branch ? `\u2387 ${props.api.state.vcs.branch}` : null,
|
|
201
225
|
)
|
|
202
226
|
|
|
227
|
+
// ── Sessions: fetch via api.client.session.list (not proc.exec) ──
|
|
228
|
+
const [sessionList, { refetch: refetchSessions }] = createResource(async () => {
|
|
229
|
+
try {
|
|
230
|
+
const result = await (props.api.client as any)?.session?.list?.({ limit: 100 })
|
|
231
|
+
return result ?? { data: [] }
|
|
232
|
+
} catch {
|
|
233
|
+
return { data: [] }
|
|
234
|
+
}
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
// Total top-level sessions (excludes subagent sessions)
|
|
203
238
|
const totalSessions = createMemo(() => {
|
|
204
|
-
|
|
239
|
+
const result = sessionList()
|
|
240
|
+
if (!result) return 0
|
|
241
|
+
const data: any[] = (result as any).data ?? result
|
|
242
|
+
if (!Array.isArray(data)) return 0
|
|
243
|
+
return data.filter((s: any) => !s.parentID).length
|
|
205
244
|
})
|
|
206
245
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
246
|
+
// Recent top-level sessions, sorted by time.updated descending
|
|
247
|
+
const recentSessions = createMemo(() => {
|
|
248
|
+
const result = sessionList()
|
|
249
|
+
if (!result) return []
|
|
250
|
+
const data: any[] = (result as any).data ?? result
|
|
251
|
+
if (!Array.isArray(data)) return []
|
|
252
|
+
return data
|
|
253
|
+
.filter((s: any) => !s.parentID && s.id !== props.sessionID)
|
|
254
|
+
.sort((a: any, b: any) => {
|
|
255
|
+
const ta = a.time?.updated ?? a.updated ?? 0
|
|
256
|
+
const tb = b.time?.updated ?? b.updated ?? 0
|
|
257
|
+
return tb - ta
|
|
258
|
+
})
|
|
259
|
+
.slice(0, 8)
|
|
210
260
|
})
|
|
211
261
|
|
|
262
|
+
// ── Memory: starts at null (= "N/A"), tracks via events ──
|
|
263
|
+
const [memoryCount, setMemoryCount] = createSignal<number | null>(null)
|
|
264
|
+
|
|
265
|
+
// ── Event subscriptions for live session/memory updates ──
|
|
266
|
+
onMount(() => {
|
|
267
|
+
const cleanup: (() => void)[] = []
|
|
268
|
+
|
|
269
|
+
// Session events — triggers resource refetch
|
|
270
|
+
try {
|
|
271
|
+
cleanup.push(props.api.event.on('session.status', refetchSessions))
|
|
272
|
+
cleanup.push(props.api.event.on('session.created', refetchSessions))
|
|
273
|
+
cleanup.push(props.api.event.on('session.updated', refetchSessions))
|
|
274
|
+
cleanup.push(props.api.event.on('session.deleted', refetchSessions))
|
|
275
|
+
} catch { /* events API not available in this runtime */ }
|
|
276
|
+
|
|
277
|
+
// Memory events — tracks running counter (no api.state.memory)
|
|
278
|
+
try {
|
|
279
|
+
const ev = (props.api.event as any)
|
|
280
|
+
if (typeof ev?.on === 'function') {
|
|
281
|
+
cleanup.push(
|
|
282
|
+
ev.on('memory.created', () => setMemoryCount((c) => (c !== null ? c + 1 : 1))),
|
|
283
|
+
)
|
|
284
|
+
cleanup.push(
|
|
285
|
+
ev.on('memory.deleted', () => setMemoryCount((c) => (c !== null ? Math.max(0, c - 1) : 0))),
|
|
286
|
+
)
|
|
287
|
+
}
|
|
288
|
+
} catch { /* memory events not available */ }
|
|
289
|
+
|
|
290
|
+
onCleanup(() => cleanup.forEach((fn) => fn()))
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
// ── Config summary ──
|
|
212
294
|
const configSummary = createMemo(() => {
|
|
213
295
|
const cfg = (props.api.state as any).config
|
|
214
296
|
if (!cfg) return null
|
|
@@ -219,12 +301,6 @@ function View(props: { api: TuiPluginApi; sessionID: string; version: string | n
|
|
|
219
301
|
}
|
|
220
302
|
})
|
|
221
303
|
|
|
222
|
-
// Load session list only when expanded
|
|
223
|
-
const [sessions] = createResource(
|
|
224
|
-
() => showSessions(),
|
|
225
|
-
() => fetchRecentSessions(props.api, props.sessionID),
|
|
226
|
-
)
|
|
227
|
-
|
|
228
304
|
const HR = () => <text fg={theme().textMuted}>{'\u2500'.repeat(28)}</text>
|
|
229
305
|
|
|
230
306
|
return (
|
|
@@ -251,20 +327,17 @@ function View(props: { api: TuiPluginApi; sessionID: string; version: string | n
|
|
|
251
327
|
</text>
|
|
252
328
|
<text fg={theme().textMuted}>{` (${String(totalSessions())})`}</text>
|
|
253
329
|
</box>
|
|
254
|
-
<Show when={showSessions()
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
</box>
|
|
266
|
-
</Show>
|
|
267
|
-
)}
|
|
330
|
+
<Show when={showSessions()}>
|
|
331
|
+
<Show
|
|
332
|
+
when={recentSessions().length > 0}
|
|
333
|
+
fallback={<box marginLeft={1}><text fg={theme().textMuted}>No recent sessions</text></box>}
|
|
334
|
+
>
|
|
335
|
+
<box marginLeft={1} flexDirection="column">
|
|
336
|
+
<For each={recentSessions()}>
|
|
337
|
+
{(ses: any) => <SessionRow api={props.api} session={ses} />}
|
|
338
|
+
</For>
|
|
339
|
+
</box>
|
|
340
|
+
</Show>
|
|
268
341
|
</Show>
|
|
269
342
|
|
|
270
343
|
{/* ── Commands ── */}
|
|
@@ -339,7 +412,9 @@ function View(props: { api: TuiPluginApi; sessionID: string; version: string | n
|
|
|
339
412
|
{/* ── Memory (always visible summary) ── */}
|
|
340
413
|
<box marginTop={1}>
|
|
341
414
|
<text fg={theme().textMuted}>
|
|
342
|
-
{
|
|
415
|
+
{memoryCount() !== null
|
|
416
|
+
? `Memory: ${fmtInt(memoryCount()!)} entries`
|
|
417
|
+
: 'Memory: N/A'}
|
|
343
418
|
</text>
|
|
344
419
|
</box>
|
|
345
420
|
</box>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/** @jsxImportSource @opentui/solid */
|
|
4
4
|
|
|
5
5
|
import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from '@opencode-ai/plugin/tui'
|
|
6
|
-
import { createMemo, createResource, createSignal, For, Show } from 'solid-js'
|
|
6
|
+
import { createMemo, createResource, createSignal, For, onCleanup, onMount, Show } from 'solid-js'
|
|
7
7
|
|
|
8
8
|
/* ─── Constants ─────────────────────────────────────────── */
|
|
9
9
|
|
|
@@ -77,7 +77,13 @@ function buildBar(pct: number): string {
|
|
|
77
77
|
|
|
78
78
|
/* ─── Version Detection ────────────────────────────────────
|
|
79
79
|
* 100% dinâmico — zero fallback hardcoded.
|
|
80
|
-
* Se falhar, retorna null e a View omite a versão.
|
|
80
|
+
* Se falhar, retorna null e a View omite a versão.
|
|
81
|
+
*
|
|
82
|
+
* Try order:
|
|
83
|
+
* 1. api.client.file.read package.json
|
|
84
|
+
* 2. git describe --tags
|
|
85
|
+
* 3. opencode --version
|
|
86
|
+
* 4. null */
|
|
81
87
|
|
|
82
88
|
async function detectVersion(api: TuiPluginApi): Promise<string | null> {
|
|
83
89
|
// Try 1: package.json do projeto (via worktree path)
|
|
@@ -100,6 +106,17 @@ async function detectVersion(api: TuiPluginApi): Promise<string | null> {
|
|
|
100
106
|
}
|
|
101
107
|
} catch { /* fall through */ }
|
|
102
108
|
|
|
109
|
+
// Try 3: opencode --version
|
|
110
|
+
try {
|
|
111
|
+
const proc = (api as any).client?.process
|
|
112
|
+
if (typeof proc?.exec === 'function') {
|
|
113
|
+
const r = await proc.exec({ command: 'opencode', args: ['--version'], timeoutMs: 3000 })
|
|
114
|
+
const stdout = (r.stdout ?? r.output ?? '') as string
|
|
115
|
+
const ver = stdout.trim().replace(/^v/, '')
|
|
116
|
+
if (ver) return ver
|
|
117
|
+
}
|
|
118
|
+
} catch { /* fall through */ }
|
|
119
|
+
|
|
103
120
|
return null // sem fallback — versão não aparece
|
|
104
121
|
}
|
|
105
122
|
|
|
@@ -165,25 +182,32 @@ function ContextBar(props: { api: TuiPluginApi; sessionID: string }) {
|
|
|
165
182
|
)
|
|
166
183
|
}
|
|
167
184
|
|
|
168
|
-
/* ───
|
|
185
|
+
/* ─── Session Row (single session with live status indicator) ─ */
|
|
169
186
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
+
function SessionRow(props: { api: TuiPluginApi; session: any }) {
|
|
188
|
+
const theme = () => props.api.theme.current
|
|
189
|
+
|
|
190
|
+
const status = createMemo(() => {
|
|
191
|
+
try {
|
|
192
|
+
const s = (props.api.state as any).session?.status?.(props.session.id)
|
|
193
|
+
if (s?.type) return s.type as string
|
|
194
|
+
} catch { /* ignore */ }
|
|
195
|
+
return null
|
|
196
|
+
})
|
|
197
|
+
|
|
198
|
+
const statusIcon = createMemo(() => {
|
|
199
|
+
switch (status()) {
|
|
200
|
+
case 'busy': return '\u25cf ' // ● — running
|
|
201
|
+
case 'retry': return '\u26a0 ' // ⚠ — needs attention
|
|
202
|
+
default: return '' // idle/unknown — no icon
|
|
203
|
+
}
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
return (
|
|
207
|
+
<text fg={theme().textMuted}>
|
|
208
|
+
{`${statusIcon()}${props.session?.id?.slice(0, 8) ?? '????'}... ${props.session?.title?.slice(0, 26) ?? '(untitled)'}`}
|
|
209
|
+
</text>
|
|
210
|
+
)
|
|
187
211
|
}
|
|
188
212
|
|
|
189
213
|
/* ─── Main Sidebar View ──────────────────────────────────── */
|
|
@@ -200,15 +224,73 @@ function View(props: { api: TuiPluginApi; sessionID: string; version: string | n
|
|
|
200
224
|
props.api.state.vcs?.branch ? `\u2387 ${props.api.state.vcs.branch}` : null,
|
|
201
225
|
)
|
|
202
226
|
|
|
227
|
+
// ── Sessions: fetch via api.client.session.list (not proc.exec) ──
|
|
228
|
+
const [sessionList, { refetch: refetchSessions }] = createResource(async () => {
|
|
229
|
+
try {
|
|
230
|
+
const result = await (props.api.client as any)?.session?.list?.({ limit: 100 })
|
|
231
|
+
return result ?? { data: [] }
|
|
232
|
+
} catch {
|
|
233
|
+
return { data: [] }
|
|
234
|
+
}
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
// Total top-level sessions (excludes subagent sessions)
|
|
203
238
|
const totalSessions = createMemo(() => {
|
|
204
|
-
|
|
239
|
+
const result = sessionList()
|
|
240
|
+
if (!result) return 0
|
|
241
|
+
const data: any[] = (result as any).data ?? result
|
|
242
|
+
if (!Array.isArray(data)) return 0
|
|
243
|
+
return data.filter((s: any) => !s.parentID).length
|
|
205
244
|
})
|
|
206
245
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
246
|
+
// Recent top-level sessions, sorted by time.updated descending
|
|
247
|
+
const recentSessions = createMemo(() => {
|
|
248
|
+
const result = sessionList()
|
|
249
|
+
if (!result) return []
|
|
250
|
+
const data: any[] = (result as any).data ?? result
|
|
251
|
+
if (!Array.isArray(data)) return []
|
|
252
|
+
return data
|
|
253
|
+
.filter((s: any) => !s.parentID && s.id !== props.sessionID)
|
|
254
|
+
.sort((a: any, b: any) => {
|
|
255
|
+
const ta = a.time?.updated ?? a.updated ?? 0
|
|
256
|
+
const tb = b.time?.updated ?? b.updated ?? 0
|
|
257
|
+
return tb - ta
|
|
258
|
+
})
|
|
259
|
+
.slice(0, 8)
|
|
210
260
|
})
|
|
211
261
|
|
|
262
|
+
// ── Memory: starts at null (= "N/A"), tracks via events ──
|
|
263
|
+
const [memoryCount, setMemoryCount] = createSignal<number | null>(null)
|
|
264
|
+
|
|
265
|
+
// ── Event subscriptions for live session/memory updates ──
|
|
266
|
+
onMount(() => {
|
|
267
|
+
const cleanup: (() => void)[] = []
|
|
268
|
+
|
|
269
|
+
// Session events — triggers resource refetch
|
|
270
|
+
try {
|
|
271
|
+
cleanup.push(props.api.event.on('session.status', refetchSessions))
|
|
272
|
+
cleanup.push(props.api.event.on('session.created', refetchSessions))
|
|
273
|
+
cleanup.push(props.api.event.on('session.updated', refetchSessions))
|
|
274
|
+
cleanup.push(props.api.event.on('session.deleted', refetchSessions))
|
|
275
|
+
} catch { /* events API not available in this runtime */ }
|
|
276
|
+
|
|
277
|
+
// Memory events — tracks running counter (no api.state.memory)
|
|
278
|
+
try {
|
|
279
|
+
const ev = (props.api.event as any)
|
|
280
|
+
if (typeof ev?.on === 'function') {
|
|
281
|
+
cleanup.push(
|
|
282
|
+
ev.on('memory.created', () => setMemoryCount((c) => (c !== null ? c + 1 : 1))),
|
|
283
|
+
)
|
|
284
|
+
cleanup.push(
|
|
285
|
+
ev.on('memory.deleted', () => setMemoryCount((c) => (c !== null ? Math.max(0, c - 1) : 0))),
|
|
286
|
+
)
|
|
287
|
+
}
|
|
288
|
+
} catch { /* memory events not available */ }
|
|
289
|
+
|
|
290
|
+
onCleanup(() => cleanup.forEach((fn) => fn()))
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
// ── Config summary ──
|
|
212
294
|
const configSummary = createMemo(() => {
|
|
213
295
|
const cfg = (props.api.state as any).config
|
|
214
296
|
if (!cfg) return null
|
|
@@ -219,12 +301,6 @@ function View(props: { api: TuiPluginApi; sessionID: string; version: string | n
|
|
|
219
301
|
}
|
|
220
302
|
})
|
|
221
303
|
|
|
222
|
-
// Load session list only when expanded
|
|
223
|
-
const [sessions] = createResource(
|
|
224
|
-
() => showSessions(),
|
|
225
|
-
() => fetchRecentSessions(props.api, props.sessionID),
|
|
226
|
-
)
|
|
227
|
-
|
|
228
304
|
const HR = () => <text fg={theme().textMuted}>{'\u2500'.repeat(28)}</text>
|
|
229
305
|
|
|
230
306
|
return (
|
|
@@ -251,20 +327,17 @@ function View(props: { api: TuiPluginApi; sessionID: string; version: string | n
|
|
|
251
327
|
</text>
|
|
252
328
|
<text fg={theme().textMuted}>{` (${String(totalSessions())})`}</text>
|
|
253
329
|
</box>
|
|
254
|
-
<Show when={showSessions()
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
</box>
|
|
266
|
-
</Show>
|
|
267
|
-
)}
|
|
330
|
+
<Show when={showSessions()}>
|
|
331
|
+
<Show
|
|
332
|
+
when={recentSessions().length > 0}
|
|
333
|
+
fallback={<box marginLeft={1}><text fg={theme().textMuted}>No recent sessions</text></box>}
|
|
334
|
+
>
|
|
335
|
+
<box marginLeft={1} flexDirection="column">
|
|
336
|
+
<For each={recentSessions()}>
|
|
337
|
+
{(ses: any) => <SessionRow api={props.api} session={ses} />}
|
|
338
|
+
</For>
|
|
339
|
+
</box>
|
|
340
|
+
</Show>
|
|
268
341
|
</Show>
|
|
269
342
|
|
|
270
343
|
{/* ── Commands ── */}
|
|
@@ -339,7 +412,9 @@ function View(props: { api: TuiPluginApi; sessionID: string; version: string | n
|
|
|
339
412
|
{/* ── Memory (always visible summary) ── */}
|
|
340
413
|
<box marginTop={1}>
|
|
341
414
|
<text fg={theme().textMuted}>
|
|
342
|
-
{
|
|
415
|
+
{memoryCount() !== null
|
|
416
|
+
? `Memory: ${fmtInt(memoryCount()!)} entries`
|
|
417
|
+
: 'Memory: N/A'}
|
|
343
418
|
</text>
|
|
344
419
|
</box>
|
|
345
420
|
</box>
|
package/src/routing.yml
CHANGED
|
@@ -2,7 +2,6 @@ version: 1.0
|
|
|
2
2
|
agents:
|
|
3
3
|
zeus:
|
|
4
4
|
role: Central orchestrator
|
|
5
|
-
model_tier: code
|
|
6
5
|
reasoning_effort: medium
|
|
7
6
|
user_invocable: true
|
|
8
7
|
can_delegate: true
|
|
@@ -41,7 +40,6 @@ agents:
|
|
|
41
40
|
- incremental-implementation
|
|
42
41
|
athena:
|
|
43
42
|
role: Strategic planner
|
|
44
|
-
model_tier: premium
|
|
45
43
|
reasoning_effort: high
|
|
46
44
|
user_invocable: true
|
|
47
45
|
can_delegate: true
|
|
@@ -61,7 +59,6 @@ agents:
|
|
|
61
59
|
- memory-bank
|
|
62
60
|
apollo:
|
|
63
61
|
role: Investigation scout
|
|
64
|
-
model_tier: free
|
|
65
62
|
reasoning_effort: low
|
|
66
63
|
user_invocable: false
|
|
67
64
|
can_delegate: false
|
|
@@ -79,7 +76,6 @@ agents:
|
|
|
79
76
|
- auto-continue
|
|
80
77
|
hermes:
|
|
81
78
|
role: Backend specialist
|
|
82
|
-
model_tier: code
|
|
83
79
|
reasoning_effort: medium
|
|
84
80
|
user_invocable: true
|
|
85
81
|
can_delegate: true
|
|
@@ -92,6 +88,10 @@ agents:
|
|
|
92
88
|
- obsolete_lib_detection
|
|
93
89
|
- memory_store
|
|
94
90
|
- pantheon_code_mode
|
|
91
|
+
subagent_can_delegate_to:
|
|
92
|
+
- apollo
|
|
93
|
+
- themis
|
|
94
|
+
- mnemosyne
|
|
95
95
|
skills:
|
|
96
96
|
- tdd-with-agents
|
|
97
97
|
- file-prompts
|
|
@@ -100,7 +100,6 @@ agents:
|
|
|
100
100
|
- incremental-implementation
|
|
101
101
|
aphrodite:
|
|
102
102
|
role: Frontend specialist
|
|
103
|
-
model_tier: code
|
|
104
103
|
reasoning_effort: medium
|
|
105
104
|
user_invocable: true
|
|
106
105
|
can_delegate: false
|
|
@@ -113,13 +112,13 @@ agents:
|
|
|
113
112
|
- deprecated_npm_detection
|
|
114
113
|
- memory_store
|
|
115
114
|
- pantheon_resources_memory_bank
|
|
115
|
+
- pantheon_code_mode
|
|
116
116
|
skills:
|
|
117
117
|
- tdd-with-agents
|
|
118
118
|
- visual-review-pipeline
|
|
119
119
|
- file-prompts
|
|
120
120
|
demeter:
|
|
121
121
|
role: Database specialist
|
|
122
|
-
model_tier: code
|
|
123
122
|
reasoning_effort: medium
|
|
124
123
|
user_invocable: true
|
|
125
124
|
can_delegate: false
|
|
@@ -132,12 +131,12 @@ agents:
|
|
|
132
131
|
- index_strategy
|
|
133
132
|
- memory_store
|
|
134
133
|
- memory_recall
|
|
134
|
+
- pantheon_code_mode
|
|
135
135
|
skills:
|
|
136
136
|
- tdd-with-agents
|
|
137
137
|
- incremental-implementation
|
|
138
138
|
themis:
|
|
139
139
|
role: Quality gate
|
|
140
|
-
model_tier: premium
|
|
141
140
|
reasoning_effort: high
|
|
142
141
|
user_invocable: true
|
|
143
142
|
can_delegate: true
|
|
@@ -151,6 +150,7 @@ agents:
|
|
|
151
150
|
- deprecation_audit
|
|
152
151
|
- memory_search
|
|
153
152
|
- pantheon_resources
|
|
153
|
+
- pantheon_code_mode
|
|
154
154
|
subagent_can_delegate_to:
|
|
155
155
|
- mnemosyne
|
|
156
156
|
skills:
|
|
@@ -160,7 +160,6 @@ agents:
|
|
|
160
160
|
- context-compression
|
|
161
161
|
prometheus:
|
|
162
162
|
role: Infrastructure specialist
|
|
163
|
-
model_tier: code
|
|
164
163
|
reasoning_effort: medium
|
|
165
164
|
user_invocable: true
|
|
166
165
|
can_delegate: false
|
|
@@ -178,7 +177,6 @@ agents:
|
|
|
178
177
|
- incremental-implementation
|
|
179
178
|
hephaestus:
|
|
180
179
|
role: AI pipelines
|
|
181
|
-
model_tier: code
|
|
182
180
|
reasoning_effort: medium
|
|
183
181
|
user_invocable: true
|
|
184
182
|
can_delegate: false
|
|
@@ -190,12 +188,12 @@ agents:
|
|
|
190
188
|
- embedding_strategy
|
|
191
189
|
- ai_workflow_composition
|
|
192
190
|
- memory_search
|
|
191
|
+
- pantheon_code_mode
|
|
193
192
|
skills:
|
|
194
193
|
- tdd-with-agents
|
|
195
194
|
- auto-continue
|
|
196
195
|
nyx:
|
|
197
196
|
role: Observability
|
|
198
|
-
model_tier: free
|
|
199
197
|
reasoning_effort: low
|
|
200
198
|
user_invocable: true
|
|
201
199
|
can_delegate: false
|
|
@@ -207,12 +205,12 @@ agents:
|
|
|
207
205
|
- alerting
|
|
208
206
|
- monitoring_dashboards
|
|
209
207
|
- pantheon_resources_routing
|
|
208
|
+
- pantheon_code_mode
|
|
210
209
|
skills:
|
|
211
210
|
- security-hardening
|
|
212
211
|
- auto-continue
|
|
213
212
|
gaia:
|
|
214
213
|
role: Remote sensing domain specialist
|
|
215
|
-
model_tier: free
|
|
216
214
|
reasoning_effort: low
|
|
217
215
|
user_invocable: false
|
|
218
216
|
can_delegate: false
|
|
@@ -226,7 +224,6 @@ agents:
|
|
|
226
224
|
- auto-continue
|
|
227
225
|
iris:
|
|
228
226
|
role: GitHub operations
|
|
229
|
-
model_tier: free
|
|
230
227
|
reasoning_effort: low
|
|
231
228
|
user_invocable: true
|
|
232
229
|
can_delegate: false
|
|
@@ -238,17 +235,14 @@ agents:
|
|
|
238
235
|
- release_management
|
|
239
236
|
- changelog_generation
|
|
240
237
|
- pantheon_resources
|
|
241
|
-
subagent_can_delegate_to:
|
|
242
|
-
- mnemosyne
|
|
243
238
|
skills:
|
|
244
239
|
- git-workflow-and-versioning
|
|
245
240
|
- artifact-management
|
|
246
241
|
mnemosyne:
|
|
247
242
|
role: Memory bank
|
|
248
|
-
model_tier: free
|
|
249
243
|
reasoning_effort: low
|
|
250
244
|
user_invocable: true
|
|
251
|
-
can_delegate:
|
|
245
|
+
can_delegate: false
|
|
252
246
|
can_receive_delegation: true
|
|
253
247
|
capabilities:
|
|
254
248
|
- memory_bank_management
|
|
@@ -260,6 +254,7 @@ agents:
|
|
|
260
254
|
- memory_store
|
|
261
255
|
- memory_recall
|
|
262
256
|
- pantheon_resources_memory_bank
|
|
257
|
+
- pantheon_code_mode
|
|
263
258
|
subagent_can_delegate_to: []
|
|
264
259
|
skills:
|
|
265
260
|
- artifact-management
|
|
@@ -268,7 +263,6 @@ agents:
|
|
|
268
263
|
- session-goal
|
|
269
264
|
talos:
|
|
270
265
|
role: Hotfix agent
|
|
271
|
-
model_tier: free
|
|
272
266
|
reasoning_effort: low
|
|
273
267
|
user_invocable: true
|
|
274
268
|
can_delegate: false
|
|
@@ -379,19 +373,6 @@ platforms:
|
|
|
379
373
|
- bash_execution
|
|
380
374
|
- web_fetch
|
|
381
375
|
- web_search
|
|
382
|
-
fallback_chains:
|
|
383
|
-
premium_agents:
|
|
384
|
-
primary: deepseek/deepseek-v4-pro
|
|
385
|
-
secondary: mimo/v2.5
|
|
386
|
-
emergency: deepseek/deepseek-v4-pro
|
|
387
|
-
code_agents:
|
|
388
|
-
primary: deepseek/deepseek-v4-flash
|
|
389
|
-
secondary: mimo/v2.5
|
|
390
|
-
emergency: deepseek/deepseek-v4-flash
|
|
391
|
-
free_agents:
|
|
392
|
-
primary: deepseek/deepseek-v4-flash
|
|
393
|
-
secondary: mimo/v2.5
|
|
394
|
-
emergency: deepseek/deepseek-v4-flash
|
|
395
376
|
background_job_board:
|
|
396
377
|
max_concurrent_per_agent: 3
|
|
397
378
|
signal_dir: .pantheon/deepwork/board-signals/
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: "Audit: heuristic scan (zero LLM) + Themis review. Usage: /pantheon-audit [--light|--full|--plan]"
|
|
3
|
-
agent: "zeus"
|
|
4
|
-
---
|
|
5
|
-
# /pantheon-audit — Quality & Security Audit
|
|
6
|
-
|
|
7
|
-
**What:** Layer 1 heuristic scan (zero tokens, <2s). If BLOCKING, returns score. If APPROVED, Themis deep review.
|
|
8
|
-
|
|
9
|
-
**Usage:**
|
|
10
|
-
- `/pantheon-audit` — Full audit (Layer 1 → 2 → 3)
|
|
11
|
-
- `/pantheon-audit --light` — Layer 1 only (quick scan)
|
|
12
|
-
- `/pantheon-audit --full` — Force full review
|
|
13
|
-
- `/pantheon-audit --plan` — Verification planning only
|
|
14
|
-
|
|
15
|
-
## Layers
|
|
16
|
-
|
|
17
|
-
### Layer 1 — Heuristic Scan
|
|
18
|
-
`python3 scripts/themis_heuristic_scan.py [--path=<dir>]`
|
|
19
|
-
Zero tokens, <2s. Checks: ruff, biome, anti-pattern slop, anti-overengineering (YAGNI), hash-anchored edits. Returns score 0-100 + APPROVED/BLOCKING.
|
|
20
|
-
|
|
21
|
-
### Layer 2 — Themis Deep Review
|
|
22
|
-
~500 tokens. Confidence scoring, regression prediction, OWASP Top 10.
|
|
23
|
-
|
|
24
|
-
### Layer 3 — Verification Planning
|
|
25
|
-
For N>5 file changes. Sugere plano de verificação antes de implementar.
|