#ifndef TINY_CONVMEM_DOMAIN_MESSAGE_H #define TINY_CONVMEM_DOMAIN_MESSAGE_H #include #include #include #define TINY_MESSAGE_ID_LENGTH 26 #define TINY_SESSION_ID_MAX 256 #define TINY_CONTENT_MAX (1024U * 1024U) #define TINY_TOOL_CALL_ID_MAX 256 #define TINY_TAG_MAX 128 #define TINY_TAG_COUNT_MAX 32 #define TINY_QUERY_MAX 4096 #define TINY_SUMMARY_MAX 4096 #define TINY_RELATION_COUNT_MAX 32 #define TINY_SOURCE_COUNT_MAX 64 typedef enum tiny_role { TINY_ROLE_USER = 1, TINY_ROLE_ASSISTANT = 2, TINY_ROLE_SYSTEM = 3 } tiny_role_t; typedef enum tiny_memory_tier { TINY_TIER_SHORT = 1, TINY_TIER_MID = 2, TINY_TIER_LONG = 3, TINY_TIER_DISCARD = 4 } tiny_memory_tier_t; typedef enum tiny_memory_kind { TINY_KIND_CONVERSATION = 1, TINY_KIND_EPISODE, TINY_KIND_SEMANTIC, TINY_KIND_PROCEDURE, TINY_KIND_PREFERENCE, TINY_KIND_SUMMARY } tiny_memory_kind_t; typedef enum tiny_relation_type { TINY_RELATION_DEPENDS_ON = 1, TINY_RELATION_DERIVED_FROM, TINY_RELATION_SUPERSEDES, TINY_RELATION_RELATED_TO } tiny_relation_type_t; typedef struct tiny_relation { tiny_relation_type_t type; char message_id[TINY_MESSAGE_ID_LENGTH + 1]; } tiny_relation_t; typedef struct tiny_metadata { char *tool_call_id; char **tags; size_t tag_count; tiny_memory_tier_t memory_tier; tiny_memory_kind_t memory_kind; uint8_t importance; char *summary; tiny_relation_t *relations; size_t relation_count; char **source_message_ids; size_t source_count; } tiny_metadata_t; typedef uint32_t tiny_metadata_mask_t; #define TINY_METADATA_TOOL_CALL_ID UINT32_C(0x01) #define TINY_METADATA_TAGS UINT32_C(0x02) #define TINY_METADATA_TIER UINT32_C(0x04) #define TINY_METADATA_KIND UINT32_C(0x08) #define TINY_METADATA_IMPORTANCE UINT32_C(0x10) #define TINY_METADATA_SUMMARY UINT32_C(0x20) #define TINY_METADATA_RELATIONS UINT32_C(0x40) #define TINY_METADATA_SOURCES UINT32_C(0x80) #define TINY_METADATA_ALL UINT32_C(0xff) typedef struct tiny_message { char message_id[TINY_MESSAGE_ID_LENGTH + 1]; char *session_id; int64_t timestamp_ms; tiny_role_t role; char *content; tiny_metadata_t metadata; uint64_t revision; int64_t updated_at_ms; } tiny_message_t; void tiny_message_init(tiny_message_t *message); void tiny_message_free(tiny_message_t *message); int tiny_message_copy(tiny_message_t *destination, const tiny_message_t *source); const char *tiny_role_name(tiny_role_t role); bool tiny_role_parse(const char *value, tiny_role_t *role); const char *tiny_tier_name(tiny_memory_tier_t tier); bool tiny_tier_parse(const char *value, tiny_memory_tier_t *tier); const char *tiny_kind_name(tiny_memory_kind_t kind); bool tiny_kind_parse(const char *value, tiny_memory_kind_t *kind); const char *tiny_relation_type_name(tiny_relation_type_t type); bool tiny_relation_type_parse(const char *value, tiny_relation_type_t *type); bool tiny_utf8_valid(const char *value, size_t length); bool tiny_message_id_valid(const char *value); bool tiny_metadata_valid(const tiny_metadata_t *metadata); #endif