tsunami-memory 1.0.0
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/LICENSE +21 -0
- package/README.md +501 -0
- package/README.zh-CN.md +485 -0
- package/package.json +46 -0
- package/server/api.ts +125 -0
- package/server/mcp.ts +221 -0
- package/src/bun_memory_store.ts +340 -0
- package/src/classifier_keywords.ts +115 -0
- package/src/core/project_state.ts +88 -0
- package/src/index.ts +54 -0
- package/src/legacy_compat/tsunami_compat.ts +22 -0
- package/src/legacy_compat/tsunami_legacy_identity.ts +13 -0
- package/src/legacy_compat/tsunami_legacy_taxonomy.ts +197 -0
- package/src/memory_audit.ts +32 -0
- package/src/memory_conflict_resolver.ts +14 -0
- package/src/memory_fabric.ts +31 -0
- package/src/memory_manager.ts +10 -0
- package/src/memory_promotion.ts +22 -0
- package/src/memory_recovery.ts +14 -0
- package/src/memory_runtime.ts +7 -0
- package/src/migration.ts +163 -0
- package/src/provider.ts +68 -0
- package/src/runtime/checkpoints/durable_recovery.ts +24 -0
- package/src/runtime/paths.ts +11 -0
- package/src/storm/basins.ts +57 -0
- package/src/storm/boundary.ts +52 -0
- package/src/storm/budget.ts +42 -0
- package/src/storm/center.ts +396 -0
- package/src/storm/confidence.ts +88 -0
- package/src/storm/coverage.ts +44 -0
- package/src/storm/directive.ts +94 -0
- package/src/storm/gate.ts +43 -0
- package/src/storm/helpers.ts +172 -0
- package/src/storm/horizon.ts +52 -0
- package/src/storm/intake.ts +80 -0
- package/src/storm/mode.ts +21 -0
- package/src/storm/pressure.ts +56 -0
- package/src/storm/readiness.ts +29 -0
- package/src/storm/saturation.ts +45 -0
- package/src/storm/selection.ts +49 -0
- package/src/storm/signals.ts +105 -0
- package/src/storm/types.ts +216 -0
- package/src/tsunami_bun_backend.ts +705 -0
- package/src/tsunami_chinese_dialect.ts +19 -0
- package/src/tsunami_classifier.ts +137 -0
- package/src/tsunami_client.ts +710 -0
- package/src/tsunami_execution_gate.ts +232 -0
- package/src/tsunami_graph_runtime.ts +359 -0
- package/src/tsunami_identity.ts +35 -0
- package/src/tsunami_routing.ts +169 -0
- package/src/tsunami_runtime_graph_sync.ts +17 -0
- package/src/tsunami_schema.ts +403 -0
- package/src/tsunami_storage_paths.ts +8 -0
- package/src/tsunami_storm_center.ts +53 -0
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="./assets/tsunami-banner.png" width="100%" alt="TSUNAMI ๆจชๅน
"/>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">๐ TSUNAMI</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>้ขๅ AI Agent ็ๆตทๆด่ฎฐๅฟ่ฟ่กๆถ</strong>
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
Bun ๅ็ ยท ้ฃๆดไธญๅฟๆ
ๅขๅผๆ ยท ็ญ+ๅทๆฃ็ดข ยท ็ฅ่ฏๅพ่ฐฑๅๆญฅ
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<p align="center">
|
|
16
|
+
<img src="https://img.shields.io/badge/Bun-1.0%2B-fbf0df?style=for-the-badge&logo=bun&logoColor=000" alt="Bun"/>
|
|
17
|
+
<img src="https://img.shields.io/badge/SQLite-FTS5-003B57?style=for-the-badge&logo=sqlite&logoColor=white" alt="SQLite"/>
|
|
18
|
+
<img src="https://img.shields.io/badge/MCP-ๅ
ผๅฎน-7C3AED?style=for-the-badge" alt="MCP"/>
|
|
19
|
+
<img src="https://img.shields.io/badge/้ถไพ่ต-blue?style=for-the-badge" alt="้ถไพ่ต"/>
|
|
20
|
+
<img src="https://img.shields.io/badge/ๅ่ฎฎ-MIT-10B981?style=for-the-badge" alt="MIT"/>
|
|
21
|
+
</p>
|
|
22
|
+
|
|
23
|
+
<p align="center">
|
|
24
|
+
<a href="README.md">English</a>
|
|
25
|
+
</p>
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
<div align="center">
|
|
30
|
+
|
|
31
|
+
## ไธบไปไนๆฏ TSUNAMI๏ผ
|
|
32
|
+
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
ๅคงๅคๆฐ AI ่ฎฐๅฟ็ณป็ปๆฏ**ๆๅนณ็**ใ**ๆ ็ถๆ็**ใ**ไธไธๆ่ๅผฑ็**ใ
|
|
36
|
+
|
|
37
|
+
TSUNAMI ๆ่ฎฐๅฟ่งไธบ**ๆตๅจ็ๆดๆต** โ ไธๆฏ้ๆๆๆฌ๏ผ่ๆฏ**ๅจ้**ใๆฏๆก่ฎฐๅฟๆบๅธฆ่ฝ้ใๅฝขๆๅๅใ้พๆฅ่ฏๆฎ๏ผๅนถๆฑๅ
ฅไธไธชๅฎๆถๅปบๆจก Agent ่ฎค็ฅ็ถๆ็้ฃๆดไธญๅฟใ
|
|
38
|
+
|
|
39
|
+
> TSUNAMI ไธๅญๅจๆๅญ๏ผๅฎๅปบๆจก**ๅจ้**ใ
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
<div align="center">
|
|
44
|
+
|
|
45
|
+
## ๐ ๆถๆ่ฎพ่ฎก
|
|
46
|
+
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
```mermaid
|
|
50
|
+
graph TD
|
|
51
|
+
TSUNAMI["๐ TSUNAMI ่ฟ่กๆถ"]
|
|
52
|
+
|
|
53
|
+
TSUNAMI --> Basin["็ๅฐ<br/>ไธป้ขๅบๅ"]
|
|
54
|
+
TSUNAMI --> Storm["๐ ้ฃๆดไธญๅฟ<br/>ๆ
ๅขๅผๆ"]
|
|
55
|
+
TSUNAMI --> Hot["โก ็ญๆฃ็ดข<br/>SQLite FTS5"]
|
|
56
|
+
TSUNAMI --> Cold["โ๏ธ ๅทๆฃ็ดข<br/>่ฏญไนๅพ่ฐฑ"]
|
|
57
|
+
TSUNAMI --> Graph["๐ง ็ฅ่ฏๅพ่ฐฑ<br/>ไธๅ
็ปๅญๅจ"]
|
|
58
|
+
|
|
59
|
+
Basin --> Project["project"]
|
|
60
|
+
Basin --> Feedback["feedback"]
|
|
61
|
+
Basin --> Reference["reference"]
|
|
62
|
+
Basin --> User["user"]
|
|
63
|
+
|
|
64
|
+
Storm --> Signals["ไฟกๅท่ฝ้"]
|
|
65
|
+
Storm --> Pressure["ๅๅ่ฏๅ"]
|
|
66
|
+
Storm --> Gate["ๆง่ก้จๆง"]
|
|
67
|
+
Storm --> Budget["้ข็ฎๆงๅถ"]
|
|
68
|
+
|
|
69
|
+
Hot --> FTS5["ไบๆฏซ็งๅ
จๆๆ็ดข"]
|
|
70
|
+
Cold --> Traversal["ๅพ่ฐฑ้ๅ"]
|
|
71
|
+
|
|
72
|
+
Graph --> Sync["่ทจไผ่ฏๅๆญฅ"]
|
|
73
|
+
Graph --> Conflict["ๅฒ็ชๆฃๆต"]
|
|
74
|
+
Graph --> Evidence["่ฏๆฎ้พๆฅ"]
|
|
75
|
+
|
|
76
|
+
style TSUNAMI fill:#0d3b66,stroke:#1a73e8,color:#e8f4f8
|
|
77
|
+
style Storm fill:#1a237e,stroke:#5c6bc0,color:#e8eaf6
|
|
78
|
+
style Basin fill:#0d3b66,stroke:#1a73e8,color:#e8f4f8
|
|
79
|
+
style Hot fill:#01579b,stroke:#0288d1,color:#e1f5fe
|
|
80
|
+
style Cold fill:#01579b,stroke:#0288d1,color:#e1f5fe
|
|
81
|
+
style Graph fill:#004d40,stroke:#00897b,color:#e0f2f1
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
<div align="center">
|
|
87
|
+
|
|
88
|
+
## ๐งฉ ๆ ธๅฟ็ณป็ป
|
|
89
|
+
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<table>
|
|
93
|
+
<tr>
|
|
94
|
+
<td width="50%">
|
|
95
|
+
|
|
96
|
+
### ๐ ้ฃๆดไธญๅฟ
|
|
97
|
+
|
|
98
|
+
**ๆดป่ทไฟกๅทๆฑ่ๅผๆใ**
|
|
99
|
+
|
|
100
|
+
้ฃๆดไธญๅฟๆ็ปญ่ฏไผฐ Agent ็ไธไธๆ โ ๆต้ไฟกๅท่ฝ้ใ่ฎก็ฎๅๅ่ฏๅใๆฃๆต้ฃๆดๆจกๅผใๅๅธๆง่ก้จๆงใๅฎๆฏไธไธชๅฎๆถ่ฎค็ฅไปช่กจ็๏ผๅ่ฏ Agent *ๅฝๅไปไนๆ้่ฆ*ใ
|
|
101
|
+
|
|
102
|
+
- ๅคๅ ็ด ๅๅๅๆ
|
|
103
|
+
- ๆง่ก้จๆง๏ผ`proceed`๏ผๅ
จ้๏ผ/ `guarded`๏ผ่ฐจๆ
๏ผ/ `hold`๏ผๆๅ๏ผ
|
|
104
|
+
- ็ฝฎไฟกๅบฆไธๅฐฑ็ปชๅบฆ่ฏไผฐ
|
|
105
|
+
- ๆไปปๅกๅ้
้ข็ฎ
|
|
106
|
+
|
|
107
|
+
</td>
|
|
108
|
+
<td width="50%">
|
|
109
|
+
|
|
110
|
+
### ๐ ็ๅฐไธๆดๆต
|
|
111
|
+
|
|
112
|
+
**ๆไธป้ข็ป็ป็่ฎฐๅฟๆตใ**
|
|
113
|
+
|
|
114
|
+
่ฎฐๅฟ้ๆดๆตๅๅๅจ็ๅฐ๏ผไธป้ขๅบๅ๏ผไน้ดๆตๅจใๆฏไธช็ๅฐ่ฟฝ่ธชไธไธชๆดป่ท็ฆ็น๏ผ็ณป็ป่ชๅจๅฐๆฐ่ฎฐๅฟๅ็ฑปๅฐๆญฃ็กฎ็็ๅฐ/ๆดๆตๅฏนใไธไธๆไธๆฏๅญๅจ็ โ ๅฎๆฏ*ๆตๅจ็*ใ
|
|
115
|
+
|
|
116
|
+
- 6 ไธช็ๅฐ๏ผepicenterใsurfaceใfaultlineใabyssใsurgeใharbor
|
|
117
|
+
- 24 ไธชๅ
ทๅๆดๆต๏ผๅฎๆดๅ็ฑปๆ ๅฐ
|
|
118
|
+
- ่ชๅจๆๆฌๅ็ฑป
|
|
119
|
+
- ๅ
ผๅฎนๆง็ wing/room ๅฝๅ็ฉบ้ด
|
|
120
|
+
|
|
121
|
+
</td>
|
|
122
|
+
</tr>
|
|
123
|
+
|
|
124
|
+
<tr>
|
|
125
|
+
<td width="50%">
|
|
126
|
+
|
|
127
|
+
### โก ็ญ + ๅทๆฃ็ดข
|
|
128
|
+
|
|
129
|
+
**ๅ้้ๅๆณๅผๆใ**
|
|
130
|
+
|
|
131
|
+
็ญๆฃ็ดข่ตฐ SQLite FTS5 ๅ
จๆๆ็ดข๏ผไบๆฏซ็ง็บงๅๅบใๅทๆฃ็ดข้ๅ็ฅ่ฏๅพ่ฐฑ๏ผ่ฟ่ก่ฏญไน็บงๅ
ณ่ๅ็ฐใไธคๆก้้ๅง็ปๅฏ็จ๏ผๆไธไธๆๅ ๆใ
|
|
132
|
+
|
|
133
|
+
- FTS5 ๅ
จๆๆ็ดข๏ผไบๆฏซ็ง็บง๏ผ
|
|
134
|
+
- ็ฅ่ฏๅพ่ฐฑ BFS ้ๅ
|
|
135
|
+
- ่ทจ็ๅฐ้ง้ๅ็ฐ
|
|
136
|
+
- ๆๆไธๅ
็ปๅธฆๆถ้ดๆๆๆง่ฟฝ่ธช
|
|
137
|
+
|
|
138
|
+
</td>
|
|
139
|
+
<td width="50%">
|
|
140
|
+
|
|
141
|
+
### ๐ง ่ฟ่กๆถๅพ่ฐฑๅๆญฅ
|
|
142
|
+
|
|
143
|
+
**ๆไน
ๅๅๅธๅผ่ฎค็ฅใ**
|
|
144
|
+
|
|
145
|
+
่ฎฐๅฟไธๆฏๅญค็ซ็ โ ๅฎไปฌๆๆไธๅผ ๅพ่ฐฑใๆฏๆก่ฎฐๅฟๅฏไปฅ้พๆฅๅฐ่ฏๆฎใ่ทจไผ่ฏๅ
ณ่ใๅนถๆฅๅๅฒ็ชๆฃๆตใๆฏๆฌกๅๅ
ฅ่ชๅจๅๆญฅๅพ่ฐฑใ
|
|
146
|
+
|
|
147
|
+
- ่ทจไผ่ฏ่ฎฐๅฟ่ฟ็ปญๆง
|
|
148
|
+
- ๅฒ็ชๆฃๆตไธ็ฝฎไฟกๅบฆ่ฐๆด
|
|
149
|
+
- ่ฏๆฎ้พๆฅๅฐๆไปถใๅฏน่ฏๅ้
็ฝฎ
|
|
150
|
+
- ไธๅ
็ปๅญๅจๅธฆ็ฝฎไฟกๅบฆใๆๆๆงๅๆบฏๆบ
|
|
151
|
+
|
|
152
|
+
</td>
|
|
153
|
+
</tr>
|
|
154
|
+
</table>
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
<div align="center">
|
|
159
|
+
|
|
160
|
+
## โก ๅฟซ้ไธๆ
|
|
161
|
+
|
|
162
|
+
</div>
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
bun install
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
import {
|
|
170
|
+
tsunamiAdd, tsunamiSearch,
|
|
171
|
+
buildTsunamiStormCenter, formatTsunamiStormCenterText,
|
|
172
|
+
} from './src/index.ts';
|
|
173
|
+
|
|
174
|
+
// ๅญๅจ่ฎฐๅฟ
|
|
175
|
+
const id = await tsunamiAdd('project', 'tasks', 'ๅฎๆไบ่ฎค่ฏๆจกๅ็ API ้ๆ', 5);
|
|
176
|
+
|
|
177
|
+
// ๅ
จๆๆ็ดข โ ไบๆฏซ็ง็บง FTS5
|
|
178
|
+
const hits = await tsunamiSearch('้ๆ', 'project', undefined, 5);
|
|
179
|
+
|
|
180
|
+
// ้ฃๆดไธญๅฟ โ ๅฎๆถไธไธๆๅๆ
|
|
181
|
+
const storm = buildTsunamiStormCenter({ query: '็ปง็ปญๅผๅๅทฅไฝ' });
|
|
182
|
+
console.log(formatTsunamiStormCenterText(storm));
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
> ้ถๅค้จไพ่ตใๆ ้ๅฏๅจๆๅกๅจใSQLite ๅ
็ฝฎไบ Bunใ
|
|
186
|
+
> ้่ฆ HTTP ๆ MCP ๆนๅผๆฅๅ
ฅ๏ผ่ฏท็ไธๆน[ๆฅๅฃ](#-ๆฅๅฃ)ใ
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
<div align="center">
|
|
191
|
+
|
|
192
|
+
## ๐ ๆฅๅฃ
|
|
193
|
+
|
|
194
|
+
</div>
|
|
195
|
+
|
|
196
|
+
TSUNAMI ๆไพไธ็งๆฅๅฃใๆไฝ ็ๆๆฏๆ ้ๆฉใ
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
### ๐ค MCP ๅทฅๅ
ท โ Claude CodeใCursorใWindsurf
|
|
201
|
+
|
|
202
|
+
ๅจ `~/.claude/mcp.json` ไธญ้
็ฝฎไธๆฌก๏ผ
|
|
203
|
+
|
|
204
|
+
```json
|
|
205
|
+
{
|
|
206
|
+
"mcpServers": {
|
|
207
|
+
"tsunami": {
|
|
208
|
+
"command": "bun",
|
|
209
|
+
"args": ["run", "/path/to/TSUNAMI/server/mcp.ts"],
|
|
210
|
+
"env": { "TSUNAMI_HOME": "~/.tsunami" }
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
MCP ๆๅก่ชๅจๅฏๅจใๅ
ซไธชๅทฅๅ
ทๅฏ็จ๏ผ
|
|
217
|
+
|
|
218
|
+
<details open>
|
|
219
|
+
<summary><strong>๐ tsunami_storm</strong> โ ๆๅปบ้ฃๆดไธญๅฟไธไธๆ</summary>
|
|
220
|
+
|
|
221
|
+
```json
|
|
222
|
+
{ "query": "็ปง็ปญ API ๅผๅๅทฅไฝ" }
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
่ฟๅๆตๅใ้ฃๆดๆจกๅผใๅๅ็ญ็บงใๆง่ก้จๆงใ้ข็ฎๅไผๅ
่กๅจๆไปคใ
|
|
226
|
+
|
|
227
|
+
</details>
|
|
228
|
+
|
|
229
|
+
<details>
|
|
230
|
+
<summary><strong>๐ tsunami_add</strong> โ ๅญๅจ่ฎฐๅฟ</summary>
|
|
231
|
+
|
|
232
|
+
```json
|
|
233
|
+
{ "content": "ๅณๅฎ็จ Redis ๅ็ผๅญ", "wing": "decision", "energy": 4 }
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
่ฟๅๅฏไธ `bunmem_xxx` IDใๆฏๆไธญๆใemojiใไปปๆ Unicodeใ
|
|
237
|
+
|
|
238
|
+
</details>
|
|
239
|
+
|
|
240
|
+
<details>
|
|
241
|
+
<summary><strong>๐ tsunami_search</strong> โ FTS5 ๅ
จๆๆ็ดข</summary>
|
|
242
|
+
|
|
243
|
+
```json
|
|
244
|
+
{ "query": "Redis ็ผๅญ", "wing": "project", "limit": 5 }
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
ไบๆฏซ็ง็บง SQLite FTS5 ๆ็ดข๏ผๆฏๆ wing/room ่ฟๆปคใ
|
|
248
|
+
|
|
249
|
+
</details>
|
|
250
|
+
|
|
251
|
+
<details>
|
|
252
|
+
<summary><strong>๐ tsunami_recall</strong> โ ไธไธๆๅๆณ</summary>
|
|
253
|
+
|
|
254
|
+
```json
|
|
255
|
+
{ "wing": "project", "limit": 10 }
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
ๆไธป้ขๆๅ่ฟๆ่ฎฐๅฟ๏ผๆ้่ฆๆงๅๆถ้ดๆๅบใ
|
|
259
|
+
|
|
260
|
+
</details>
|
|
261
|
+
|
|
262
|
+
<details>
|
|
263
|
+
<summary><strong>๐ tsunami_timeline</strong> โ ๆถ้ด็บฟ</summary>
|
|
264
|
+
|
|
265
|
+
```json
|
|
266
|
+
{ "limit": 20 }
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
ๆๆถ้ด้กบๅบๆๅๆๆ่ฎฐๅฟใ
|
|
270
|
+
|
|
271
|
+
</details>
|
|
272
|
+
|
|
273
|
+
<details>
|
|
274
|
+
<summary><strong>๐ tsunami_diary</strong> โ ไผ่ฏๆฅๅฟ</summary>
|
|
275
|
+
|
|
276
|
+
```json
|
|
277
|
+
{ "entry": "ไปๅคฉๆๅปบไบ่ฎค่ฏๆจกๅ", "agent": "claude" }
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
่ชๅจๅ ๆถ้ดๆณ็ๆฅ่ฎฐๆก็ฎใ
|
|
281
|
+
|
|
282
|
+
</details>
|
|
283
|
+
|
|
284
|
+
<details>
|
|
285
|
+
<summary><strong>๐ tsunami_status</strong> โ ็ณป็ปๅฅๅบท</summary>
|
|
286
|
+
|
|
287
|
+
```json
|
|
288
|
+
{}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
่ฎฐๅฟๆฐ้ใ็ๅฐ็ป่ฎกใๅ็ซฏไฟกๆฏใ
|
|
292
|
+
|
|
293
|
+
</details>
|
|
294
|
+
|
|
295
|
+
<details>
|
|
296
|
+
<summary><strong>๐๏ธ tsunami_wings</strong> โ ไธป้ขๅ็ฑป</summary>
|
|
297
|
+
|
|
298
|
+
```json
|
|
299
|
+
{}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
ๆๆ็ๅฐ/ๅบๅๅๆก็ฎๆฐ้ใ
|
|
303
|
+
|
|
304
|
+
</details>
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
### ๐ HTTP API โ ไปปไฝ่ฏญ่จ
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
TSUNAMI_PORT=18904 TSUNAMI_HOME=~/.tsunami bun run server/api.ts
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
| ๆนๆณ | ็ซฏ็น | ็จ้ |
|
|
315
|
+
|--------|----------|---------|
|
|
316
|
+
| `POST` | `/add` | ๐ ๅญๅจ่ฎฐๅฟ |
|
|
317
|
+
| `GET` | `/search` | ๐ FTS5 ๅ
จๆๆ็ดข |
|
|
318
|
+
| `GET` | `/recall` | ๐ ไธไธๆๅๆณ |
|
|
319
|
+
| `GET` | `/storm` | ๐ ๆๅปบ้ฃๆดไธญๅฟ |
|
|
320
|
+
| `GET` | `/status` | ๐ ็ณป็ปๅฅๅบท |
|
|
321
|
+
| `GET` | `/timeline` | ๐ ๆถ้ดๆๅ |
|
|
322
|
+
| `POST` | `/diary` | ๐ ไผ่ฏๆฅๅฟ |
|
|
323
|
+
| `GET` | `/health` | โ
ๅญๆดปๆฃๆฅ |
|
|
324
|
+
|
|
325
|
+
<table>
|
|
326
|
+
<tr><td width="33%">
|
|
327
|
+
|
|
328
|
+
**Shell**
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
curl -X POST localhost:18904/add \
|
|
332
|
+
-H 'Content-Type: application/json' \
|
|
333
|
+
-d '{"wing":"project",
|
|
334
|
+
"content":"้ๆไบ่ฎค่ฏๆจกๅ",
|
|
335
|
+
"energy":4}'
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
</td><td width="33%">
|
|
339
|
+
|
|
340
|
+
**Python**
|
|
341
|
+
|
|
342
|
+
```python
|
|
343
|
+
import requests
|
|
344
|
+
r = requests.post(
|
|
345
|
+
'http://localhost:18904/add',
|
|
346
|
+
json={'wing': 'feedback',
|
|
347
|
+
'content': '็จๆทๅๅฅฝๆทฑ่ฒๆจกๅผ',
|
|
348
|
+
'energy': 5}
|
|
349
|
+
)
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
</td><td width="33%">
|
|
353
|
+
|
|
354
|
+
**TypeScript**
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
const r = await fetch(
|
|
358
|
+
'http://localhost:18904/add', {
|
|
359
|
+
method: 'POST',
|
|
360
|
+
headers: {'Content-Type': 'application/json'},
|
|
361
|
+
body: JSON.stringify({
|
|
362
|
+
wing: 'reference',
|
|
363
|
+
content: 'Bun sqlite API ๆๆกฃ',
|
|
364
|
+
energy: 3})
|
|
365
|
+
});
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
</td></tr>
|
|
369
|
+
</table>
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
### ๐ฆ TypeScript SDK โ ็ผ็จๅผ่ฐ็จ
|
|
374
|
+
|
|
375
|
+
```typescript
|
|
376
|
+
import {
|
|
377
|
+
tsunamiAdd, tsunamiSearch, tsunamiRecall,
|
|
378
|
+
tsunamiKgAdd, tsunamiKgQuery,
|
|
379
|
+
buildTsunamiStormCenter, formatTsunamiStormCenterText,
|
|
380
|
+
buildTsunamiExecutionGate, applyTsunamiExecutionGateToTool,
|
|
381
|
+
classifyMemory,
|
|
382
|
+
} from './src/index.ts';
|
|
383
|
+
|
|
384
|
+
const id = await tsunamiAdd('project', 'tasks', 'ๅฎๆ่ฎค่ฏๆจกๅ้ๆ', 5);
|
|
385
|
+
const hits = await tsunamiSearch('้ๆ', 'project', undefined, 10);
|
|
386
|
+
|
|
387
|
+
const storm = buildTsunamiStormCenter({
|
|
388
|
+
projectDir: './my-project',
|
|
389
|
+
query: '็ปง็ปญๅผๅๅทฅไฝ',
|
|
390
|
+
});
|
|
391
|
+
console.log(formatTsunamiStormCenterText(storm));
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
<div align="center">
|
|
397
|
+
|
|
398
|
+
## ๐ค ่ชๅจ่ฎฐๅฟ
|
|
399
|
+
|
|
400
|
+
</div>
|
|
401
|
+
|
|
402
|
+
้ป่ฎคๆ
ๅตไธ TSUNAMI ไธบ**ๆพๅผ่ฐ็จ** โ ไฝ ๅณๅฎไฝๆถๅญๅจๆๅๆณใ่ฆๅ
ๆๅจ่ฎฐๅฟ๏ผๅฏ้่ฟ Claude Code hooks ๆฅๅ
ฅ็ๅฝๅจๆใ
|
|
403
|
+
|
|
404
|
+
**ๅๆ๏ผ** HTTP API ไปฅๅฎๆค่ฟ็จ่ฟ่ก๏ผ`bun run server/api.ts &` ๆ PM2/launchd๏ผใ
|
|
405
|
+
|
|
406
|
+
### ไผ่ฏๅฏๅจ ยท ไธไธๆๆณจๅ
ฅ
|
|
407
|
+
|
|
408
|
+
Claude ๅฏๅจๆถ่ชๅจๆณจๅ
ฅ้ฃๆดไธญๅฟไธไธๆ๏ผ
|
|
409
|
+
|
|
410
|
+
```json
|
|
411
|
+
{
|
|
412
|
+
"hooks": {
|
|
413
|
+
"SessionStart": [{
|
|
414
|
+
"matcher": "",
|
|
415
|
+
"hooks": [{
|
|
416
|
+
"type": "command",
|
|
417
|
+
"command": "STORM=$(curl -s 'http://localhost:18904/storm' | python3 -c \"import sys,json; d=json.load(sys.stdin); t=d.get('storm',{}).get('text',''); print(t[:3000])\" 2>/dev/null); if [ -n \"$STORM\" ]; then echo \"$STORM\"; fi"
|
|
418
|
+
}]
|
|
419
|
+
}]
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### ไผ่ฏ็ปๆ ยท ่ชๅจๆฅ่ฎฐ
|
|
425
|
+
|
|
426
|
+
ๆฏๆฌกไผ่ฏ็ปๆๅ่ชๅจ่ฎฐๅฝ๏ผ
|
|
427
|
+
|
|
428
|
+
```json
|
|
429
|
+
{
|
|
430
|
+
"hooks": {
|
|
431
|
+
"Stop": [{
|
|
432
|
+
"matcher": "",
|
|
433
|
+
"hooks": [{
|
|
434
|
+
"type": "command",
|
|
435
|
+
"command": "curl -s -X POST http://localhost:18904/diary -H 'Content-Type: application/json' -d '{\"entry\":\"ไผ่ฏ็ปๆ\",\"agent\":\"claude\",\"wing\":\"session\",\"importance\":3}' > /dev/null 2>&1"
|
|
436
|
+
}]
|
|
437
|
+
}]
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
### ๆฏๆฌก่พๅ
ฅ ยท ๅณ็ญๆ่ท
|
|
443
|
+
|
|
444
|
+
ๆฃๆตๅฐ `ๅณๅฎ`ใ`ๅๅนถ`ใ`้จ็ฝฒ`ใ`ๅๅธ`ใ`ไธ็บฟ` ็ญๅ
ณ้ฎ่ฏๆถ่ชๅจๅฝๆกฃๅฐๅณ็ญ็ๅฐ๏ผ
|
|
445
|
+
|
|
446
|
+
```json
|
|
447
|
+
{
|
|
448
|
+
"hooks": {
|
|
449
|
+
"UserPromptSubmit": [{
|
|
450
|
+
"matcher": "",
|
|
451
|
+
"hooks": [{
|
|
452
|
+
"type": "command",
|
|
453
|
+
"command": "PROMPT=$(cat); if echo \"$PROMPT\" | grep -qiE 'decid|chose|finaliz|merge|deploy|releas|shipp|ๅณๅฎ|้ๆฉ|ๅๅนถ|้จ็ฝฒ|ๅๅธ|ไธ็บฟ'; then curl -s -X POST http://localhost:18904/add -H 'Content-Type: application/json' -d \"{\\\"wing\\\":\\\"decision\\\",\\\"content\\\":\\\"$(echo $PROMPT | tr '\\\"' ' ' | head -c 500)\\\",\\\"energy\\\":4}\" > /dev/null 2>&1; fi"
|
|
454
|
+
}]
|
|
455
|
+
}]
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
462
|
+
<div align="center">
|
|
463
|
+
|
|
464
|
+
## โ๏ธ ็ฏๅขๅ้
|
|
465
|
+
|
|
466
|
+
</div>
|
|
467
|
+
|
|
468
|
+
| ๅ้ | ้ป่ฎคๅผ | ่ฏดๆ |
|
|
469
|
+
|----------|---------|-------------|
|
|
470
|
+
| `TSUNAMI_HOME` | `.tsunami` | ๆฐๆฎๅญๅจ็ฎๅฝ |
|
|
471
|
+
| `TSUNAMI_PORT` | `18904` | HTTP API ็ซฏๅฃ |
|
|
472
|
+
| `TSUNAMI_STORM_THRESHOLD` | `0.7` | ้ฃๆดไฟกๅทๆไฝ่ฝ้้ๅผ |
|
|
473
|
+
| `TSUNAMI_BUDGET_STEPS` | `99` | ้ป่ฎคๆง่กๆญฅๆฐ้ข็ฎ |
|
|
474
|
+
|
|
475
|
+
---
|
|
476
|
+
|
|
477
|
+
<div align="center">
|
|
478
|
+
|
|
479
|
+
## ๐ ๅ่ฎฎ
|
|
480
|
+
|
|
481
|
+
</div>
|
|
482
|
+
|
|
483
|
+
<p align="center">
|
|
484
|
+
MIT ยฉ TSUNAMI Memory System
|
|
485
|
+
</p>
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tsunami-memory",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "TSUNAMI โ Bun-native oceanic memory system with basin/current flow, storm center, hot+cold retrieval, knowledge graph sync, and evidence linking.",
|
|
5
|
+
"main": "src/index.ts",
|
|
6
|
+
"files": [
|
|
7
|
+
"src/**/*.ts",
|
|
8
|
+
"server/**/*.ts",
|
|
9
|
+
"README.md"
|
|
10
|
+
],
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/tsunami-memory/tsunami.git"
|
|
14
|
+
},
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/tsunami-memory/tsunami/issues"
|
|
17
|
+
},
|
|
18
|
+
"type": "module",
|
|
19
|
+
"scripts": {
|
|
20
|
+
"start": "bun run server/api.ts",
|
|
21
|
+
"typecheck": "tsc --noEmit",
|
|
22
|
+
"smoke": "bun run src/index.ts"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"memory",
|
|
26
|
+
"agent",
|
|
27
|
+
"ai",
|
|
28
|
+
"tsunami",
|
|
29
|
+
"bun",
|
|
30
|
+
"sqlite",
|
|
31
|
+
"knowledge-graph",
|
|
32
|
+
"storm-center",
|
|
33
|
+
"retrieval"
|
|
34
|
+
],
|
|
35
|
+
"author": "TSUNAMI Memory System",
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"dependencies": {},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"typescript": "^5.0.0",
|
|
40
|
+
"@types/node": "^20.0.0",
|
|
41
|
+
"bun-types": "^1.0.0"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"bun": ">=1.0.0"
|
|
45
|
+
}
|
|
46
|
+
}
|
package/server/api.ts
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TSUNAMI HTTP API Server โ universal memory backend for any agent
|
|
3
|
+
*
|
|
4
|
+
* Start: bun run server/api.ts
|
|
5
|
+
* Port: 18904 (configurable via TSUNAMI_PORT)
|
|
6
|
+
*
|
|
7
|
+
* Endpoints:
|
|
8
|
+
* POST /add โ Add memory
|
|
9
|
+
* GET /search?q= โ Search memories
|
|
10
|
+
* GET /recall?wing=&limit= โ Recall by context
|
|
11
|
+
* GET /storm?project=&query= โ Storm center
|
|
12
|
+
* GET /status โ System status
|
|
13
|
+
* GET /timeline?limit= โ Timeline
|
|
14
|
+
* POST /diary โ Write diary entry
|
|
15
|
+
* GET /health โ Health check
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const PORT = parseInt(process.env.TSUNAMI_PORT || '18904');
|
|
19
|
+
|
|
20
|
+
// Lightweight HTTP server โ zero external deps (Bun native)
|
|
21
|
+
const server = Bun.serve({
|
|
22
|
+
port: PORT,
|
|
23
|
+
async fetch(req) {
|
|
24
|
+
const url = new URL(req.url);
|
|
25
|
+
const cors = {
|
|
26
|
+
'Access-Control-Allow-Origin': '*',
|
|
27
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
28
|
+
'Access-Control-Allow-Headers': 'Content-Type',
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
if (req.method === 'OPTIONS') return new Response(null, { headers: cors });
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
// Dynamic import to defer heavy module loading
|
|
35
|
+
const { tsunamiAdd, tsunamiSearch, tsunamiRecall, tsunamiStatus, tsunamiTimeline, tsunamiDiary } = await import('../src/tsunami_client');
|
|
36
|
+
const { buildTsunamiStormCenter, formatTsunamiStormCenterText } = await import('../src/tsunami_storm_center');
|
|
37
|
+
|
|
38
|
+
// โโ Health โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
39
|
+
if (url.pathname === '/health') {
|
|
40
|
+
return json({ ok: true, service: 'tsunami-memory', port: PORT }, cors);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// โโ POST /add โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
44
|
+
if (url.pathname === '/add' && req.method === 'POST') {
|
|
45
|
+
const body = await req.json().catch(() => ({}));
|
|
46
|
+
const { wing, room, content, energy } = body;
|
|
47
|
+
if (!content) return json({ error: 'content required' }, cors, 400);
|
|
48
|
+
const result = await tsunamiAdd(wing || 'default', room || 'general', content, energy || 3);
|
|
49
|
+
return json({ ok: true, result }, cors);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// โโ GET /search?q=&wing=&limit= โโโโโโโโโโโโโโโโโ
|
|
53
|
+
if (url.pathname === '/search' && req.method === 'GET') {
|
|
54
|
+
const q = url.searchParams.get('q') || '';
|
|
55
|
+
const wing = url.searchParams.get('wing') || undefined;
|
|
56
|
+
const limit = parseInt(url.searchParams.get('limit') || '5');
|
|
57
|
+
if (!q) return json({ error: 'q required' }, cors, 400);
|
|
58
|
+
const result = await tsunamiSearch(q, wing, undefined, limit);
|
|
59
|
+
return json({ ok: true, query: q, result }, cors);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// โโ GET /recall?wing=&room=&limit= โโโโโโโโโโโโโโ
|
|
63
|
+
if (url.pathname === '/recall' && req.method === 'GET') {
|
|
64
|
+
const wing = url.searchParams.get('wing') || undefined;
|
|
65
|
+
const room = url.searchParams.get('room') || undefined;
|
|
66
|
+
const limit = parseInt(url.searchParams.get('limit') || '10');
|
|
67
|
+
const result = await tsunamiRecall(wing, room, limit);
|
|
68
|
+
return json({ ok: true, result }, cors);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// โโ GET /storm?project=&query= โโโโโโโโโโโโโโโโโโ
|
|
72
|
+
if (url.pathname === '/storm' && req.method === 'GET') {
|
|
73
|
+
const projectDir = url.searchParams.get('project') || process.cwd();
|
|
74
|
+
const query = url.searchParams.get('query') || '';
|
|
75
|
+
const center = buildTsunamiStormCenter({ projectDir, query, refreshGraph: false });
|
|
76
|
+
return json({ ok: true, storm: { flow: center.flow, mode: center.stormMode, pressure: center.stormPressure, gate: center.stormGate, budget: center.stormBudget, text: formatTsunamiStormCenterText(center) } }, cors);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// โโ GET /status โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
80
|
+
if (url.pathname === '/status' && req.method === 'GET') {
|
|
81
|
+
const result = await tsunamiStatus();
|
|
82
|
+
return json({ ok: true, ...result }, cors);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// โโ GET /timeline?limit= โโโโโโโโโโโโโโโโโโโโโโโโ
|
|
86
|
+
if (url.pathname === '/timeline' && req.method === 'GET') {
|
|
87
|
+
const limit = parseInt(url.searchParams.get('limit') || '20');
|
|
88
|
+
const result = await tsunamiTimeline(limit);
|
|
89
|
+
return json({ ok: true, timeline: result }, cors);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// โโ POST /diary โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
93
|
+
if (url.pathname === '/diary' && req.method === 'POST') {
|
|
94
|
+
const body = await req.json().catch(() => ({}));
|
|
95
|
+
const { entry, agent, wing, importance } = body;
|
|
96
|
+
if (!entry) return json({ error: 'entry required' }, cors, 400);
|
|
97
|
+
const result = await tsunamiDiary(entry, agent || 'external', wing || 'diary', importance || 3);
|
|
98
|
+
return json({ ok: true, result }, cors);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// โโ GET / โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
102
|
+
if (url.pathname === '/' && req.method === 'GET') {
|
|
103
|
+
return json({
|
|
104
|
+
service: 'TSUNAMI Memory API',
|
|
105
|
+
version: '1.0.0',
|
|
106
|
+
endpoints: ['/health', '/add', '/search', '/recall', '/storm', '/status', '/timeline', '/diary'],
|
|
107
|
+
}, cors);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return new Response('Not Found', { status: 404, headers: cors });
|
|
111
|
+
} catch (err: any) {
|
|
112
|
+
return json({ error: err?.message || String(err) }, cors, 500);
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
function json(data: any, headers: Record<string, string>, status = 200): Response {
|
|
118
|
+
return new Response(JSON.stringify(data, null, 2), {
|
|
119
|
+
status,
|
|
120
|
+
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
console.log(`๐ TSUNAMI Memory API running on http://localhost:${PORT}`);
|
|
125
|
+
console.log(` Try: curl http://localhost:${PORT}/`);
|