@props-labs/mesh-os 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +258 -0
- package/dist/core/client.d.ts +142 -0
- package/dist/core/client.js +581 -0
- package/dist/core/taxonomy.d.ts +219 -0
- package/dist/core/taxonomy.js +131 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +20 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +146 -0
- package/package.json +54 -0
- package/src/templates/.env.example +18 -0
- package/src/templates/docker-compose.yml +55 -0
- package/src/templates/hasura/config.yaml +9 -0
- package/src/templates/hasura/metadata/config.yaml +1 -0
- package/src/templates/hasura/metadata/databases/databases.yaml +15 -0
- package/src/templates/hasura/metadata/databases/default/tables/public_agents.yaml +14 -0
- package/src/templates/hasura/metadata/databases/default/tables/public_memories.yaml +17 -0
- package/src/templates/hasura/metadata/databases/default/tables/public_memory_edges.yaml +57 -0
- package/src/templates/hasura/metadata/databases/default/tables/tables.yaml +54 -0
- package/src/templates/hasura/metadata/databases/default/tables/track_tables.yaml +14 -0
- package/src/templates/hasura/metadata/metadata.json +80 -0
- package/src/templates/hasura/metadata/version.yaml +1 -0
- package/src/templates/hasura/migrations/default/1_init/down.sql +13 -0
- package/src/templates/hasura/migrations/default/1_init/up.sql +218 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
- name: default
|
2
|
+
kind: postgres
|
3
|
+
configuration:
|
4
|
+
connection_info:
|
5
|
+
database_url:
|
6
|
+
from_env: HASURA_GRAPHQL_DATABASE_URL
|
7
|
+
isolation_level: read-committed
|
8
|
+
pool_settings:
|
9
|
+
connection_lifetime: 600
|
10
|
+
idle_timeout: 180
|
11
|
+
max_connections: 50
|
12
|
+
retries: 1
|
13
|
+
use_prepared_statements: true
|
14
|
+
tables: "!include default/tables/tables.yaml"
|
15
|
+
functions: []
|
@@ -0,0 +1,17 @@
|
|
1
|
+
table:
|
2
|
+
name: memories
|
3
|
+
schema: public
|
4
|
+
configuration:
|
5
|
+
custom_root_fields: {}
|
6
|
+
custom_name: memories
|
7
|
+
object_relationships:
|
8
|
+
- name: agent
|
9
|
+
using:
|
10
|
+
foreign_key_constraint_on: agent_id
|
11
|
+
computed_fields:
|
12
|
+
- name: similarity_score
|
13
|
+
definition:
|
14
|
+
function:
|
15
|
+
name: search_memories
|
16
|
+
schema: public
|
17
|
+
comment: Computes similarity score for vector search
|
@@ -0,0 +1,57 @@
|
|
1
|
+
table:
|
2
|
+
name: memory_edges
|
3
|
+
schema: public
|
4
|
+
is_enum: false
|
5
|
+
configuration:
|
6
|
+
column_config: {}
|
7
|
+
custom_column_names: {}
|
8
|
+
custom_name: memory_edges
|
9
|
+
custom_root_fields: {}
|
10
|
+
|
11
|
+
array_relationships: []
|
12
|
+
computed_fields: []
|
13
|
+
delete_permissions:
|
14
|
+
- role: admin
|
15
|
+
permission:
|
16
|
+
filter: {}
|
17
|
+
|
18
|
+
event_triggers: []
|
19
|
+
insert_permissions:
|
20
|
+
- role: admin
|
21
|
+
permission:
|
22
|
+
check: {}
|
23
|
+
columns:
|
24
|
+
- id
|
25
|
+
- source_memory
|
26
|
+
- target_memory
|
27
|
+
- relationship
|
28
|
+
- weight
|
29
|
+
- created_at
|
30
|
+
|
31
|
+
object_relationships:
|
32
|
+
- name: source
|
33
|
+
using:
|
34
|
+
foreign_key_constraint_on: source_memory
|
35
|
+
- name: target
|
36
|
+
using:
|
37
|
+
foreign_key_constraint_on: target_memory
|
38
|
+
|
39
|
+
select_permissions:
|
40
|
+
- role: admin
|
41
|
+
permission:
|
42
|
+
columns:
|
43
|
+
- id
|
44
|
+
- source_memory
|
45
|
+
- target_memory
|
46
|
+
- relationship
|
47
|
+
- weight
|
48
|
+
- created_at
|
49
|
+
filter: {}
|
50
|
+
|
51
|
+
update_permissions:
|
52
|
+
- role: admin
|
53
|
+
permission:
|
54
|
+
columns:
|
55
|
+
- weight
|
56
|
+
filter: {}
|
57
|
+
check: {}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
- table:
|
2
|
+
name: agents
|
3
|
+
schema: public
|
4
|
+
configuration:
|
5
|
+
custom_root_fields: {}
|
6
|
+
custom_name: agents
|
7
|
+
array_relationships:
|
8
|
+
- name: memories
|
9
|
+
using:
|
10
|
+
foreign_key_constraint_on:
|
11
|
+
column: agent_id
|
12
|
+
table:
|
13
|
+
name: memories
|
14
|
+
schema: public
|
15
|
+
|
16
|
+
- table:
|
17
|
+
name: memories
|
18
|
+
schema: public
|
19
|
+
configuration:
|
20
|
+
custom_root_fields: {}
|
21
|
+
custom_name: memories
|
22
|
+
object_relationships:
|
23
|
+
- name: agent
|
24
|
+
using:
|
25
|
+
foreign_key_constraint_on: agent_id
|
26
|
+
array_relationships:
|
27
|
+
- name: incoming_edges
|
28
|
+
using:
|
29
|
+
foreign_key_constraint_on:
|
30
|
+
column: target_memory
|
31
|
+
table:
|
32
|
+
name: memory_edges
|
33
|
+
schema: public
|
34
|
+
- name: outgoing_edges
|
35
|
+
using:
|
36
|
+
foreign_key_constraint_on:
|
37
|
+
column: source_memory
|
38
|
+
table:
|
39
|
+
name: memory_edges
|
40
|
+
schema: public
|
41
|
+
|
42
|
+
- table:
|
43
|
+
name: memory_edges
|
44
|
+
schema: public
|
45
|
+
configuration:
|
46
|
+
custom_root_fields: {}
|
47
|
+
custom_name: memory_edges
|
48
|
+
object_relationships:
|
49
|
+
- name: source
|
50
|
+
using:
|
51
|
+
foreign_key_constraint_on: source_memory
|
52
|
+
- name: target
|
53
|
+
using:
|
54
|
+
foreign_key_constraint_on: target_memory
|
@@ -0,0 +1,80 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"sources": [
|
4
|
+
{
|
5
|
+
"name": "default",
|
6
|
+
"kind": "postgres",
|
7
|
+
"tables": [
|
8
|
+
{
|
9
|
+
"table": {
|
10
|
+
"schema": "public",
|
11
|
+
"name": "agents"
|
12
|
+
},
|
13
|
+
"array_relationships": [
|
14
|
+
{
|
15
|
+
"name": "memories",
|
16
|
+
"using": {
|
17
|
+
"foreign_key_constraint_on": {
|
18
|
+
"column": "agent_id",
|
19
|
+
"table": {
|
20
|
+
"schema": "public",
|
21
|
+
"name": "memories"
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}
|
25
|
+
}
|
26
|
+
]
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"table": {
|
30
|
+
"schema": "public",
|
31
|
+
"name": "memories"
|
32
|
+
},
|
33
|
+
"object_relationships": [
|
34
|
+
{
|
35
|
+
"name": "agent",
|
36
|
+
"using": {
|
37
|
+
"foreign_key_constraint_on": "agent_id"
|
38
|
+
}
|
39
|
+
}
|
40
|
+
],
|
41
|
+
"computed_fields": [
|
42
|
+
{
|
43
|
+
"name": "similarity_score",
|
44
|
+
"definition": {
|
45
|
+
"function": {
|
46
|
+
"schema": "public",
|
47
|
+
"name": "search_memories"
|
48
|
+
}
|
49
|
+
},
|
50
|
+
"comment": "Computes similarity score for vector search"
|
51
|
+
}
|
52
|
+
]
|
53
|
+
}
|
54
|
+
],
|
55
|
+
"functions": [
|
56
|
+
{
|
57
|
+
"function": {
|
58
|
+
"schema": "public",
|
59
|
+
"name": "search_memories"
|
60
|
+
}
|
61
|
+
}
|
62
|
+
],
|
63
|
+
"configuration": {
|
64
|
+
"connection_info": {
|
65
|
+
"use_prepared_statements": true,
|
66
|
+
"database_url": {
|
67
|
+
"from_env": "HASURA_GRAPHQL_DATABASE_URL"
|
68
|
+
},
|
69
|
+
"isolation_level": "read-committed",
|
70
|
+
"pool_settings": {
|
71
|
+
"connection_lifetime": 600,
|
72
|
+
"retries": 1,
|
73
|
+
"idle_timeout": 180,
|
74
|
+
"max_connections": 50
|
75
|
+
}
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
79
|
+
]
|
80
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
version: 3
|
@@ -0,0 +1,13 @@
|
|
1
|
+
-- Drop functions
|
2
|
+
DROP FUNCTION IF EXISTS search_memories;
|
3
|
+
DROP FUNCTION IF EXISTS get_connected_memories;
|
4
|
+
DROP FUNCTION IF EXISTS update_updated_at_column;
|
5
|
+
|
6
|
+
-- Drop tables
|
7
|
+
DROP TABLE IF EXISTS public.memory_edges;
|
8
|
+
DROP TABLE IF EXISTS public.memories;
|
9
|
+
DROP TABLE IF EXISTS public.agents;
|
10
|
+
|
11
|
+
-- Drop extensions
|
12
|
+
DROP EXTENSION IF EXISTS vector;
|
13
|
+
DROP EXTENSION IF EXISTS "uuid-ossp";
|
@@ -0,0 +1,218 @@
|
|
1
|
+
-- Enable required extensions
|
2
|
+
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
3
|
+
CREATE EXTENSION IF NOT EXISTS "vector";
|
4
|
+
|
5
|
+
-- Create function to validate slugs
|
6
|
+
CREATE OR REPLACE FUNCTION validate_slug(slug text)
|
7
|
+
RETURNS boolean AS $$
|
8
|
+
BEGIN
|
9
|
+
RETURN slug ~ '^[a-z][a-z0-9_-]*[a-z0-9]$';
|
10
|
+
END;
|
11
|
+
$$ LANGUAGE plpgsql IMMUTABLE;
|
12
|
+
|
13
|
+
-- Create agents table
|
14
|
+
CREATE TABLE IF NOT EXISTS public.agents (
|
15
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
16
|
+
slug TEXT UNIQUE,
|
17
|
+
name TEXT NOT NULL,
|
18
|
+
description TEXT,
|
19
|
+
metadata JSONB,
|
20
|
+
status TEXT NOT NULL DEFAULT 'active',
|
21
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
22
|
+
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
23
|
+
CONSTRAINT valid_slug CHECK (slug IS NULL OR validate_slug(slug))
|
24
|
+
);
|
25
|
+
|
26
|
+
-- Create memories table
|
27
|
+
CREATE TABLE IF NOT EXISTS public.memories (
|
28
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
29
|
+
agent_id UUID REFERENCES public.agents(id) ON DELETE CASCADE,
|
30
|
+
content TEXT NOT NULL,
|
31
|
+
metadata JSONB,
|
32
|
+
embedding vector(1536), -- OpenAI text-embedding-3-small dimension
|
33
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
34
|
+
updated_at TIMESTAMPTZ DEFAULT NOW()
|
35
|
+
);
|
36
|
+
|
37
|
+
-- Create memory edges table
|
38
|
+
CREATE TABLE IF NOT EXISTS public.memory_edges (
|
39
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
40
|
+
source_memory UUID REFERENCES public.memories(id) ON DELETE CASCADE,
|
41
|
+
target_memory UUID REFERENCES public.memories(id) ON DELETE CASCADE,
|
42
|
+
relationship TEXT NOT NULL,
|
43
|
+
weight FLOAT DEFAULT 1.0,
|
44
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
45
|
+
);
|
46
|
+
|
47
|
+
-- Create index for vector similarity search
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_memories_embedding ON public.memories
|
49
|
+
USING ivfflat (embedding vector_cosine_ops)
|
50
|
+
WITH (lists = 100);
|
51
|
+
|
52
|
+
-- Create index for memory edges lookup
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_memory_edges_source ON public.memory_edges(source_memory);
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_memory_edges_target ON public.memory_edges(target_memory);
|
55
|
+
|
56
|
+
-- Create function to update updated_at timestamp
|
57
|
+
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
58
|
+
RETURNS TRIGGER AS $$
|
59
|
+
BEGIN
|
60
|
+
NEW.updated_at = NOW();
|
61
|
+
RETURN NEW;
|
62
|
+
END;
|
63
|
+
$$ language 'plpgsql';
|
64
|
+
|
65
|
+
-- Create triggers for updated_at
|
66
|
+
CREATE TRIGGER update_agents_updated_at
|
67
|
+
BEFORE UPDATE ON public.agents
|
68
|
+
FOR EACH ROW
|
69
|
+
EXECUTE FUNCTION update_updated_at_column();
|
70
|
+
|
71
|
+
CREATE TRIGGER update_memories_updated_at
|
72
|
+
BEFORE UPDATE ON public.memories
|
73
|
+
FOR EACH ROW
|
74
|
+
EXECUTE FUNCTION update_updated_at_column();
|
75
|
+
|
76
|
+
-- Create a view for memories with similarity
|
77
|
+
CREATE OR REPLACE VIEW public.memories_with_similarity AS
|
78
|
+
SELECT
|
79
|
+
m.*,
|
80
|
+
0::float8 as similarity -- Default similarity, will be replaced in search
|
81
|
+
FROM memories m;
|
82
|
+
|
83
|
+
-- Add function to normalize embeddings
|
84
|
+
CREATE OR REPLACE FUNCTION normalize_embedding()
|
85
|
+
RETURNS TRIGGER AS $$
|
86
|
+
BEGIN
|
87
|
+
IF NEW.embedding IS NOT NULL THEN
|
88
|
+
-- Normalize the embedding vector using l2_normalize
|
89
|
+
NEW.embedding = l2_normalize(NEW.embedding);
|
90
|
+
END IF;
|
91
|
+
RETURN NEW;
|
92
|
+
END;
|
93
|
+
$$ LANGUAGE plpgsql;
|
94
|
+
|
95
|
+
-- Create trigger to normalize embeddings on insert and update
|
96
|
+
CREATE TRIGGER normalize_memory_embedding
|
97
|
+
BEFORE INSERT OR UPDATE OF embedding ON public.memories
|
98
|
+
FOR EACH ROW
|
99
|
+
EXECUTE FUNCTION normalize_embedding();
|
100
|
+
|
101
|
+
-- Add a debug function to check vector normalization
|
102
|
+
CREATE OR REPLACE FUNCTION debug_vector_info(v vector(1536))
|
103
|
+
RETURNS TABLE (
|
104
|
+
original_norm float8,
|
105
|
+
normalized_norm float8,
|
106
|
+
is_normalized boolean
|
107
|
+
) AS $$
|
108
|
+
SELECT
|
109
|
+
sqrt(v <-> v) as original_norm,
|
110
|
+
sqrt(l2_normalize(v) <-> l2_normalize(v)) as normalized_norm,
|
111
|
+
abs(1 - sqrt(v <-> v)) < 0.000001 as is_normalized;
|
112
|
+
$$ LANGUAGE SQL IMMUTABLE;
|
113
|
+
|
114
|
+
-- Modify the search function to work with normalized embeddings
|
115
|
+
CREATE OR REPLACE FUNCTION public.search_memories(
|
116
|
+
query_embedding vector(1536),
|
117
|
+
match_threshold float8,
|
118
|
+
match_count integer,
|
119
|
+
filter_agent_id uuid DEFAULT NULL
|
120
|
+
)
|
121
|
+
RETURNS SETOF public.memories_with_similarity
|
122
|
+
LANGUAGE sql
|
123
|
+
STABLE
|
124
|
+
AS $$
|
125
|
+
WITH normalized_query AS (
|
126
|
+
SELECT l2_normalize(query_embedding) AS normalized_vector
|
127
|
+
)
|
128
|
+
SELECT
|
129
|
+
m.id,
|
130
|
+
m.agent_id,
|
131
|
+
m.content,
|
132
|
+
m.metadata,
|
133
|
+
m.embedding,
|
134
|
+
m.created_at,
|
135
|
+
m.updated_at,
|
136
|
+
-(m.embedding <#> (SELECT normalized_vector FROM normalized_query)) as similarity
|
137
|
+
FROM memories m
|
138
|
+
WHERE
|
139
|
+
CASE
|
140
|
+
WHEN filter_agent_id IS NOT NULL THEN m.agent_id = filter_agent_id
|
141
|
+
ELSE TRUE
|
142
|
+
END
|
143
|
+
-- Re-enable threshold with corrected sign
|
144
|
+
AND -(m.embedding <#> (SELECT normalized_vector FROM normalized_query)) >= match_threshold
|
145
|
+
ORDER BY -(m.embedding <#> (SELECT normalized_vector FROM normalized_query)) DESC
|
146
|
+
LIMIT match_count;
|
147
|
+
$$;
|
148
|
+
|
149
|
+
-- Track the function in Hasura
|
150
|
+
COMMENT ON FUNCTION public.search_memories IS E'@graphql({"type": "Query"})';
|
151
|
+
|
152
|
+
-- Create function to get connected memories
|
153
|
+
CREATE OR REPLACE FUNCTION get_connected_memories(
|
154
|
+
memory_id uuid,
|
155
|
+
relationship_type text DEFAULT NULL,
|
156
|
+
max_depth integer DEFAULT 1
|
157
|
+
)
|
158
|
+
RETURNS TABLE (
|
159
|
+
source_id UUID,
|
160
|
+
target_id UUID,
|
161
|
+
relationship TEXT,
|
162
|
+
weight FLOAT,
|
163
|
+
depth INTEGER
|
164
|
+
) AS $$
|
165
|
+
WITH RECURSIVE memory_graph AS (
|
166
|
+
-- Base case
|
167
|
+
SELECT
|
168
|
+
source_memory,
|
169
|
+
target_memory,
|
170
|
+
relationship,
|
171
|
+
weight,
|
172
|
+
1 as depth
|
173
|
+
FROM public.memory_edges
|
174
|
+
WHERE
|
175
|
+
(source_memory = memory_id OR target_memory = memory_id)
|
176
|
+
AND (relationship_type IS NULL OR relationship = relationship_type)
|
177
|
+
|
178
|
+
UNION
|
179
|
+
|
180
|
+
-- Recursive case
|
181
|
+
SELECT
|
182
|
+
e.source_memory,
|
183
|
+
e.target_memory,
|
184
|
+
e.relationship,
|
185
|
+
e.weight,
|
186
|
+
g.depth + 1
|
187
|
+
FROM public.memory_edges e
|
188
|
+
INNER JOIN memory_graph g ON
|
189
|
+
(e.source_memory = g.target_memory OR e.target_memory = g.source_memory)
|
190
|
+
WHERE
|
191
|
+
g.depth < max_depth
|
192
|
+
AND (relationship_type IS NULL OR e.relationship = relationship_type)
|
193
|
+
)
|
194
|
+
SELECT DISTINCT
|
195
|
+
source_memory as source_id,
|
196
|
+
target_memory as target_id,
|
197
|
+
relationship,
|
198
|
+
weight,
|
199
|
+
depth
|
200
|
+
FROM memory_graph;
|
201
|
+
$$ LANGUAGE SQL STABLE;
|
202
|
+
|
203
|
+
-- Add a function to inspect memory embeddings
|
204
|
+
CREATE OR REPLACE FUNCTION inspect_memory_embeddings()
|
205
|
+
RETURNS TABLE (
|
206
|
+
memory_id UUID,
|
207
|
+
content TEXT,
|
208
|
+
embedding_norm float8,
|
209
|
+
is_normalized boolean
|
210
|
+
) AS $$
|
211
|
+
SELECT
|
212
|
+
id,
|
213
|
+
content,
|
214
|
+
sqrt(embedding <-> embedding) as embedding_norm,
|
215
|
+
abs(1 - sqrt(embedding <-> embedding)) < 0.000001 as is_normalized
|
216
|
+
FROM memories
|
217
|
+
WHERE embedding IS NOT NULL;
|
218
|
+
$$ LANGUAGE SQL STABLE;
|