[Sync] Lua Hyprland chain, licence cleanup
This commit is contained in:
1 parent
93b4f695ce
commit
47166d877f
183 files changed
+5618
-5839
No files matched your search
@@ -15,6 +15,7 @@ service caches config).
|
||||
| `agents/*.md` | Four subagents with real prompts and scoped permissions: `code-reviewer`, `test-runner` (hidden), `doc-writer` (edits docs only), `security-auditor` (hidden). |
|
||||
| `commands/*.md` | `/commit` (Conventional Commits message, never commits) and `/review` (read-only diff review), both on the `plan` agent. |
|
||||
| `plugins/verbose/` | 2.x TUI plugin: `<leader>v`, `/verbose`, or the palette entry toggles the *verbose view* — thinking blocks expanded and tool calls ungrouped — reading the live state from the built-in toggles so a mixed state converges. `server.ts` is a no-op half required by the loader. |
|
||||
| `plugins/agent-state.ts` | Server-side plugin: mirrors the session state (`message.updated` user → busy, `permission.asked` → input, `session.idle` → done, `session.error` → error) into the tmux pane opencode runs in via `~/.config/tmux/scripts/agent-state.sh`, for the status-bar agent badges. Skips child sessions; only right when the TUI in the pane spawned the server (not `serve`/`attach`); under `opencodes` (bwrap) the tmux socket dir must be bound in. |
|
||||
| `themes/catppuccin-mocha.json` | Catppuccin Mocha (dark) / Latte (light) theme following the pi theme's semantic mapping. Built-in `catppuccin` exists too; this one matches pi. |
|
||||
| `tui.json` | TUI settings in the v1 schema (2.x compat): theme, leader timeout, stacked diffs, block cursor, attention notifications, a few extra keybinds. |
|
||||
|
||||
|
||||
@@ -151,7 +151,7 @@
|
||||
"gemma-4-E4B-it-UD-Q8_K_XL": { "name": "Gemma 4 E4B · 64k · vision — fast generalist, long docs (~57 t/s, remote)", "attachment": true, "limit": { "context": 65536, "output": 16384 } },
|
||||
"GLM-4.7-Flash-UD-Q4_K_XL": { "reasoning": true, "interleaved": "reasoning_content", "name": "GLM-4.7 Flash · 24k — quality coder (~21 t/s, remote)", "limit": { "context": 24576, "output": 8192 } },
|
||||
"GLM-4.7-Flash-UD-Q3_K_XL": { "reasoning": true, "interleaved": "reasoning_content", "name": "GLM-4.7 Flash Q3 · 24k — fast coder (~28 t/s, remote)", "limit": { "context": 24576, "output": 8192 } },
|
||||
"Ornith-1.5-35B-A3B-IQ3_XXS": { "reasoning": true, "name": "Ornith 1.5 35B · 24k · vision — agentic coder, thinking (~32 t/s, remote)", "attachment": true, "limit": { "context": 24576, "output": 8192 } },
|
||||
"Ornith-1.5-35B-A3B-IQ3_XXS": { "reasoning": true, "name": "Ornith 1.5 35B · 32k · vision — agentic coder, thinking (~32 t/s, remote)", "attachment": true, "limit": { "context": 32768, "output": 8192 } },
|
||||
"gpt-oss-20b": { "reasoning": true, "name": "gpt-oss 20B · 64k — fast reasoning + tools (~38 t/s, remote)", "limit": { "context": 65536, "output": 8192 } },
|
||||
"gpt-oss-20b-low": { "reasoning": true, "name": "gpt-oss 20B low · 64k — snappy answers (~37 t/s, remote)", "limit": { "context": 65536, "output": 8192 } }
|
||||
}
|
||||
@@ -174,7 +174,7 @@
|
||||
"gemma-4-E4B-it-UD-Q8_K_XL": { "name": "Gemma 4 E4B · 64k · vision — fast generalist, long docs (~57 t/s)", "attachment": true, "limit": { "context": 65536, "output": 16384 } },
|
||||
"GLM-4.7-Flash-UD-Q4_K_XL": { "reasoning": true, "interleaved": "reasoning_content", "name": "GLM-4.7 Flash · 24k — quality coder (~21 t/s)", "limit": { "context": 24576, "output": 8192 } },
|
||||
"GLM-4.7-Flash-UD-Q3_K_XL": { "reasoning": true, "interleaved": "reasoning_content", "name": "GLM-4.7 Flash Q3 · 24k — fast coder (~28 t/s)", "limit": { "context": 24576, "output": 8192 } },
|
||||
"Ornith-1.5-35B-A3B-IQ3_XXS": { "reasoning": true, "name": "Ornith 1.5 35B · 24k · vision — agentic coder, thinking (~32 t/s)", "attachment": true, "limit": { "context": 24576, "output": 8192 } },
|
||||
"Ornith-1.5-35B-A3B-IQ3_XXS": { "reasoning": true, "name": "Ornith 1.5 35B · 32k · vision — agentic coder, thinking (~32 t/s)", "attachment": true, "limit": { "context": 32768, "output": 8192 } },
|
||||
"gpt-oss-20b": { "reasoning": true, "name": "gpt-oss 20B · 64k — fast reasoning + tools (~38 t/s)", "limit": { "context": 65536, "output": 8192 } },
|
||||
"gpt-oss-20b-low": { "reasoning": true, "name": "gpt-oss 20B low · 64k — snappy answers (~37 t/s)", "limit": { "context": 65536, "output": 8192 } }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
// opencode agent-state plugin: mirrors the session state into the tmux pane opencode runs in via
|
||||
// ~/.config/tmux/scripts/agent-state.sh (oc busy|done|input|error). No-op outside tmux.
|
||||
//
|
||||
// Runs in the SERVER process, so TMUX_PANE is only right when the TUI in the pane spawned the
|
||||
// server (plain `opencode`), not for `opencode serve` / `opencode attach`. Under the bwrap
|
||||
// `opencodes` wrapper the tmux socket dir must be bound in, or the script gives up quietly.
|
||||
// Child (subagent) sessions are skipped so a subagent finishing does not flag "done".
|
||||
import type { Plugin } from "@opencode-ai/plugin"
|
||||
|
||||
export const AgentState: Plugin = async ({ client, $ }) => {
|
||||
const script = `${process.env.HOME}/.config/tmux/scripts/agent-state.sh`
|
||||
const set = async (state: string) => {
|
||||
if (!process.env.TMUX_PANE) return
|
||||
try {
|
||||
await $`${script} oc ${state}`.quiet().nothrow()
|
||||
} catch {}
|
||||
}
|
||||
const childCache = new Map<string, boolean>()
|
||||
const isChild = async (sessionID?: string) => {
|
||||
if (!sessionID) return false
|
||||
if (!childCache.has(sessionID)) {
|
||||
try {
|
||||
const r = await client.session.get({ path: { id: sessionID } })
|
||||
childCache.set(sessionID, Boolean(r.data?.parentID))
|
||||
} catch {
|
||||
childCache.set(sessionID, false)
|
||||
}
|
||||
}
|
||||
return childCache.get(sessionID) ?? false
|
||||
}
|
||||
return {
|
||||
event: async ({ event }) => {
|
||||
const p = (event as { properties?: Record<string, any> }).properties ?? {}
|
||||
switch (event.type) {
|
||||
case "message.updated": // a new user message = a prompt went in
|
||||
if (p.info?.role === "user" && !(await isChild(p.info?.sessionID))) await set("busy")
|
||||
break
|
||||
case "permission.asked":
|
||||
if (!(await isChild(p.sessionID))) await set("input")
|
||||
break
|
||||
case "permission.replied":
|
||||
if (!(await isChild(p.sessionID))) await set("busy")
|
||||
break
|
||||
case "session.idle":
|
||||
if (!(await isChild(p.sessionID))) await set("done")
|
||||
break
|
||||
case "session.error":
|
||||
if (!(await isChild(p.sessionID))) await set("error")
|
||||
break
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user