feat(runtime): track user-level Pi configuration with the provider key templated

Mirrors ~/.pi/agent/ as the authoritative copy. models.json becomes
models.json.template with ${ZENMUX_API_KEY} substituted; the real value stays
in secrets/zenmux.env, which is untracked and enforced by the pre-commit guard.

Excluded with rationale: auth.json, trust.json, models-store.json, sessions/,
herdr-agent-state.ts (installer-managed, overwritten on reinstall) and the
third-party skills under ~/.agents/skills.

Recorded during migration: the configured fallback model zenmux/x-ai/grok-4.6 is
absent from models.json, so pi falls back to an undeclared custom model id with
no context window, cost table or thinkingLevelMap. Fixing that is a behaviour
change and is deferred rather than folded into this zero-change migration.
This commit is contained in:
Kai
2026-08-26 22:52:48 -07:00
parent 734e63aa28
commit 98635022d0
9 changed files with 505 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
import type {
ExtensionAPI,
ProjectTrustEventResult,
} from "@earendil-works/pi-coding-agent";
import { realpathSync } from "node:fs";
import { resolve } from "node:path";
const MEMO_WORKSPACE = "/home/claw/pi-workspaces/memo-inbox";
export default function piMemoTrust(pi: ExtensionAPI) {
pi.on("project_trust", async (event): Promise<ProjectTrustEventResult> => {
try {
if (realpathSync(resolve(event.cwd)) === realpathSync(MEMO_WORKSPACE)) {
return { trusted: "yes", remember: true };
}
} catch {
// Fall through to Pi's normal trust decision for every other path.
}
return { trusted: "undecided" };
});
}
+47
View File
@@ -0,0 +1,47 @@
{
"providers": {
"zenmux": {
"name": "ZenMux",
"baseUrl": "https://zenmux.ai/api/v1",
"api": "openai-responses",
"apiKey": "${ZENMUX_API_KEY}",
"authHeader": true,
"models": [
{
"id": "openai/gpt-5.6-luna",
"name": "GPT-5.6 Luna (ZenMux)",
"reasoning": true,
"thinkingLevelMap": {
"off": "none",
"minimal": "low",
"low": "low",
"medium": "medium",
"high": "high",
"xhigh": "xhigh",
"max": "xhigh"
},
"input": [
"text",
"image"
],
"cost": {
"input": 0.2,
"output": 1.2,
"cacheRead": 0.02,
"cacheWrite": 0.25,
"tiers": [
{
"inputTokensAbove": 272000,
"input": 0.4,
"output": 1.8,
"cacheRead": 0.04,
"cacheWrite": 0.5
}
]
},
"contextWindow": 1050000
}
]
}
}
}
+12
View File
@@ -0,0 +1,12 @@
---
description: 创建 Google Calendar 日历事项(Pi Memo
argument-hint: "<日期、时间和事项>"
---
这是 Pi Memo Inbox 的 `/calendar` 快捷入口,等价于“日历事项”。
仅在当前会话加载了 `pi-memo-inbox` skill 时执行;否则说明该命令只适用于 Pi Memo Topic,不要采取任何操作。
请把下面的用户内容作为 `calendar`,并严格遵循 `pi-memo-inbox` skill 的时间确认和 Google Calendar 创建规则:
${ARGUMENTS}
+12
View File
@@ -0,0 +1,12 @@
---
description: 记录到今天的 JournalPi Memo
argument-hint: "<内容>"
---
这是 Pi Memo Inbox 的 `/memo` 快捷入口,等价于“记一下”。
仅在当前会话加载了 `pi-memo-inbox` skill 时执行;否则说明该命令只适用于 Pi Memo Topic,不要采取任何操作。
请把下面的用户内容按 `record``idea` 分类,并严格遵循 `pi-memo-inbox` skill 的上下文补全、确认、写入和同步规则:
${ARGUMENTS}
+12
View File
@@ -0,0 +1,12 @@
---
description: 添加到今天的 Journal 待办(Pi Memo
argument-hint: "<待办内容>"
---
这是 Pi Memo Inbox 的 `/todo` 快捷入口,等价于“待办事项”。
仅在当前会话加载了 `pi-memo-inbox` skill 时执行;否则说明该命令只适用于 Pi Memo Topic,不要采取任何操作。
请把下面的用户内容作为 `todo`,并严格遵循 `pi-memo-inbox` skill 的上下文补全、确认、写入和同步规则:
${ARGUMENTS}
+7
View File
@@ -0,0 +1,7 @@
{
"defaultProvider": "zenmux",
"defaultModel": "openai/gpt-5.6-luna",
"defaultThinkingLevel": "high",
"lastChangelogVersion": "0.84.2",
"theme": "dark"
}