echoes-vault-opencode 1.1.4 → 1.1.5
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/index.ts +0 -48
- package/package.json +1 -1
- package/tui.tsx +5 -37
package/index.ts
CHANGED
|
@@ -19,12 +19,6 @@ type VaultPaths = {
|
|
|
19
19
|
assets: string
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
type VaultStats = {
|
|
23
|
-
totalPages: number
|
|
24
|
-
totalDailyLogs: number
|
|
25
|
-
deprecatedPages: number
|
|
26
|
-
}
|
|
27
|
-
|
|
28
22
|
type EchoesState = {
|
|
29
23
|
version: number
|
|
30
24
|
pluginVersion: string
|
|
@@ -35,7 +29,6 @@ type EchoesState = {
|
|
|
35
29
|
lastStart: string | null
|
|
36
30
|
lastSave: string | null
|
|
37
31
|
}
|
|
38
|
-
stats: VaultStats
|
|
39
32
|
}
|
|
40
33
|
|
|
41
34
|
const STATE_FILENAME = ".opencode/echoes-state.json"
|
|
@@ -60,11 +53,6 @@ const defaultState = (): EchoesState => ({
|
|
|
60
53
|
lastStart: null,
|
|
61
54
|
lastSave: null,
|
|
62
55
|
},
|
|
63
|
-
stats: {
|
|
64
|
-
totalPages: 0,
|
|
65
|
-
totalDailyLogs: 0,
|
|
66
|
-
deprecatedPages: 0,
|
|
67
|
-
},
|
|
68
56
|
})
|
|
69
57
|
|
|
70
58
|
const readState = async (directory: string): Promise<EchoesState> => {
|
|
@@ -100,36 +88,6 @@ const ensureVaultDirs = async (paths: VaultPaths): Promise<void> => {
|
|
|
100
88
|
await fs.mkdir(paths.assets, { recursive: true })
|
|
101
89
|
}
|
|
102
90
|
|
|
103
|
-
const collectStats = async (vaultPaths: VaultPaths): Promise<VaultStats> => {
|
|
104
|
-
let totalPages = 0
|
|
105
|
-
let totalDailyLogs = 0
|
|
106
|
-
let deprecatedPages = 0
|
|
107
|
-
|
|
108
|
-
try {
|
|
109
|
-
const pageFiles = (await fs.readdir(vaultPaths.pages)).filter((f) => f.endsWith(".md"))
|
|
110
|
-
totalPages = pageFiles.length
|
|
111
|
-
for (const file of pageFiles) {
|
|
112
|
-
const content = await fs.readFile(path.join(vaultPaths.pages, file), "utf-8")
|
|
113
|
-
if (content.includes("DEPRECATED")) {
|
|
114
|
-
deprecatedPages++
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
} catch { /* pages dir may not exist yet */ }
|
|
118
|
-
|
|
119
|
-
try {
|
|
120
|
-
const dailyFiles = (await fs.readdir(vaultPaths.daily)).filter((f) => f.endsWith(".md"))
|
|
121
|
-
totalDailyLogs = dailyFiles.length
|
|
122
|
-
} catch { /* daily dir may not exist yet */ }
|
|
123
|
-
|
|
124
|
-
return { totalPages, totalDailyLogs, deprecatedPages }
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const updateStats = async (directory: string, vaultPaths: VaultPaths): Promise<void> => {
|
|
128
|
-
const st = await readState(directory)
|
|
129
|
-
st.stats = await collectStats(vaultPaths)
|
|
130
|
-
await writeState(directory, st)
|
|
131
|
-
}
|
|
132
|
-
|
|
133
91
|
const DEFAULT_INDEX = `# EchoesVault Index
|
|
134
92
|
|
|
135
93
|
Welcome to the EchoesVault knowledge base.
|
|
@@ -417,7 +375,6 @@ const OpenCodeEchoes: Plugin = async ({ directory }) => {
|
|
|
417
375
|
state.pluginVersion = await getPluginVersion()
|
|
418
376
|
state.session.started = false
|
|
419
377
|
state.session.saved = false
|
|
420
|
-
state.stats = await collectStats(paths)
|
|
421
378
|
await writeState(directory, state)
|
|
422
379
|
|
|
423
380
|
return {
|
|
@@ -522,7 +479,6 @@ const OpenCodeEchoes: Plugin = async ({ directory }) => {
|
|
|
522
479
|
const st = await readState(directory)
|
|
523
480
|
st.session.saved = true
|
|
524
481
|
st.session.lastSave = new Date().toISOString()
|
|
525
|
-
st.stats = await collectStats(paths)
|
|
526
482
|
await writeState(directory, st)
|
|
527
483
|
|
|
528
484
|
return [
|
|
@@ -550,7 +506,6 @@ const OpenCodeEchoes: Plugin = async ({ directory }) => {
|
|
|
550
506
|
const timestamp = new Date().toISOString()
|
|
551
507
|
const entry = `### Scratchpad — ${timestamp}\n\n${args.logEntry}\n\n`
|
|
552
508
|
await fs.appendFile(dailyFile, entry)
|
|
553
|
-
await updateStats(directory, paths)
|
|
554
509
|
return `✅ Scratchpad note saved to EchoesVault/daily/${today}.md`
|
|
555
510
|
},
|
|
556
511
|
}),
|
|
@@ -632,8 +587,6 @@ const OpenCodeEchoes: Plugin = async ({ directory }) => {
|
|
|
632
587
|
}
|
|
633
588
|
}
|
|
634
589
|
|
|
635
|
-
await updateStats(directory, paths)
|
|
636
|
-
|
|
637
590
|
const action = existed ? "updated" : "created"
|
|
638
591
|
const parts = [`✅ Page ${action}: EchoesVault/pages/${fileName}`]
|
|
639
592
|
if (!existed && args.indexDescription) {
|
|
@@ -649,7 +602,6 @@ const OpenCodeEchoes: Plugin = async ({ directory }) => {
|
|
|
649
602
|
async execute(_args, _ctx) {
|
|
650
603
|
const st = await readState(directory)
|
|
651
604
|
st.initialized = true
|
|
652
|
-
st.stats = await collectStats(paths)
|
|
653
605
|
await writeState(directory, st)
|
|
654
606
|
return "EchoesVault activated."
|
|
655
607
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "echoes-vault-opencode",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.5",
|
|
4
4
|
"description": "EchoesVault — persistent memory plugin for OpenCode. Obsidian-style knowledge base with daily logs, encyclopedia pages, and session resumption.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.ts",
|
package/tui.tsx
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
/** @jsxImportSource @opentui/solid */
|
|
2
2
|
import type { TuiPlugin } from "@opencode-ai/plugin/tui"
|
|
3
|
-
import { createSignal, onCleanup
|
|
3
|
+
import { createSignal, onCleanup } from "solid-js"
|
|
4
4
|
import * as fs from "node:fs"
|
|
5
5
|
import * as path from "node:path"
|
|
6
6
|
|
|
7
|
-
type VaultStats = {
|
|
8
|
-
totalPages: number
|
|
9
|
-
totalDailyLogs: number
|
|
10
|
-
deprecatedPages: number
|
|
11
|
-
}
|
|
12
|
-
|
|
13
7
|
type EchoesState = {
|
|
14
8
|
version: number
|
|
15
9
|
pluginVersion: string
|
|
@@ -20,7 +14,6 @@ type EchoesState = {
|
|
|
20
14
|
lastStart: string | null
|
|
21
15
|
lastSave: string | null
|
|
22
16
|
}
|
|
23
|
-
stats: VaultStats
|
|
24
17
|
}
|
|
25
18
|
|
|
26
19
|
const STATE_PATH = path.join(process.cwd(), ".opencode", "echoes-state.json")
|
|
@@ -61,18 +54,6 @@ const tui: TuiPlugin = async (api) => {
|
|
|
61
54
|
return "Session Not Started"
|
|
62
55
|
}
|
|
63
56
|
|
|
64
|
-
const vaultHealthColor = () => {
|
|
65
|
-
const pages = state()?.stats?.totalPages ?? 0
|
|
66
|
-
if (pages > 200) return theme.error
|
|
67
|
-
if (pages >= 170) return theme.warning
|
|
68
|
-
return theme.success
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const vaultUsagePercent = () => {
|
|
72
|
-
const pages = state()?.stats?.totalPages ?? 0
|
|
73
|
-
return Math.round((pages / 200) * 100)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
57
|
const statusDesc = () => {
|
|
77
58
|
const s = state()
|
|
78
59
|
if (!s || !s.initialized) return null
|
|
@@ -106,29 +87,16 @@ const tui: TuiPlugin = async (api) => {
|
|
|
106
87
|
<text fg={theme.textMuted}> v{state()?.pluginVersion ?? ""}</text>
|
|
107
88
|
</box>
|
|
108
89
|
<text fg={statusColor()}>{statusLabel()}</text>
|
|
109
|
-
|
|
90
|
+
{statusDesc() && (
|
|
110
91
|
<text fg={theme.textMuted}>{statusDesc()}</text>
|
|
111
|
-
|
|
112
|
-
|
|
92
|
+
)}
|
|
93
|
+
{statusCmd() && (
|
|
113
94
|
<box flexDirection="row">
|
|
114
95
|
<text fg={theme.textMuted}>Run </text>
|
|
115
96
|
<text fg={theme.text}>{statusCmd()}</text>
|
|
116
97
|
<text fg={theme.textMuted}> {statusCmdHint()}</text>
|
|
117
98
|
</box>
|
|
118
|
-
|
|
119
|
-
<Show when={state()?.initialized}>
|
|
120
|
-
<box flexDirection="column">
|
|
121
|
-
<box flexDirection="row">
|
|
122
|
-
<text fg={vaultHealthColor()}>• </text>
|
|
123
|
-
<text fg={theme.text}><b>Vault Health</b></text>
|
|
124
|
-
</box>
|
|
125
|
-
<text fg={theme.textMuted}> Pages: {state()?.stats?.totalPages ?? 0}</text>
|
|
126
|
-
<text fg={theme.textMuted}> Usage: {vaultUsagePercent()}%</text>
|
|
127
|
-
<Show when={(state()?.stats?.totalPages ?? 0) > 200}>
|
|
128
|
-
<text fg={theme.textMuted}> Consider migrating to RAG</text>
|
|
129
|
-
</Show>
|
|
130
|
-
</box>
|
|
131
|
-
</Show>
|
|
99
|
+
)}
|
|
132
100
|
</box>
|
|
133
101
|
)
|
|
134
102
|
},
|