memory @ 0.2.0
Per-thread long-term memory backed by Postgres + pgvector. Stores facts, preferences, and habits with versioned supersession.
Publisher / author
tupiflow
Type
memory
Signing key
kid-20260520-e5fe9257
Bundle
Download signed bundle
verifies against kid-20260520-e5fe9257
Signed manifest (spec)
Byte-for-byte signed payload. Hash with RFC 8785 canonical JSON, verify the Ed25519 signature against the public key for kid-20260520-e5fe9257.
{
"icon": {
"kind": "svg",
"path": "icon.svg"
},
"bundle": {
"sha256": "47af237b1c3aea80034e2fcca150a67fa610f279500f09122362b13019b2fd55",
"sizeBytes": 6756
},
"schema": {
"namespace": "plugin_memory",
"migrations": [
"migrations/0001_init.sql"
]
},
"actions": [
{
"slug": "save-memory",
"tool": {
"name": "memory_save",
"description": "Store NEW long-term memory. BEFORE calling: check existing memories first via memory_search and/or memory_list. If a related memory already exists and the user's statement refines/corrects it (moved cities, changed job, renamed pet), call memory_update INSTEAD. kind: fact (stable), preference (user pref), habit (pattern).",
"inputSchemaJson": "{\"type\":\"object\",\"properties\":{\"integrationId\":{\"type\":\"string\",\"description\":\"Memory integration id (auto-bound when invoked from a chat trigger).\"},\"threadId\":{\"type\":\"string\",\"description\":\"Chat thread id (auto-bound when invoked from a chat trigger).\"},\"content\":{\"type\":\"string\",\"description\":\"Memory content to store.\"},\"kind\":{\"type\":\"string\",\"enum\":[\"fact\",\"preference\",\"habit\"],\"description\":\"Memory kind. Defaults to 'fact'.\"}},\"required\":[\"integrationId\",\"threadId\",\"content\"],\"additionalProperties\":false}"
},
"label": "Save Memory",
"category": "Memory",
"description": "Store a fact, preference, or habit for the current chat thread. Embedded for semantic search when a provider is configured.",
"configFields": [
{
"key": "threadId",
"type": "text",
"label": "Thread ID",
"example": "telegram:2017653240",
"required": true
},
{
"key": "content",
"type": "template-input",
"label": "Content",
"required": true
},
{
"key": "kind",
"type": "select",
"label": "Kind"
}
],
"outputFields": [
{
"field": "id",
"description": "ID of the stored memory."
},
{
"field": "semantic",
"description": "True when an embedding was computed and persisted."
}
],
"stepFunction": "saveMemoryStep"
},
{
"slug": "search-memory",
"tool": {
"name": "memory_search",
"description": "Semantic search over thread memories. Empty results = fall back to memory_list.",
"inputSchemaJson": "{\"type\":\"object\",\"properties\":{\"integrationId\":{\"type\":\"string\"},\"threadId\":{\"type\":\"string\",\"description\":\"Chat thread id (auto-bound when invoked from a chat trigger).\"},\"query\":{\"type\":\"string\",\"description\":\"Search query.\"},\"topK\":{\"type\":[\"number\",\"string\"],\"description\":\"Max results (default 10, max 50).\"},\"minScore\":{\"type\":[\"number\",\"string\"],\"description\":\"Cosine similarity floor in [-1, 1]. Default 0.6. Ignored when semantic search is disabled on the integration.\"}},\"required\":[\"integrationId\",\"threadId\",\"query\"],\"additionalProperties\":false}"
},
"label": "Search Memory",
"category": "Memory",
"description": "Semantic vector search (with keyword ILIKE fallback) over thread memories.",
"configFields": [
{
"key": "threadId",
"type": "text",
"label": "Thread ID",
"required": true
},
{
"key": "query",
"type": "text",
"label": "Query",
"required": true
},
{
"key": "topK",
"type": "number",
"label": "Top K"
},
{
"key": "minScore",
"type": "number",
"label": "Min similarity score"
}
],
"outputFields": [
{
"field": "results",
"description": "Array of matching memory entries."
},
{
"field": "count",
"description": "Number of results returned."
}
],
"stepFunction": "searchMemoryStep"
},
{
"slug": "update-memory",
"tool": {
"name": "memory_update",
"description": "Update an EXISTING memory by id when the user's statement supersedes a previous fact/preference/habit. Creates a new versioned row and marks the old row as superseded — history preserved. Find the id via memory_search or memory_list first.",
"inputSchemaJson": "{\"type\":\"object\",\"properties\":{\"integrationId\":{\"type\":\"string\"},\"memoryId\":{\"type\":\"string\",\"description\":\"Memory id to update.\"},\"content\":{\"type\":\"string\",\"description\":\"New content.\"}},\"required\":[\"integrationId\",\"memoryId\",\"content\"],\"additionalProperties\":false}"
},
"label": "Update Memory",
"category": "Memory",
"description": "Update an existing memory entry. Inserts a new versioned row and marks the old row as superseded.",
"configFields": [
{
"key": "memoryId",
"type": "template-input",
"label": "Memory ID",
"required": true
},
{
"key": "content",
"type": "template-input",
"label": "New Content",
"required": true
}
],
"outputFields": [
{
"field": "id",
"description": "ID of the new memory version (old entry superseded)."
}
],
"stepFunction": "updateMemoryStep"
},
{
"slug": "delete-memory",
"tool": {
"name": "memory_delete",
"description": "Delete memory by id. Find id via memory_list or memory_search.",
"inputSchemaJson": "{\"type\":\"object\",\"properties\":{\"integrationId\":{\"type\":\"string\"},\"memoryId\":{\"type\":\"string\",\"description\":\"Memory id to delete.\"}},\"required\":[\"integrationId\",\"memoryId\"],\"additionalProperties\":false}"
},
"label": "Delete Memory",
"category": "Memory",
"description": "Permanently delete a memory entry by ID.",
"configFields": [
{
"key": "memoryId",
"type": "template-input",
"label": "Memory ID",
"required": true
}
],
"outputFields": [
{
"field": "id",
"description": "ID of the deleted memory."
}
],
"stepFunction": "deleteMemoryStep"
},
{
"slug": "list-memory",
"tool": {
"name": "memory_list",
"description": "List thread memories, optional kind filter. Use when no search query applies.",
"inputSchemaJson": "{\"type\":\"object\",\"properties\":{\"integrationId\":{\"type\":\"string\"},\"threadId\":{\"type\":\"string\",\"description\":\"Chat thread id (auto-bound when invoked from a chat trigger).\"},\"kind\":{\"type\":\"string\",\"enum\":[\"fact\",\"preference\",\"habit\"],\"description\":\"Optional kind filter.\"},\"limit\":{\"type\":[\"number\",\"string\"],\"description\":\"Max entries (default 100, max 500).\"}},\"required\":[\"integrationId\",\"threadId\"],\"additionalProperties\":false}"
},
"label": "List Memory",
"category": "Memory",
"description": "List all current memories for the chat thread, optionally filtered by kind.",
"configFields": [
{
"key": "threadId",
"type": "text",
"label": "Thread ID",
"required": true
},
{
"key": "kind",
"type": "select",
"label": "Kind filter"
},
{
"key": "limit",
"type": "number",
"label": "Limit"
}
],
"outputFields": [
{
"field": "results",
"description": "Array of memory entries."
},
{
"field": "count",
"description": "Number of entries returned."
}
],
"stepFunction": "listMemoryStep"
}
],
"runtime": {
"minTupiflowVersion": "0.0.0"
},
"identity": {
"name": "memory",
"type": "memory",
"version": "0.2.0",
"publisher": "tupiflow",
"description": "Per-thread long-term memory backed by Postgres + pgvector. Stores facts, preferences, and habits with versioned supersession."
},
"entrypoint": "bundle.mjs",
"capabilities": [
"secrets.read",
"db.read",
"db.write",
"llm.call"
],
"requiredExtensions": [
"vector"
]
} Signature
KYvvkfyCU50EjzdoUAM4JRKTVK43Peswa9nsyIcFM0ga0UoBBtvjdvPJvZDRJ6F/dUqmNL1KjABOC1xCMEUgAA==