持久記憶
Triggerfish 代理具有持久的跨工作階段記憶。代理可以儲存事實、偏好和上下文,在對話、重啟甚至觸發器喚醒之間存活。記憶具有分類閘控——代理無法讀取超過其工作階段 taint 的內容或寫入低於它的內容。
工具
memory_save
將事實或資訊儲存到持久記憶。
| 參數 | 類型 | 必要 | 描述 |
|---|---|---|---|
key | string | 是 | 唯一識別碼(例如 user-name、project-deadline) |
content | string | 是 | 要記住的內容 |
tags | array | 否 | 用於分類的標籤(例如 ["personal", "preference"]) |
分類自動設定為目前工作階段的 taint 等級。代理無法選擇記憶儲存的等級。
memory_get
透過鍵擷取特定記憶。
| 參數 | 類型 | 必要 | 描述 |
|---|---|---|---|
key | string | 是 | 要擷取的記憶鍵 |
如果記憶存在且在當前安全等級下可存取,則回傳記憶內容。較高分類的版本會遮蔽較低的版本。
memory_search
使用自然語言搜尋所有可存取的記憶。
| 參數 | 類型 | 必要 | 描述 |
|---|---|---|---|
query | string | 是 | 自然語言搜尋查詢 |
max_results | number | 否 | 最大結果數(預設:10) |
使用 SQLite FTS5 全文搜尋和詞幹分析。結果按目前工作階段的安全等級過濾。
memory_list
列出所有可存取的記憶,可選擇按標籤過濾。
| 參數 | 類型 | 必要 | 描述 |
|---|---|---|---|
tag | string | 否 | 要過濾的標籤 |
memory_delete
按鍵刪除記憶。記錄是軟刪除的(隱藏但為稽核保留)。
| 參數 | 類型 | 必要 | 描述 |
|---|---|---|---|
key | string | 是 | 要刪除的記憶鍵 |
只能刪除當前工作階段安全等級下的記憶。
記憶如何運作
自動擷取
代理會主動儲存使用者分享的重要事實——個人詳情、專案上下文、偏好——使用描述性鍵。這是由 SPINE.md 引導的提示級行為。LLM 選擇儲存什麼;策略層強制在什麼等級。
分類閘控
每條記憶記錄都攜帶等於儲存時工作階段 taint 的分類等級:
- 在
CONFIDENTIAL工作階段中儲存的記憶被分類為CONFIDENTIAL PUBLIC工作階段無法讀取CONFIDENTIAL記憶CONFIDENTIAL工作階段可以讀取CONFIDENTIAL和PUBLIC記憶
這由每次讀取操作的 canFlowTo 檢查強制執行。LLM 無法繞過這一點。
記憶遮蔽
當同一鍵存在於多個分類等級時,只回傳目前工作階段可見的最高分類版本。這防止跨分類邊界的資訊洩漏。
範例: 如果 user-name 同時存在於 PUBLIC(在公開聊天中設定)和 INTERNAL(在私人工作階段中更新),INTERNAL 工作階段看到 INTERNAL 版本,而 PUBLIC 工作階段只看到 PUBLIC 版本。
儲存
記憶透過 StorageProvider 介面儲存(與工作階段、排程任務和待辦事項使用的相同抽象)。全文搜尋使用 SQLite FTS5 進行快速的自然語言查詢和詞幹分析。
安全性
- 分類始終在
PRE_TOOL_CALLhook 中強制設定為session.taint——LLM 無法選擇較低的分類 - 所有讀取都由
canFlowTo過濾——永遠不會回傳超過工作階段 taint 的記憶 - 刪除是軟刪除——記錄被隱藏但為稽核保留
- 代理無法透過讀取高分類資料並在較低等級重新儲存來提升記憶分類(降級寫入防護適用)
安全性 LLM 永遠不會選擇記憶分類。它始終由策略層強制設定為目前工作階段的 taint 等級。這是一個無法透過配置移除的硬邊界。 :::
