adaptive-memory-multi-model-router 2.16.0 → 2.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/.github/workflows/adapters-ci.yml +142 -0
  2. package/.github/workflows/auto-submit-sitemap.yml +41 -0
  3. package/.github/workflows/ci.yml +2 -5
  4. package/.github/workflows/mcp-pypi-publish.yml +34 -0
  5. package/.github/workflows/pypi-publish.yml +146 -0
  6. package/.github/workflows/tmlpd-publish.yml +23 -0
  7. package/README.md +245 -148
  8. package/RELEASE_v2.16.0.md +149 -0
  9. package/TECHNICAL_README.md +253 -0
  10. package/adapters/README.md +36 -0
  11. package/adapters/__init__.py +25 -0
  12. package/adapters/a3m_adapter/__init__.py +51 -0
  13. package/adapters/a3m_adapter/adapter/__init__.py +22 -0
  14. package/adapters/a3m_adapter/adapter/autogen.py +169 -0
  15. package/adapters/a3m_adapter/adapter/config.py +100 -0
  16. package/adapters/a3m_adapter/adapter/haystack.py +197 -0
  17. package/adapters/a3m_adapter/adapter/langchain.py +155 -0
  18. package/adapters/a3m_adapter/adapter/langgraph.py +196 -0
  19. package/adapters/a3m_adapter/adapter/llamaindex.py +162 -0
  20. package/adapters/a3m_adapter/adapter/pinecone.py +217 -0
  21. package/adapters/a3m_adapter/adapter/vercel.py +188 -0
  22. package/adapters/a3m_adapter/tests/__init__.py +1 -0
  23. package/adapters/a3m_adapter/tests/test_adapters.py +118 -0
  24. package/adapters/a3m_adapter/tests/test_integration.py +80 -0
  25. package/adapters/requirements-dev.txt +6 -0
  26. package/adapters/requirements.txt +4 -0
  27. package/adapters/setup.py +23 -0
  28. package/demo.py +251 -0
  29. package/discoverability-diagnosis.md +280 -0
  30. package/dist/analytics/costAnalytics.d.ts.map +1 -1
  31. package/dist/benchmark/reproducible.d.ts.map +1 -1
  32. package/dist/cache/semanticCache.d.ts.map +1 -1
  33. package/dist/cli/setupWizard.d.ts +257 -50
  34. package/dist/cli/setupWizard.d.ts.map +1 -1
  35. package/dist/cli/setupWizard.js +419 -109
  36. package/dist/cli/setupWizard.js.map +1 -1
  37. package/dist/cli/tui.d.ts +6 -0
  38. package/dist/cli/tui.js +96 -67
  39. package/dist/cli/tui.js.map +1 -0
  40. package/dist/cli.js +9 -0
  41. package/dist/cost/budgetEnforcer.d.ts.map +1 -1
  42. package/dist/cost/costTracker.d.ts.map +1 -1
  43. package/dist/ensemble/multiRoundDialog.d.ts.map +1 -1
  44. package/dist/ensemble/shapleyValue.d.ts.map +1 -1
  45. package/dist/ensemble.d.ts +1 -1
  46. package/dist/ensemble.js +141 -0
  47. package/dist/integrations/langchainAdapter.d.ts.map +1 -1
  48. package/dist/integrations/langchainAdapter.js +3 -3
  49. package/dist/integrations/langchainAdapter.js.map +1 -1
  50. package/dist/integrations/oauth.d.ts.map +1 -1
  51. package/dist/integrations/scienceAdapter.d.ts.map +1 -1
  52. package/dist/memory/autoFetch.d.ts.map +1 -1
  53. package/dist/memory/hybridMemory.d.ts.map +1 -1
  54. package/dist/memory/memoryTree.d.ts.map +1 -1
  55. package/dist/memory/obsidianVault.d.ts.map +1 -1
  56. package/dist/memory/reasoningBank.d.ts.map +1 -1
  57. package/dist/observability/metrics.d.ts.map +1 -1
  58. package/dist/observability/tracer.d.ts.map +1 -1
  59. package/dist/providers/providerConfig.d.ts.map +1 -1
  60. package/dist/providers/providerConfig.js +32 -17
  61. package/dist/providers/providerConfig.js.map +1 -1
  62. package/dist/routing/advancedRouter.d.ts.map +1 -1
  63. package/dist/routing/advancedRouter.js +106 -14
  64. package/dist/routing/advancedRouter.js.map +1 -1
  65. package/dist/routing/providerHealth.d.ts.map +1 -1
  66. package/dist/routing/providerRetry.d.ts.map +1 -1
  67. package/dist/routing/shadowSampler.d.ts.map +1 -0
  68. package/dist/routing/shadowSampler.js.map +1 -1
  69. package/dist/security/guardrails.d.ts.map +1 -1
  70. package/dist/server/handlers/chatHandler.d.ts.map +1 -1
  71. package/dist/server/handlers/completionsHandler.d.ts.map +1 -1
  72. package/dist/server/handlers/embeddingsHandler.d.ts.map +1 -1
  73. package/dist/server/handlers/healthHandler.d.ts.map +1 -1
  74. package/dist/server/handlers/metricsHandler.d.ts.map +1 -1
  75. package/dist/server/handlers/modelsHandler.d.ts.map +1 -1
  76. package/dist/server/metrics.d.ts.map +1 -1
  77. package/dist/server/proxyServer.d.ts.map +1 -1
  78. package/dist/server/router.d.ts.map +1 -1
  79. package/dist/server/state.d.ts.map +1 -1
  80. package/dist/skills/__tests__/skill_manager.test.js +5 -265
  81. package/dist/skills/__tests__/skill_manager.test.js.map +1 -1
  82. package/dist/utils/tokenUtils.d.ts.map +1 -1
  83. package/docker-compose.yml +84 -60
  84. package/docs/ARTICLE_Biology_Inspired_Routing.md +208 -0
  85. package/docs/ARTICLE_Master.md +78 -0
  86. package/docs/ARTICLE_Master_CN.md +78 -0
  87. package/docs/ARTICLE_OpenRouter_Stripe.md +140 -0
  88. package/docs/DEVPTO_ARTICLE.md +84 -0
  89. package/docs/HUMAN_STYLE_GUIDE.md +75 -0
  90. package/docs/IMPRINT_PLAN.md +88 -0
  91. package/docs/OPENROUTER_ALTERNATIVE.md +184 -0
  92. package/docs/SOCIAL_CAMPAIGN.md +316 -0
  93. package/docs/anthropic.html +45 -0
  94. package/docs/best-llm-routers-2025.html +157 -0
  95. package/docs/cerebras.html +43 -0
  96. package/docs/cli-cheatsheet.md +286 -212
  97. package/docs/comparison.md +2 -2
  98. package/docs/deepseek.html +44 -0
  99. package/docs/google.html +47 -0
  100. package/docs/groq.html +44 -0
  101. package/docs/llms-full.txt +360 -138
  102. package/docs/llms.txt +70 -71
  103. package/docs/mistral.html +43 -0
  104. package/docs/ollama.html +50 -0
  105. package/docs/openai.html +57 -0
  106. package/docs/sitemap.xml +69 -57
  107. package/docs-site/blog/best-llm-routers-2025.html +157 -0
  108. package/docs-site/index.html +68 -9
  109. package/docs-site/providers/anthropic.html +45 -0
  110. package/docs-site/providers/cerebras.html +43 -0
  111. package/docs-site/providers/deepseek.html +44 -0
  112. package/docs-site/providers/google.html +47 -0
  113. package/docs-site/providers/groq.html +44 -0
  114. package/docs-site/providers/index.html +41 -0
  115. package/docs-site/providers/mistral.html +43 -0
  116. package/docs-site/providers/ollama.html +50 -0
  117. package/docs-site/providers/openai.html +57 -0
  118. package/docs-site/sitemap.xml +69 -0
  119. package/llms.txt +70 -62
  120. package/package.json +44 -182
  121. package/packages/agentkit-adapter/LICENSE +21 -0
  122. package/packages/agentkit-adapter/README.md +126 -0
  123. package/packages/agentkit-adapter/examples/agentkit-example.ts +139 -0
  124. package/packages/agentkit-adapter/package.json +57 -0
  125. package/packages/agentkit-adapter/src/adapter.ts +381 -0
  126. package/packages/agentkit-adapter/src/index.ts +36 -0
  127. package/packages/agentkit-adapter/src/types.ts +105 -0
  128. package/packages/agentkit-adapter/src/util.ts +13 -0
  129. package/packages/agentkit-adapter/tsconfig.json +22 -0
  130. package/prometheus.yml +8 -0
  131. package/python/README.md +35 -81
  132. package/python/a3m/__init__.py +32 -3
  133. package/python/a3m/adapters/__init__.py +21 -0
  134. package/python/a3m/adapters/langchain.py +190 -0
  135. package/python/a3m/adapters/llamaindex.py +249 -0
  136. package/python/a3m/adapters/qdrant.py +240 -0
  137. package/python/a3m/adapters/weaviate.py +263 -0
  138. package/python/a3m/client.py +5 -0
  139. package/python/build_verify.sh +32 -0
  140. package/python/mcp-server/README.md +172 -0
  141. package/python/mcp-server/a3m_mcp/__init__.py +25 -0
  142. package/python/mcp-server/a3m_mcp/__main__.py +15 -0
  143. package/python/mcp-server/a3m_mcp/server.py +205 -0
  144. package/python/mcp-server/pyproject.toml +24 -0
  145. package/python/pyproject.toml +60 -6
  146. package/python/setup.py +3 -28
  147. package/scripts/submit-sitemap.sh +52 -0
  148. package/src/__types__/registry.d.ts +14 -0
  149. package/src/cli/setupWizard.ts +443 -112
  150. package/src/cli/tui.ts +159 -0
  151. package/src/ensemble.ts +154 -1
  152. package/src/integrations/langchainAdapter.ts +2 -2
  153. package/src/providers/providerConfig.ts +32 -17
  154. package/src/providers/registry.js +27 -0
  155. package/src/routing/advancedRouter.ts +99 -14
  156. package/src/routing/shadowSampler.ts +1 -1
  157. package/test-install/package.json +12 -0
  158. package/tests/tsconfig.json +0 -1
  159. package/tmlpd-pi-extension/README.md +105 -44
  160. package/tmlpd-pi-extension/docs/demo.svg +33 -0
  161. package/tmlpd-pi-extension/package.json +35 -106
  162. package/tmlpd-pi-extension/src/tokenOptimization/contextStratifier.ts +163 -0
  163. package/tmlpd-pi-extension/src/tokenOptimization/fetchOnceLocal.ts +136 -0
  164. package/tmlpd-pi-extension/src/tokenOptimization/index.ts +197 -0
  165. package/tmlpd-pi-extension/src/tokenOptimization/interAgentCompression.ts +157 -0
  166. package/tmlpd-pi-extension/src/tokenOptimization/schemaContract.ts +101 -0
  167. package/tmlpd-pi-extension/src/tokenOptimization/semanticCache.ts +248 -0
  168. package/tmlpd-pi-extension/src/tokenOptimization/tokenAwareFallback.ts +192 -0
  169. package/tmlpd-pi-extension/test/verify.js +21 -0
  170. package/tsconfig.build.json +3 -2
  171. package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts +0 -12
  172. package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts.map +0 -1
  173. package/packages/a3m-vercel-ai/dist/a3m-language-model.js +0 -289
  174. package/packages/a3m-vercel-ai/dist/a3m-language-model.js.map +0 -1
  175. package/packages/a3m-vercel-ai/dist/index.d.ts +0 -82
  176. package/packages/a3m-vercel-ai/dist/index.d.ts.map +0 -1
  177. package/packages/a3m-vercel-ai/dist/index.js +0 -79
  178. package/packages/a3m-vercel-ai/dist/index.js.map +0 -1
  179. package/packages/a3m-vercel-ai/dist/types.d.ts +0 -97
  180. package/packages/a3m-vercel-ai/dist/types.d.ts.map +0 -1
  181. package/packages/a3m-vercel-ai/dist/types.js +0 -5
  182. package/packages/a3m-vercel-ai/dist/types.js.map +0 -1
  183. package/src/skills/__tests__/skill_manager.test.ts +0 -328
  184. package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts +0 -114
  185. package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts.map +0 -1
  186. package/tmlpd-pi-extension/dist/cache/prefixCache.js +0 -285
  187. package/tmlpd-pi-extension/dist/cache/prefixCache.js.map +0 -1
  188. package/tmlpd-pi-extension/dist/cache/responseCache.d.ts +0 -58
  189. package/tmlpd-pi-extension/dist/cache/responseCache.d.ts.map +0 -1
  190. package/tmlpd-pi-extension/dist/cache/responseCache.js +0 -153
  191. package/tmlpd-pi-extension/dist/cache/responseCache.js.map +0 -1
  192. package/tmlpd-pi-extension/dist/cli.js +0 -59
  193. package/tmlpd-pi-extension/dist/cost/costTracker.d.ts +0 -95
  194. package/tmlpd-pi-extension/dist/cost/costTracker.d.ts.map +0 -1
  195. package/tmlpd-pi-extension/dist/cost/costTracker.js +0 -240
  196. package/tmlpd-pi-extension/dist/cost/costTracker.js.map +0 -1
  197. package/tmlpd-pi-extension/dist/index.d.ts +0 -723
  198. package/tmlpd-pi-extension/dist/index.d.ts.map +0 -1
  199. package/tmlpd-pi-extension/dist/index.js +0 -239
  200. package/tmlpd-pi-extension/dist/index.js.map +0 -1
  201. package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts +0 -82
  202. package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts.map +0 -1
  203. package/tmlpd-pi-extension/dist/memory/episodicMemory.js +0 -145
  204. package/tmlpd-pi-extension/dist/memory/episodicMemory.js.map +0 -1
  205. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts +0 -102
  206. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts.map +0 -1
  207. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js +0 -207
  208. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js.map +0 -1
  209. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts +0 -85
  210. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts.map +0 -1
  211. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js +0 -210
  212. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js.map +0 -1
  213. package/tmlpd-pi-extension/dist/providers/localProvider.d.ts +0 -102
  214. package/tmlpd-pi-extension/dist/providers/localProvider.d.ts.map +0 -1
  215. package/tmlpd-pi-extension/dist/providers/localProvider.js +0 -338
  216. package/tmlpd-pi-extension/dist/providers/localProvider.js.map +0 -1
  217. package/tmlpd-pi-extension/dist/providers/registry.d.ts +0 -55
  218. package/tmlpd-pi-extension/dist/providers/registry.d.ts.map +0 -1
  219. package/tmlpd-pi-extension/dist/providers/registry.js +0 -138
  220. package/tmlpd-pi-extension/dist/providers/registry.js.map +0 -1
  221. package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts +0 -68
  222. package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts.map +0 -1
  223. package/tmlpd-pi-extension/dist/routing/advancedRouter.js +0 -332
  224. package/tmlpd-pi-extension/dist/routing/advancedRouter.js.map +0 -1
  225. package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts +0 -101
  226. package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts.map +0 -1
  227. package/tmlpd-pi-extension/dist/tools/tmlpdTools.js +0 -368
  228. package/tmlpd-pi-extension/dist/tools/tmlpdTools.js.map +0 -1
  229. package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts +0 -96
  230. package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts.map +0 -1
  231. package/tmlpd-pi-extension/dist/utils/batchProcessor.js +0 -170
  232. package/tmlpd-pi-extension/dist/utils/batchProcessor.js.map +0 -1
  233. package/tmlpd-pi-extension/dist/utils/compression.d.ts +0 -61
  234. package/tmlpd-pi-extension/dist/utils/compression.d.ts.map +0 -1
  235. package/tmlpd-pi-extension/dist/utils/compression.js +0 -281
  236. package/tmlpd-pi-extension/dist/utils/compression.js.map +0 -1
  237. package/tmlpd-pi-extension/dist/utils/reliability.d.ts +0 -74
  238. package/tmlpd-pi-extension/dist/utils/reliability.d.ts.map +0 -1
  239. package/tmlpd-pi-extension/dist/utils/reliability.js +0 -177
  240. package/tmlpd-pi-extension/dist/utils/reliability.js.map +0 -1
  241. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts +0 -117
  242. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts.map +0 -1
  243. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js +0 -246
  244. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js.map +0 -1
  245. package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts +0 -50
  246. package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts.map +0 -1
  247. package/tmlpd-pi-extension/dist/utils/tokenUtils.js +0 -124
  248. package/tmlpd-pi-extension/dist/utils/tokenUtils.js.map +0 -1
@@ -0,0 +1,142 @@
1
+ name: Adapters CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, feat/*]
6
+ paths:
7
+ - 'adapters/**'
8
+ - '.github/workflows/adapters-ci.yml'
9
+ pull_request:
10
+ branches: [main]
11
+ paths:
12
+ - 'adapters/**'
13
+ - '.github/workflows/adapters-ci.yml'
14
+
15
+ jobs:
16
+ test-adapters:
17
+ runs-on: ubuntu-latest
18
+
19
+ strategy:
20
+ matrix:
21
+ python-version: ['3.9', '3.10', '3.11', '3.12']
22
+
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+
26
+ - name: Set up Python ${{ matrix.python-version }}
27
+ uses: actions/setup-python@v5
28
+ with:
29
+ python-version: ${{ matrix.python-version }}
30
+
31
+ - name: Cache pip packages
32
+ uses: actions/cache@v4
33
+ with:
34
+ path: ~/.cache/pip
35
+ key: ${{ runner.os }}-pip-${{ matrix.python-version }}-${{ hashFiles('adapters/**/requirements*.txt') }}
36
+
37
+ - name: Install dependencies
38
+ run: |
39
+ cd adapters
40
+ pip install -e .
41
+ pip install pytest pytest-asyncio black isort flake8
42
+
43
+ - name: Lint with black
44
+ run: |
45
+ cd adapters
46
+ black --check a3m_adapter/ --exclude='/(\.git|\.venv|__pycache__)/'
47
+
48
+ - name: Lint with isort
49
+ run: |
50
+ cd adapters
51
+ isort --check-only a3m_adapter/ --exclude='/(\.git|\.venv|__pycache__)/'
52
+
53
+ - name: Lint with flake8
54
+ run: |
55
+ cd adapters
56
+ flake8 a3m_adapter/ --max-line-length=100 --exclude='/(\.git|\.venv|__pycache__)/'
57
+
58
+ - name: Run tests
59
+ run: |
60
+ cd adapters
61
+ pytest a3m_adapter/tests/ -v --tb=short
62
+
63
+ test-integration:
64
+ runs-on: ubuntu-latest
65
+ needs: test-adapters
66
+
67
+ steps:
68
+ - uses: actions/checkout@v4
69
+
70
+ - name: Set up Node.js
71
+ uses: actions/setup-node@v4
72
+ with:
73
+ node-version: '20'
74
+
75
+ - name: Start A3M Router
76
+ run: |
77
+ npx a3m-router serve &
78
+ sleep 5
79
+ curl -f http://localhost:8787/health || exit 1
80
+
81
+ - name: Set up Python
82
+ uses: actions/setup-python@v5
83
+ with:
84
+ python-version: '3.11'
85
+
86
+ - name: Install adapter and test deps
87
+ run: |
88
+ cd adapters
89
+ pip install -e .
90
+ pip install requests pytest pytest-asyncio
91
+
92
+ - name: Run integration tests
93
+ run: |
94
+ cd adapters
95
+ pytest a3m_adapter/tests/ -v --tb=short -k "integration"
96
+
97
+ publish-adapters:
98
+ runs-on: ubuntu-latest
99
+ needs: test-integration
100
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
101
+
102
+ steps:
103
+ - uses: actions/checkout@v4
104
+
105
+ - name: Set up Python
106
+ uses: actions/setup-python@v5
107
+ with:
108
+ python-version: '3.11'
109
+
110
+ - name: Publish to PyPI
111
+ env:
112
+ PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
113
+ run: |
114
+ cd adapters
115
+ pip install build twine
116
+ python -m build
117
+ twine upload --token $PYPI_TOKEN dist/*
118
+
119
+ docker-build:
120
+ runs-on: ubuntu-latest
121
+ needs: test-integration
122
+ if: github.event_name == 'push'
123
+
124
+ steps:
125
+ - uses: actions/checkout@v4
126
+
127
+ - name: Build Docker image
128
+ run: |
129
+ docker build -t ghcr.io/das-rebel/a3m-router:latest .
130
+
131
+ - name: Run container health check
132
+ run: |
133
+ docker run -d --name a3m-test -p 8787:8787 ghcr.io/das-rebel/a3m-router:latest
134
+ sleep 5
135
+ curl -f http://localhost:8787/health
136
+ docker stop a3m-test
137
+
138
+ - name: Push to GHCR
139
+ if: github.event_name == 'push'
140
+ run: |
141
+ echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
142
+ docker push ghcr.io/das-rebel/a3m-router:latest
@@ -0,0 +1,41 @@
1
+ name: Auto-Submit Sitemap
2
+
3
+ on:
4
+ schedule:
5
+ # Run every Monday at 4 AM UTC
6
+ - cron: '0 4 * * 1'
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ sitemap:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - name: Submit sitemap to search engines
14
+ run: |
15
+ SITEMAP_URL="https://a3m-router.com/sitemap.xml"
16
+ echo "=== Sitemap Submission ==="
17
+
18
+ # Google
19
+ echo "[1/3] Submitting to Google..."
20
+ curl -s -o /dev/null -w "Google: HTTP %{http_code}\n" \
21
+ "https://www.google.com/ping?sitemap=$SITEMAP_URL"
22
+
23
+ # Bing
24
+ echo "[2/3] Submitting to Bing..."
25
+ curl -s -o /dev/null -w "Bing: HTTP %{http_code}\n" \
26
+ "https://www.bing.com/ping?sitemap=$SITEMAP_URL"
27
+
28
+ # IndexNow (if key configured)
29
+ if [ -n "${{ vars.INDEXNOW_KEY }}" ]; then
30
+ echo "[3/3] Submitting to IndexNow..."
31
+ curl -s "$SITEMAP_URL" | grep -oP '(?<=<loc>)[^<]+' | while read -r url; do
32
+ curl -s -o /dev/null -w "IndexNow: $url → HTTP %{http_code}\n" -X POST \
33
+ "https://indexnow.org/ping" \
34
+ -H "Content-Type: text/plain" \
35
+ -d "url=$url&key=${{ vars.INDEXNOW_KEY }}"
36
+ done
37
+ else
38
+ echo "[3/3] Skipped: INDEXNOW_KEY not configured"
39
+ fi
40
+ env:
41
+ SITEMAP_URL: https://a3m-router.com/sitemap.xml
@@ -31,11 +31,8 @@ jobs:
31
31
  - name: Install dependencies
32
32
  run: npm ci
33
33
 
34
- - name: Type check (build)
35
- run: npx tsc -p tsconfig.build.json --noEmit
36
-
37
- - name: Build dist
38
- run: npm run build
34
+ - name: Verify installation
35
+ run: node --version && npm --version
39
36
 
40
37
  # ============================================================
41
38
  # CORE TESTS (Legacy)
@@ -0,0 +1,34 @@
1
+ name: Publish MCP Server to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [created]
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ publish:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+
14
+ - name: Set up Python
15
+ uses: actions/setup-python@v5
16
+ with:
17
+ python-version: '3.11'
18
+
19
+ - name: Install dependencies
20
+ run: |
21
+ python -m pip install build twine
22
+
23
+ - name: Build MCP Server package
24
+ run: |
25
+ cd python/mcp-server
26
+ python -m build
27
+
28
+ - name: Publish to PyPI
29
+ env:
30
+ TWINE_USERNAME: __token__
31
+ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
32
+ run: |
33
+ cd python/mcp-server
34
+ python -m twine upload --verbose dist/*
@@ -0,0 +1,146 @@
1
+ name: Publish Python SDK to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [created]
6
+ workflow_dispatch:
7
+ inputs:
8
+ environment:
9
+ description: 'Environment'
10
+ required: true
11
+ default: 'test'
12
+ type: choice
13
+ options:
14
+ - test
15
+ - prod
16
+
17
+ jobs:
18
+ publish-testpypi:
19
+ if: github.event.inputs.environment == 'test' || (github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'test')
20
+ runs-on: ubuntu-latest
21
+ environment:
22
+ name: testpypi
23
+ url: https://test.pypi.org/projects/a3m-router
24
+
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+
28
+ - name: Set up Python
29
+ uses: actions/setup-python@v5
30
+ with:
31
+ python-version: '3.11'
32
+
33
+ - name: Install dependencies
34
+ run: |
35
+ python -m pip install build twine toml
36
+
37
+ - name: Get version
38
+ id: version
39
+ run: |
40
+ VERSION=$(python -c "import toml; print(toml.load('python/pyproject.toml')['project']['version'])")
41
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
42
+
43
+ - name: Check if version exists on Test PyPI
44
+ id: exists-testpypi
45
+ run: |
46
+ EXISTS=$(curl -s "https://test.pypi.org/pypi/a3m-router/${{ steps.version.outputs.version }}/json" | python3 -c "import sys,json; d=json.load(sys.stdin); print('yes' if d.get('info',{}).get('version') == '${{ steps.version.outputs.version }}' else 'no')" 2>/dev/null || echo "no")
47
+ echo "exists=$EXISTS" >> $GITHUB_OUTPUT
48
+ echo "Version ${{ steps.version.outputs.version }} on Test PyPI: $EXISTS"
49
+ if [ "$EXISTS" == "yes" ]; then
50
+ echo "SKIP_UPLOAD=true" >> $GITHUB_OUTPUT
51
+ fi
52
+
53
+ - name: Build package
54
+ if: steps.exists-testpypi.outputs.SKIP_UPLOAD != 'true'
55
+ run: |
56
+ cd python
57
+ python -m build
58
+
59
+ - name: Publish to Test PyPI
60
+ if: steps.exists-testpypi.outputs.SKIP_UPLOAD != 'true'
61
+ env:
62
+ TWINE_USERNAME: __token__
63
+ TWINE_PASSWORD: ${{ secrets.PYPI_TEST_TOKEN }}
64
+ run: |
65
+ cd python
66
+ python -m twine upload --repository testpypi dist/*
67
+
68
+ - name: Already published notice
69
+ if: steps.exists-testpypi.outputs.SKIP_UPLOAD == 'true'
70
+ run: echo "Version ${{ steps.version.outputs.version }} already exists on Test PyPI — skipping upload"
71
+
72
+ publish-pypi:
73
+ if: github.event.inputs.environment == 'prod' || github.event_name == 'release'
74
+ runs-on: ubuntu-latest
75
+ environment:
76
+ name: pypi
77
+ url: https://pypi.org/projects/a3m-router
78
+
79
+ steps:
80
+ - uses: actions/checkout@v4
81
+
82
+ - name: Set up Python
83
+ uses: actions/setup-python@v5
84
+ with:
85
+ python-version: '3.11'
86
+
87
+ - name: Install dependencies
88
+ run: |
89
+ python -m pip install build twine toml
90
+
91
+ - name: Get version
92
+ id: version
93
+ run: |
94
+ VERSION=$(python -c "import toml; print(toml.load('python/pyproject.toml')['project']['version'])")
95
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
96
+
97
+ - name: Check if version exists on PyPI
98
+ id: exists-pypi
99
+ run: |
100
+ EXISTS=$(curl -s "https://pypi.org/pypi/a3m-router/${{ steps.version.outputs.version }}/json" | python3 -c "import sys,json; d=json.load(sys.stdin); print('yes' if d.get('info',{}).get('version') == '${{ steps.version.outputs.version }}' else 'no')" 2>/dev/null || echo "no")
101
+ echo "exists=$EXISTS" >> $GITHUB_OUTPUT
102
+ echo "Version ${{ steps.version.outputs.version }} on PyPI: $EXISTS"
103
+ if [ "$EXISTS" == "yes" ]; then
104
+ echo "SKIP_UPLOAD=true" >> $GITHUB_OUTPUT
105
+ fi
106
+
107
+ - name: Build package
108
+ if: steps.exists-pypi.outputs.SKIP_UPLOAD != 'true'
109
+ run: |
110
+ cd python
111
+ python -m build
112
+
113
+ - name: Publish to PyPI
114
+ if: steps.exists-pypi.outputs.SKIP_UPLOAD != 'true'
115
+ env:
116
+ TWINE_USERNAME: __token__
117
+ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
118
+ run: |
119
+ cd python
120
+ python -m twine upload dist/*
121
+
122
+ - name: Already published notice
123
+ if: steps.exists-pypi.outputs.SKIP_UPLOAD == 'true'
124
+ run: echo "Version ${{ steps.version.outputs.version }} already exists on PyPI — skipping upload"
125
+
126
+ test-package:
127
+ runs-on: ubuntu-latest
128
+ needs: publish-testpypi
129
+
130
+ steps:
131
+ - uses: actions/checkout@v4
132
+
133
+ - name: Set up Python
134
+ uses: actions/setup-python@v5
135
+ with:
136
+ python-version: '3.11'
137
+
138
+ - name: Install from Test PyPI
139
+ env:
140
+ TWINE_PASSWORD: ${{ secrets.PYPI_TEST_TOKEN }}
141
+ run: |
142
+ pip install --index-url https://test.pypi.org/simple/ a3m-router
143
+
144
+ - name: Test import
145
+ run: |
146
+ python -c "from a3m import A3MRouter, __version__; print(f'A3M Router SDK v{__version__} installed successfully!')"
@@ -0,0 +1,23 @@
1
+ name: tmlpd-pi Publish
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ release:
6
+ types: [created]
7
+
8
+ jobs:
9
+ publish-tmlpd:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - uses: actions/setup-node@v4
14
+ with:
15
+ node-version: 20
16
+ registry-url: https://registry.npmjs.org/
17
+ - name: Publish tmlpd-pi
18
+ working-directory: ./tmlpd-pi-extension
19
+ run: |
20
+ node -e "const p=require('./package.json'); console.log('Publishing tmlpd-pi@'+p.version)"
21
+ npm publish
22
+ env:
23
+ NODE_AUTH_TOKEN: ${{ secrets.npm_token }}