From 33789f0131eec1b6ef92a7a4c621b940e5603bab Mon Sep 17 00:00:00 2001 From: Merul Dhiman Date: Tue, 20 Jan 2026 15:48:48 +0530 Subject: [PATCH 1/5] feat: switch to summary for generating wishlists --- docs/.docusaurus/DONT-EDIT-THIS-FOLDER | 5 + docs/.docusaurus/client-manifest.json | 343 +++++++++++++++++ docs/.docusaurus/client-modules.js | 6 + docs/.docusaurus/codeTranslations.json | 1 + .../default/__plugin.json | 4 + .../default/blog-post-list-prop-default.json | 4 + .../default/blogMetadata-default.json | 5 + .../default/__mdx-loader-dependency.json | 1 + .../default/__plugin.json | 4 + .../default/p/docs-175.json | 1 + .../p/docs-category-getting-started-da0.json | 1 + ...ocs-category-post-platforms-guide-f40.json | 1 + .../p/docs-category-w-3-ds-basics-d3b.json | 1 + .../p/docs-category-w-3-ds-protocol-0ba.json | 1 + .../default/p/prototype-docs-793.json | 1 + ...ype-docs-category-getting-started-204.json | 1 + ...ocs-category-post-platforms-guide-251.json | 1 + ...otype-docs-category-w-3-ds-basics-031.json | 1 + ...ype-docs-category-w-3-ds-protocol-320.json | 1 + ...etting-started-getting-started-md-793.json | 27 ++ ...platform-guide-getting-started-md-ba4.json | 27 ++ ...t-platform-guide-mapping-rules-md-24c.json | 27 ++ ...tform-guide-webhook-controller-md-7c7.json | 23 ++ ...-w-3-ds-basics-getting-started-md-9b4.json | 27 ++ ...-3-ds-protocol-getting-started-md-6b0.json | 27 ++ .../default/__plugin.json | 4 + .../site-src-pages-markdown-page-md-393.json | 11 + .../default/__plugin.json | 4 + .../default/layers.css | 1 + .../default/__plugin.json | 4 + ...rototype-docusaurus-debug-content-78b.json | 1 + docs/.docusaurus/docusaurus.config.mjs | 352 ++++++++++++++++++ docs/.docusaurus/globalData.json | 78 ++++ docs/.docusaurus/i18n.json | 20 + docs/.docusaurus/registry.js | 31 ++ docs/.docusaurus/routes.js | 132 +++++++ docs/.docusaurus/routesChunkNames.json | 112 ++++++ docs/.docusaurus/site-metadata.json | 41 ++ docs/.docusaurus/site-storage.json | 4 + docs/src/pages/index.tsx | 21 ++ mappings/.gitignore | 2 - platforms/dreamsync-api/package.json | 3 +- .../src/database/entities/Wishlist.ts | 8 +- platforms/dreamsync-api/src/index.ts | 15 +- .../src/services/AIMatchingService.ts | 61 ++- .../src/services/MatchingService.ts | 45 ++- .../src/services/SharedMatchingService.ts | 26 +- .../src/services/WishlistSummaryService.ts | 181 +++++++-- 48 files changed, 1608 insertions(+), 90 deletions(-) create mode 100644 docs/.docusaurus/DONT-EDIT-THIS-FOLDER create mode 100644 docs/.docusaurus/client-manifest.json create mode 100644 docs/.docusaurus/client-modules.js create mode 100644 docs/.docusaurus/codeTranslations.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-blog/default/__plugin.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-blog/default/blog-post-list-prop-default.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-blog/default/blogMetadata-default.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/__mdx-loader-dependency.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/__plugin.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-175.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-getting-started-da0.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-post-platforms-guide-f40.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-w-3-ds-basics-d3b.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-w-3-ds-protocol-0ba.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-793.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-getting-started-204.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-post-platforms-guide-251.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-basics-031.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-protocol-320.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-getting-started-getting-started-md-793.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-post-platform-guide-getting-started-md-ba4.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-post-platform-guide-mapping-rules-md-24c.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-post-platform-guide-webhook-controller-md-7c7.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-w-3-ds-basics-getting-started-md-9b4.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-w-3-ds-protocol-getting-started-md-6b0.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-pages/default/__plugin.json create mode 100644 docs/.docusaurus/docusaurus-plugin-content-pages/default/site-src-pages-markdown-page-md-393.json create mode 100644 docs/.docusaurus/docusaurus-plugin-css-cascade-layers/default/__plugin.json create mode 100644 docs/.docusaurus/docusaurus-plugin-css-cascade-layers/default/layers.css create mode 100644 docs/.docusaurus/docusaurus-plugin-debug/default/__plugin.json create mode 100644 docs/.docusaurus/docusaurus-plugin-debug/default/p/prototype-docusaurus-debug-content-78b.json create mode 100644 docs/.docusaurus/docusaurus.config.mjs create mode 100644 docs/.docusaurus/globalData.json create mode 100644 docs/.docusaurus/i18n.json create mode 100644 docs/.docusaurus/registry.js create mode 100644 docs/.docusaurus/routes.js create mode 100644 docs/.docusaurus/routesChunkNames.json create mode 100644 docs/.docusaurus/site-metadata.json create mode 100644 docs/.docusaurus/site-storage.json create mode 100644 docs/src/pages/index.tsx delete mode 100644 mappings/.gitignore diff --git a/docs/.docusaurus/DONT-EDIT-THIS-FOLDER b/docs/.docusaurus/DONT-EDIT-THIS-FOLDER new file mode 100644 index 000000000..6c06ae873 --- /dev/null +++ b/docs/.docusaurus/DONT-EDIT-THIS-FOLDER @@ -0,0 +1,5 @@ +This folder stores temp files that Docusaurus' client bundler accesses. + +DO NOT hand-modify files in this folder because they will be overwritten in the +next build. You can clear all build artifacts (including this folder) with the +`docusaurus clear` command. diff --git a/docs/.docusaurus/client-manifest.json b/docs/.docusaurus/client-manifest.json new file mode 100644 index 000000000..8bd84e8cf --- /dev/null +++ b/docs/.docusaurus/client-manifest.json @@ -0,0 +1,343 @@ +{ + "entrypoints": [ + "main" + ], + "origins": { + "210": [ + 210 + ], + "673": [ + 61, + 401, + 869, + 673 + ], + "17896441": [ + 673, + 869, + 401 + ], + "main": [ + 354, + 869, + 792 + ], + "runtime~main": [ + 792, + 869, + 354 + ], + "0058b4c6": [ + 849 + ], + "14eb3368": [ + 869, + 969 + ], + "1df93b7f": [ + 869, + 583 + ], + "1f391b9e": [ + 673, + 869, + 61 + ], + "24c26dc8": [ + 125 + ], + "34c20098": [ + 614 + ], + "393be207": [ + 134 + ], + "5e95c892": [ + 647 + ], + "6b07c947": [ + 239 + ], + "793a58cf": [ + 875 + ], + "7c769433": [ + 535 + ], + "9b4bc8d1": [ + 740 + ], + "a46acded": [ + 813 + ], + "a7456010": [ + 235 + ], + "a7bd4aaa": [ + 98 + ], + "a94703ab": [ + 869, + 48 + ], + "aba21aa0": [ + 742 + ], + "ba4daec4": [ + 475 + ], + "c260b502": [ + 635 + ], + "dee7716e": [ + 549 + ], + "styles": [ + 48, + 61, + 354, + 401, + 583, + 673, + 792, + 969, + 869 + ] + }, + "assets": { + "48": { + "js": [ + { + "file": "assets/js/a94703ab.f01e3e39.js", + "hash": "029f2956971827ef", + "publicPath": "/assets/js/a94703ab.f01e3e39.js" + } + ] + }, + "61": { + "js": [ + { + "file": "assets/js/1f391b9e.01abd2f6.js", + "hash": "4a8bf9e7e6fb3a85", + "publicPath": "/assets/js/1f391b9e.01abd2f6.js" + } + ] + }, + "98": { + "js": [ + { + "file": "assets/js/a7bd4aaa.020ba65e.js", + "hash": "70e5f6dfbffa43ae", + "publicPath": "/assets/js/a7bd4aaa.020ba65e.js" + } + ] + }, + "125": { + "js": [ + { + "file": "assets/js/24c26dc8.6be59bad.js", + "hash": "e4c01e63488d1738", + "publicPath": "/assets/js/24c26dc8.6be59bad.js" + } + ] + }, + "134": { + "js": [ + { + "file": "assets/js/393be207.266d87a2.js", + "hash": "a6eb287bc3c6e816", + "publicPath": "/assets/js/393be207.266d87a2.js" + } + ] + }, + "210": { + "js": [ + { + "file": "assets/js/210.3f559ccf.js", + "hash": "0469c152cf628896", + "publicPath": "/assets/js/210.3f559ccf.js" + } + ] + }, + "235": { + "js": [ + { + "file": "assets/js/a7456010.0c87bb65.js", + "hash": "7c41011efbed8388", + "publicPath": "/assets/js/a7456010.0c87bb65.js" + } + ] + }, + "239": { + "js": [ + { + "file": "assets/js/6b07c947.8c96a918.js", + "hash": "45481e2b2a8a660f", + "publicPath": "/assets/js/6b07c947.8c96a918.js" + } + ] + }, + "354": { + "js": [ + { + "file": "assets/js/runtime~main.edeb49f0.js", + "hash": "ec86e5bbcecd2738", + "publicPath": "/assets/js/runtime~main.edeb49f0.js" + } + ] + }, + "401": { + "js": [ + { + "file": "assets/js/17896441.a3ae2df9.js", + "hash": "4eeff7a655609f3e", + "publicPath": "/assets/js/17896441.a3ae2df9.js" + } + ] + }, + "475": { + "js": [ + { + "file": "assets/js/ba4daec4.008addf7.js", + "hash": "2d4c242a4bc65956", + "publicPath": "/assets/js/ba4daec4.008addf7.js" + } + ] + }, + "535": { + "js": [ + { + "file": "assets/js/7c769433.782cf022.js", + "hash": "23a93a90ca917ed2", + "publicPath": "/assets/js/7c769433.782cf022.js" + } + ] + }, + "549": { + "js": [ + { + "file": "assets/js/dee7716e.c5e995ce.js", + "hash": "c765f42ad1cea579", + "publicPath": "/assets/js/dee7716e.c5e995ce.js" + } + ] + }, + "583": { + "js": [ + { + "file": "assets/js/1df93b7f.7b4ec884.js", + "hash": "3d534162ee34a086", + "publicPath": "/assets/js/1df93b7f.7b4ec884.js" + } + ] + }, + "614": { + "js": [ + { + "file": "assets/js/34c20098.a24763eb.js", + "hash": "cd6da18f9180bc53", + "publicPath": "/assets/js/34c20098.a24763eb.js" + } + ] + }, + "635": { + "js": [ + { + "file": "assets/js/c260b502.4b88f530.js", + "hash": "b674997d2d318445", + "publicPath": "/assets/js/c260b502.4b88f530.js" + } + ] + }, + "647": { + "js": [ + { + "file": "assets/js/5e95c892.c75ddb06.js", + "hash": "ba44105373de0850", + "publicPath": "/assets/js/5e95c892.c75ddb06.js" + } + ] + }, + "673": { + "js": [ + { + "file": "assets/js/673.0aa24210.js", + "hash": "56e8923e7cfedbe0", + "publicPath": "/assets/js/673.0aa24210.js" + } + ] + }, + "740": { + "js": [ + { + "file": "assets/js/9b4bc8d1.a535fbb2.js", + "hash": "f6c1f6a27d2559d0", + "publicPath": "/assets/js/9b4bc8d1.a535fbb2.js" + } + ] + }, + "742": { + "js": [ + { + "file": "assets/js/aba21aa0.db338441.js", + "hash": "92f6adddf46e1654", + "publicPath": "/assets/js/aba21aa0.db338441.js" + } + ] + }, + "792": { + "js": [ + { + "file": "assets/js/main.37873397.js", + "hash": "70689e39b476ea49", + "publicPath": "/assets/js/main.37873397.js" + } + ] + }, + "813": { + "js": [ + { + "file": "assets/js/a46acded.7ebed8c6.js", + "hash": "66fd979995d9f97e", + "publicPath": "/assets/js/a46acded.7ebed8c6.js" + } + ] + }, + "849": { + "js": [ + { + "file": "assets/js/0058b4c6.b47c551c.js", + "hash": "3db16ebea094dc94", + "publicPath": "/assets/js/0058b4c6.b47c551c.js" + } + ] + }, + "869": { + "css": [ + { + "file": "assets/css/styles.0ae02191.css", + "hash": "53e992ef64305439", + "publicPath": "/assets/css/styles.0ae02191.css" + } + ] + }, + "875": { + "js": [ + { + "file": "assets/js/793a58cf.d1ae54d6.js", + "hash": "aceaefead0aef76b", + "publicPath": "/assets/js/793a58cf.d1ae54d6.js" + } + ] + }, + "969": { + "js": [ + { + "file": "assets/js/14eb3368.be9f2937.js", + "hash": "88351146834dc986", + "publicPath": "/assets/js/14eb3368.be9f2937.js" + } + ] + } + } +} \ No newline at end of file diff --git a/docs/.docusaurus/client-modules.js b/docs/.docusaurus/client-modules.js new file mode 100644 index 000000000..1398598b8 --- /dev/null +++ b/docs/.docusaurus/client-modules.js @@ -0,0 +1,6 @@ +export default [ + require("/home/merul/Projects/metastate/docs/.docusaurus/docusaurus-plugin-css-cascade-layers/default/layers.css"), + require("/home/merul/Projects/metastate/node_modules/.pnpm/infima@0.2.0-alpha.45/node_modules/infima/dist/css/default/default.css"), + require("/home/merul/Projects/metastate/node_modules/.pnpm/@docusaurus+theme-classic@3.9.2_@types+react@18.3.27_bufferutil@4.0.9_react-dom@18.3.1__a44b3ac937bced3a751a2f63b4b47c7b/node_modules/@docusaurus/theme-classic/lib/prism-include-languages"), + require("/home/merul/Projects/metastate/node_modules/.pnpm/@docusaurus+theme-classic@3.9.2_@types+react@18.3.27_bufferutil@4.0.9_react-dom@18.3.1__a44b3ac937bced3a751a2f63b4b47c7b/node_modules/@docusaurus/theme-classic/lib/nprogress"), +]; diff --git a/docs/.docusaurus/codeTranslations.json b/docs/.docusaurus/codeTranslations.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/docs/.docusaurus/codeTranslations.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-blog/default/__plugin.json b/docs/.docusaurus/docusaurus-plugin-content-blog/default/__plugin.json new file mode 100644 index 000000000..3206737be --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-blog/default/__plugin.json @@ -0,0 +1,4 @@ +{ + "name": "docusaurus-plugin-content-blog", + "id": "default" +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-blog/default/blog-post-list-prop-default.json b/docs/.docusaurus/docusaurus-plugin-content-blog/default/blog-post-list-prop-default.json new file mode 100644 index 000000000..fb396f1d0 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-blog/default/blog-post-list-prop-default.json @@ -0,0 +1,4 @@ +{ + "title": "Recent posts", + "items": [] +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-blog/default/blogMetadata-default.json b/docs/.docusaurus/docusaurus-plugin-content-blog/default/blogMetadata-default.json new file mode 100644 index 000000000..1c3885afc --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-blog/default/blogMetadata-default.json @@ -0,0 +1,5 @@ +{ + "blogBasePath": "/prototype/blog", + "blogTitle": "Blog", + "authorsListPath": "/prototype/blog/authors" +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/__mdx-loader-dependency.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/__mdx-loader-dependency.json new file mode 100644 index 000000000..1ead7583f --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/__mdx-loader-dependency.json @@ -0,0 +1 @@ +{"options":{"sidebarPath":"/home/merul/Projects/metastate/docs/sidebars.ts","editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/","path":"docs","editCurrentVersion":false,"editLocalizedFiles":false,"routeBasePath":"docs","tagsBasePath":"tags","include":["**/*.{md,mdx}"],"exclude":["**/_*.{js,jsx,ts,tsx,md,mdx}","**/_*/**","**/*.test.{js,jsx,ts,tsx}","**/__tests__/**"],"sidebarCollapsible":true,"sidebarCollapsed":true,"docsRootComponent":"@theme/DocsRoot","docVersionRootComponent":"@theme/DocVersionRoot","docRootComponent":"@theme/DocRoot","docItemComponent":"@theme/DocItem","docTagsListComponent":"@theme/DocTagsListPage","docTagDocListComponent":"@theme/DocTagDocListPage","docCategoryGeneratedIndexComponent":"@theme/DocCategoryGeneratedIndexPage","remarkPlugins":[],"rehypePlugins":[],"recmaPlugins":[],"beforeDefaultRemarkPlugins":[],"beforeDefaultRehypePlugins":[],"admonitions":true,"showLastUpdateTime":false,"showLastUpdateAuthor":false,"includeCurrentVersion":true,"disableVersioning":false,"versions":{},"breadcrumbs":true,"onInlineTags":"warn","id":"default"},"versionsMetadata":[{"versionName":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","path":"/prototype/docs","tagsPath":"/prototype/docs/tags","editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs","isLast":true,"routePriority":-1,"sidebarFilePath":"/home/merul/Projects/metastate/docs/sidebars.ts","contentPath":"/home/merul/Projects/metastate/docs/docs"}]} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/__plugin.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/__plugin.json new file mode 100644 index 000000000..3818ad026 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/__plugin.json @@ -0,0 +1,4 @@ +{ + "name": "docusaurus-plugin-content-docs", + "id": "default" +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-175.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-175.json new file mode 100644 index 000000000..e58074b42 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-175.json @@ -0,0 +1 @@ +{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/docs/Getting Started/getting-started","label":"Tutorial Intro","docId":"Getting Started/getting-started","unlisted":false}],"href":"/docs/category/getting-started"},{"type":"category","label":"W3DS Basics","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/docs/W3DS Basics/getting-started","label":"Tutorial Intro","docId":"W3DS Basics/getting-started","unlisted":false}],"href":"/docs/category/w3ds-basics"},{"type":"category","label":"W3DS Protocol","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/docs/W3DS Protocol/getting-started","label":"Tutorial Intro","docId":"W3DS Protocol/getting-started","unlisted":false}],"href":"/docs/category/w3ds-protocol"},{"type":"category","label":"Post Platforms Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/docs/Post Platform Guide/getting-started","label":"Getting Started with Platform Development","docId":"Post Platform Guide/getting-started","unlisted":false},{"type":"link","href":"/docs/Post Platform Guide/mapping-rules","label":"Mapping Rules","docId":"Post Platform Guide/mapping-rules","unlisted":false},{"type":"link","href":"/docs/Post Platform Guide/webhook-controller","label":"Webhook Controller Guide","docId":"Post Platform Guide/webhook-controller","unlisted":false}],"href":"/docs/category/post-platforms-guide"}]},"docs":{"Getting Started/getting-started":{"id":"Getting Started/getting-started","title":"Tutorial Intro","description":"Let's discover Docusaurus in less than 5 minutes.","sidebar":"tutorialSidebar"},"Post Platform Guide/getting-started":{"id":"Post Platform Guide/getting-started","title":"Getting Started with Platform Development","description":"This guide will help you get started building platforms in the metastate ecosystem. We'll cover the essential concepts and patterns you'll need to implement, using @eCurrency-api as a reference example.","sidebar":"tutorialSidebar"},"Post Platform Guide/mapping-rules":{"id":"Post Platform Guide/mapping-rules","title":"Mapping Rules","description":"This document explains how to create mappings for the web3-adapter system, which enables data exchange between different platforms using a universal ontology.","sidebar":"tutorialSidebar"},"Post Platform Guide/webhook-controller":{"id":"Post Platform Guide/webhook-controller","title":"Webhook Controller Guide","description":"The webhook controller receives awareness protocol packets from the eVault system and saves them to your local database.","sidebar":"tutorialSidebar"},"W3DS Basics/getting-started":{"id":"W3DS Basics/getting-started","title":"Tutorial Intro","description":"Let's discover Docusaurus in less than 5 minutes.","sidebar":"tutorialSidebar"},"W3DS Protocol/getting-started":{"id":"W3DS Protocol/getting-started","title":"Tutorial Intro","description":"Let's discover Docusaurus in less than 5 minutes.","sidebar":"tutorialSidebar"}}}} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-getting-started-da0.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-getting-started-da0.json new file mode 100644 index 000000000..302096311 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-getting-started-da0.json @@ -0,0 +1 @@ +{"categoryGeneratedIndex":{"title":"Getting Started","slug":"/category/getting-started","permalink":"/docs/category/getting-started","sidebar":"tutorialSidebar","navigation":{"next":{"title":"Tutorial Intro","permalink":"/docs/Getting Started/getting-started"}}}} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-post-platforms-guide-f40.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-post-platforms-guide-f40.json new file mode 100644 index 000000000..2fd9ace90 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-post-platforms-guide-f40.json @@ -0,0 +1 @@ +{"categoryGeneratedIndex":{"title":"Post Platforms Guide","slug":"/category/post-platforms-guide","permalink":"/docs/category/post-platforms-guide","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Tutorial Intro","permalink":"/docs/W3DS Protocol/getting-started"},"next":{"title":"Getting Started with Platform Development","permalink":"/docs/Post Platform Guide/getting-started"}}}} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-w-3-ds-basics-d3b.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-w-3-ds-basics-d3b.json new file mode 100644 index 000000000..862d50187 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-w-3-ds-basics-d3b.json @@ -0,0 +1 @@ +{"categoryGeneratedIndex":{"title":"W3DS Basics","slug":"/category/w3ds-basics","permalink":"/docs/category/w3ds-basics","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Tutorial Intro","permalink":"/docs/Getting Started/getting-started"},"next":{"title":"Tutorial Intro","permalink":"/docs/W3DS Basics/getting-started"}}}} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-w-3-ds-protocol-0ba.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-w-3-ds-protocol-0ba.json new file mode 100644 index 000000000..405bf510c --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/docs-category-w-3-ds-protocol-0ba.json @@ -0,0 +1 @@ +{"categoryGeneratedIndex":{"title":"W3DS Protocol","slug":"/category/w3ds-protocol","permalink":"/docs/category/w3ds-protocol","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Tutorial Intro","permalink":"/docs/W3DS Basics/getting-started"},"next":{"title":"Tutorial Intro","permalink":"/docs/W3DS Protocol/getting-started"}}}} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-793.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-793.json new file mode 100644 index 000000000..aa36d6907 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-793.json @@ -0,0 +1 @@ +{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/prototype/docs/Getting Started/getting-started","label":"Tutorial Intro","docId":"Getting Started/getting-started","unlisted":false}],"href":"/prototype/docs/category/getting-started"},{"type":"category","label":"W3DS Basics","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/prototype/docs/W3DS Basics/getting-started","label":"Tutorial Intro","docId":"W3DS Basics/getting-started","unlisted":false}],"href":"/prototype/docs/category/w3ds-basics"},{"type":"category","label":"W3DS Protocol","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/prototype/docs/W3DS Protocol/getting-started","label":"Tutorial Intro","docId":"W3DS Protocol/getting-started","unlisted":false}],"href":"/prototype/docs/category/w3ds-protocol"},{"type":"category","label":"Post Platforms Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/prototype/docs/Post Platform Guide/getting-started","label":"Getting Started with Platform Development","docId":"Post Platform Guide/getting-started","unlisted":false},{"type":"link","href":"/prototype/docs/Post Platform Guide/mapping-rules","label":"Mapping Rules","docId":"Post Platform Guide/mapping-rules","unlisted":false},{"type":"link","href":"/prototype/docs/Post Platform Guide/webhook-controller","label":"Webhook Controller Guide","docId":"Post Platform Guide/webhook-controller","unlisted":false}],"href":"/prototype/docs/category/post-platforms-guide"}]},"docs":{"Getting Started/getting-started":{"id":"Getting Started/getting-started","title":"Tutorial Intro","description":"Let's discover Docusaurus in less than 5 minutes.","sidebar":"tutorialSidebar"},"Post Platform Guide/getting-started":{"id":"Post Platform Guide/getting-started","title":"Getting Started with Platform Development","description":"This guide will help you get started building platforms in the metastate ecosystem. We'll cover the essential concepts and patterns you'll need to implement, using @eCurrency-api as a reference example.","sidebar":"tutorialSidebar"},"Post Platform Guide/mapping-rules":{"id":"Post Platform Guide/mapping-rules","title":"Mapping Rules","description":"This document explains how to create mappings for the web3-adapter system, which enables data exchange between different platforms using a universal ontology.","sidebar":"tutorialSidebar"},"Post Platform Guide/webhook-controller":{"id":"Post Platform Guide/webhook-controller","title":"Webhook Controller Guide","description":"The webhook controller receives awareness protocol packets from the eVault system and saves them to your local database.","sidebar":"tutorialSidebar"},"W3DS Basics/getting-started":{"id":"W3DS Basics/getting-started","title":"Tutorial Intro","description":"Let's discover Docusaurus in less than 5 minutes.","sidebar":"tutorialSidebar"},"W3DS Protocol/getting-started":{"id":"W3DS Protocol/getting-started","title":"Tutorial Intro","description":"Let's discover Docusaurus in less than 5 minutes.","sidebar":"tutorialSidebar"}}}} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-getting-started-204.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-getting-started-204.json new file mode 100644 index 000000000..fcab96f98 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-getting-started-204.json @@ -0,0 +1 @@ +{"categoryGeneratedIndex":{"title":"Getting Started","slug":"/category/getting-started","permalink":"/prototype/docs/category/getting-started","sidebar":"tutorialSidebar","navigation":{"next":{"title":"Tutorial Intro","permalink":"/prototype/docs/Getting Started/getting-started"}}}} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-post-platforms-guide-251.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-post-platforms-guide-251.json new file mode 100644 index 000000000..72363b13b --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-post-platforms-guide-251.json @@ -0,0 +1 @@ +{"categoryGeneratedIndex":{"title":"Post Platforms Guide","slug":"/category/post-platforms-guide","permalink":"/prototype/docs/category/post-platforms-guide","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Tutorial Intro","permalink":"/prototype/docs/W3DS Protocol/getting-started"},"next":{"title":"Getting Started with Platform Development","permalink":"/prototype/docs/Post Platform Guide/getting-started"}}}} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-basics-031.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-basics-031.json new file mode 100644 index 000000000..d0310e982 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-basics-031.json @@ -0,0 +1 @@ +{"categoryGeneratedIndex":{"title":"W3DS Basics","slug":"/category/w3ds-basics","permalink":"/prototype/docs/category/w3ds-basics","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Tutorial Intro","permalink":"/prototype/docs/Getting Started/getting-started"},"next":{"title":"Tutorial Intro","permalink":"/prototype/docs/W3DS Basics/getting-started"}}}} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-protocol-320.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-protocol-320.json new file mode 100644 index 000000000..05a2ccf72 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-protocol-320.json @@ -0,0 +1 @@ +{"categoryGeneratedIndex":{"title":"W3DS Protocol","slug":"/category/w3ds-protocol","permalink":"/prototype/docs/category/w3ds-protocol","sidebar":"tutorialSidebar","navigation":{"previous":{"title":"Tutorial Intro","permalink":"/prototype/docs/W3DS Basics/getting-started"},"next":{"title":"Tutorial Intro","permalink":"/prototype/docs/W3DS Protocol/getting-started"}}}} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-getting-started-getting-started-md-793.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-getting-started-getting-started-md-793.json new file mode 100644 index 000000000..7501173dc --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-getting-started-getting-started-md-793.json @@ -0,0 +1,27 @@ +{ + "id": "Getting Started/getting-started", + "title": "Tutorial Intro", + "description": "Let's discover Docusaurus in less than 5 minutes.", + "source": "@site/docs/Getting Started/getting-started.md", + "sourceDirName": "Getting Started", + "slug": "/Getting Started/getting-started", + "permalink": "/prototype/docs/Getting Started/getting-started", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Getting Started/getting-started.md", + "tags": [], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1 + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Getting Started", + "permalink": "/prototype/docs/category/getting-started" + }, + "next": { + "title": "W3DS Basics", + "permalink": "/prototype/docs/category/w3ds-basics" + } +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-post-platform-guide-getting-started-md-ba4.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-post-platform-guide-getting-started-md-ba4.json new file mode 100644 index 000000000..edfa1f2bf --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-post-platform-guide-getting-started-md-ba4.json @@ -0,0 +1,27 @@ +{ + "id": "Post Platform Guide/getting-started", + "title": "Getting Started with Platform Development", + "description": "This guide will help you get started building platforms in the metastate ecosystem. We'll cover the essential concepts and patterns you'll need to implement, using @eCurrency-api as a reference example.", + "source": "@site/docs/Post Platform Guide/getting-started.md", + "sourceDirName": "Post Platform Guide", + "slug": "/Post Platform Guide/getting-started", + "permalink": "/prototype/docs/Post Platform Guide/getting-started", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Post Platform Guide/getting-started.md", + "tags": [], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1 + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Post Platforms Guide", + "permalink": "/prototype/docs/category/post-platforms-guide" + }, + "next": { + "title": "Mapping Rules", + "permalink": "/prototype/docs/Post Platform Guide/mapping-rules" + } +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-post-platform-guide-mapping-rules-md-24c.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-post-platform-guide-mapping-rules-md-24c.json new file mode 100644 index 000000000..6f2c64859 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-post-platform-guide-mapping-rules-md-24c.json @@ -0,0 +1,27 @@ +{ + "id": "Post Platform Guide/mapping-rules", + "title": "Mapping Rules", + "description": "This document explains how to create mappings for the web3-adapter system, which enables data exchange between different platforms using a universal ontology.", + "source": "@site/docs/Post Platform Guide/mapping-rules.md", + "sourceDirName": "Post Platform Guide", + "slug": "/Post Platform Guide/mapping-rules", + "permalink": "/prototype/docs/Post Platform Guide/mapping-rules", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Post Platform Guide/mapping-rules.md", + "tags": [], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1 + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Getting Started with Platform Development", + "permalink": "/prototype/docs/Post Platform Guide/getting-started" + }, + "next": { + "title": "Webhook Controller Guide", + "permalink": "/prototype/docs/Post Platform Guide/webhook-controller" + } +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-post-platform-guide-webhook-controller-md-7c7.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-post-platform-guide-webhook-controller-md-7c7.json new file mode 100644 index 000000000..6f7bf7280 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-post-platform-guide-webhook-controller-md-7c7.json @@ -0,0 +1,23 @@ +{ + "id": "Post Platform Guide/webhook-controller", + "title": "Webhook Controller Guide", + "description": "The webhook controller receives awareness protocol packets from the eVault system and saves them to your local database.", + "source": "@site/docs/Post Platform Guide/webhook-controller.md", + "sourceDirName": "Post Platform Guide", + "slug": "/Post Platform Guide/webhook-controller", + "permalink": "/prototype/docs/Post Platform Guide/webhook-controller", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Post Platform Guide/webhook-controller.md", + "tags": [], + "version": "current", + "sidebarPosition": 3, + "frontMatter": { + "sidebar_position": 3 + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "Mapping Rules", + "permalink": "/prototype/docs/Post Platform Guide/mapping-rules" + } +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-w-3-ds-basics-getting-started-md-9b4.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-w-3-ds-basics-getting-started-md-9b4.json new file mode 100644 index 000000000..2dcb1b2a8 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-w-3-ds-basics-getting-started-md-9b4.json @@ -0,0 +1,27 @@ +{ + "id": "W3DS Basics/getting-started", + "title": "Tutorial Intro", + "description": "Let's discover Docusaurus in less than 5 minutes.", + "source": "@site/docs/W3DS Basics/getting-started.md", + "sourceDirName": "W3DS Basics", + "slug": "/W3DS Basics/getting-started", + "permalink": "/prototype/docs/W3DS Basics/getting-started", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/W3DS Basics/getting-started.md", + "tags": [], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1 + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "W3DS Basics", + "permalink": "/prototype/docs/category/w3ds-basics" + }, + "next": { + "title": "W3DS Protocol", + "permalink": "/prototype/docs/category/w3ds-protocol" + } +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-w-3-ds-protocol-getting-started-md-6b0.json b/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-w-3-ds-protocol-getting-started-md-6b0.json new file mode 100644 index 000000000..cb34a66bc --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-docs/default/site-docs-w-3-ds-protocol-getting-started-md-6b0.json @@ -0,0 +1,27 @@ +{ + "id": "W3DS Protocol/getting-started", + "title": "Tutorial Intro", + "description": "Let's discover Docusaurus in less than 5 minutes.", + "source": "@site/docs/W3DS Protocol/getting-started.md", + "sourceDirName": "W3DS Protocol", + "slug": "/W3DS Protocol/getting-started", + "permalink": "/prototype/docs/W3DS Protocol/getting-started", + "draft": false, + "unlisted": false, + "editUrl": "https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/W3DS Protocol/getting-started.md", + "tags": [], + "version": "current", + "sidebarPosition": 1, + "frontMatter": { + "sidebar_position": 1 + }, + "sidebar": "tutorialSidebar", + "previous": { + "title": "W3DS Protocol", + "permalink": "/prototype/docs/category/w3ds-protocol" + }, + "next": { + "title": "Post Platforms Guide", + "permalink": "/prototype/docs/category/post-platforms-guide" + } +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-pages/default/__plugin.json b/docs/.docusaurus/docusaurus-plugin-content-pages/default/__plugin.json new file mode 100644 index 000000000..b141f718a --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-pages/default/__plugin.json @@ -0,0 +1,4 @@ +{ + "name": "docusaurus-plugin-content-pages", + "id": "default" +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-content-pages/default/site-src-pages-markdown-page-md-393.json b/docs/.docusaurus/docusaurus-plugin-content-pages/default/site-src-pages-markdown-page-md-393.json new file mode 100644 index 000000000..a03306179 --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-content-pages/default/site-src-pages-markdown-page-md-393.json @@ -0,0 +1,11 @@ +{ + "type": "mdx", + "permalink": "/prototype/markdown-page", + "source": "@site/src/pages/markdown-page.md", + "title": "Markdown page example", + "description": "You don't need React to write simple standalone pages.", + "frontMatter": { + "title": "Markdown page example" + }, + "unlisted": false +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-css-cascade-layers/default/__plugin.json b/docs/.docusaurus/docusaurus-plugin-css-cascade-layers/default/__plugin.json new file mode 100644 index 000000000..a5ea98d0b --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-css-cascade-layers/default/__plugin.json @@ -0,0 +1,4 @@ +{ + "name": "docusaurus-plugin-css-cascade-layers", + "id": "default" +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-css-cascade-layers/default/layers.css b/docs/.docusaurus/docusaurus-plugin-css-cascade-layers/default/layers.css new file mode 100644 index 000000000..1e6d99d1e --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-css-cascade-layers/default/layers.css @@ -0,0 +1 @@ +@layer docusaurus.infima, docusaurus.theme-common, docusaurus.theme-classic, docusaurus.core, docusaurus.plugin-debug, docusaurus.theme-mermaid, docusaurus.theme-live-codeblock, docusaurus.theme-search-algolia.docsearch, docusaurus.theme-search-algolia; \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-debug/default/__plugin.json b/docs/.docusaurus/docusaurus-plugin-debug/default/__plugin.json new file mode 100644 index 000000000..21c2cfd4e --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-debug/default/__plugin.json @@ -0,0 +1,4 @@ +{ + "name": "docusaurus-plugin-debug", + "id": "default" +} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus-plugin-debug/default/p/prototype-docusaurus-debug-content-78b.json b/docs/.docusaurus/docusaurus-plugin-debug/default/p/prototype-docusaurus-debug-content-78b.json new file mode 100644 index 000000000..1030e6a1e --- /dev/null +++ b/docs/.docusaurus/docusaurus-plugin-debug/default/p/prototype-docusaurus-debug-content-78b.json @@ -0,0 +1 @@ +{"allContent":{"docusaurus-plugin-css-cascade-layers":{},"docusaurus-plugin-content-docs":{"default":{"loadedVersions":[{"versionName":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","path":"/prototype/docs","tagsPath":"/prototype/docs/tags","editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs","isLast":true,"routePriority":-1,"sidebarFilePath":"/home/merul/Projects/metastate/docs/sidebars.ts","contentPath":"/home/merul/Projects/metastate/docs/docs","docs":[{"id":"Getting Started/getting-started","title":"Tutorial Intro","description":"Let's discover Docusaurus in less than 5 minutes.","source":"@site/docs/Getting Started/getting-started.md","sourceDirName":"Getting Started","slug":"/Getting Started/getting-started","permalink":"/prototype/docs/Getting Started/getting-started","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Getting Started/getting-started.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started","permalink":"/prototype/docs/category/getting-started"},"next":{"title":"W3DS Basics","permalink":"/prototype/docs/category/w3ds-basics"}},{"id":"Post Platform Guide/getting-started","title":"Getting Started with Platform Development","description":"This guide will help you get started building platforms in the metastate ecosystem. We'll cover the essential concepts and patterns you'll need to implement, using @eCurrency-api as a reference example.","source":"@site/docs/Post Platform Guide/getting-started.md","sourceDirName":"Post Platform Guide","slug":"/Post Platform Guide/getting-started","permalink":"/prototype/docs/Post Platform Guide/getting-started","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Post Platform Guide/getting-started.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Post Platforms Guide","permalink":"/prototype/docs/category/post-platforms-guide"},"next":{"title":"Mapping Rules","permalink":"/prototype/docs/Post Platform Guide/mapping-rules"}},{"id":"Post Platform Guide/mapping-rules","title":"Mapping Rules","description":"This document explains how to create mappings for the web3-adapter system, which enables data exchange between different platforms using a universal ontology.","source":"@site/docs/Post Platform Guide/mapping-rules.md","sourceDirName":"Post Platform Guide","slug":"/Post Platform Guide/mapping-rules","permalink":"/prototype/docs/Post Platform Guide/mapping-rules","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Post Platform Guide/mapping-rules.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"Getting Started with Platform Development","permalink":"/prototype/docs/Post Platform Guide/getting-started"},"next":{"title":"Webhook Controller Guide","permalink":"/prototype/docs/Post Platform Guide/webhook-controller"}},{"id":"Post Platform Guide/webhook-controller","title":"Webhook Controller Guide","description":"The webhook controller receives awareness protocol packets from the eVault system and saves them to your local database.","source":"@site/docs/Post Platform Guide/webhook-controller.md","sourceDirName":"Post Platform Guide","slug":"/Post Platform Guide/webhook-controller","permalink":"/prototype/docs/Post Platform Guide/webhook-controller","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/Post Platform Guide/webhook-controller.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"sidebar_position":3},"sidebar":"tutorialSidebar","previous":{"title":"Mapping Rules","permalink":"/prototype/docs/Post Platform Guide/mapping-rules"}},{"id":"W3DS Basics/getting-started","title":"Tutorial Intro","description":"Let's discover Docusaurus in less than 5 minutes.","source":"@site/docs/W3DS Basics/getting-started.md","sourceDirName":"W3DS Basics","slug":"/W3DS Basics/getting-started","permalink":"/prototype/docs/W3DS Basics/getting-started","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/W3DS Basics/getting-started.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"W3DS Basics","permalink":"/prototype/docs/category/w3ds-basics"},"next":{"title":"W3DS Protocol","permalink":"/prototype/docs/category/w3ds-protocol"}},{"id":"W3DS Protocol/getting-started","title":"Tutorial Intro","description":"Let's discover Docusaurus in less than 5 minutes.","source":"@site/docs/W3DS Protocol/getting-started.md","sourceDirName":"W3DS Protocol","slug":"/W3DS Protocol/getting-started","permalink":"/prototype/docs/W3DS Protocol/getting-started","draft":false,"unlisted":false,"editUrl":"https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/docs/W3DS Protocol/getting-started.md","tags":[],"version":"current","sidebarPosition":1,"frontMatter":{"sidebar_position":1},"sidebar":"tutorialSidebar","previous":{"title":"W3DS Protocol","permalink":"/prototype/docs/category/w3ds-protocol"},"next":{"title":"Post Platforms Guide","permalink":"/prototype/docs/category/post-platforms-guide"}}],"drafts":[],"sidebars":{"tutorialSidebar":[{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"Getting Started/getting-started"}],"link":{"type":"generated-index","slug":"/category/getting-started","permalink":"/prototype/docs/category/getting-started"}},{"type":"category","label":"W3DS Basics","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"W3DS Basics/getting-started"}],"link":{"type":"generated-index","slug":"/category/w3ds-basics","permalink":"/prototype/docs/category/w3ds-basics"}},{"type":"category","label":"W3DS Protocol","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"W3DS Protocol/getting-started"}],"link":{"type":"generated-index","slug":"/category/w3ds-protocol","permalink":"/prototype/docs/category/w3ds-protocol"}},{"type":"category","label":"Post Platforms Guide","collapsible":true,"collapsed":true,"items":[{"type":"doc","id":"Post Platform Guide/getting-started"},{"type":"doc","id":"Post Platform Guide/mapping-rules"},{"type":"doc","id":"Post Platform Guide/webhook-controller"}],"link":{"type":"generated-index","slug":"/category/post-platforms-guide","permalink":"/prototype/docs/category/post-platforms-guide"}}]}}]}},"docusaurus-plugin-content-blog":{"default":{"blogSidebarTitle":"Recent posts","blogPosts":[],"blogListPaginated":[],"blogTags":{},"blogTagsListPath":"/prototype/blog/tags"}},"docusaurus-plugin-content-pages":{"default":[{"type":"jsx","permalink":"/prototype/","source":"@site/src/pages/index.tsx"},{"type":"mdx","permalink":"/prototype/markdown-page","source":"@site/src/pages/markdown-page.md","title":"Markdown page example","description":"You don't need React to write simple standalone pages.","frontMatter":{"title":"Markdown page example"},"unlisted":false}]},"docusaurus-plugin-debug":{},"docusaurus-plugin-svgr":{},"docusaurus-theme-classic":{},"docusaurus-bootstrap-plugin":{},"docusaurus-mdx-fallback-plugin":{}}} \ No newline at end of file diff --git a/docs/.docusaurus/docusaurus.config.mjs b/docs/.docusaurus/docusaurus.config.mjs new file mode 100644 index 000000000..e489c36a9 --- /dev/null +++ b/docs/.docusaurus/docusaurus.config.mjs @@ -0,0 +1,352 @@ +/* + * AUTOGENERATED - DON'T EDIT + * Your edits in this file will be overwritten in the next build! + * Modify the docusaurus.config.js file at your site's root instead. + */ +export default { + "title": "W3DS Documentation", + "tagline": "Documentation for Web 3 Data Spaces", + "favicon": "img/favicon.ico", + "future": { + "v4": { + "removeLegacyPostBuildHeadAttribute": true, + "useCssCascadeLayers": true + }, + "experimental_faster": { + "swcJsLoader": false, + "swcJsMinimizer": false, + "swcHtmlMinimizer": false, + "lightningCssMinimizer": false, + "mdxCrossCompilerCache": false, + "rspackBundler": false, + "rspackPersistentCache": false, + "ssgWorkerThreads": false + }, + "experimental_storage": { + "type": "localStorage", + "namespace": false + }, + "experimental_router": "browser" + }, + "url": "https://MetaState-Prototype-Project.github.io", + "baseUrl": "/prototype/", + "organizationName": "MetaState-Prototype-Project", + "projectName": "MetaState-Prototype-Project.github.io", + "trailingSlash": false, + "onBrokenLinks": "throw", + "i18n": { + "defaultLocale": "en", + "locales": [ + "en" + ], + "path": "i18n", + "localeConfigs": {} + }, + "presets": [ + [ + "classic", + { + "docs": { + "sidebarPath": "./sidebars.ts", + "editUrl": "https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/" + } + } + ] + ], + "themeConfig": { + "image": "img/docusaurus-social-card.jpg", + "colorMode": { + "respectPrefersColorScheme": true, + "defaultMode": "light", + "disableSwitch": false + }, + "navbar": { + "title": "", + "logo": { + "src": "/img/w3dslogo.svg" + }, + "items": [ + { + "type": "docSidebar", + "sidebarId": "tutorialSidebar", + "position": "left", + "label": "Tutorial" + }, + { + "href": "https://github.com/MetaState-Prototype-Project/prototype", + "label": "GitHub", + "position": "right" + } + ], + "hideOnScroll": false + }, + "footer": { + "style": "dark", + "links": [ + { + "title": "Docs", + "items": [ + { + "label": "Documentaion", + "to": "/docs/Getting%20Started/getting-started" + } + ] + } + ], + "copyright": "Copyright © 2026 Stichting MetasState Foundation. Built with Docusaurus." + }, + "prism": { + "theme": { + "plain": { + "color": "#393A34", + "backgroundColor": "#f6f8fa" + }, + "styles": [ + { + "types": [ + "comment", + "prolog", + "doctype", + "cdata" + ], + "style": { + "color": "#999988", + "fontStyle": "italic" + } + }, + { + "types": [ + "namespace" + ], + "style": { + "opacity": 0.7 + } + }, + { + "types": [ + "string", + "attr-value" + ], + "style": { + "color": "#e3116c" + } + }, + { + "types": [ + "punctuation", + "operator" + ], + "style": { + "color": "#393A34" + } + }, + { + "types": [ + "entity", + "url", + "symbol", + "number", + "boolean", + "variable", + "constant", + "property", + "regex", + "inserted" + ], + "style": { + "color": "#36acaa" + } + }, + { + "types": [ + "atrule", + "keyword", + "attr-name", + "selector" + ], + "style": { + "color": "#00a4db" + } + }, + { + "types": [ + "function", + "deleted", + "tag" + ], + "style": { + "color": "#d73a49" + } + }, + { + "types": [ + "function-variable" + ], + "style": { + "color": "#6f42c1" + } + }, + { + "types": [ + "tag", + "selector", + "keyword" + ], + "style": { + "color": "#00009f" + } + } + ] + }, + "darkTheme": { + "plain": { + "color": "#F8F8F2", + "backgroundColor": "#282A36" + }, + "styles": [ + { + "types": [ + "prolog", + "constant", + "builtin" + ], + "style": { + "color": "rgb(189, 147, 249)" + } + }, + { + "types": [ + "inserted", + "function" + ], + "style": { + "color": "rgb(80, 250, 123)" + } + }, + { + "types": [ + "deleted" + ], + "style": { + "color": "rgb(255, 85, 85)" + } + }, + { + "types": [ + "changed" + ], + "style": { + "color": "rgb(255, 184, 108)" + } + }, + { + "types": [ + "punctuation", + "symbol" + ], + "style": { + "color": "rgb(248, 248, 242)" + } + }, + { + "types": [ + "string", + "char", + "tag", + "selector" + ], + "style": { + "color": "rgb(255, 121, 198)" + } + }, + { + "types": [ + "keyword", + "variable" + ], + "style": { + "color": "rgb(189, 147, 249)", + "fontStyle": "italic" + } + }, + { + "types": [ + "comment" + ], + "style": { + "color": "rgb(98, 114, 164)" + } + }, + { + "types": [ + "attr-name" + ], + "style": { + "color": "rgb(241, 250, 140)" + } + } + ] + }, + "additionalLanguages": [], + "magicComments": [ + { + "className": "theme-code-block-highlighted-line", + "line": "highlight-next-line", + "block": { + "start": "highlight-start", + "end": "highlight-end" + } + } + ] + }, + "docs": { + "versionPersistence": "localStorage", + "sidebar": { + "hideable": false, + "autoCollapseCategories": false + } + }, + "blog": { + "sidebar": { + "groupByYear": true + } + }, + "metadata": [], + "tableOfContents": { + "minHeadingLevel": 2, + "maxHeadingLevel": 3 + } + }, + "baseUrlIssueBanner": true, + "onBrokenAnchors": "warn", + "onDuplicateRoutes": "warn", + "staticDirectories": [ + "static" + ], + "customFields": {}, + "plugins": [], + "themes": [], + "scripts": [], + "headTags": [], + "stylesheets": [], + "clientModules": [], + "titleDelimiter": "|", + "noIndex": false, + "markdown": { + "format": "mdx", + "mermaid": false, + "emoji": true, + "mdx1Compat": { + "comments": true, + "admonitions": true, + "headingIds": true + }, + "anchors": { + "maintainCase": false + }, + "hooks": { + "onBrokenMarkdownLinks": "warn", + "onBrokenMarkdownImages": "throw" + } + } +}; diff --git a/docs/.docusaurus/globalData.json b/docs/.docusaurus/globalData.json new file mode 100644 index 000000000..fea5d98f7 --- /dev/null +++ b/docs/.docusaurus/globalData.json @@ -0,0 +1,78 @@ +{ + "docusaurus-plugin-content-docs": { + "default": { + "path": "/prototype/docs", + "versions": [ + { + "name": "current", + "label": "Next", + "isLast": true, + "path": "/prototype/docs", + "mainDocId": "Getting Started/getting-started", + "docs": [ + { + "id": "Getting Started/getting-started", + "path": "/prototype/docs/Getting Started/getting-started", + "sidebar": "tutorialSidebar" + }, + { + "id": "Post Platform Guide/getting-started", + "path": "/prototype/docs/Post Platform Guide/getting-started", + "sidebar": "tutorialSidebar" + }, + { + "id": "Post Platform Guide/mapping-rules", + "path": "/prototype/docs/Post Platform Guide/mapping-rules", + "sidebar": "tutorialSidebar" + }, + { + "id": "Post Platform Guide/webhook-controller", + "path": "/prototype/docs/Post Platform Guide/webhook-controller", + "sidebar": "tutorialSidebar" + }, + { + "id": "W3DS Basics/getting-started", + "path": "/prototype/docs/W3DS Basics/getting-started", + "sidebar": "tutorialSidebar" + }, + { + "id": "W3DS Protocol/getting-started", + "path": "/prototype/docs/W3DS Protocol/getting-started", + "sidebar": "tutorialSidebar" + }, + { + "id": "/category/getting-started", + "path": "/prototype/docs/category/getting-started", + "sidebar": "tutorialSidebar" + }, + { + "id": "/category/w3ds-basics", + "path": "/prototype/docs/category/w3ds-basics", + "sidebar": "tutorialSidebar" + }, + { + "id": "/category/w3ds-protocol", + "path": "/prototype/docs/category/w3ds-protocol", + "sidebar": "tutorialSidebar" + }, + { + "id": "/category/post-platforms-guide", + "path": "/prototype/docs/category/post-platforms-guide", + "sidebar": "tutorialSidebar" + } + ], + "draftIds": [], + "sidebars": { + "tutorialSidebar": { + "link": { + "path": "/prototype/docs/category/getting-started", + "label": "Getting Started" + } + } + } + } + ], + "breadcrumbs": true + } + } +} \ No newline at end of file diff --git a/docs/.docusaurus/i18n.json b/docs/.docusaurus/i18n.json new file mode 100644 index 000000000..1261b63d5 --- /dev/null +++ b/docs/.docusaurus/i18n.json @@ -0,0 +1,20 @@ +{ + "defaultLocale": "en", + "locales": [ + "en" + ], + "path": "i18n", + "currentLocale": "en", + "localeConfigs": { + "en": { + "label": "English", + "direction": "ltr", + "htmlLang": "en", + "calendar": "gregory", + "path": "en", + "translate": false, + "url": "https://MetaState-Prototype-Project.github.io", + "baseUrl": "/prototype/" + } + } +} \ No newline at end of file diff --git a/docs/.docusaurus/registry.js b/docs/.docusaurus/registry.js new file mode 100644 index 000000000..b72815828 --- /dev/null +++ b/docs/.docusaurus/registry.js @@ -0,0 +1,31 @@ +export default { + "__comp---site-src-pages-index-tsx-1-df-d3e": [() => import(/* webpackChunkName: "__comp---site-src-pages-index-tsx-1-df-d3e" */ "@site/src/pages/index.tsx"), "@site/src/pages/index.tsx", require.resolveWeak("@site/src/pages/index.tsx")], + "__comp---theme-debug-config-23-a-2ff": [() => import(/* webpackChunkName: "__comp---theme-debug-config-23-a-2ff" */ "@theme/DebugConfig"), "@theme/DebugConfig", require.resolveWeak("@theme/DebugConfig")], + "__comp---theme-debug-contentba-8-ce7": [() => import(/* webpackChunkName: "__comp---theme-debug-contentba-8-ce7" */ "@theme/DebugContent"), "@theme/DebugContent", require.resolveWeak("@theme/DebugContent")], + "__comp---theme-debug-global-dataede-0fa": [() => import(/* webpackChunkName: "__comp---theme-debug-global-dataede-0fa" */ "@theme/DebugGlobalData"), "@theme/DebugGlobalData", require.resolveWeak("@theme/DebugGlobalData")], + "__comp---theme-debug-registry-679-501": [() => import(/* webpackChunkName: "__comp---theme-debug-registry-679-501" */ "@theme/DebugRegistry"), "@theme/DebugRegistry", require.resolveWeak("@theme/DebugRegistry")], + "__comp---theme-debug-routes-946-699": [() => import(/* webpackChunkName: "__comp---theme-debug-routes-946-699" */ "@theme/DebugRoutes"), "@theme/DebugRoutes", require.resolveWeak("@theme/DebugRoutes")], + "__comp---theme-debug-site-metadata-68-e-3d4": [() => import(/* webpackChunkName: "__comp---theme-debug-site-metadata-68-e-3d4" */ "@theme/DebugSiteMetadata"), "@theme/DebugSiteMetadata", require.resolveWeak("@theme/DebugSiteMetadata")], + "__comp---theme-doc-category-generated-index-page-14-e-640": [() => import(/* webpackChunkName: "__comp---theme-doc-category-generated-index-page-14-e-640" */ "@theme/DocCategoryGeneratedIndexPage"), "@theme/DocCategoryGeneratedIndexPage", require.resolveWeak("@theme/DocCategoryGeneratedIndexPage")], + "__comp---theme-doc-item-178-a40": [() => import(/* webpackChunkName: "__comp---theme-doc-item-178-a40" */ "@theme/DocItem"), "@theme/DocItem", require.resolveWeak("@theme/DocItem")], + "__comp---theme-doc-roota-94-67a": [() => import(/* webpackChunkName: "__comp---theme-doc-roota-94-67a" */ "@theme/DocRoot"), "@theme/DocRoot", require.resolveWeak("@theme/DocRoot")], + "__comp---theme-doc-version-roota-7-b-5de": [() => import(/* webpackChunkName: "__comp---theme-doc-version-roota-7-b-5de" */ "@theme/DocVersionRoot"), "@theme/DocVersionRoot", require.resolveWeak("@theme/DocVersionRoot")], + "__comp---theme-docs-root-5-e-9-0b6": [() => import(/* webpackChunkName: "__comp---theme-docs-root-5-e-9-0b6" */ "@theme/DocsRoot"), "@theme/DocsRoot", require.resolveWeak("@theme/DocsRoot")], + "__comp---theme-mdx-page-1-f-3-b90": [() => import(/* webpackChunkName: "__comp---theme-mdx-page-1-f-3-b90" */ "@theme/MDXPage"), "@theme/MDXPage", require.resolveWeak("@theme/MDXPage")], + "__props---prototype-docs-5-d-2-28b": [() => import(/* webpackChunkName: "__props---prototype-docs-5-d-2-28b" */ "@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-793.json"), "@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-793.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-793.json")], + "__props---prototype-docs-category-getting-startedde-4-722": [() => import(/* webpackChunkName: "__props---prototype-docs-category-getting-startedde-4-722" */ "@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-category-getting-started-204.json"), "@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-category-getting-started-204.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-category-getting-started-204.json")], + "__props---prototype-docs-category-post-platforms-guide-458-03b": [() => import(/* webpackChunkName: "__props---prototype-docs-category-post-platforms-guide-458-03b" */ "@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-category-post-platforms-guide-251.json"), "@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-category-post-platforms-guide-251.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-category-post-platforms-guide-251.json")], + "__props---prototype-docs-category-w-3-ds-basics-243-112": [() => import(/* webpackChunkName: "__props---prototype-docs-category-w-3-ds-basics-243-112" */ "@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-basics-031.json"), "@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-basics-031.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-basics-031.json")], + "__props---prototype-docs-category-w-3-ds-protocolb-0-c-d97": [() => import(/* webpackChunkName: "__props---prototype-docs-category-w-3-ds-protocolb-0-c-d97" */ "@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-protocol-320.json"), "@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-protocol-320.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/p/prototype-docs-category-w-3-ds-protocol-320.json")], + "__props---prototype-docusaurus-debug-content-46-c-f05": [() => import(/* webpackChunkName: "__props---prototype-docusaurus-debug-content-46-c-f05" */ "@generated/docusaurus-plugin-debug/default/p/prototype-docusaurus-debug-content-78b.json"), "@generated/docusaurus-plugin-debug/default/p/prototype-docusaurus-debug-content-78b.json", require.resolveWeak("@generated/docusaurus-plugin-debug/default/p/prototype-docusaurus-debug-content-78b.json")], + "config---prototype-5-e-9-698": [() => import(/* webpackChunkName: "config---prototype-5-e-9-698" */ "@generated/docusaurus.config"), "@generated/docusaurus.config", require.resolveWeak("@generated/docusaurus.config")], + "content---prototype-docs-getting-started-getting-started-793-2ea": [() => import(/* webpackChunkName: "content---prototype-docs-getting-started-getting-started-793-2ea" */ "@site/docs/Getting Started/getting-started.md"), "@site/docs/Getting Started/getting-started.md", require.resolveWeak("@site/docs/Getting Started/getting-started.md")], + "content---prototype-docs-post-platform-guide-getting-startedba-4-fea": [() => import(/* webpackChunkName: "content---prototype-docs-post-platform-guide-getting-startedba-4-fea" */ "@site/docs/Post Platform Guide/getting-started.md"), "@site/docs/Post Platform Guide/getting-started.md", require.resolveWeak("@site/docs/Post Platform Guide/getting-started.md")], + "content---prototype-docs-post-platform-guide-mapping-rules-24-c-411": [() => import(/* webpackChunkName: "content---prototype-docs-post-platform-guide-mapping-rules-24-c-411" */ "@site/docs/Post Platform Guide/mapping-rules.md"), "@site/docs/Post Platform Guide/mapping-rules.md", require.resolveWeak("@site/docs/Post Platform Guide/mapping-rules.md")], + "content---prototype-docs-post-platform-guide-webhook-controller-7-c-7-462": [() => import(/* webpackChunkName: "content---prototype-docs-post-platform-guide-webhook-controller-7-c-7-462" */ "@site/docs/Post Platform Guide/webhook-controller.md"), "@site/docs/Post Platform Guide/webhook-controller.md", require.resolveWeak("@site/docs/Post Platform Guide/webhook-controller.md")], + "content---prototype-docs-w-3-ds-basics-getting-started-9-b-4-bb6": [() => import(/* webpackChunkName: "content---prototype-docs-w-3-ds-basics-getting-started-9-b-4-bb6" */ "@site/docs/W3DS Basics/getting-started.md"), "@site/docs/W3DS Basics/getting-started.md", require.resolveWeak("@site/docs/W3DS Basics/getting-started.md")], + "content---prototype-docs-w-3-ds-protocol-getting-started-6-b-0-90a": [() => import(/* webpackChunkName: "content---prototype-docs-w-3-ds-protocol-getting-started-6-b-0-90a" */ "@site/docs/W3DS Protocol/getting-started.md"), "@site/docs/W3DS Protocol/getting-started.md", require.resolveWeak("@site/docs/W3DS Protocol/getting-started.md")], + "content---prototype-markdown-page-393-636": [() => import(/* webpackChunkName: "content---prototype-markdown-page-393-636" */ "@site/src/pages/markdown-page.md"), "@site/src/pages/markdown-page.md", require.resolveWeak("@site/src/pages/markdown-page.md")], + "plugin---prototype-docsaba-aa1": [() => import(/* webpackChunkName: "plugin---prototype-docsaba-aa1" */ "@generated/docusaurus-plugin-content-docs/default/__plugin.json"), "@generated/docusaurus-plugin-content-docs/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-docs/default/__plugin.json")], + "plugin---prototype-docusaurus-debugb-38-734": [() => import(/* webpackChunkName: "plugin---prototype-docusaurus-debugb-38-734" */ "@generated/docusaurus-plugin-debug/default/__plugin.json"), "@generated/docusaurus-plugin-debug/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-debug/default/__plugin.json")], + "plugin---prototype-markdown-pagea-74-9ea": [() => import(/* webpackChunkName: "plugin---prototype-markdown-pagea-74-9ea" */ "@generated/docusaurus-plugin-content-pages/default/__plugin.json"), "@generated/docusaurus-plugin-content-pages/default/__plugin.json", require.resolveWeak("@generated/docusaurus-plugin-content-pages/default/__plugin.json")],}; diff --git a/docs/.docusaurus/routes.js b/docs/.docusaurus/routes.js new file mode 100644 index 000000000..3550f09b5 --- /dev/null +++ b/docs/.docusaurus/routes.js @@ -0,0 +1,132 @@ +import React from 'react'; +import ComponentCreator from '@docusaurus/ComponentCreator'; + +export default [ + { + path: '/prototype/__docusaurus/debug', + component: ComponentCreator('/prototype/__docusaurus/debug', 'b97'), + exact: true + }, + { + path: '/prototype/__docusaurus/debug/config', + component: ComponentCreator('/prototype/__docusaurus/debug/config', 'a4e'), + exact: true + }, + { + path: '/prototype/__docusaurus/debug/content', + component: ComponentCreator('/prototype/__docusaurus/debug/content', '917'), + exact: true + }, + { + path: '/prototype/__docusaurus/debug/globalData', + component: ComponentCreator('/prototype/__docusaurus/debug/globalData', '387'), + exact: true + }, + { + path: '/prototype/__docusaurus/debug/metadata', + component: ComponentCreator('/prototype/__docusaurus/debug/metadata', 'e26'), + exact: true + }, + { + path: '/prototype/__docusaurus/debug/registry', + component: ComponentCreator('/prototype/__docusaurus/debug/registry', 'a9f'), + exact: true + }, + { + path: '/prototype/__docusaurus/debug/routes', + component: ComponentCreator('/prototype/__docusaurus/debug/routes', 'c78'), + exact: true + }, + { + path: '/prototype/markdown-page', + component: ComponentCreator('/prototype/markdown-page', 'd93'), + exact: true + }, + { + path: '/prototype/docs', + component: ComponentCreator('/prototype/docs', '605'), + routes: [ + { + path: '/prototype/docs', + component: ComponentCreator('/prototype/docs', 'dbc'), + routes: [ + { + path: '/prototype/docs', + component: ComponentCreator('/prototype/docs', '053'), + routes: [ + { + path: '/prototype/docs/category/getting-started', + component: ComponentCreator('/prototype/docs/category/getting-started', '81d'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/prototype/docs/category/post-platforms-guide', + component: ComponentCreator('/prototype/docs/category/post-platforms-guide', 'db5'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/prototype/docs/category/w3ds-basics', + component: ComponentCreator('/prototype/docs/category/w3ds-basics', '085'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/prototype/docs/category/w3ds-protocol', + component: ComponentCreator('/prototype/docs/category/w3ds-protocol', 'a0b'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/prototype/docs/Getting Started/getting-started', + component: ComponentCreator('/prototype/docs/Getting Started/getting-started', '5c8'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/prototype/docs/Post Platform Guide/getting-started', + component: ComponentCreator('/prototype/docs/Post Platform Guide/getting-started', '32b'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/prototype/docs/Post Platform Guide/mapping-rules', + component: ComponentCreator('/prototype/docs/Post Platform Guide/mapping-rules', '56b'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/prototype/docs/Post Platform Guide/webhook-controller', + component: ComponentCreator('/prototype/docs/Post Platform Guide/webhook-controller', '330'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/prototype/docs/W3DS Basics/getting-started', + component: ComponentCreator('/prototype/docs/W3DS Basics/getting-started', 'c05'), + exact: true, + sidebar: "tutorialSidebar" + }, + { + path: '/prototype/docs/W3DS Protocol/getting-started', + component: ComponentCreator('/prototype/docs/W3DS Protocol/getting-started', 'd7d'), + exact: true, + sidebar: "tutorialSidebar" + } + ] + } + ] + } + ] + }, + { + path: '/prototype/', + component: ComponentCreator('/prototype/', 'c71'), + exact: true + }, + { + path: '*', + component: ComponentCreator('*'), + }, +]; diff --git a/docs/.docusaurus/routesChunkNames.json b/docs/.docusaurus/routesChunkNames.json new file mode 100644 index 000000000..dd8c9eac1 --- /dev/null +++ b/docs/.docusaurus/routesChunkNames.json @@ -0,0 +1,112 @@ +{ + "/prototype/__docusaurus/debug-b97": { + "__comp": "__comp---theme-debug-config-23-a-2ff", + "__context": { + "plugin": "plugin---prototype-docusaurus-debugb-38-734" + } + }, + "/prototype/__docusaurus/debug/config-a4e": { + "__comp": "__comp---theme-debug-config-23-a-2ff", + "__context": { + "plugin": "plugin---prototype-docusaurus-debugb-38-734" + } + }, + "/prototype/__docusaurus/debug/content-917": { + "__comp": "__comp---theme-debug-contentba-8-ce7", + "__context": { + "plugin": "plugin---prototype-docusaurus-debugb-38-734" + }, + "__props": "__props---prototype-docusaurus-debug-content-46-c-f05" + }, + "/prototype/__docusaurus/debug/globalData-387": { + "__comp": "__comp---theme-debug-global-dataede-0fa", + "__context": { + "plugin": "plugin---prototype-docusaurus-debugb-38-734" + } + }, + "/prototype/__docusaurus/debug/metadata-e26": { + "__comp": "__comp---theme-debug-site-metadata-68-e-3d4", + "__context": { + "plugin": "plugin---prototype-docusaurus-debugb-38-734" + } + }, + "/prototype/__docusaurus/debug/registry-a9f": { + "__comp": "__comp---theme-debug-registry-679-501", + "__context": { + "plugin": "plugin---prototype-docusaurus-debugb-38-734" + } + }, + "/prototype/__docusaurus/debug/routes-c78": { + "__comp": "__comp---theme-debug-routes-946-699", + "__context": { + "plugin": "plugin---prototype-docusaurus-debugb-38-734" + } + }, + "/prototype/markdown-page-d93": { + "__comp": "__comp---theme-mdx-page-1-f-3-b90", + "__context": { + "plugin": "plugin---prototype-markdown-pagea-74-9ea" + }, + "content": "content---prototype-markdown-page-393-636" + }, + "/prototype/docs-605": { + "__comp": "__comp---theme-docs-root-5-e-9-0b6", + "__context": { + "plugin": "plugin---prototype-docsaba-aa1" + } + }, + "/prototype/docs-dbc": { + "__comp": "__comp---theme-doc-version-roota-7-b-5de", + "__props": "__props---prototype-docs-5-d-2-28b" + }, + "/prototype/docs-053": { + "__comp": "__comp---theme-doc-roota-94-67a" + }, + "/prototype/docs/category/getting-started-81d": { + "__comp": "__comp---theme-doc-category-generated-index-page-14-e-640", + "__props": "__props---prototype-docs-category-getting-startedde-4-722" + }, + "/prototype/docs/category/post-platforms-guide-db5": { + "__comp": "__comp---theme-doc-category-generated-index-page-14-e-640", + "__props": "__props---prototype-docs-category-post-platforms-guide-458-03b" + }, + "/prototype/docs/category/w3ds-basics-085": { + "__comp": "__comp---theme-doc-category-generated-index-page-14-e-640", + "__props": "__props---prototype-docs-category-w-3-ds-basics-243-112" + }, + "/prototype/docs/category/w3ds-protocol-a0b": { + "__comp": "__comp---theme-doc-category-generated-index-page-14-e-640", + "__props": "__props---prototype-docs-category-w-3-ds-protocolb-0-c-d97" + }, + "/prototype/docs/Getting Started/getting-started-5c8": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---prototype-docs-getting-started-getting-started-793-2ea" + }, + "/prototype/docs/Post Platform Guide/getting-started-32b": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---prototype-docs-post-platform-guide-getting-startedba-4-fea" + }, + "/prototype/docs/Post Platform Guide/mapping-rules-56b": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---prototype-docs-post-platform-guide-mapping-rules-24-c-411" + }, + "/prototype/docs/Post Platform Guide/webhook-controller-330": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---prototype-docs-post-platform-guide-webhook-controller-7-c-7-462" + }, + "/prototype/docs/W3DS Basics/getting-started-c05": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---prototype-docs-w-3-ds-basics-getting-started-9-b-4-bb6" + }, + "/prototype/docs/W3DS Protocol/getting-started-d7d": { + "__comp": "__comp---theme-doc-item-178-a40", + "content": "content---prototype-docs-w-3-ds-protocol-getting-started-6-b-0-90a" + }, + "/prototype/-c71": { + "__comp": "__comp---site-src-pages-index-tsx-1-df-d3e", + "__context": { + "plugin": "plugin---prototype-markdown-pagea-74-9ea" + }, + "config": "config---prototype-5-e-9-698" + } +} \ No newline at end of file diff --git a/docs/.docusaurus/site-metadata.json b/docs/.docusaurus/site-metadata.json new file mode 100644 index 000000000..a545e1cef --- /dev/null +++ b/docs/.docusaurus/site-metadata.json @@ -0,0 +1,41 @@ +{ + "docusaurusVersion": "3.9.2", + "siteVersion": "0.0.0", + "pluginVersions": { + "docusaurus-plugin-css-cascade-layers": { + "type": "package", + "name": "@docusaurus/plugin-css-cascade-layers", + "version": "3.9.2" + }, + "docusaurus-plugin-content-docs": { + "type": "package", + "name": "@docusaurus/plugin-content-docs", + "version": "3.9.2" + }, + "docusaurus-plugin-content-blog": { + "type": "package", + "name": "@docusaurus/plugin-content-blog", + "version": "3.9.2" + }, + "docusaurus-plugin-content-pages": { + "type": "package", + "name": "@docusaurus/plugin-content-pages", + "version": "3.9.2" + }, + "docusaurus-plugin-debug": { + "type": "package", + "name": "@docusaurus/plugin-debug", + "version": "3.9.2" + }, + "docusaurus-plugin-svgr": { + "type": "package", + "name": "@docusaurus/plugin-svgr", + "version": "3.9.2" + }, + "docusaurus-theme-classic": { + "type": "package", + "name": "@docusaurus/theme-classic", + "version": "3.9.2" + } + } +} \ No newline at end of file diff --git a/docs/.docusaurus/site-storage.json b/docs/.docusaurus/site-storage.json new file mode 100644 index 000000000..c769c71c4 --- /dev/null +++ b/docs/.docusaurus/site-storage.json @@ -0,0 +1,4 @@ +{ + "type": "localStorage", + "namespace": "" +} \ No newline at end of file diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx new file mode 100644 index 000000000..6965e5346 --- /dev/null +++ b/docs/src/pages/index.tsx @@ -0,0 +1,21 @@ +import { useEffect, type ReactNode } from 'react'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import { useHistory } from "@docusaurus/router" + +export default function Home(): ReactNode { + const { siteConfig } = useDocusaurusContext(); + const history = useHistory(); + + + useEffect(() => { + history.push("/prototype/docs/Getting Started/getting-started") + }, []) + + return ( + + + ); +} diff --git a/mappings/.gitignore b/mappings/.gitignore deleted file mode 100644 index 73edf0327..000000000 --- a/mappings/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -!.gitignore -* \ No newline at end of file diff --git a/platforms/dreamsync-api/package.json b/platforms/dreamsync-api/package.json index 23656bb42..9638c33f4 100644 --- a/platforms/dreamsync-api/package.json +++ b/platforms/dreamsync-api/package.json @@ -11,7 +11,8 @@ "typeorm": "typeorm-ts-node-commonjs", "migration:generate": "typeorm-ts-node-commonjs migration:generate -d src/database/data-source.ts", "migration:run": "typeorm-ts-node-commonjs migration:run -d src/database/data-source.ts", - "migration:revert": "typeorm-ts-node-commonjs migration:revert -d src/database/data-source.ts" + "migration:revert": "typeorm-ts-node-commonjs migration:revert -d src/database/data-source.ts", + "migrate-summaries": "ts-node --project tsconfig.json scripts/migrate-summaries.ts" }, "dependencies": { "axios": "^1.6.7", diff --git a/platforms/dreamsync-api/src/database/entities/Wishlist.ts b/platforms/dreamsync-api/src/database/entities/Wishlist.ts index f5192d134..d6944ef0a 100644 --- a/platforms/dreamsync-api/src/database/entities/Wishlist.ts +++ b/platforms/dreamsync-api/src/database/entities/Wishlist.ts @@ -22,11 +22,11 @@ export class Wishlist { @Column({ type: "text" }) content: string; // Markdown content - @Column({ type: "text", nullable: true }) - summaryWants: string | null; + @Column({ type: "jsonb", nullable: true }) + summaryWants: string[] | null; - @Column({ type: "text", nullable: true }) - summaryOffers: string | null; + @Column({ type: "jsonb", nullable: true }) + summaryOffers: string[] | null; @Column({ type: "boolean", default: true }) isActive: boolean; diff --git a/platforms/dreamsync-api/src/index.ts b/platforms/dreamsync-api/src/index.ts index c9a225f72..10a57ca0d 100644 --- a/platforms/dreamsync-api/src/index.ts +++ b/platforms/dreamsync-api/src/index.ts @@ -32,23 +32,24 @@ AppDataSource.initialize() const exists = await platformService.checkPlatformEVaultExists(); if (!exists) { - console.log("🔧 Creating platform eVault for DreamSync..."); + console.log("Creating platform eVault for DreamSync..."); const result = await platformService.createPlatformEVault(); - console.log(`✅ Platform eVault created successfully: ${result.w3id}`); + console.log(`Platform eVault created successfully: ${result.w3id}`); } else { - console.log("✅ Platform eVault already exists for DreamSync"); + console.log("Platform eVault already exists for DreamSync"); } } catch (error) { - console.error("❌ Failed to initialize platform eVault:", error); + console.error("Failed to initialize platform eVault:", error); // Don't exit the process, just log the error } - // Backfill wishlist summaries for existing records + // Summarize all wishlists on platform start try { const wishlistSummaryService = WishlistSummaryService.getInstance(); - await wishlistSummaryService.backfillMissingSummaries(); + await wishlistSummaryService.summarizeAllWishlists(); } catch (error) { - console.error("❌ Failed to backfill wishlist summaries:", error); + console.error("Failed to summarize wishlists:", error); + // Don't exit the process, just log the error } // Start AI matching job (disabled automatic startup) diff --git a/platforms/dreamsync-api/src/services/AIMatchingService.ts b/platforms/dreamsync-api/src/services/AIMatchingService.ts index 56c85a5e7..b653c9e34 100644 --- a/platforms/dreamsync-api/src/services/AIMatchingService.ts +++ b/platforms/dreamsync-api/src/services/AIMatchingService.ts @@ -38,26 +38,38 @@ export class AIMatchingService { return withOperationContext('AIMatchingService', operationId, async () => { const wishlists = await this.getWishlistsForMatching(); - console.log(`📋 Found ${wishlists.length} wishlists to analyze`); + console.log(`📋 Found ${wishlists.length} wishlists to analyze (after filtering blank wishlists)`); + + if (wishlists.length === 0) { + console.log("⚠️ No valid wishlists to match, skipping matching process"); + return; + } + await this.ensureWishlistSummaries(wishlists); // Get existing groups for context const existingGroups = await this.getExistingGroups(); console.log(`🏠 Found ${existingGroups.length} existing groups to consider`); - // Convert to shared service format - const wishlistData: WishlistData[] = wishlists.map(wishlist => ({ - id: wishlist.id, - content: wishlist.content, - summaryWants: wishlist.summaryWants || "", - summaryOffers: wishlist.summaryOffers || "", - userId: wishlist.userId, - user: { - id: wishlist.user.id, - name: wishlist.user.name || wishlist.user.ename, - ename: wishlist.user.ename - } - })); + // Convert to shared service format, filtering out wishlists without summaries + const wishlistData: WishlistData[] = wishlists + .filter(wishlist => { + // Only include wishlists with valid summary arrays + return wishlist.summaryWants && wishlist.summaryWants.length > 0 && + wishlist.summaryOffers && wishlist.summaryOffers.length > 0; + }) + .map(wishlist => ({ + id: wishlist.id, + content: wishlist.content, + summaryWants: wishlist.summaryWants || [], + summaryOffers: wishlist.summaryOffers || [], + userId: wishlist.userId, + user: { + id: wishlist.user.id, + name: wishlist.user.name || wishlist.user.ename, + ename: wishlist.user.ename + } + })); // Use matching service for parallel processing const matchResults = await this.matchingService.findMatches(wishlistData, existingGroups); @@ -224,9 +236,19 @@ export class AIMatchingService { private async ensureWishlistSummaries(wishlists: Wishlist[]): Promise { for (const wishlist of wishlists) { - if (!wishlist.summaryWants || !wishlist.summaryOffers) { + // Ensure summaries exist and are arrays + if (!wishlist.summaryWants || wishlist.summaryWants.length === 0 || + !wishlist.summaryOffers || wishlist.summaryOffers.length === 0) { try { await this.wishlistSummaryService.ensureSummaries(wishlist); + // Reload wishlist to get updated summaries + const updated = await this.wishlistRepository.findOne({ + where: { id: wishlist.id }, + relations: ["user"] + }); + if (updated) { + Object.assign(wishlist, updated); + } } catch (error) { console.error(`Failed to ensure summary for wishlist ${wishlist.id}`, error); } @@ -383,10 +405,12 @@ Content: ${wishlistA.content} Title: ${wishlistB.title} Content: ${wishlistB.content} -IMPORTANT: Only return a JSON response if there's a meaningful connection (confidence > 0.7). If there's no meaningful connection, return confidence: 0 and matchType: "private" (this will be filtered out). +IMPORTANT: Only return a JSON response if there's a meaningful connection (confidence > 0.85). If there's no meaningful connection, return confidence: 0 and matchType: "private" (this will be filtered out). + +CRITICAL: If either wishlist is blank, templated with minimal content, or contains insufficient information, return confidence: 0. A blank/templated wishlist has the template structure (## What I Want / ## What I Can Do) but with very few items (2 or fewer meaningful items) or very short/placeholder content. Do NOT generate matches based on generic or placeholder content. Return JSON with: -1. "confidence": number between 0-1 indicating match strength (0 if no meaningful connection) +1. "confidence": number between 0-1 indicating match strength (0 if no meaningful connection or if wishlists are too sparse) 2. "matchType": "private" or "group" (use "private" if no connection) 3. "reason": brief explanation of why they match (or why no match) 4. "matchedWants": array of what User A wants that User B can offer @@ -399,8 +423,9 @@ Consider: - Complementary needs and offerings - Potential for meaningful collaboration - Whether this could be a private connection or group activity +- Whether the wishlists contain sufficient meaningful content (not just template placeholders) -Only suggest matches with confidence > 0.7 for meaningful connections. +Only suggest matches with confidence > 0.85 for meaningful connections based on substantial content. `.trim(); } diff --git a/platforms/dreamsync-api/src/services/MatchingService.ts b/platforms/dreamsync-api/src/services/MatchingService.ts index 54154a715..5b7b5245f 100644 --- a/platforms/dreamsync-api/src/services/MatchingService.ts +++ b/platforms/dreamsync-api/src/services/MatchingService.ts @@ -15,8 +15,8 @@ export interface MatchResult { export interface WishlistData { id: string; content: string; - summaryWants: string; - summaryOffers: string; + summaryWants: string[]; + summaryOffers: string[]; userId: string; user: { id: string; @@ -68,17 +68,24 @@ export class MatchingService { private buildAllMatchesPrompt(wishlists: WishlistData[], existingGroups?: GroupData[]): string { const delimiter = "<|>"; const wishlistHeader = `userId${delimiter}userEname${delimiter}userName${delimiter}wants${delimiter}offers`; - const wishlistRows = wishlists.map((wishlist) => { - const wants = wishlist.summaryWants || wishlist.content; - const offers = wishlist.summaryOffers || wishlist.content; - return [ - this.sanitizeField(wishlist.userId), - this.sanitizeField(wishlist.user.ename), - this.sanitizeField(wishlist.user.name || wishlist.user.ename), - this.sanitizeField(wants), - this.sanitizeField(offers), - ].join(delimiter); - }).join("\n"); + const wishlistRows = wishlists + .filter((wishlist) => { + // Only include wishlists with valid summary arrays + return wishlist.summaryWants && wishlist.summaryWants.length > 0 && + wishlist.summaryOffers && wishlist.summaryOffers.length > 0; + }) + .map((wishlist) => { + // Join array items with semicolons for CSV format + const wants = (wishlist.summaryWants || []).join('; '); + const offers = (wishlist.summaryOffers || []).join('; '); + return [ + this.sanitizeField(wishlist.userId), + this.sanitizeField(wishlist.user.ename), + this.sanitizeField(wishlist.user.name || wishlist.user.ename), + this.sanitizeField(wants), + this.sanitizeField(offers), + ].join(delimiter); + }).join("\n"); let existingGroupsText = ''; if (existingGroups && existingGroups.length > 0) { @@ -110,6 +117,8 @@ You are an AI matching assistant. Analyze ALL the wishlists below and find meani The wishlists are provided as delimiter-separated rows (delimiter: "${delimiter}"). Columns: userId${delimiter}userEname${delimiter}userName${delimiter}wants${delimiter}offers +The "wants" and "offers" columns contain semicolon-separated arrays of short phrases extracted from each user's wishlist. + ${wishlistHeader} ${wishlistRows} @@ -119,7 +128,7 @@ Return userIds EXACTLY as provided in the table (no new IDs, no missing IDs).${e TASK: Find ALL meaningful matches between these users based on their wishlists. IMPORTANT RULES: -1. Only suggest matches with confidence > 0.7 +1. Only suggest matches with confidence > 0.85 2. Each user can be matched with multiple other users 3. Return ALL matches found, not just the best ones 4. Consider both "What I Want" and "What I Can Do" sections @@ -127,6 +136,10 @@ IMPORTANT RULES: 6. Classify activities properly: - PRIVATE: Personal services (tutoring, coaching, 1-on-1 lessons, personal projects) - GROUP: Group activities (sports teams, clubs, workshops, group projects, tournaments) +7. CRITICAL: If wishlists are blank, templated with minimal content, or contain insufficient information to make meaningful matches, return an empty array [] + - Blank/templated wishlists have the template structure (## What I Want / ## What I Can Do) but with very few items (2 or fewer) or very short/meaningless content + - Do NOT generate matches based on generic or placeholder content + - Only return matches when there is substantial, meaningful content in the wishlists Return a JSON array of matches with this structure: [ @@ -191,7 +204,7 @@ Be thorough and find ALL potential matches! messages: [ { role: "system", - content: "You are an AI matching assistant. Your goal is to find meaningful connections between people based on their wishlists. Analyze all wishlists and return ALL matches found as a JSON array." + content: "You are an AI matching assistant. Your goal is to find meaningful connections between people based on their wishlists. Analyze all wishlists and return ALL matches found as a JSON array. If wishlists are blank, templated with minimal content, or insufficient for meaningful matching, return an empty array []." }, { role: "user", @@ -261,7 +274,7 @@ Be thorough and find ALL potential matches! const minUsers = isJoinExistingGroup ? 1 : 2; if (typeof match.confidence === 'number' && - match.confidence > 0.7 && + match.confidence > 0.85 && ['private', 'group'].includes(match.matchType) && Array.isArray(match.userIds) && match.userIds.length >= minUsers && diff --git a/platforms/dreamsync-api/src/services/SharedMatchingService.ts b/platforms/dreamsync-api/src/services/SharedMatchingService.ts index aa42134d0..40f894926 100644 --- a/platforms/dreamsync-api/src/services/SharedMatchingService.ts +++ b/platforms/dreamsync-api/src/services/SharedMatchingService.ts @@ -13,8 +13,8 @@ export interface MatchResult { export interface WishlistData { id: string; content: string; - summaryWants: string; - summaryOffers: string; + summaryWants: string[]; + summaryOffers: string[]; userId: string; user: { id: string; @@ -63,7 +63,7 @@ export class MatchingService { const batchPromises = batch.map(async ({ wishlistA, wishlistB }) => { try { const matchResult = await this.analyzeMatch(wishlistA, wishlistB); - if (matchResult.confidence > 0.7) { + if (matchResult.confidence > 0.85) { return matchResult; } return null; @@ -90,19 +90,28 @@ export class MatchingService { } private buildAnalysisPrompt(wishlistA: WishlistData, wishlistB: WishlistData): string { + const wantsA = (wishlistA.summaryWants || []).join(', '); + const offersA = (wishlistA.summaryOffers || []).join(', '); + const wantsB = (wishlistB.summaryWants || []).join(', '); + const offersB = (wishlistB.summaryOffers || []).join(', '); + return ` Analyze these two wishlists to determine if there's a meaningful connection: Wishlist A (User: ${wishlistA.user.name}): - ${wishlistA.content} + Wants: ${wantsA || 'None specified'} + Offers: ${offersA || 'None specified'} Wishlist B (User: ${wishlistB.user.name}): - ${wishlistB.content} + Wants: ${wantsB || 'None specified'} + Offers: ${offersB || 'None specified'} + + IMPORTANT: Only return a JSON response if there's a meaningful connection (confidence > 0.85). If there's no meaningful connection, return confidence: 0 and matchType: "private" (this will be filtered out). - IMPORTANT: Only return a JSON response if there's a meaningful connection (confidence > 0.7). If there's no meaningful connection, return confidence: 0 and matchType: "private" (this will be filtered out). + CRITICAL: If either wishlist is blank, templated with minimal content, or contains insufficient information, return confidence: 0. A blank/templated wishlist has the template structure (## What I Want / ## What I Can Do) but with very few items (2 or fewer meaningful items) or very short/placeholder content. Do NOT generate matches based on generic or placeholder content. Return JSON with: - 1. "confidence": number between 0-1 indicating match strength (0 if no meaningful connection) + 1. "confidence": number between 0-1 indicating match strength (0 if no meaningful connection or if wishlists are too sparse) 2. "matchType": "private" or "group" (use "private" if no connection) 3. "reason": brief explanation of why they match (or why no match) 4. "matchedWants": array of what User A wants that User B can offer @@ -115,8 +124,9 @@ export class MatchingService { - Complementary needs and offerings - Potential for meaningful collaboration - Whether this could be a private connection or group activity + - Whether the wishlists contain sufficient meaningful content (not just template placeholders) - Only suggest matches with confidence > 0.7 for meaningful connections. + Only suggest matches with confidence > 0.85 for meaningful connections based on substantial content. `.trim(); } diff --git a/platforms/dreamsync-api/src/services/WishlistSummaryService.ts b/platforms/dreamsync-api/src/services/WishlistSummaryService.ts index 2e2e69fc8..eb353ad8f 100644 --- a/platforms/dreamsync-api/src/services/WishlistSummaryService.ts +++ b/platforms/dreamsync-api/src/services/WishlistSummaryService.ts @@ -4,8 +4,8 @@ import { AppDataSource } from "../database/data-source"; import { Wishlist } from "../database/entities/Wishlist"; type WishlistSummary = { - summaryWants: string; - summaryOffers: string; + summaryWants: string[]; + summaryOffers: string[]; }; const DELIMITER = "<|>"; @@ -32,13 +32,22 @@ export class WishlistSummaryService { async summarizeWishlistContent(content: string): Promise { const prompt = ` -Summarize the wishlist into two ultra-short single-line fragments (<=120 chars each). -Return EXACTLY in this format, nothing else: -wants: -offers: -- Be terse, remove filler, prefer keywords over sentences. -- Avoid newlines, commas, and the delimiter "${DELIMITER}". -- If explicit wants/offers are missing, infer concise intent/skills from context. +Extract and summarize the wishlist into two arrays of short items. + +Return EXACTLY in this JSON format, nothing else: +{ + "wants": ["item 1", "item 2", "item 3"], + "offers": ["item 1", "item 2", "item 3"] +} + +Rules: +- Extract each distinct want/offer as a separate array item +- Each item should be a short phrase (5-30 characters) +- Be terse, remove filler, prefer keywords over sentences +- Avoid the delimiter "${DELIMITER}" in items +- If explicit wants/offers are missing, infer concise intent/skills from context +- Return empty arrays [] if no meaningful content found +- Maximum 10 items per array `.trim(); try { @@ -47,7 +56,7 @@ offers: messages: [ { role: "system", - content: "You are a terse summarizer that emits exactly two lines: wants and offers.", + content: "You are a summarizer that extracts wants and offers as JSON arrays of short phrases.", }, { role: "user", @@ -55,7 +64,8 @@ offers: }, ], temperature: 0.2, - max_tokens: 180, + max_tokens: 500, + response_format: { type: "json_object" }, }); const raw = response.choices[0]?.message?.content || ""; @@ -67,11 +77,11 @@ offers: console.error("WishlistSummaryService: OpenAI summarization failed, using fallback", error); } - // Fallback: truncate raw content into two identical concise lines + // Fallback: extract basic items from content const fallback = this.buildFallback(content); return { - summaryWants: fallback, - summaryOffers: fallback, + summaryWants: fallback.wants, + summaryOffers: fallback.offers, }; } @@ -83,7 +93,8 @@ offers: } async ensureSummaries(wishlist: Wishlist): Promise { - if (wishlist.summaryWants && wishlist.summaryOffers) { + if (wishlist.summaryWants && wishlist.summaryWants.length > 0 && + wishlist.summaryOffers && wishlist.summaryOffers.length > 0) { return wishlist; } return this.summarizeAndPersist(wishlist); @@ -117,39 +128,141 @@ offers: console.log("WishlistSummaryService: Backfill completed"); } - private parseSummary(raw: string): WishlistSummary | null { - const cleaned = raw.replace(/\r/g, "").trim(); - const wantsMatch = cleaned.match(/wants:\s*(.*)/i); - const offersMatch = cleaned.match(/offers:\s*(.*)/i); + /** + * Summarize all wishlists and log the results + * Used for comprehensive summarization on platform start + */ + async summarizeAllWishlists(): Promise { + const allWishlists = await this.wishlistRepository.find({ + where: { isActive: true }, + order: { updatedAt: "DESC" }, + }); - if (!wantsMatch && !offersMatch) { - return null; + if (allWishlists.length === 0) { + console.log("WishlistSummaryService: No active wishlists to summarize"); + return; } - const summaryWants = this.cleanFragment(wantsMatch?.[1] || ""); - const summaryOffers = this.cleanFragment(offersMatch?.[1] || ""); + console.log(`\n${"=".repeat(80)}`); + console.log(`WishlistSummaryService: Starting comprehensive summarization of ${allWishlists.length} wishlists`); + console.log(`${"=".repeat(80)}\n`); - if (!summaryWants && !summaryOffers) { - return null; + let successCount = 0; + let errorCount = 0; + + for (const wishlist of allWishlists) { + try { + const summary = await this.summarizeWishlistContent(wishlist.content); + + // Log the raw content and summary + console.log(`[${wishlist.id}]`); + console.log(` Raw: ${wishlist.content.substring(0, 200)}${wishlist.content.length > 200 ? '...' : ''}`); + console.log(` Summary Wants: ${JSON.stringify(summary.summaryWants)}`); + console.log(` Summary Offers: ${JSON.stringify(summary.summaryOffers)}`); + console.log(''); + + // Persist the summary + wishlist.summaryWants = summary.summaryWants; + wishlist.summaryOffers = summary.summaryOffers; + await this.wishlistRepository.save(wishlist); + + successCount++; + } catch (error) { + console.error(`[${wishlist.id}] Failed to summarize:`, error); + errorCount++; + } } - return { - summaryWants: summaryWants || summaryOffers || "", - summaryOffers: summaryOffers || summaryWants || "", - }; + console.log(`${"=".repeat(80)}`); + console.log(`WishlistSummaryService: Summarization completed`); + console.log(` Success: ${successCount}`); + console.log(` Errors: ${errorCount}`); + console.log(`${"=".repeat(80)}\n`); + } + + private parseSummary(raw: string): WishlistSummary | null { + try { + const cleaned = raw.replace(/\r/g, "").trim(); + const jsonMatch = cleaned.match(/\{[\s\S]*\}/); + if (!jsonMatch) { + return null; + } + + const parsed = JSON.parse(jsonMatch[0]); + const wants = Array.isArray(parsed.wants) ? parsed.wants : []; + const offers = Array.isArray(parsed.offers) ? parsed.offers : []; + + // Clean and validate items + const cleanWants = wants + .filter((item: any) => typeof item === 'string' && item.trim().length > 0) + .map((item: string) => this.cleanArrayItem(item)) + .filter((item: string) => item.length > 0 && item.length <= 100) + .slice(0, 10); + + const cleanOffers = offers + .filter((item: any) => typeof item === 'string' && item.trim().length > 0) + .map((item: string) => this.cleanArrayItem(item)) + .filter((item: string) => item.length > 0 && item.length <= 100) + .slice(0, 10); + + return { + summaryWants: cleanWants.length > 0 ? cleanWants : [], + summaryOffers: cleanOffers.length > 0 ? cleanOffers : [], + }; + } catch (error) { + console.error("WishlistSummaryService: Failed to parse summary JSON", error); + return null; + } } - private cleanFragment(fragment: string): string { - return fragment + private cleanArrayItem(item: string): string { + return item .replace(new RegExp(DELIMITER, "g"), " ") .replace(/\s+/g, " ") .replace(/[,\n\r]+/g, " ") .trim() - .slice(0, MAX_FALLBACK_LENGTH); + .slice(0, 100); } - private buildFallback(content: string): string { - return this.cleanFragment(content).slice(0, MAX_FALLBACK_LENGTH); + private buildFallback(content: string): { wants: string[]; offers: string[] } { + // Extract list items from markdown content as fallback + const wants: string[] = []; + const offers: string[] = []; + + const lines = content.split('\n'); + let currentSection: 'wants' | 'offers' | null = null; + + for (const line of lines) { + const trimmed = line.trim(); + + // Detect section headers + if (/^##\s*what\s+i\s+want/i.test(trimmed)) { + currentSection = 'wants'; + continue; + } + if (/^##\s*what\s+i\s+can\s+do/i.test(trimmed)) { + currentSection = 'offers'; + continue; + } + + // Extract list items + const listItemMatch = trimmed.match(/^[-*]\s+(.+)$/); + if (listItemMatch) { + const item = this.cleanArrayItem(listItemMatch[1]); + if (item.length > 0) { + if (currentSection === 'wants') { + wants.push(item); + } else if (currentSection === 'offers') { + offers.push(item); + } + } + } + } + + return { + wants: wants.slice(0, 10), + offers: offers.slice(0, 10), + }; } } From a4057feef731d2fb9fa40b7b727631169365ebec Mon Sep 17 00:00:00 2001 From: Merul Dhiman Date: Tue, 20 Jan 2026 15:48:56 +0530 Subject: [PATCH 2/5] chore: add migration script --- .../scripts/migrate-summaries.ts | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 platforms/dreamsync-api/scripts/migrate-summaries.ts diff --git a/platforms/dreamsync-api/scripts/migrate-summaries.ts b/platforms/dreamsync-api/scripts/migrate-summaries.ts new file mode 100644 index 000000000..02a313c73 --- /dev/null +++ b/platforms/dreamsync-api/scripts/migrate-summaries.ts @@ -0,0 +1,93 @@ +import "reflect-metadata"; +import path from "node:path"; +import { config } from "dotenv"; +import { AppDataSource } from "../src/database/data-source"; +import { WishlistSummaryService } from "../src/services/WishlistSummaryService"; +import { Wishlist } from "../src/database/entities/Wishlist"; + +// Load environment variables +config({ path: path.resolve(__dirname, "../../../.env") }); + +async function migrateSummaries() { + console.log("Starting migration: Converting text summaries to AI-generated arrays...\n"); + + try { + // Initialize database connection + await AppDataSource.initialize(); + console.log("Database connection established\n"); + + const wishlistRepository = AppDataSource.getRepository(Wishlist); + const summaryService = WishlistSummaryService.getInstance(); + + // Get all wishlists that need migration (have text summaries or no summaries) + const wishlists = await wishlistRepository.find({ + where: { isActive: true }, + relations: ["user"], + order: { updatedAt: "DESC" }, + }); + + console.log(`Found ${wishlists.length} wishlists to process\n`); + + let processedCount = 0; + let skippedCount = 0; + let errorCount = 0; + + for (const wishlist of wishlists) { + try { + // Check if already has array summaries + const hasArraySummaries = + Array.isArray(wishlist.summaryWants) && wishlist.summaryWants.length > 0 && + Array.isArray(wishlist.summaryOffers) && wishlist.summaryOffers.length > 0; + + if (hasArraySummaries) { + skippedCount++; + continue; + } + + console.log(`Processing wishlist ${wishlist.id}...`); + console.log(` Raw content: ${wishlist.content.substring(0, 200)}${wishlist.content.length > 200 ? '...' : ''}`); + + // Use the summary service to generate arrays from the raw content + const summary = await summaryService.summarizeWishlistContent(wishlist.content); + + console.log(` Generated Wants: ${JSON.stringify(summary.summaryWants)}`); + console.log(` Generated Offers: ${JSON.stringify(summary.summaryOffers)}`); + + // Save the arrays to the database + wishlist.summaryWants = summary.summaryWants; + wishlist.summaryOffers = summary.summaryOffers; + await wishlistRepository.save(wishlist); + + console.log(` Saved successfully\n`); + processedCount++; + + } catch (error) { + console.error(` Error processing wishlist ${wishlist.id}:`, error); + errorCount++; + } + } + + console.log("Migration completed:"); + console.log(` Processed: ${processedCount}`); + console.log(` Skipped (already has arrays): ${skippedCount}`); + console.log(` Errors: ${errorCount}\n`); + + } catch (error) { + console.error("Migration failed:", error); + process.exit(1); + } finally { + await AppDataSource.destroy(); + console.log("Database connection closed"); + } +} + +// Run migration +migrateSummaries() + .then(() => { + console.log("Migration script completed"); + process.exit(0); + }) + .catch((error) => { + console.error("Migration script failed:", error); + process.exit(1); + }); From 4e92c08e699c79058d44d56dc24c1298fb3b63c0 Mon Sep 17 00:00:00 2001 From: Merul Dhiman Date: Tue, 20 Jan 2026 15:50:58 +0530 Subject: [PATCH 3/5] chore: add db migration --- .../migrations/1768904445609-migration.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 platforms/dreamsync-api/src/database/migrations/1768904445609-migration.ts diff --git a/platforms/dreamsync-api/src/database/migrations/1768904445609-migration.ts b/platforms/dreamsync-api/src/database/migrations/1768904445609-migration.ts new file mode 100644 index 000000000..5bcc39e4a --- /dev/null +++ b/platforms/dreamsync-api/src/database/migrations/1768904445609-migration.ts @@ -0,0 +1,20 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Migration1768904445609 implements MigrationInterface { + name = 'Migration1768904445609' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "wishlists" DROP COLUMN "summaryWants"`); + await queryRunner.query(`ALTER TABLE "wishlists" ADD "summaryWants" jsonb`); + await queryRunner.query(`ALTER TABLE "wishlists" DROP COLUMN "summaryOffers"`); + await queryRunner.query(`ALTER TABLE "wishlists" ADD "summaryOffers" jsonb`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "wishlists" DROP COLUMN "summaryOffers"`); + await queryRunner.query(`ALTER TABLE "wishlists" ADD "summaryOffers" text`); + await queryRunner.query(`ALTER TABLE "wishlists" DROP COLUMN "summaryWants"`); + await queryRunner.query(`ALTER TABLE "wishlists" ADD "summaryWants" text`); + } + +} From a01e4d651ede3b21ff078f96c91a8accb87b7bc6 Mon Sep 17 00:00:00 2001 From: Merul Dhiman Date: Tue, 20 Jan 2026 16:35:37 +0530 Subject: [PATCH 4/5] fix: wishlist filtering --- .../src/services/MatchingService.ts | 97 ++++++++++--------- 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/platforms/dreamsync-api/src/services/MatchingService.ts b/platforms/dreamsync-api/src/services/MatchingService.ts index 5b7b5245f..b260967ae 100644 --- a/platforms/dreamsync-api/src/services/MatchingService.ts +++ b/platforms/dreamsync-api/src/services/MatchingService.ts @@ -48,19 +48,34 @@ export class MatchingService { * Analyze all wishlists at once and find matches in a single AI request */ async findMatches(wishlists: WishlistData[], existingGroups?: GroupData[]): Promise { - console.log(`🤖 Starting AI matching process for ${wishlists.length} wishlists...`); - console.log(`📊 Analyzing all wishlists in a single AI request (much more efficient!)`); + console.log(`Starting AI matching process for ${wishlists.length} wishlists...`); + console.log(`Analyzing all wishlists in a single AI request (much more efficient!)`); + + // Filter out wishlists without valid summaries before processing + const validWishlists = wishlists.filter((wishlist) => { + return wishlist.summaryWants && wishlist.summaryWants.length > 0 && + wishlist.summaryOffers && wishlist.summaryOffers.length > 0; + }); + + if (validWishlists.length === 0) { + console.log("No wishlists with valid summaries to match, returning empty array"); + return []; + } + + if (validWishlists.length < wishlists.length) { + console.log(`Filtered out ${wishlists.length - validWishlists.length} wishlists without valid summaries`); + } if (existingGroups && existingGroups.length > 0) { - console.log(`🏠 Found ${existingGroups.length} existing groups to consider`); + console.log(`Found ${existingGroups.length} existing groups to consider`); } try { - const matchResults = await this.analyzeAllMatches(wishlists, existingGroups); - console.log(`🎉 AI matching process completed! Found ${matchResults.length} matches`); + const matchResults = await this.analyzeAllMatches(validWishlists, existingGroups); + console.log(`AI matching process completed! Found ${matchResults.length} matches`); return matchResults; } catch (error) { - console.error("❌ Error in AI matching process:", error); + console.error("Error in AI matching process:", error); return []; } } @@ -68,24 +83,18 @@ export class MatchingService { private buildAllMatchesPrompt(wishlists: WishlistData[], existingGroups?: GroupData[]): string { const delimiter = "<|>"; const wishlistHeader = `userId${delimiter}userEname${delimiter}userName${delimiter}wants${delimiter}offers`; - const wishlistRows = wishlists - .filter((wishlist) => { - // Only include wishlists with valid summary arrays - return wishlist.summaryWants && wishlist.summaryWants.length > 0 && - wishlist.summaryOffers && wishlist.summaryOffers.length > 0; - }) - .map((wishlist) => { - // Join array items with semicolons for CSV format - const wants = (wishlist.summaryWants || []).join('; '); - const offers = (wishlist.summaryOffers || []).join('; '); - return [ - this.sanitizeField(wishlist.userId), - this.sanitizeField(wishlist.user.ename), - this.sanitizeField(wishlist.user.name || wishlist.user.ename), - this.sanitizeField(wants), - this.sanitizeField(offers), - ].join(delimiter); - }).join("\n"); + const wishlistRows = wishlists.map((wishlist) => { + // Join array items with semicolons for CSV format + const wants = (wishlist.summaryWants || []).join('; '); + const offers = (wishlist.summaryOffers || []).join('; '); + return [ + this.sanitizeField(wishlist.userId), + this.sanitizeField(wishlist.user.ename), + this.sanitizeField(wishlist.user.name || wishlist.user.ename), + this.sanitizeField(wants), + this.sanitizeField(offers), + ].join(delimiter); + }).join("\n"); let existingGroupsText = ''; if (existingGroups && existingGroups.length > 0) { @@ -136,10 +145,8 @@ IMPORTANT RULES: 6. Classify activities properly: - PRIVATE: Personal services (tutoring, coaching, 1-on-1 lessons, personal projects) - GROUP: Group activities (sports teams, clubs, workshops, group projects, tournaments) -7. CRITICAL: If wishlists are blank, templated with minimal content, or contain insufficient information to make meaningful matches, return an empty array [] - - Blank/templated wishlists have the template structure (## What I Want / ## What I Can Do) but with very few items (2 or fewer) or very short/meaningless content - - Do NOT generate matches based on generic or placeholder content - - Only return matches when there is substantial, meaningful content in the wishlists + +NOTE: All wishlists provided have been pre-filtered to ensure they contain valid summary data. You should analyze all provided wishlists and find meaningful matches between them. Only return an empty array [] if you genuinely cannot find any meaningful connections between ANY of the provided users. Return a JSON array of matches with this structure: [ @@ -191,12 +198,12 @@ Be thorough and find ALL potential matches! const prompt = this.buildAllMatchesPrompt(wishlists, existingGroups); console.log("\n" + "=".repeat(100)); - console.log("🤖 AI REQUEST DEBUG - FULL PROMPT SENT TO AI:"); + console.log("AI REQUEST DEBUG - FULL PROMPT SENT TO AI:"); console.log("=".repeat(100)); console.log(prompt); console.log("=".repeat(100)); - console.log(`📊 Prompt length: ${prompt.length} characters`); - console.log(`📊 Number of wishlists: ${wishlists.length}`); + console.log(`Prompt length: ${prompt.length} characters`); + console.log(`Number of wishlists: ${wishlists.length}`); console.log("=".repeat(100) + "\n"); const response = await this.openai.chat.completions.create({ @@ -218,12 +225,12 @@ Be thorough and find ALL potential matches! const content = response.choices[0]?.message?.content; console.log("\n" + "=".repeat(100)); - console.log("🤖 AI RESPONSE DEBUG - FULL RESPONSE FROM AI:"); + console.log("AI RESPONSE DEBUG - FULL RESPONSE FROM AI:"); console.log("=".repeat(100)); console.log(content); console.log("=".repeat(100)); - console.log(`📊 Response length: ${content?.length || 0} characters`); - console.log(`📊 Usage: ${JSON.stringify(response.usage, null, 2)}`); + console.log(`Response length: ${content?.length || 0} characters`); + console.log(`Usage: ${JSON.stringify(response.usage, null, 2)}`); console.log("=".repeat(100) + "\n"); if (!content) { @@ -234,25 +241,25 @@ Be thorough and find ALL potential matches! // Try to extract JSON array from the response const jsonMatch = content.match(/\[[\s\S]*\]/); if (!jsonMatch) { - console.log("❌ DEBUG: No JSON array pattern found in response"); - console.log("❌ DEBUG: Looking for pattern: /\\[[\\s\\S]*\\]/"); + console.log("DEBUG: No JSON array pattern found in response"); + console.log("DEBUG: Looking for pattern: /\\[[\\s\\S]*\\]/"); throw new Error("No JSON array found in response"); } console.log("\n" + "=".repeat(100)); - console.log("🔍 JSON EXTRACTION DEBUG:"); + console.log("JSON EXTRACTION DEBUG:"); console.log("=".repeat(100)); - console.log("📝 Extracted JSON string:"); + console.log("Extracted JSON string:"); console.log(jsonMatch[0]); console.log("=".repeat(100) + "\n"); const matches = JSON.parse(jsonMatch[0]); console.log("\n" + "=".repeat(100)); - console.log("🔍 PARSED MATCHES DEBUG:"); + console.log("PARSED MATCHES DEBUG:"); console.log("=".repeat(100)); - console.log(`📊 Total matches from AI: ${matches.length}`); - console.log("📝 Raw matches array:"); + console.log(`Total matches from AI: ${matches.length}`); + console.log("Raw matches array:"); console.log(JSON.stringify(matches, null, 2)); console.log("=".repeat(100) + "\n"); @@ -264,7 +271,7 @@ Be thorough and find ALL potential matches! const validMatches: MatchResult[] = []; for (let i = 0; i < matches.length; i++) { const match = matches[i]; - console.log(`🔍 Validating match ${i + 1}:`, JSON.stringify(match, null, 2)); + console.log(`Validating match ${i + 1}:`, JSON.stringify(match, null, 2)); // Check if this is a JOIN_EXISTING_GROUP match (can have 1 user) const isJoinExistingGroup = match.suggestedActivities?.some((activity: any) => @@ -280,7 +287,7 @@ Be thorough and find ALL potential matches! match.userIds.length >= minUsers && match.activityCategory) { - console.log(`✅ Match ${i + 1} is VALID`); + console.log(`Match ${i + 1} is VALID`); validMatches.push({ confidence: match.confidence, matchType: match.matchType, @@ -293,7 +300,7 @@ Be thorough and find ALL potential matches! activityCategory: match.activityCategory }); } else { - console.log(`❌ Match ${i + 1} is INVALID:`); + console.log(`Match ${i + 1} is INVALID:`); console.log(` - confidence: ${match.confidence} (type: ${typeof match.confidence})`); console.log(` - matchType: ${match.matchType} (valid: ${['private', 'group'].includes(match.matchType)})`); console.log(` - userIds: ${JSON.stringify(match.userIds)} (isArray: ${Array.isArray(match.userIds)}, length: ${match.userIds?.length}, min required: ${minUsers})`); @@ -302,7 +309,7 @@ Be thorough and find ALL potential matches! } } - console.log(`✅ AI found ${validMatches.length} valid matches from ${matches.length} total suggestions`); + console.log(`AI found ${validMatches.length} valid matches from ${matches.length} total suggestions`); return validMatches; } catch (error) { console.error("Failed to parse OpenAI response:", content); From 41a6292bed3e2aa0abb60d0f3cbf533f6a3fe8e0 Mon Sep 17 00:00:00 2001 From: Merul Dhiman Date: Tue, 20 Jan 2026 16:40:49 +0530 Subject: [PATCH 5/5] chore: error logs --- .../src/services/MatchingService.ts | 75 ++++++++++++++----- .../src/services/WishlistSummaryService.ts | 13 ++++ 2 files changed, 69 insertions(+), 19 deletions(-) diff --git a/platforms/dreamsync-api/src/services/MatchingService.ts b/platforms/dreamsync-api/src/services/MatchingService.ts index b260967ae..487018883 100644 --- a/platforms/dreamsync-api/src/services/MatchingService.ts +++ b/platforms/dreamsync-api/src/services/MatchingService.ts @@ -121,7 +121,7 @@ Use the exact groupId from the table above in the format: "JOIN_EXISTING_GROUP:< } return ` -You are an AI matching assistant. Analyze ALL the wishlists below and find meaningful connections between users. +You are an AI matching assistant. Your task is to find meaningful connections between users based on their wishlists. The wishlists are provided as delimiter-separated rows (delimiter: "${delimiter}"). Columns: userId${delimiter}userEname${delimiter}userName${delimiter}wants${delimiter}offers @@ -134,7 +134,13 @@ ${wishlistRows} Use ONLY the rows above (not full prose) to infer matches. Return userIds EXACTLY as provided in the table (no new IDs, no missing IDs).${existingGroupsText} -TASK: Find ALL meaningful matches between these users based on their wishlists. +CRITICAL INSTRUCTIONS: +- You MUST analyze the wishlists above and find matches +- Look for complementary needs: when User A wants something that User B offers, or vice versa +- Look for shared interests: when multiple users want or offer similar things +- Look for skill exchanges: when one can teach what another wants to learn +- You should actively search for connections - do NOT return an empty array unless there are truly ZERO possible connections +- All wishlists provided have valid content - analyze them thoroughly IMPORTANT RULES: 1. Only suggest matches with confidence > 0.85 @@ -146,8 +152,6 @@ IMPORTANT RULES: - PRIVATE: Personal services (tutoring, coaching, 1-on-1 lessons, personal projects) - GROUP: Group activities (sports teams, clubs, workshops, group projects, tournaments) -NOTE: All wishlists provided have been pre-filtered to ensure they contain valid summary data. You should analyze all provided wishlists and find meaningful matches between them. Only return an empty array [] if you genuinely cannot find any meaningful connections between ANY of the provided users. - Return a JSON array of matches with this structure: [ { @@ -206,24 +210,55 @@ Be thorough and find ALL potential matches! console.log(`Number of wishlists: ${wishlists.length}`); console.log("=".repeat(100) + "\n"); - const response = await this.openai.chat.completions.create({ - model: "gpt-4", - messages: [ - { - role: "system", - content: "You are an AI matching assistant. Your goal is to find meaningful connections between people based on their wishlists. Analyze all wishlists and return ALL matches found as a JSON array. If wishlists are blank, templated with minimal content, or insufficient for meaningful matching, return an empty array []." - }, - { - role: "user", - content: prompt, - }, - ], - temperature: 0.7, - max_tokens: 4000, // Increased token limit for multiple matches - }); + let response; + try { + response = await this.openai.chat.completions.create({ + model: "gpt-4", + messages: [ + { + role: "system", + content: "You are an AI matching assistant. Your goal is to find meaningful connections between people based on their wishlists. You MUST actively search for matches - look for complementary needs, shared interests, and skill exchanges. Return ALL matches found as a JSON array. Only return an empty array if there are genuinely zero possible connections between any users." + }, + { + role: "user", + content: prompt, + }, + ], + temperature: 0.7, + max_tokens: 4000, // Increased token limit for multiple matches + }); + } catch (error: any) { + console.error("OpenAI API Error:"); + console.error(" Error type:", error?.constructor?.name); + console.error(" Error message:", error?.message); + console.error(" Error code:", error?.code); + console.error(" Error status:", error?.status); + + // Check for rate limit errors + if (error?.status === 429 || error?.code === 'rate_limit_exceeded' || error?.message?.includes('rate limit')) { + console.error("RATE LIMIT DETECTED!"); + console.error(" Rate limit error details:", JSON.stringify(error, null, 2)); + throw new Error("OpenAI rate limit exceeded. Please try again later."); + } + + // Check for other API errors + if (error?.status) { + console.error(`OpenAI API returned status ${error.status}`); + console.error(" Full error:", JSON.stringify(error, null, 2)); + } + + throw error; + } const content = response.choices[0]?.message?.content; + // Check for suspiciously short responses (might indicate rate limiting or errors) + if (content && content.length < 10) { + console.warn("WARNING: Received very short response from AI (might indicate rate limiting or error)"); + console.warn(` Response: "${content}"`); + console.warn(` Response length: ${content.length} characters`); + } + console.log("\n" + "=".repeat(100)); console.log("AI RESPONSE DEBUG - FULL RESPONSE FROM AI:"); console.log("=".repeat(100)); @@ -231,6 +266,8 @@ Be thorough and find ALL potential matches! console.log("=".repeat(100)); console.log(`Response length: ${content?.length || 0} characters`); console.log(`Usage: ${JSON.stringify(response.usage, null, 2)}`); + console.log(`Model: ${response.model || 'N/A'}`); + console.log(`Finish reason: ${response.choices[0]?.finish_reason || 'N/A'}`); console.log("=".repeat(100) + "\n"); if (!content) { diff --git a/platforms/dreamsync-api/src/services/WishlistSummaryService.ts b/platforms/dreamsync-api/src/services/WishlistSummaryService.ts index eb353ad8f..e8dfe2fab 100644 --- a/platforms/dreamsync-api/src/services/WishlistSummaryService.ts +++ b/platforms/dreamsync-api/src/services/WishlistSummaryService.ts @@ -66,6 +66,19 @@ Rules: temperature: 0.2, max_tokens: 500, response_format: { type: "json_object" }, + }).catch((error: any) => { + console.error("WishlistSummaryService OpenAI API Error:"); + console.error(" Error type:", error?.constructor?.name); + console.error(" Error message:", error?.message); + console.error(" Error code:", error?.code); + console.error(" Error status:", error?.status); + + if (error?.status === 429 || error?.code === 'rate_limit_exceeded' || error?.message?.includes('rate limit')) { + console.error("RATE LIMIT DETECTED in WishlistSummaryService!"); + console.error(" Rate limit error details:", JSON.stringify(error, null, 2)); + } + + throw error; }); const raw = response.choices[0]?.message?.content || "";