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
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
format | const | yes |
| |
version | const | yes |
| |
exported_at | string | yes | When the file was written. Informational only; import never trusts it as an item time. |
|
items | array of object | yes |
| |
items[].text | string | yes | The item text after the store's own redaction. A secret that survived an older export is redacted again on import. |
|
items[].kind | enum | yes |
| |
items[].scope | string | yes | `user` for the person, or `project:<slug>` for a project. Never an absolute path. |
|
items[].source | string | yes | The adapter id (claude-code, cursor, …), the service (actor, vibe, know, person) or the memory-service adapter (mem0, letta, zep) the item came from. |
|
items[].source_ref | object | null | The path relative to the scanned root and the heading, when the item came from a file. | ||
items[].status | enum | Defaults to active on import. A conflict item is imported as suggested: its pair did not come with it. |
| |
items[].confidence | number |
| ||
items[].machine | string | null | The Link machine id the item came from, when it came from one. |
| |
items[].seen_at | string |
| ||
items[].created_at | string |
|
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 }] }