AiMemoryExportV1 ai.memory-export@1

Generated at from openvibe-contracts v0.419.0 and openvibe-sdk v0.161.0.

Version
1.0.0
Owner
ai
Visibility
first-party
Status
active
Compatibility
backward
Schema
https://openvibe.network/contracts/ai/memory-export.v1.json

ai.memory-export@1 (OpenVibe.AI; Memory M5): the one portable memory file. GET /api/v1/memory/export answers it, decrypted for the person's own export; POST /api/v1/memory/import accepts the same document (only `format`, `version` and `items` are read on import). Every item carries the text after redaction, its kind and scope, its source and the confidence the store had; ids, owners and merge/conflict links are deliberately absent, so a file can be moved to another account and imported without carrying anyone's identity. A profile is derived from the items and is rebuilt, never imported.

Fields

FieldTypeRequiredDescriptionConstraints
formatconstyes
  • = "openvibe.memory-export@1"
versionconstyes
  • = 1
exported_atstringyesWhen the file was written. Informational only; import never trusts it as an item time.
  • format date-time
itemsarray of objectyes
  • maxItems 10000
  • items: no other fields
items[].textstringyesThe item text after the store's own redaction. A secret that survived an older export is redacted again on import.
  • minLength 1
  • maxLength 8000
items[].kindenumyes
  • one of "preference", "fact", "project_rule", "procedure", "decision", "lesson"
items[].scopestringyes`user` for the person, or `project:<slug>` for a project. Never an absolute path.
  • pattern ^(user|project:[a-z0-9][a-z0-9._-]{0,63})$
items[].sourcestringyesThe adapter id (claude-code, cursor, …), the service (actor, vibe, know, person) or the memory-service adapter (mem0, letta, zep) the item came from.
  • minLength 1
  • maxLength 100
items[].source_refobject | nullThe path relative to the scanned root and the heading, when the item came from a file.
items[].statusenumDefaults to active on import. A conflict item is imported as suggested: its pair did not come with it.
  • one of "active", "suggested", "archived", "conflict"
items[].confidencenumber
  • minimum 0
  • maximum 1
items[].machinestring | nullThe Link machine id the item came from, when it came from one.
  • maxLength 100
items[].seen_atstring
  • format date-time
items[].created_atstring
  • format date-time

Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

Valid: export
{
  "format": "openvibe.memory-export@1",
  "version": 1,
  "exported_at": "2026-11-07T09:30:00.000Z",
  "items": [
    {
      "text": "Prefers short, direct answers.",
      "kind": "preference",
      "scope": "user",
      "source": "claude-code",
      "source_ref": {
        "path": ".claude/CLAUDE.md",
        "heading": "Style"
      },
      "status": "active",
      "confidence": 1,
      "machine": "node_01J8Z3Q4R5S6T7V8W9X0Y1Z2J",
      "seen_at": "2026-11-01T10:00:00.000Z",
      "created_at": "2026-10-30T10:00:00.000Z"
    },
    {
      "text": "Run the narrowest test before the suite.",
      "kind": "project_rule",
      "scope": "project:openvibe-ai",
      "source": "mem0",
      "confidence": 0.8
    }
  ]
}
Valid: minimal
{
  "format": "openvibe.memory-export@1",
  "version": 1,
  "exported_at": "2026-11-07T09:30:00.000Z",
  "items": []
}
Rejected: absolute-scope
{
  "format": "openvibe.memory-export@1",
  "version": 1,
  "exported_at": "2026-11-07T09:30:00.000Z",
  "items": [
    {
      "text": "A note with an absolute path for a scope.",
      "kind": "fact",
      "scope": "project:/home/ada/secret",
      "source": "claude-code"
    }
  ]
}
Rejected: wrong-format
{
  "format": "openvibe.memory@2",
  "version": 2,
  "exported_at": "2026-11-07T09:30:00.000Z",
  "items": []
}

Validate

const contracts = require('openvibe-contracts');
contracts.validate('ai.memory-export@1', value);   // { valid, errors: [{ path, message }] }