agentmesh-ai 0.3.1 → 0.4.0
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/GUIDE.md +20 -24
- package/README.md +50 -0
- package/dist/cloud/cloud-conversation.js +1 -1
- package/dist/cloud/cloud-conversation.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/conversation-tools.d.ts.map +1 -1
- package/dist/mcp/conversation-tools.js +159 -7
- package/dist/mcp/conversation-tools.js.map +1 -1
- package/dist/mcp/index.js +32 -10
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/memory-tools.d.ts.map +1 -1
- package/dist/mcp/memory-tools.js +99 -22
- package/dist/mcp/memory-tools.js.map +1 -1
- package/dist/memory/consolidator.d.ts +54 -0
- package/dist/memory/consolidator.d.ts.map +1 -0
- package/dist/memory/consolidator.js +173 -0
- package/dist/memory/consolidator.js.map +1 -0
- package/dist/memory/index.d.ts +2 -1
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +2 -1
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/merge-view.d.ts +6 -1
- package/dist/memory/merge-view.d.ts.map +1 -1
- package/dist/memory/merge-view.js +136 -15
- package/dist/memory/merge-view.js.map +1 -1
- package/dist/memory/schema.d.ts +32 -8
- package/dist/memory/schema.d.ts.map +1 -1
- package/dist/memory/schema.js +4 -1
- package/dist/memory/schema.js.map +1 -1
- package/dist/memory/searcher.d.ts +15 -4
- package/dist/memory/searcher.d.ts.map +1 -1
- package/dist/memory/searcher.js +80 -28
- package/dist/memory/searcher.js.map +1 -1
- package/dist/memory/types.d.ts +23 -2
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/write-utils.d.ts +5 -1
- package/dist/memory/write-utils.d.ts.map +1 -1
- package/dist/memory/write-utils.js +37 -0
- package/dist/memory/write-utils.js.map +1 -1
- package/dist/sdk.d.ts +95 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +177 -0
- package/dist/sdk.js.map +1 -0
- package/dist/utils/id.d.ts +1 -1
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +2 -2
- package/dist/utils/id.js.map +1 -1
- package/package.json +5 -1
- package/test-realtime.mjs +97 -0
- package/test-realtime2.mjs +43 -0
- package/test-realtime3.mjs +73 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-utils.d.ts","sourceRoot":"","sources":["../../src/memory/write-utils.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"write-utils.d.ts","sourceRoot":"","sources":["../../src/memory/write-utils.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9H,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IAAE,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,YAAY,CAEtG;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,eAAe,EAAE,EAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,OAAO,CAAC,EAAE,WAAW,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CA8BrD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAa9F;AAYD,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAa3E;AAED,8EAA8E;AAC9E,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAIlD;AAED,kDAAkD;AAClD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAkBtF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EAAE,EACtB,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,kBAAkB,GAC1B,IAAI,CAiBN"}
|
|
@@ -59,15 +59,52 @@ export function validateContent(content) {
|
|
|
59
59
|
}
|
|
60
60
|
return { warnings: scanResult.warnings };
|
|
61
61
|
}
|
|
62
|
+
/** Tag-to-category mapping for automatic inference. */
|
|
63
|
+
const TAG_TO_CATEGORY = {
|
|
64
|
+
'api': 'api', 'endpoint': 'api', 'route': 'api', 'rest': 'api', 'graphql': 'api', 'interface': 'api',
|
|
65
|
+
'convention': 'convention', 'naming': 'convention', 'style': 'convention', 'pattern': 'convention', 'standard': 'convention',
|
|
66
|
+
'bug': 'gotcha', 'gotcha': 'gotcha', 'workaround': 'gotcha', 'pitfall': 'gotcha', 'fix': 'gotcha',
|
|
67
|
+
'decision': 'decision', 'architecture': 'decision', 'tech-stack': 'decision', 'choice': 'decision', 'design': 'decision',
|
|
68
|
+
'dependency': 'dependency', 'library': 'dependency', 'package': 'dependency', 'framework': 'dependency', 'tool': 'dependency',
|
|
69
|
+
'preference': 'user_pref', 'user': 'user_pref',
|
|
70
|
+
};
|
|
71
|
+
/** Infer category from tags and topic when not explicitly provided. */
|
|
72
|
+
export function inferCategory(tags, topic) {
|
|
73
|
+
// Check tags first
|
|
74
|
+
for (const tag of tags) {
|
|
75
|
+
const cat = TAG_TO_CATEGORY[tag.toLowerCase()];
|
|
76
|
+
if (cat)
|
|
77
|
+
return cat;
|
|
78
|
+
}
|
|
79
|
+
// Check topic words
|
|
80
|
+
const topicWords = topic.toLowerCase().split(/\s+/);
|
|
81
|
+
for (const word of topicWords) {
|
|
82
|
+
const cat = TAG_TO_CATEGORY[word];
|
|
83
|
+
if (cat)
|
|
84
|
+
return cat;
|
|
85
|
+
}
|
|
86
|
+
return 'project_fact';
|
|
87
|
+
}
|
|
88
|
+
/** Check if an entry represents a rule (convention or protected decision). */
|
|
89
|
+
export function isRule(entry) {
|
|
90
|
+
const status = getEffectiveStatus(entry);
|
|
91
|
+
const category = entry.category ?? inferCategory(entry.tags, entry.topic);
|
|
92
|
+
return category === 'convention' || (category === 'decision' && status === 'protected');
|
|
93
|
+
}
|
|
62
94
|
/** Build a new MemoryEntry from write options. */
|
|
63
95
|
export function buildMemoryEntry(options, now) {
|
|
64
96
|
const resolvedStatus = getEffectiveStatus({ status: options.status, protected: options.protected });
|
|
97
|
+
const category = options.category ?? inferCategory(options.tags, options.topic);
|
|
98
|
+
const summary = options.summary ?? options.content.slice(0, 60).replace(/\n/g, ' ');
|
|
65
99
|
return {
|
|
66
100
|
topic: options.topic,
|
|
67
101
|
tags: options.tags,
|
|
68
102
|
content: options.content,
|
|
69
103
|
date: now,
|
|
70
104
|
status: resolvedStatus,
|
|
105
|
+
category,
|
|
106
|
+
summary,
|
|
107
|
+
...(options.scope === 'private' ? { scope: 'private' } : {}),
|
|
71
108
|
...(options.decided_with ? { decided_with: options.decided_with } : {}),
|
|
72
109
|
...(resolvedStatus === 'protected' ? { protected: true } : {}),
|
|
73
110
|
...(options.owner ? { owner: options.owner } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-utils.js","sourceRoot":"","sources":["../../src/memory/write-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,KAAqD;IACtF,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,WAA8B,EAC9B,OAAe,EACf,KAAa;IAEb,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO;YAAE,SAAS;QAEvC,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CACnD,CAAC;QACF,IAAI,CAAC,aAAa;YAAE,SAAS;QAE7B,MAAM,eAAe,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAE1D,IAAI,eAAe,KAAK,WAAW,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;YAClD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE;wBACP,OAAO,EAAE,KAAK;wBACd,OAAO,EAAE,IAAI;wBACb,MAAM,EAAE,UAAU,KAAK,oDAAoD,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,sNAAsN,KAAK,MAAM,OAAO,UAAU;qBAC1Y;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,eAAe,KAAK,UAAU,EAAE,CAAC;YAC1C,OAAO;gBACL,eAAe,EAAE,SAAS,MAAM,CAAC,KAAK,uBAAuB,aAAa,CAAC,KAAK,wEAAwE;aACzJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE;gBACP,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,oEAAoE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,8CAA8C;aACzJ;YACD,QAAQ,EAAE,UAAU,CAAC,QAAQ;SAC9B,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,gBAAgB,CAAC,OAA2B,EAAE,GAAW;IACvE,MAAM,cAAc,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"write-utils.js","sourceRoot":"","sources":["../../src/memory/write-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,KAAqD;IACtF,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,WAA8B,EAC9B,OAAe,EACf,KAAa;IAEb,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO;YAAE,SAAS;QAEvC,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CACvC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CACnD,CAAC;QACF,IAAI,CAAC,aAAa;YAAE,SAAS;QAE7B,MAAM,eAAe,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAE1D,IAAI,eAAe,KAAK,WAAW,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;YAClD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE;wBACP,OAAO,EAAE,KAAK;wBACd,OAAO,EAAE,IAAI;wBACb,MAAM,EAAE,UAAU,KAAK,oDAAoD,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,sNAAsN,KAAK,MAAM,OAAO,UAAU;qBAC1Y;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,eAAe,KAAK,UAAU,EAAE,CAAC;YAC1C,OAAO;gBACL,eAAe,EAAE,SAAS,MAAM,CAAC,KAAK,uBAAuB,aAAa,CAAC,KAAK,wEAAwE;aACzJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE;gBACP,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,oEAAoE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,8CAA8C;aACzJ;YACD,QAAQ,EAAE,UAAU,CAAC,QAAQ;SAC9B,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,uDAAuD;AACvD,MAAM,eAAe,GAAmC;IACtD,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK;IACpG,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY;IAC5H,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ;IACjG,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU;IACxH,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY;IAC7H,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW;CAC/C,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,IAAc,EAAE,KAAa;IACzD,mBAAmB;IACnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/C,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IACD,oBAAoB;IACpB,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,MAAM,CAAC,KAAkB;IACvC,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1E,OAAO,QAAQ,KAAK,YAAY,IAAI,CAAC,QAAQ,KAAK,UAAU,IAAI,MAAM,KAAK,WAAW,CAAC,CAAC;AAC1F,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,gBAAgB,CAAC,OAA2B,EAAE,GAAW;IACvE,MAAM,cAAc,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACpG,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAEpF,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,cAAc;QACtB,QAAQ;QACR,OAAO;QACP,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,cAAc,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,OAAsB,EACtB,QAAqB,EACrB,OAA2B;IAE3B,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CACrC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAC5D,CAAC;IAEF,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,UAAU,CAAC,EAAE,CAAC;YACrG,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC;YAC5B,IAAI,SAAS,KAAK,WAAW;gBAAE,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC;YACzD,IAAI,QAAQ,CAAC,KAAK;gBAAE,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
|
package/dist/sdk.d.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { MemoryCategory, MemoryStatus, MemoryScope, MergedMemoryEntry, WriteResult } from './memory/types.js';
|
|
2
|
+
import type { HealthReport } from './memory/consolidator.js';
|
|
3
|
+
import type { StoredMessage } from './conversation/protocol.js';
|
|
4
|
+
/** Options for creating an AgentMeshClient. */
|
|
5
|
+
export interface AgentMeshClientOptions {
|
|
6
|
+
/** Cloud team ID (e.g. 'team-a1b2c3d4e5f6a7b8'). */
|
|
7
|
+
teamId: string;
|
|
8
|
+
/** Unique ID for this agent (e.g. 'researcher', 'writer-agent'). */
|
|
9
|
+
agentId: string;
|
|
10
|
+
/** Human-readable role (e.g. 'Research Agent'). Default: 'agent'. */
|
|
11
|
+
agentRole?: string;
|
|
12
|
+
/** The framework/tool name (e.g. 'crewai', 'autogen'). Default: 'sdk'. */
|
|
13
|
+
agentTool?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Options for reading memory. */
|
|
16
|
+
export interface ReadMemoryOpts {
|
|
17
|
+
/** Read full details for specific topics only. */
|
|
18
|
+
topics?: string[];
|
|
19
|
+
/** Filter by tags. */
|
|
20
|
+
tags?: string[];
|
|
21
|
+
/** Filter by category. */
|
|
22
|
+
category?: MemoryCategory;
|
|
23
|
+
/** Filter by a specific agent. */
|
|
24
|
+
agent?: string;
|
|
25
|
+
/** Max entries (default 50). */
|
|
26
|
+
limit?: number;
|
|
27
|
+
}
|
|
28
|
+
/** Options for writing memory. */
|
|
29
|
+
export interface WriteMemoryOpts {
|
|
30
|
+
topic: string;
|
|
31
|
+
content: string;
|
|
32
|
+
tags: string[];
|
|
33
|
+
category?: MemoryCategory;
|
|
34
|
+
summary?: string;
|
|
35
|
+
status?: MemoryStatus;
|
|
36
|
+
scope?: MemoryScope;
|
|
37
|
+
decided_with?: string[];
|
|
38
|
+
owner?: string;
|
|
39
|
+
}
|
|
40
|
+
/** Options for searching memory. */
|
|
41
|
+
export interface SearchMemoryOpts {
|
|
42
|
+
category?: MemoryCategory;
|
|
43
|
+
limit?: number;
|
|
44
|
+
}
|
|
45
|
+
/** Options for waiting for replies. */
|
|
46
|
+
export interface WaitForRepliesOpts {
|
|
47
|
+
/** Max wait time in ms (default 60000). */
|
|
48
|
+
timeoutMs?: number;
|
|
49
|
+
/** Poll interval in ms (default 5000). */
|
|
50
|
+
pollIntervalMs?: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* AgentMesh SDK client for programmatic access to shared memory and messaging.
|
|
54
|
+
*
|
|
55
|
+
* Designed for agent frameworks (CrewAI, AutoGen, LangGraph, etc.) and
|
|
56
|
+
* any Node.js application that needs persistent cross-agent knowledge sharing.
|
|
57
|
+
*/
|
|
58
|
+
export declare class AgentMeshClient {
|
|
59
|
+
private teamId;
|
|
60
|
+
private agentId;
|
|
61
|
+
private agentRole;
|
|
62
|
+
private agentTool;
|
|
63
|
+
constructor(options: AgentMeshClientOptions);
|
|
64
|
+
/**
|
|
65
|
+
* Read shared memory.
|
|
66
|
+
* Without `topics`: returns all entries (filtered by tags/category/agent).
|
|
67
|
+
* With `topics`: returns full details for specific topics only.
|
|
68
|
+
*/
|
|
69
|
+
readMemory(opts?: ReadMemoryOpts): Promise<MergedMemoryEntry[]>;
|
|
70
|
+
/**
|
|
71
|
+
* Read memory and return a formatted string (index or full details).
|
|
72
|
+
* Useful for injecting into agent prompts.
|
|
73
|
+
*/
|
|
74
|
+
readMemoryFormatted(opts?: ReadMemoryOpts): Promise<string>;
|
|
75
|
+
/** Write a knowledge entry to shared memory. */
|
|
76
|
+
writeMemory(opts: WriteMemoryOpts): Promise<WriteResult>;
|
|
77
|
+
/** Search shared memory by keyword. */
|
|
78
|
+
searchMemory(query: string, opts?: SearchMemoryOpts): Promise<MergedMemoryEntry[]>;
|
|
79
|
+
/** Analyze memory health — find duplicates, stale entries, conflicts. */
|
|
80
|
+
consolidate(): Promise<HealthReport>;
|
|
81
|
+
/** Get a formatted health report string. */
|
|
82
|
+
consolidateFormatted(): Promise<string>;
|
|
83
|
+
/** Send a message to a discussion topic (REST mode, no WebSocket needed). */
|
|
84
|
+
sendMessage(topic: string, content: string): Promise<void>;
|
|
85
|
+
/** Get messages for a topic, optionally since a timestamp. */
|
|
86
|
+
getMessages(topic: string, opts?: {
|
|
87
|
+
since?: string;
|
|
88
|
+
}): Promise<StoredMessage[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Wait for replies on a topic by polling the database.
|
|
91
|
+
* Returns new messages from other agents, or empty array on timeout.
|
|
92
|
+
*/
|
|
93
|
+
waitForReplies(topic: string, opts?: WaitForRepliesOpts): Promise<StoredMessage[]>;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk.js
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentMesh SDK — programmatic access to shared memory and conversation.
|
|
3
|
+
*
|
|
4
|
+
* Use this when integrating AgentMesh into agent frameworks (CrewAI, AutoGen,
|
|
5
|
+
* LangGraph, etc.) or any Node.js/TypeScript application.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { AgentMeshClient } from 'agentmesh-ai';
|
|
10
|
+
*
|
|
11
|
+
* const client = new AgentMeshClient({
|
|
12
|
+
* teamId: 'team-a1b2c3d4e5f6a7b8',
|
|
13
|
+
* agentId: 'researcher',
|
|
14
|
+
* agentRole: 'Research Agent',
|
|
15
|
+
* agentTool: 'crewai',
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // Read team knowledge
|
|
19
|
+
* const memories = await client.readMemory();
|
|
20
|
+
*
|
|
21
|
+
* // Write knowledge
|
|
22
|
+
* await client.writeMemory({
|
|
23
|
+
* topic: 'Data Sources',
|
|
24
|
+
* content: 'Bloomberg API is reliable for financial data',
|
|
25
|
+
* tags: ['data', 'api'],
|
|
26
|
+
* category: 'project_fact',
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // Search
|
|
30
|
+
* const results = await client.searchMemory('authentication');
|
|
31
|
+
*
|
|
32
|
+
* // Send a message to other agents
|
|
33
|
+
* await client.sendMessage('API Design', 'I suggest REST over GraphQL');
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
import { cloudReadAllMemories, cloudWriteMemory, getSupabaseClient, } from './cloud/supabase-client.js';
|
|
37
|
+
import { searchMemories } from './memory/searcher.js';
|
|
38
|
+
import { mergeMemories, formatMemoryIndex, formatMergedMemories } from './memory/merge-view.js';
|
|
39
|
+
import { analyzeMemoryHealth, formatHealthReport } from './memory/consolidator.js';
|
|
40
|
+
/**
|
|
41
|
+
* AgentMesh SDK client for programmatic access to shared memory and messaging.
|
|
42
|
+
*
|
|
43
|
+
* Designed for agent frameworks (CrewAI, AutoGen, LangGraph, etc.) and
|
|
44
|
+
* any Node.js application that needs persistent cross-agent knowledge sharing.
|
|
45
|
+
*/
|
|
46
|
+
export class AgentMeshClient {
|
|
47
|
+
teamId;
|
|
48
|
+
agentId;
|
|
49
|
+
agentRole;
|
|
50
|
+
agentTool;
|
|
51
|
+
constructor(options) {
|
|
52
|
+
this.teamId = options.teamId;
|
|
53
|
+
this.agentId = options.agentId;
|
|
54
|
+
this.agentRole = options.agentRole ?? 'agent';
|
|
55
|
+
this.agentTool = options.agentTool ?? 'sdk';
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Read shared memory.
|
|
59
|
+
* Without `topics`: returns all entries (filtered by tags/category/agent).
|
|
60
|
+
* With `topics`: returns full details for specific topics only.
|
|
61
|
+
*/
|
|
62
|
+
async readMemory(opts) {
|
|
63
|
+
const memories = await cloudReadAllMemories(this.teamId);
|
|
64
|
+
return mergeMemories(memories, {
|
|
65
|
+
topics: opts?.topics,
|
|
66
|
+
tags: opts?.tags,
|
|
67
|
+
agent: opts?.agent,
|
|
68
|
+
limit: opts?.topics ? undefined : (opts?.limit ?? 50),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Read memory and return a formatted string (index or full details).
|
|
73
|
+
* Useful for injecting into agent prompts.
|
|
74
|
+
*/
|
|
75
|
+
async readMemoryFormatted(opts) {
|
|
76
|
+
const entries = await this.readMemory(opts);
|
|
77
|
+
if (opts?.topics && opts.topics.length > 0) {
|
|
78
|
+
return formatMergedMemories(entries);
|
|
79
|
+
}
|
|
80
|
+
return formatMemoryIndex(entries, this.agentId);
|
|
81
|
+
}
|
|
82
|
+
/** Write a knowledge entry to shared memory. */
|
|
83
|
+
async writeMemory(opts) {
|
|
84
|
+
return cloudWriteMemory(this.teamId, this.agentId, this.agentRole, this.agentTool, {
|
|
85
|
+
topic: opts.topic,
|
|
86
|
+
content: opts.content,
|
|
87
|
+
tags: opts.tags,
|
|
88
|
+
category: opts.category,
|
|
89
|
+
summary: opts.summary,
|
|
90
|
+
status: opts.status,
|
|
91
|
+
scope: opts.scope,
|
|
92
|
+
decided_with: opts.decided_with,
|
|
93
|
+
owner: opts.owner,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** Search shared memory by keyword. */
|
|
97
|
+
async searchMemory(query, opts) {
|
|
98
|
+
const memories = await cloudReadAllMemories(this.teamId);
|
|
99
|
+
return searchMemories(memories, query, {
|
|
100
|
+
category: opts?.category,
|
|
101
|
+
limit: opts?.limit,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/** Analyze memory health — find duplicates, stale entries, conflicts. */
|
|
105
|
+
async consolidate() {
|
|
106
|
+
const memories = await cloudReadAllMemories(this.teamId);
|
|
107
|
+
const allEntries = mergeMemories(memories, { limit: 999 });
|
|
108
|
+
return analyzeMemoryHealth(allEntries);
|
|
109
|
+
}
|
|
110
|
+
/** Get a formatted health report string. */
|
|
111
|
+
async consolidateFormatted() {
|
|
112
|
+
const report = await this.consolidate();
|
|
113
|
+
return formatHealthReport(report);
|
|
114
|
+
}
|
|
115
|
+
/** Send a message to a discussion topic (REST mode, no WebSocket needed). */
|
|
116
|
+
async sendMessage(topic, content) {
|
|
117
|
+
const supabase = getSupabaseClient();
|
|
118
|
+
const { error } = await supabase.from('team_messages').insert({
|
|
119
|
+
team_id: this.teamId,
|
|
120
|
+
topic,
|
|
121
|
+
agent_id: this.agentId,
|
|
122
|
+
agent_display_name: this.agentId,
|
|
123
|
+
agent_role: this.agentRole,
|
|
124
|
+
agent_tool: this.agentTool,
|
|
125
|
+
content,
|
|
126
|
+
message_type: 'message',
|
|
127
|
+
});
|
|
128
|
+
if (error) {
|
|
129
|
+
throw new Error(`Failed to send message: ${error.message}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** Get messages for a topic, optionally since a timestamp. */
|
|
133
|
+
async getMessages(topic, opts) {
|
|
134
|
+
const supabase = getSupabaseClient();
|
|
135
|
+
let query = supabase
|
|
136
|
+
.from('team_messages')
|
|
137
|
+
.select('*')
|
|
138
|
+
.eq('team_id', this.teamId)
|
|
139
|
+
.eq('topic', topic)
|
|
140
|
+
.order('created_at', { ascending: true });
|
|
141
|
+
if (opts?.since) {
|
|
142
|
+
query = query.gt('created_at', opts.since);
|
|
143
|
+
}
|
|
144
|
+
const { data } = await query;
|
|
145
|
+
return (data ?? []).map(row => ({
|
|
146
|
+
from: {
|
|
147
|
+
id: row.agent_id,
|
|
148
|
+
displayName: row.agent_display_name,
|
|
149
|
+
role: row.agent_role,
|
|
150
|
+
tool: row.agent_tool,
|
|
151
|
+
},
|
|
152
|
+
topic: row.topic,
|
|
153
|
+
content: row.content,
|
|
154
|
+
timestamp: row.created_at,
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Wait for replies on a topic by polling the database.
|
|
159
|
+
* Returns new messages from other agents, or empty array on timeout.
|
|
160
|
+
*/
|
|
161
|
+
async waitForReplies(topic, opts) {
|
|
162
|
+
const timeoutMs = opts?.timeoutMs ?? 60000;
|
|
163
|
+
const pollIntervalMs = opts?.pollIntervalMs ?? 5000;
|
|
164
|
+
const since = new Date().toISOString();
|
|
165
|
+
const deadline = Date.now() + timeoutMs;
|
|
166
|
+
while (Date.now() < deadline) {
|
|
167
|
+
await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
|
|
168
|
+
const replies = await this.getMessages(topic, { since });
|
|
169
|
+
const fromOthers = replies.filter(m => m.from.id !== this.agentId);
|
|
170
|
+
if (fromOthers.length > 0) {
|
|
171
|
+
return fromOthers;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=sdk.js.map
|
package/dist/sdk.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/id.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Generate a unique team ID (
|
|
1
|
+
/** Generate a unique team ID. 16 hex chars = 8 bytes = 2^64 possibilities (unguessable). */
|
|
2
2
|
export declare function generateTeamId(): string;
|
|
3
3
|
/** Generate a slug-style agent ID from display name and tool. */
|
|
4
4
|
export declare function generateAgentId(displayName: string, tool: string): string;
|
package/dist/utils/id.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAKA,
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAKA,4FAA4F;AAC5F,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CASzE"}
|
package/dist/utils/id.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Agent ID generation utilities.
|
|
3
3
|
*/
|
|
4
4
|
import { randomBytes } from 'node:crypto';
|
|
5
|
-
/** Generate a unique team ID (
|
|
5
|
+
/** Generate a unique team ID. 16 hex chars = 8 bytes = 2^64 possibilities (unguessable). */
|
|
6
6
|
export function generateTeamId() {
|
|
7
|
-
return `team-${randomBytes(
|
|
7
|
+
return `team-${randomBytes(8).toString('hex')}`;
|
|
8
8
|
}
|
|
9
9
|
/** Generate a slug-style agent ID from display name and tool. */
|
|
10
10
|
export function generateAgentId(displayName, tool) {
|
package/dist/utils/id.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,4FAA4F;AAC5F,MAAM,UAAU,cAAc;IAC5B,OAAO,QAAQ,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAClD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,eAAe,CAAC,WAAmB,EAAE,IAAY;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/B,qFAAqF;IACrF,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,QAAQ,IAAI,QAAQ,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IAEtE,OAAO,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC;AACnC,CAAC;AAED,mFAAmF;AACnF,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,GAAG;SACP,WAAW,EAAE;SACb,IAAI,EAAE;QACP,2DAA2D;SAC1D,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;SACjC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAG,0CAA0C;SACpE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAO,4BAA4B;SACtD,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAI,gCAAgC;AAC/D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentmesh-ai",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Let your AI agents share knowledge and talk to each other",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
"types": "./dist/index.d.ts",
|
|
15
15
|
"default": "./dist/index.js"
|
|
16
16
|
},
|
|
17
|
+
"./sdk": {
|
|
18
|
+
"types": "./dist/sdk.d.ts",
|
|
19
|
+
"default": "./dist/sdk.js"
|
|
20
|
+
},
|
|
17
21
|
"./mcp": {
|
|
18
22
|
"types": "./dist/mcp/index.d.ts",
|
|
19
23
|
"default": "./dist/mcp/index.js"
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { createClient } from '@supabase/supabase-js';
|
|
2
|
+
|
|
3
|
+
const SUPABASE_URL = 'https://hbdrhdeqyioxkzmoxnjp.supabase.co';
|
|
4
|
+
const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImhiZHJoZGVxeWlveGt6bW94bmpwIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzUxMzY4MTYsImV4cCI6MjA5MDcxMjgxNn0.BDKzJt4XQ1yS9eIoO0dp2Mx7flxU2eEwxfD8kAIlw_w';
|
|
5
|
+
|
|
6
|
+
console.log('=== Supabase Realtime Diagnostic ===\n');
|
|
7
|
+
|
|
8
|
+
// Test 1: REST API
|
|
9
|
+
console.log('Test 1: REST API...');
|
|
10
|
+
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
|
|
11
|
+
try {
|
|
12
|
+
const { data, error } = await supabase.from('team_memories').select('count').limit(1);
|
|
13
|
+
if (error) console.log(' REST FAIL:', error.message);
|
|
14
|
+
else console.log(' REST OK');
|
|
15
|
+
} catch (e) {
|
|
16
|
+
console.log(' REST FAIL:', e.message);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Test 2: WebSocket URL reachability
|
|
20
|
+
console.log('\nTest 2: WebSocket URL...');
|
|
21
|
+
const wsUrl = SUPABASE_URL.replace('https://', 'wss://') + '/realtime/v1/websocket?apikey=' + SUPABASE_ANON_KEY + '&vsn=1.0.0';
|
|
22
|
+
console.log(' URL:', wsUrl.slice(0, 80) + '...');
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const { default: WebSocket } = await import('ws');
|
|
26
|
+
const ws = new WebSocket(wsUrl);
|
|
27
|
+
|
|
28
|
+
await new Promise((resolve, reject) => {
|
|
29
|
+
const timeout = setTimeout(() => {
|
|
30
|
+
ws.close();
|
|
31
|
+
reject(new Error('WebSocket connection timeout (15s)'));
|
|
32
|
+
}, 15000);
|
|
33
|
+
|
|
34
|
+
ws.on('open', () => {
|
|
35
|
+
clearTimeout(timeout);
|
|
36
|
+
console.log(' WebSocket OPEN - connected!');
|
|
37
|
+
ws.close();
|
|
38
|
+
resolve();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
ws.on('error', (err) => {
|
|
42
|
+
clearTimeout(timeout);
|
|
43
|
+
console.log(' WebSocket ERROR:', err.message);
|
|
44
|
+
reject(err);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
ws.on('close', (code, reason) => {
|
|
48
|
+
console.log(' WebSocket CLOSED: code=' + code, 'reason=' + reason.toString());
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
} catch (e) {
|
|
52
|
+
console.log(' WebSocket FAIL:', e.message);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Test 3: Supabase Realtime channel
|
|
56
|
+
console.log('\nTest 3: Supabase Realtime channel subscribe...');
|
|
57
|
+
try {
|
|
58
|
+
const channel = supabase.channel('test-diagnostic', {
|
|
59
|
+
config: { broadcast: { self: true } },
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const result = await new Promise((resolve, reject) => {
|
|
63
|
+
const timeout = setTimeout(() => {
|
|
64
|
+
supabase.removeChannel(channel);
|
|
65
|
+
reject(new Error('Channel subscribe timeout (20s)'));
|
|
66
|
+
}, 20000);
|
|
67
|
+
|
|
68
|
+
channel.subscribe((status) => {
|
|
69
|
+
console.log(' Channel status:', status);
|
|
70
|
+
if (status === 'SUBSCRIBED') {
|
|
71
|
+
clearTimeout(timeout);
|
|
72
|
+
resolve('OK');
|
|
73
|
+
} else if (status === 'CHANNEL_ERROR' || status === 'TIMED_OUT') {
|
|
74
|
+
clearTimeout(timeout);
|
|
75
|
+
reject(new Error('Channel status: ' + status));
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
console.log(' Channel subscribe:', result);
|
|
81
|
+
|
|
82
|
+
// Test 4: Try sending a broadcast
|
|
83
|
+
console.log('\nTest 4: Broadcast test...');
|
|
84
|
+
const sendResult = await channel.send({
|
|
85
|
+
type: 'broadcast',
|
|
86
|
+
event: 'test',
|
|
87
|
+
payload: { msg: 'hello from diagnostic' },
|
|
88
|
+
});
|
|
89
|
+
console.log(' Broadcast result:', sendResult);
|
|
90
|
+
|
|
91
|
+
supabase.removeChannel(channel);
|
|
92
|
+
} catch (e) {
|
|
93
|
+
console.log(' Channel FAIL:', e.message);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
console.log('\n=== Diagnostic complete ===');
|
|
97
|
+
process.exit(0);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createClient } from '@supabase/supabase-js';
|
|
2
|
+
|
|
3
|
+
const SUPABASE_URL = 'https://hbdrhdeqyioxkzmoxnjp.supabase.co';
|
|
4
|
+
const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImhiZHJoZGVxeWlveGt6bW94bmpwIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzUxMzY4MTYsImV4cCI6MjA5MDcxMjgxNn0.BDKzJt4XQ1yS9eIoO0dp2Mx7flxU2eEwxfD8kAIlw_w';
|
|
5
|
+
|
|
6
|
+
console.log('=== Realtime Deep Diagnostic ===\n');
|
|
7
|
+
|
|
8
|
+
const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
|
|
9
|
+
|
|
10
|
+
// Test A: Simple broadcast channel
|
|
11
|
+
console.log('Test A: Broadcast-only channel...');
|
|
12
|
+
const chA = supabase.channel('test-broadcast-only');
|
|
13
|
+
chA.subscribe((status, err) => {
|
|
14
|
+
console.log(' [A] status:', status, err ? 'error: ' + err.message : '');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// Test B: Postgres Changes channel
|
|
18
|
+
console.log('Test B: Postgres Changes channel...');
|
|
19
|
+
const chB = supabase.channel('test-db-changes')
|
|
20
|
+
.on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'team_messages' }, (payload) => {
|
|
21
|
+
console.log(' [B] DB change:', payload);
|
|
22
|
+
});
|
|
23
|
+
chB.subscribe((status, err) => {
|
|
24
|
+
console.log(' [B] status:', status, err ? 'error: ' + err.message : '');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// Test C: Presence channel
|
|
28
|
+
console.log('Test C: Presence channel...');
|
|
29
|
+
const chC = supabase.channel('test-presence');
|
|
30
|
+
chC.subscribe(async (status, err) => {
|
|
31
|
+
console.log(' [C] status:', status, err ? 'error: ' + err.message : '');
|
|
32
|
+
if (status === 'SUBSCRIBED') {
|
|
33
|
+
await chC.track({ user: 'diagnostic-test' });
|
|
34
|
+
console.log(' [C] presence tracked!');
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
console.log('\nWaiting 25 seconds...\n');
|
|
39
|
+
await new Promise(resolve => setTimeout(resolve, 25000));
|
|
40
|
+
|
|
41
|
+
supabase.removeAllChannels();
|
|
42
|
+
console.log('\n=== Done ===');
|
|
43
|
+
process.exit(0);
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { createClient } from '@supabase/supabase-js';
|
|
2
|
+
|
|
3
|
+
const SUPABASE_URL = 'https://hbdrhdeqyioxkzmoxnjp.supabase.co';
|
|
4
|
+
const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImhiZHJoZGVxeWlveGt6bW94bmpwIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzUxMzY4MTYsImV4cCI6MjA5MDcxMjgxNn0.BDKzJt4XQ1yS9eIoO0dp2Mx7flxU2eEwxfD8kAIlw_w';
|
|
5
|
+
|
|
6
|
+
console.log('=== Realtime Fix Attempts ===\n');
|
|
7
|
+
|
|
8
|
+
// Attempt 1: With explicit timeout and transport config
|
|
9
|
+
console.log('Attempt 1: Explicit realtime config...');
|
|
10
|
+
const supabase1 = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
|
|
11
|
+
realtime: {
|
|
12
|
+
timeout: 30000,
|
|
13
|
+
heartbeatIntervalMs: 15000,
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
const ch1 = supabase1.channel('fix-test-1');
|
|
18
|
+
const result1 = await new Promise((resolve) => {
|
|
19
|
+
const t = setTimeout(() => resolve('TIMEOUT'), 15000);
|
|
20
|
+
ch1.subscribe((status) => {
|
|
21
|
+
console.log(' [1] status:', status);
|
|
22
|
+
if (status === 'SUBSCRIBED') { clearTimeout(t); resolve('OK'); }
|
|
23
|
+
if (status === 'TIMED_OUT' || status === 'CHANNEL_ERROR') { clearTimeout(t); resolve(status); }
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
console.log(' [1] result:', result1);
|
|
27
|
+
supabase1.removeAllChannels();
|
|
28
|
+
|
|
29
|
+
// Attempt 2: With custom WebSocket URL
|
|
30
|
+
console.log('\nAttempt 2: Custom realtime URL with wss://...');
|
|
31
|
+
const supabase2 = createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
|
|
32
|
+
realtime: {
|
|
33
|
+
url: 'wss://hbdrhdeqyioxkzmoxnjp.supabase.co/realtime/v1',
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const ch2 = supabase2.channel('fix-test-2');
|
|
38
|
+
const result2 = await new Promise((resolve) => {
|
|
39
|
+
const t = setTimeout(() => resolve('TIMEOUT'), 15000);
|
|
40
|
+
ch2.subscribe((status) => {
|
|
41
|
+
console.log(' [2] status:', status);
|
|
42
|
+
if (status === 'SUBSCRIBED') { clearTimeout(t); resolve('OK'); }
|
|
43
|
+
if (status === 'TIMED_OUT' || status === 'CHANNEL_ERROR') { clearTimeout(t); resolve(status); }
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
console.log(' [2] result:', result2);
|
|
47
|
+
supabase2.removeAllChannels();
|
|
48
|
+
|
|
49
|
+
// Attempt 3: Connect then subscribe
|
|
50
|
+
console.log('\nAttempt 3: Manual connect first...');
|
|
51
|
+
const supabase3 = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
|
|
52
|
+
// Force connect the realtime client
|
|
53
|
+
supabase3.realtime.setAuth(SUPABASE_ANON_KEY);
|
|
54
|
+
supabase3.realtime.connect();
|
|
55
|
+
|
|
56
|
+
// Wait for socket to open
|
|
57
|
+
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
58
|
+
console.log(' Socket state:', supabase3.realtime.connectionState?.() ?? 'unknown');
|
|
59
|
+
|
|
60
|
+
const ch3 = supabase3.channel('fix-test-3');
|
|
61
|
+
const result3 = await new Promise((resolve) => {
|
|
62
|
+
const t = setTimeout(() => resolve('TIMEOUT'), 15000);
|
|
63
|
+
ch3.subscribe((status) => {
|
|
64
|
+
console.log(' [3] status:', status);
|
|
65
|
+
if (status === 'SUBSCRIBED') { clearTimeout(t); resolve('OK'); }
|
|
66
|
+
if (status === 'TIMED_OUT' || status === 'CHANNEL_ERROR') { clearTimeout(t); resolve(status); }
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
console.log(' [3] result:', result3);
|
|
70
|
+
supabase3.removeAllChannels();
|
|
71
|
+
|
|
72
|
+
console.log('\n=== Done ===');
|
|
73
|
+
process.exit(0);
|