pantheon-opencode 1.1.1-beta.9 → 1.1.1
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/scripts/install-mcp.mjs +54 -18
- package/scripts/mcp_persistence_server.py +3 -3
- 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/mcp/install-mcp.mjs +54 -18
- package/src/mcp/mcp_persistence_server.py +3 -3
- package/src/plugins/tui/dist/tui.d.ts.map +1 -1
- package/src/plugins/tui/dist/tui.js +208 -112
- package/src/plugins/tui/dist/tui.tsx +162 -45
- package/src/plugins/tui/src/index.tsx +162 -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
package/opencode.json
CHANGED
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
"$schema": "https://opencode.ai/config.json",
|
|
3
3
|
"default_agent": "zeus",
|
|
4
4
|
"subagent_depth": 2,
|
|
5
|
-
"
|
|
5
|
+
"model": "opencode-go/deepseek-v4-flash",
|
|
6
|
+
"small_model": "opencode-go/deepseek-v4-flash",
|
|
6
7
|
"permission": {
|
|
7
|
-
"skill": {
|
|
8
|
+
"skill": {
|
|
9
|
+
"*": "allow"
|
|
10
|
+
},
|
|
8
11
|
"websearch": "deny",
|
|
9
12
|
"bash": {
|
|
10
13
|
"git *": "allow",
|
|
@@ -29,5 +32,49 @@
|
|
|
29
32
|
"x-bf-vk": "sk-bf-a5a9b5b0-45fc-414d-8e4d-f9beb8c49a6d"
|
|
30
33
|
}
|
|
31
34
|
}
|
|
35
|
+
},
|
|
36
|
+
"agent": {
|
|
37
|
+
"athena": {
|
|
38
|
+
"model": "opencode-go/kimi-k3"
|
|
39
|
+
},
|
|
40
|
+
"themis": {
|
|
41
|
+
"model": "opencode-go/deepseek-v4-pro"
|
|
42
|
+
},
|
|
43
|
+
"zeus": {
|
|
44
|
+
"model": "opencode-go/deepseek-v4-pro"
|
|
45
|
+
},
|
|
46
|
+
"hephaestus": {
|
|
47
|
+
"model": "opencode-go/deepseek-v4-pro"
|
|
48
|
+
},
|
|
49
|
+
"hermes": {
|
|
50
|
+
"model": "opencode-go/deepseek-v4-flash"
|
|
51
|
+
},
|
|
52
|
+
"aphrodite": {
|
|
53
|
+
"model": "opencode-go/deepseek-v4-flash"
|
|
54
|
+
},
|
|
55
|
+
"demeter": {
|
|
56
|
+
"model": "opencode-go/deepseek-v4-flash"
|
|
57
|
+
},
|
|
58
|
+
"prometheus": {
|
|
59
|
+
"model": "opencode-go/deepseek-v4-flash"
|
|
60
|
+
},
|
|
61
|
+
"apollo": {
|
|
62
|
+
"model": "opencode-go/deepseek-v4-flash"
|
|
63
|
+
},
|
|
64
|
+
"nyx": {
|
|
65
|
+
"model": "opencode-go/deepseek-v4-flash"
|
|
66
|
+
},
|
|
67
|
+
"gaia": {
|
|
68
|
+
"model": "opencode-go/deepseek-v4-flash"
|
|
69
|
+
},
|
|
70
|
+
"iris": {
|
|
71
|
+
"model": "opencode-go/deepseek-v4-flash"
|
|
72
|
+
},
|
|
73
|
+
"mnemosyne": {
|
|
74
|
+
"model": "opencode-go/deepseek-v4-flash"
|
|
75
|
+
},
|
|
76
|
+
"talos": {
|
|
77
|
+
"model": "opencode-go/deepseek-v4-flash"
|
|
78
|
+
}
|
|
32
79
|
}
|
|
33
80
|
}
|
package/package.json
CHANGED
package/pantheon.schema.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"$id": "https://pantheon.orchestrator/schema.json",
|
|
4
4
|
"title": "Pantheon Configuration Schema",
|
|
5
|
-
"description": "Configuration schema
|
|
5
|
+
"description": "Pantheon Orchestration Configuration Schema — NOT the OpenCode config schema. This schema defines Pantheon-specific configuration (routing, presets, fallback chains). For OpenCode config, see https://opencode.ai/config.json",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"properties": {
|
|
8
8
|
"version": {
|
package/scripts/install-mcp.mjs
CHANGED
|
@@ -171,11 +171,11 @@ const MCPS = {
|
|
|
171
171
|
name: 'Pantheon Resources',
|
|
172
172
|
description: 'Pantheon framework resources — agents, skills, routing, deepwork, memory bank',
|
|
173
173
|
platforms: {
|
|
174
|
-
opencode: { type: 'local', command: '
|
|
175
|
-
vscode: { type: 'stdio', command: '
|
|
176
|
-
cursor: { type: 'local', command: '
|
|
177
|
-
claude: { type: 'local', command: '
|
|
178
|
-
windsurf: { type: 'local', command: '
|
|
174
|
+
opencode: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/mcp_resources_server.py')] },
|
|
175
|
+
vscode: { type: 'stdio', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/mcp_resources_server.py')] },
|
|
176
|
+
cursor: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/mcp_resources_server.py')] },
|
|
177
|
+
claude: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/mcp_resources_server.py')] },
|
|
178
|
+
windsurf: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/mcp_resources_server.py')] },
|
|
179
179
|
},
|
|
180
180
|
env: [],
|
|
181
181
|
validate: async () => {
|
|
@@ -191,11 +191,11 @@ const MCPS = {
|
|
|
191
191
|
name: 'Pantheon Code Mode',
|
|
192
192
|
description: 'Execute orchestration scripts from .pantheon/code-mode/ directory',
|
|
193
193
|
platforms: {
|
|
194
|
-
opencode: { type: 'local', command: '
|
|
195
|
-
vscode: { type: 'stdio', command: '
|
|
196
|
-
cursor: { type: 'local', command: '
|
|
197
|
-
claude: { type: 'local', command: '
|
|
198
|
-
windsurf: { type: 'local', command: '
|
|
194
|
+
opencode: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/code_mode_server.py')] },
|
|
195
|
+
vscode: { type: 'stdio', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/code_mode_server.py')] },
|
|
196
|
+
cursor: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/code_mode_server.py')] },
|
|
197
|
+
claude: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/code_mode_server.py')] },
|
|
198
|
+
windsurf: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/code_mode_server.py')] },
|
|
199
199
|
},
|
|
200
200
|
env: [],
|
|
201
201
|
validate: async () => {
|
|
@@ -214,23 +214,23 @@ const MCPS = {
|
|
|
214
214
|
platforms: {
|
|
215
215
|
opencode: {
|
|
216
216
|
type: 'local',
|
|
217
|
-
command: '.venv/bin/python3',
|
|
218
|
-
args: ['scripts/memory_mcp_server.py'],
|
|
217
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
218
|
+
args: [join(ROOT, 'scripts/memory_mcp_server.py')],
|
|
219
219
|
},
|
|
220
220
|
claude: {
|
|
221
221
|
type: 'local',
|
|
222
|
-
command: '.venv/bin/python3',
|
|
223
|
-
args: ['scripts/memory_mcp_server.py'],
|
|
222
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
223
|
+
args: [join(ROOT, 'scripts/memory_mcp_server.py')],
|
|
224
224
|
},
|
|
225
225
|
cursor: {
|
|
226
226
|
type: 'local',
|
|
227
|
-
command: '.venv/bin/python3',
|
|
228
|
-
args: ['scripts/memory_mcp_server.py'],
|
|
227
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
228
|
+
args: [join(ROOT, 'scripts/memory_mcp_server.py')],
|
|
229
229
|
},
|
|
230
230
|
windsurf: {
|
|
231
231
|
type: 'local',
|
|
232
|
-
command: '.venv/bin/python3',
|
|
233
|
-
args: ['scripts/memory_mcp_server.py'],
|
|
232
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
233
|
+
args: [join(ROOT, 'scripts/memory_mcp_server.py')],
|
|
234
234
|
},
|
|
235
235
|
},
|
|
236
236
|
env: [],
|
|
@@ -242,6 +242,42 @@ const MCPS = {
|
|
|
242
242
|
return { ok: false, message: 'scripts/memory_mcp_server.py not found' }
|
|
243
243
|
},
|
|
244
244
|
},
|
|
245
|
+
'pantheon-persistence': {
|
|
246
|
+
tier: 1,
|
|
247
|
+
name: 'Pantheon Persistence',
|
|
248
|
+
description:
|
|
249
|
+
'Pantheon Persistence MCP Server — key-value store with FTS5 full-text search, TTL-based expiration, and namespace isolation',
|
|
250
|
+
platforms: {
|
|
251
|
+
opencode: {
|
|
252
|
+
type: 'local',
|
|
253
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
254
|
+
args: [join(ROOT, 'scripts/mcp_persistence_server.py')],
|
|
255
|
+
},
|
|
256
|
+
claude: {
|
|
257
|
+
type: 'local',
|
|
258
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
259
|
+
args: [join(ROOT, 'scripts/mcp_persistence_server.py')],
|
|
260
|
+
},
|
|
261
|
+
cursor: {
|
|
262
|
+
type: 'local',
|
|
263
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
264
|
+
args: [join(ROOT, 'scripts/mcp_persistence_server.py')],
|
|
265
|
+
},
|
|
266
|
+
windsurf: {
|
|
267
|
+
type: 'local',
|
|
268
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
269
|
+
args: [join(ROOT, 'scripts/mcp_persistence_server.py')],
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
env: [],
|
|
273
|
+
validate: async () => {
|
|
274
|
+
const scriptPath = join(ROOT, 'scripts', 'mcp_persistence_server.py')
|
|
275
|
+
if (existsSync(scriptPath)) {
|
|
276
|
+
return { ok: true, message: 'server script present' }
|
|
277
|
+
}
|
|
278
|
+
return { ok: false, message: 'scripts/mcp_persistence_server.py not found' }
|
|
279
|
+
},
|
|
280
|
+
},
|
|
245
281
|
docker: {
|
|
246
282
|
tier: 2,
|
|
247
283
|
name: 'Docker MCP',
|
|
@@ -15,7 +15,7 @@ import argparse
|
|
|
15
15
|
import re
|
|
16
16
|
import sqlite3
|
|
17
17
|
import sys
|
|
18
|
-
from datetime import
|
|
18
|
+
from datetime import datetime, timedelta, timezone
|
|
19
19
|
from pathlib import Path
|
|
20
20
|
|
|
21
21
|
from _pantheon_paths import pantheon_home, pantheon_project
|
|
@@ -148,7 +148,7 @@ def _write_deletelog(db_path: Path, count: int, keys: list[str]) -> None:
|
|
|
148
148
|
log_path = db_path.with_name(db_path.name + ".deletelog")
|
|
149
149
|
_rotate_deletelog(log_path)
|
|
150
150
|
|
|
151
|
-
timestamp = datetime.now(
|
|
151
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
152
152
|
keys_str = ",".join(keys)
|
|
153
153
|
with open(log_path, "a", encoding="utf-8") as f:
|
|
154
154
|
f.write(f"[{timestamp}] PURGED={count} KEYS=[{keys_str}]\n")
|
|
@@ -208,7 +208,7 @@ async def kv_store(
|
|
|
208
208
|
conn = _db(scope)
|
|
209
209
|
expires_at: str | None = None
|
|
210
210
|
if ttl is not None:
|
|
211
|
-
expires_at = (datetime.now(
|
|
211
|
+
expires_at = (datetime.now(timezone.utc) + timedelta(seconds=ttl)).isoformat()
|
|
212
212
|
|
|
213
213
|
conn.execute(
|
|
214
214
|
"INSERT INTO kv_store (namespace, key, value, expires_at, "
|
package/src/agents/mnemosyne.md
CHANGED
|
@@ -34,9 +34,17 @@ permission:
|
|
|
34
34
|
bash: deny
|
|
35
35
|
read: allow
|
|
36
36
|
grep: allow
|
|
37
|
-
edit:
|
|
37
|
+
edit: deny
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
+
## ⚠️ SCOPE BOUNDARY
|
|
41
|
+
|
|
42
|
+
**Memory Bank ONLY — NEVER write files outside `.pantheon/memory-bank/` or `.pantheon/deepwork/`.**
|
|
43
|
+
Your role is documentation, ADRs, artifacts, and memory management.
|
|
44
|
+
|
|
45
|
+
NEVER modify source code files under `src/`, `backend/`, `frontend/`, `scripts/`, or any other implementation directory.
|
|
46
|
+
If asked to edit code, refuse and redirect to the appropriate implementation agent (@hermes, @aphrodite, @demeter, etc.).
|
|
47
|
+
|
|
40
48
|
## Core Capabilities
|
|
41
49
|
|
|
42
50
|
### 1. Memory Bank Management
|
package/src/agents/nyx.md
CHANGED
|
@@ -8,7 +8,7 @@ permission:
|
|
|
8
8
|
grep: allow
|
|
9
9
|
bash: allow
|
|
10
10
|
webfetch: allow
|
|
11
|
-
edit:
|
|
11
|
+
edit: deny
|
|
12
12
|
temperature: 0.1
|
|
13
13
|
steps: 25
|
|
14
14
|
skills:
|
|
@@ -20,6 +20,12 @@ mcp_tools:
|
|
|
20
20
|
pantheon-code-mode: [execute_code_script]
|
|
21
21
|
---
|
|
22
22
|
|
|
23
|
+
## ⚠️ ABSOLUTE CONSTRAINT
|
|
24
|
+
|
|
25
|
+
**ANALYSIS ONLY — NEVER implement, never edit files, never write code.**
|
|
26
|
+
Your role is to observe, trace, and report. If you identify a configuration change needed, report the finding — do not implement it yourself.
|
|
27
|
+
Delegate all implementation to @hermes, @prometheus, or @demeter.
|
|
28
|
+
|
|
23
29
|
## Core Capabilities
|
|
24
30
|
|
|
25
31
|
### 1. OpenTelemetry Integration
|
package/src/agents/themis.md
CHANGED
|
@@ -7,7 +7,7 @@ permission:
|
|
|
7
7
|
read: allow
|
|
8
8
|
grep: allow
|
|
9
9
|
bash: allow
|
|
10
|
-
edit:
|
|
10
|
+
edit: deny
|
|
11
11
|
temperature: 0.1
|
|
12
12
|
steps: 30
|
|
13
13
|
skills:
|
|
@@ -20,8 +20,14 @@ mcp_tools:
|
|
|
20
20
|
pantheon-memory: [memory_search]
|
|
21
21
|
pantheon-code-mode: [execute_code_script]
|
|
22
22
|
---
|
|
23
|
-
## Purpose
|
|
24
23
|
|
|
24
|
+
## ⚠️ ABSOLUTE CONSTRAINT
|
|
25
|
+
|
|
26
|
+
**REVIEWER ONLY — NEVER implement, never edit files, never write code.**
|
|
27
|
+
Your role is to audit, review, and block. If you find an issue, report it — do not fix it yourself.
|
|
28
|
+
Delegate all implementation to @hermes, @aphrodite, @demeter, or @prometheus.
|
|
29
|
+
|
|
30
|
+
## Purpose
|
|
25
31
|
Quality & security gate for all Pantheon agents. Three-layer review with IntentGate to ensure code matches requirements before deep review.
|
|
26
32
|
|
|
27
33
|
## IntentGate
|
package/src/agents/zeus.md
CHANGED
|
@@ -50,6 +50,16 @@ skills:
|
|
|
50
50
|
|
|
51
51
|
**Auto-continue** só com pedido explícito do usuário.
|
|
52
52
|
|
|
53
|
+
## ⚠️ Bash Scoping
|
|
54
|
+
|
|
55
|
+
**`bash: allow` é para leitura e diagnóstico APENAS.**
|
|
56
|
+
NUNCA use bash para:
|
|
57
|
+
- Editar arquivos (use sed/echo/redirect → delegue para @hermes)
|
|
58
|
+
- Instalar dependências (delegue para @prometheus)
|
|
59
|
+
- Executar comandos que modificam o sistema
|
|
60
|
+
|
|
61
|
+
Comandos permitidos: `ls`, `git status`, `git log`, `ps`, `python3 -c`, `cat` (leitura), `npm test` (para verificar).
|
|
62
|
+
|
|
53
63
|
---
|
|
54
64
|
|
|
55
65
|
## Delegation Cache (Otimizacao de Tokens)
|
package/src/mcp/install-mcp.mjs
CHANGED
|
@@ -171,11 +171,11 @@ const MCPS = {
|
|
|
171
171
|
name: 'Pantheon Resources',
|
|
172
172
|
description: 'Pantheon framework resources — agents, skills, routing, deepwork, memory bank',
|
|
173
173
|
platforms: {
|
|
174
|
-
opencode: { type: 'local', command: '
|
|
175
|
-
vscode: { type: 'stdio', command: '
|
|
176
|
-
cursor: { type: 'local', command: '
|
|
177
|
-
claude: { type: 'local', command: '
|
|
178
|
-
windsurf: { type: 'local', command: '
|
|
174
|
+
opencode: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/mcp_resources_server.py')] },
|
|
175
|
+
vscode: { type: 'stdio', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/mcp_resources_server.py')] },
|
|
176
|
+
cursor: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/mcp_resources_server.py')] },
|
|
177
|
+
claude: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/mcp_resources_server.py')] },
|
|
178
|
+
windsurf: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/mcp_resources_server.py')] },
|
|
179
179
|
},
|
|
180
180
|
env: [],
|
|
181
181
|
validate: async () => {
|
|
@@ -191,11 +191,11 @@ const MCPS = {
|
|
|
191
191
|
name: 'Pantheon Code Mode',
|
|
192
192
|
description: 'Execute orchestration scripts from .pantheon/code-mode/ directory',
|
|
193
193
|
platforms: {
|
|
194
|
-
opencode: { type: 'local', command: '
|
|
195
|
-
vscode: { type: 'stdio', command: '
|
|
196
|
-
cursor: { type: 'local', command: '
|
|
197
|
-
claude: { type: 'local', command: '
|
|
198
|
-
windsurf: { type: 'local', command: '
|
|
194
|
+
opencode: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/code_mode_server.py')] },
|
|
195
|
+
vscode: { type: 'stdio', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/code_mode_server.py')] },
|
|
196
|
+
cursor: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/code_mode_server.py')] },
|
|
197
|
+
claude: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/code_mode_server.py')] },
|
|
198
|
+
windsurf: { type: 'local', command: join(ROOT, '.venv/bin/python3'), args: [join(ROOT, 'scripts/code_mode_server.py')] },
|
|
199
199
|
},
|
|
200
200
|
env: [],
|
|
201
201
|
validate: async () => {
|
|
@@ -214,23 +214,23 @@ const MCPS = {
|
|
|
214
214
|
platforms: {
|
|
215
215
|
opencode: {
|
|
216
216
|
type: 'local',
|
|
217
|
-
command: '.venv/bin/python3',
|
|
218
|
-
args: ['scripts/memory_mcp_server.py'],
|
|
217
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
218
|
+
args: [join(ROOT, 'scripts/memory_mcp_server.py')],
|
|
219
219
|
},
|
|
220
220
|
claude: {
|
|
221
221
|
type: 'local',
|
|
222
|
-
command: '.venv/bin/python3',
|
|
223
|
-
args: ['scripts/memory_mcp_server.py'],
|
|
222
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
223
|
+
args: [join(ROOT, 'scripts/memory_mcp_server.py')],
|
|
224
224
|
},
|
|
225
225
|
cursor: {
|
|
226
226
|
type: 'local',
|
|
227
|
-
command: '.venv/bin/python3',
|
|
228
|
-
args: ['scripts/memory_mcp_server.py'],
|
|
227
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
228
|
+
args: [join(ROOT, 'scripts/memory_mcp_server.py')],
|
|
229
229
|
},
|
|
230
230
|
windsurf: {
|
|
231
231
|
type: 'local',
|
|
232
|
-
command: '.venv/bin/python3',
|
|
233
|
-
args: ['scripts/memory_mcp_server.py'],
|
|
232
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
233
|
+
args: [join(ROOT, 'scripts/memory_mcp_server.py')],
|
|
234
234
|
},
|
|
235
235
|
},
|
|
236
236
|
env: [],
|
|
@@ -242,6 +242,42 @@ const MCPS = {
|
|
|
242
242
|
return { ok: false, message: 'scripts/memory_mcp_server.py not found' }
|
|
243
243
|
},
|
|
244
244
|
},
|
|
245
|
+
'pantheon-persistence': {
|
|
246
|
+
tier: 1,
|
|
247
|
+
name: 'Pantheon Persistence',
|
|
248
|
+
description:
|
|
249
|
+
'Pantheon Persistence MCP Server — key-value store with FTS5 full-text search, TTL-based expiration, and namespace isolation',
|
|
250
|
+
platforms: {
|
|
251
|
+
opencode: {
|
|
252
|
+
type: 'local',
|
|
253
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
254
|
+
args: [join(ROOT, 'scripts/mcp_persistence_server.py')],
|
|
255
|
+
},
|
|
256
|
+
claude: {
|
|
257
|
+
type: 'local',
|
|
258
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
259
|
+
args: [join(ROOT, 'scripts/mcp_persistence_server.py')],
|
|
260
|
+
},
|
|
261
|
+
cursor: {
|
|
262
|
+
type: 'local',
|
|
263
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
264
|
+
args: [join(ROOT, 'scripts/mcp_persistence_server.py')],
|
|
265
|
+
},
|
|
266
|
+
windsurf: {
|
|
267
|
+
type: 'local',
|
|
268
|
+
command: join(ROOT, '.venv/bin/python3'),
|
|
269
|
+
args: [join(ROOT, 'scripts/mcp_persistence_server.py')],
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
env: [],
|
|
273
|
+
validate: async () => {
|
|
274
|
+
const scriptPath = join(ROOT, 'scripts', 'mcp_persistence_server.py')
|
|
275
|
+
if (existsSync(scriptPath)) {
|
|
276
|
+
return { ok: true, message: 'server script present' }
|
|
277
|
+
}
|
|
278
|
+
return { ok: false, message: 'scripts/mcp_persistence_server.py not found' }
|
|
279
|
+
},
|
|
280
|
+
},
|
|
245
281
|
docker: {
|
|
246
282
|
tier: 2,
|
|
247
283
|
name: 'Docker MCP',
|
|
@@ -14,7 +14,7 @@ import argparse
|
|
|
14
14
|
import re
|
|
15
15
|
import sqlite3
|
|
16
16
|
import sys
|
|
17
|
-
from datetime import
|
|
17
|
+
from datetime import datetime, timedelta, timezone
|
|
18
18
|
from pathlib import Path
|
|
19
19
|
|
|
20
20
|
from _pantheon_paths import pantheon_home, pantheon_project
|
|
@@ -147,7 +147,7 @@ def _write_deletelog(db_path: Path, count: int, keys: list[str]) -> None:
|
|
|
147
147
|
log_path = db_path.with_name(db_path.name + ".deletelog")
|
|
148
148
|
_rotate_deletelog(log_path)
|
|
149
149
|
|
|
150
|
-
timestamp = datetime.now(
|
|
150
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
151
151
|
keys_str = ",".join(keys)
|
|
152
152
|
with open(log_path, "a", encoding="utf-8") as f:
|
|
153
153
|
f.write(f"[{timestamp}] PURGED={count} KEYS=[{keys_str}]\n")
|
|
@@ -207,7 +207,7 @@ async def kv_store(
|
|
|
207
207
|
conn = _db(scope)
|
|
208
208
|
expires_at: str | None = None
|
|
209
209
|
if ttl is not None:
|
|
210
|
-
expires_at = (datetime.now(
|
|
210
|
+
expires_at = (datetime.now(timezone.utc) + timedelta(seconds=ttl)).isoformat()
|
|
211
211
|
|
|
212
212
|
conn.execute(
|
|
213
213
|
"INSERT INTO kv_store (namespace, key, value, expires_at, "
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.d.ts","names":[],"sources":["../src/index.tsx"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"tui.d.ts","names":[],"sources":["../src/index.tsx"],"mappings":";;cAsbM,QAAQ;EAAoB"}
|