tupiflow registry /plugins/memory/0.5.0

memory @ 0.5.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": "5760e11b09170b70d544adea0881f49237ba7efc9896f53427f1a2103bb3be54",
    "sizeBytes": 6590
  },
  "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.5.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",
    "agent.tool-runtime"
  ],
  "requiredExtensions": [
    "vector"
  ]
}

Signature

3T8thUysCXTpc9nIp0cfeYLddZJMS9ISmjDMR02cmGWL8b0XKnuxiyByogGI6s+rYyw0kSueA0FwSw5cQM3ABA==