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.
@@ -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
- /* ─── Sessions List (loaded on expand) ───────────────────── */
185
+ /* ─── Session Row (single session with live status indicator) ─ */
169
186
 
170
- async function fetchRecentSessions(api: TuiPluginApi, sessionID: string): Promise<any[] | null> {
171
- try {
172
- const proc = (api as any).client?.process
173
- if (typeof proc?.exec !== 'function') return null
174
- const result = await proc.exec({
175
- command: 'opencode',
176
- args: ['session', 'list', '--format', 'json', '--max-count', '20'],
177
- timeoutMs: 5000,
178
- })
179
- const stdout = (result.stdout ?? result.output ?? '') as string
180
- const sessions = JSON.parse(stdout)
181
- if (!Array.isArray(sessions)) return null
182
- return sessions
183
- .filter((s: any) => s.id !== sessionID)
184
- .sort((a: any, b: any) => (b.updated ?? 0) - (a.updated ?? 0))
185
- .slice(0, 8)
186
- } catch { return null }
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
- try { return props.api.state.session.count() } catch { return 0 }
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
- const memoryCount = createMemo(() => {
208
- const mem = (props.api.state as any).memory
209
- return safeNum(mem?.entries) || safeNum(mem?.count)
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() && sessions()}>
255
- {(s) => (
256
- <Show when={s().length > 0} fallback={<box marginLeft={1}><text fg={theme().textMuted}>No recent sessions</text></box>}>
257
- <box marginLeft={1} flexDirection="column">
258
- <For each={s()}>
259
- {(ses: any) => (
260
- <text fg={theme().textMuted}>
261
- {`${ses.id.slice(0, 8)}... ${ses.title?.slice(0, 28) ?? '(untitled)'}`}
262
- </text>
263
- )}
264
- </For>
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
- {`Memory: ${memoryCount() > 0 ? `${fmtInt(memoryCount())} entries` : '0 entries'}`}
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
- /* ─── Sessions List (loaded on expand) ───────────────────── */
185
+ /* ─── Session Row (single session with live status indicator) ─ */
169
186
 
170
- async function fetchRecentSessions(api: TuiPluginApi, sessionID: string): Promise<any[] | null> {
171
- try {
172
- const proc = (api as any).client?.process
173
- if (typeof proc?.exec !== 'function') return null
174
- const result = await proc.exec({
175
- command: 'opencode',
176
- args: ['session', 'list', '--format', 'json', '--max-count', '20'],
177
- timeoutMs: 5000,
178
- })
179
- const stdout = (result.stdout ?? result.output ?? '') as string
180
- const sessions = JSON.parse(stdout)
181
- if (!Array.isArray(sessions)) return null
182
- return sessions
183
- .filter((s: any) => s.id !== sessionID)
184
- .sort((a: any, b: any) => (b.updated ?? 0) - (a.updated ?? 0))
185
- .slice(0, 8)
186
- } catch { return null }
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
- try { return props.api.state.session.count() } catch { return 0 }
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
- const memoryCount = createMemo(() => {
208
- const mem = (props.api.state as any).memory
209
- return safeNum(mem?.entries) || safeNum(mem?.count)
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() && sessions()}>
255
- {(s) => (
256
- <Show when={s().length > 0} fallback={<box marginLeft={1}><text fg={theme().textMuted}>No recent sessions</text></box>}>
257
- <box marginLeft={1} flexDirection="column">
258
- <For each={s()}>
259
- {(ses: any) => (
260
- <text fg={theme().textMuted}>
261
- {`${ses.id.slice(0, 8)}... ${ses.title?.slice(0, 28) ?? '(untitled)'}`}
262
- </text>
263
- )}
264
- </For>
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
- {`Memory: ${memoryCount() > 0 ? `${fmtInt(memoryCount())} entries` : '0 entries'}`}
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: true
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.