insforge 1.3.0 → 1.4.8

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 (269) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/auth/package.json +5 -3
  3. package/auth/src/lib/broadcastService.ts +115 -117
  4. package/auth/src/lib/insforge.ts +8 -0
  5. package/auth/src/main.tsx +2 -4
  6. package/auth/src/pages/SignInPage.tsx +60 -60
  7. package/auth/src/pages/SignUpPage.tsx +60 -60
  8. package/auth/src/pages/VerifyEmailPage.tsx +18 -0
  9. package/auth/tsconfig.json +2 -1
  10. package/backend/package.json +10 -6
  11. package/backend/src/api/middlewares/rate-limiters.ts +127 -127
  12. package/backend/src/api/routes/ai/index.routes.ts +475 -468
  13. package/backend/src/api/routes/auth/index.routes.ts +85 -32
  14. package/backend/src/api/routes/auth/oauth.routes.ts +11 -6
  15. package/backend/src/api/routes/database/index.routes.ts +2 -0
  16. package/backend/src/api/routes/database/records.routes.ts +39 -175
  17. package/backend/src/api/routes/database/rpc.routes.ts +69 -0
  18. package/backend/src/api/routes/deployments/index.routes.ts +192 -0
  19. package/backend/src/api/routes/docs/index.routes.ts +3 -2
  20. package/backend/src/api/routes/email/index.routes.ts +35 -35
  21. package/backend/src/api/routes/functions/index.routes.ts +3 -3
  22. package/backend/src/api/routes/metadata/index.routes.ts +26 -0
  23. package/backend/src/api/routes/webhooks/index.routes.ts +109 -0
  24. package/backend/src/infra/database/database.manager.ts +0 -10
  25. package/backend/src/infra/database/migrations/018_schema-rework.sql +441 -0
  26. package/backend/src/infra/database/migrations/019_create-deployments-table.sql +36 -0
  27. package/backend/src/infra/database/migrations/020_add-audio-modality.sql +11 -0
  28. package/backend/src/infra/database/migrations/bootstrap/bootstrap-migrations.js +103 -0
  29. package/backend/src/infra/security/token.manager.ts +1 -4
  30. package/backend/src/providers/ai/openrouter.provider.ts +12 -3
  31. package/backend/src/providers/database/base.provider.ts +39 -0
  32. package/backend/src/providers/database/cloud.provider.ts +159 -0
  33. package/backend/src/providers/deployments/vercel.provider.ts +516 -0
  34. package/backend/src/server.ts +19 -7
  35. package/backend/src/services/ai/ai-config.service.ts +6 -6
  36. package/backend/src/services/ai/ai-model.service.ts +60 -60
  37. package/backend/src/services/ai/ai-usage.service.ts +7 -7
  38. package/backend/src/services/ai/chat-completion.service.ts +415 -220
  39. package/backend/src/services/ai/helpers.ts +64 -64
  40. package/backend/src/services/ai/index.ts +13 -13
  41. package/backend/src/services/auth/auth-config.service.ts +4 -4
  42. package/backend/src/services/auth/auth-otp.service.ts +6 -6
  43. package/backend/src/services/auth/auth.service.ts +134 -74
  44. package/backend/src/services/auth/index.ts +4 -4
  45. package/backend/src/services/auth/oauth-config.service.ts +12 -12
  46. package/backend/src/services/database/database-advance.service.ts +19 -55
  47. package/backend/src/services/database/database-table.service.ts +38 -85
  48. package/backend/src/services/database/postgrest-proxy.service.ts +165 -0
  49. package/backend/src/services/deployments/deployment.service.ts +693 -0
  50. package/backend/src/services/functions/function.service.ts +61 -41
  51. package/backend/src/services/logs/audit.service.ts +10 -10
  52. package/backend/src/services/secrets/secret.service.ts +101 -27
  53. package/backend/src/services/storage/storage.service.ts +30 -30
  54. package/backend/src/services/usage/usage.service.ts +6 -6
  55. package/backend/src/types/ai.ts +8 -0
  56. package/backend/src/types/auth.ts +5 -1
  57. package/backend/src/types/database.ts +2 -0
  58. package/backend/src/types/deployments.ts +33 -0
  59. package/backend/src/types/storage.ts +1 -1
  60. package/backend/src/types/webhooks.ts +45 -0
  61. package/backend/src/utils/cookies.ts +34 -35
  62. package/backend/src/utils/environment.ts +0 -14
  63. package/backend/src/utils/s3-config-loader.ts +64 -64
  64. package/backend/src/utils/seed.ts +334 -301
  65. package/backend/src/utils/sql-parser.ts +126 -0
  66. package/backend/src/utils/utils.ts +114 -114
  67. package/backend/src/utils/validations.ts +10 -10
  68. package/backend/tests/local/test-rpc.sh +141 -0
  69. package/backend/tests/local/test-secrets.sh +1 -1
  70. package/backend/tests/manual/test-ai-model-plugins.sh +258 -0
  71. package/backend/tests/manual/test-rawsql-modes.sh +24 -24
  72. package/backend/tests/unit/database-advance.test.ts +326 -0
  73. package/backend/tests/unit/helpers.test.ts +2 -2
  74. package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +13 -10
  75. package/docker-compose.prod.yml +1 -1
  76. package/docker-compose.yml +1 -1
  77. package/docs/agent-docs/deployment.md +79 -0
  78. package/docs/changelog.mdx +165 -72
  79. package/docs/core-concepts/ai/architecture.mdx +1 -23
  80. package/docs/core-concepts/ai/sdk.mdx +26 -1
  81. package/docs/core-concepts/authentication/architecture.mdx +6 -8
  82. package/docs/core-concepts/authentication/sdk.mdx +387 -91
  83. package/docs/core-concepts/authentication/ui-components/customization.mdx +460 -256
  84. package/docs/core-concepts/authentication/ui-components/nextjs.mdx +50 -24
  85. package/docs/core-concepts/authentication/ui-components/react-router.mdx +18 -19
  86. package/docs/core-concepts/authentication/ui-components/react.mdx +26 -19
  87. package/docs/core-concepts/database/architecture.mdx +58 -21
  88. package/docs/core-concepts/database/pgvector.mdx +138 -0
  89. package/docs/core-concepts/database/sdk.mdx +17 -17
  90. package/docs/core-concepts/deployments/architecture.mdx +152 -0
  91. package/docs/core-concepts/email/architecture.mdx +4 -2
  92. package/docs/core-concepts/functions/architecture.mdx +1 -1
  93. package/docs/core-concepts/functions/sdk.mdx +0 -1
  94. package/docs/core-concepts/realtime/architecture.mdx +1 -1
  95. package/docs/core-concepts/storage/architecture.mdx +1 -1
  96. package/docs/core-concepts/storage/sdk.mdx +25 -25
  97. package/docs/docs.json +14 -6
  98. package/docs/favicon.png +0 -0
  99. package/docs/favicon.svg +3 -18
  100. package/docs/images/changelog/dec-2025/apple-oauth.mp4 +0 -0
  101. package/docs/images/changelog/dec-2025/moreModels.png +0 -0
  102. package/docs/images/changelog/dec-2025/multi-region.webp +0 -0
  103. package/docs/images/changelog/dec-2025/postgres-connection.webp +0 -0
  104. package/docs/images/changelog/dec-2025/realtime2.png +0 -0
  105. package/docs/images/mcp-setup/CC-MCP-1.mp4 +0 -0
  106. package/docs/images/mcp-setup/CC-MCP-2.mp4 +0 -0
  107. package/docs/images/mcp-setup/Cursor-MCP-1.mp4 +0 -0
  108. package/docs/images/mcp-setup/Cursor-MCP-2.mp4 +0 -0
  109. package/docs/images/mcp-setup/Cursor-MCP-3.mp4 +0 -0
  110. package/docs/images/mcp-setup/claude-code-connect.png +0 -0
  111. package/docs/images/mcp-setup/cline-1.png +0 -0
  112. package/docs/images/mcp-setup/cline-2.png +0 -0
  113. package/docs/images/mcp-setup/cline-3.png +0 -0
  114. package/docs/images/mcp-setup/connect-project.png +0 -0
  115. package/docs/images/mcp-setup/copilot-1.png +0 -0
  116. package/docs/images/mcp-setup/copilot-2.png +0 -0
  117. package/docs/images/mcp-setup/copilot-3.png +0 -0
  118. package/docs/images/mcp-setup/mcp-json-1.png +0 -0
  119. package/docs/images/mcp-setup/mcp-json-2.png +0 -0
  120. package/docs/images/mcp-setup/qoder-1.png +0 -0
  121. package/docs/images/mcp-setup/qoder-2.png +0 -0
  122. package/docs/images/mcp-setup/roocode-1.png +0 -0
  123. package/docs/images/mcp-setup/roocode-2.png +0 -0
  124. package/docs/images/mcp-setup/trae-1.png +0 -0
  125. package/docs/images/mcp-setup/trae-2.png +0 -0
  126. package/docs/images/mcp-setup/trae-3.png +0 -0
  127. package/docs/images/mcp-setup/trae-4.png +0 -0
  128. package/docs/images/mcp-setup/trae-5.png +0 -0
  129. package/docs/images/mcp-setup/windsurf-1.png +0 -0
  130. package/docs/images/mcp-setup/windsurf-2.png +0 -0
  131. package/docs/insforge-instructions-sdk.md +7 -3
  132. package/docs/introduction.mdx +9 -8
  133. package/docs/mcp-setup.mdx +332 -0
  134. package/docs/oauth-server.mdx +563 -0
  135. package/docs/partnership.mdx +79 -10
  136. package/docs/quickstart.mdx +1 -1
  137. package/docs/vscode-extension.mdx +74 -0
  138. package/eslint.config.js +1 -0
  139. package/examples/response-examples.md +1 -1
  140. package/frontend/package.json +1 -1
  141. package/frontend/src/App.tsx +8 -3
  142. package/frontend/src/assets/logos/antigravity.svg +1 -0
  143. package/frontend/src/assets/logos/copilot.svg +10 -0
  144. package/frontend/src/assets/logos/deepseek.svg +139 -0
  145. package/frontend/src/assets/logos/kiro.svg +9 -0
  146. package/frontend/src/assets/logos/qoder.svg +4 -0
  147. package/frontend/src/assets/logos/qwen.svg +15 -0
  148. package/frontend/src/components/CodeBlock.tsx +2 -2
  149. package/frontend/src/components/ConnectCTA.tsx +3 -2
  150. package/frontend/src/components/datagrid/DataGrid.tsx +90 -62
  151. package/frontend/src/components/datagrid/datagridTypes.tsx +2 -1
  152. package/frontend/src/components/datagrid/index.ts +1 -1
  153. package/frontend/src/components/index.ts +0 -1
  154. package/frontend/src/components/layout/AppHeader.tsx +4 -27
  155. package/frontend/src/components/layout/AppSidebar.tsx +85 -100
  156. package/frontend/src/components/layout/Layout.tsx +34 -32
  157. package/frontend/src/components/layout/PrimaryMenu.tsx +12 -4
  158. package/frontend/src/components/radix/Select.tsx +151 -151
  159. package/frontend/src/features/ai/components/AIConfigCard.tsx +200 -200
  160. package/frontend/src/features/ai/components/AIEmptyState.tsx +23 -23
  161. package/frontend/src/features/ai/components/ModalityFilterSidebar.tsx +102 -101
  162. package/frontend/src/features/ai/components/ModelSelectionDialog.tsx +135 -135
  163. package/frontend/src/features/ai/components/ModelSelectionGrid.tsx +51 -51
  164. package/frontend/src/features/ai/components/SystemPromptDialog.tsx +118 -118
  165. package/frontend/src/features/ai/components/index.ts +6 -6
  166. package/frontend/src/features/ai/helpers.ts +147 -141
  167. package/frontend/src/features/ai/pages/AIPage.tsx +166 -166
  168. package/frontend/src/features/auth/components/AuthPreview.tsx +96 -96
  169. package/frontend/src/features/auth/components/UsersDataGrid.tsx +55 -31
  170. package/frontend/src/features/auth/components/index.ts +5 -5
  171. package/frontend/src/features/auth/pages/AuthMethodsPage.tsx +275 -275
  172. package/frontend/src/features/dashboard/pages/DashboardPage.tsx +1 -1
  173. package/frontend/src/features/database/components/DatabaseDataGrid.tsx +0 -2
  174. package/frontend/src/features/database/components/ForeignKeyCell.tsx +38 -11
  175. package/frontend/src/features/database/components/ForeignKeyPopover.tsx +18 -8
  176. package/frontend/src/features/database/components/LinkRecordModal.tsx +61 -13
  177. package/frontend/src/features/database/components/RecordFormField.tsx +1 -1
  178. package/frontend/src/features/database/components/TableSidebar.tsx +0 -3
  179. package/frontend/src/features/database/components/TablesEmptyState.tsx +1 -1
  180. package/frontend/src/features/database/components/TemplatePreview.tsx +1 -2
  181. package/frontend/src/features/database/constants.ts +16 -28
  182. package/frontend/src/features/database/hooks/useCSVImport.ts +3 -2
  183. package/frontend/src/features/database/hooks/useRawSQL.ts +3 -2
  184. package/frontend/src/features/database/hooks/useTables.ts +5 -7
  185. package/frontend/src/features/database/pages/FunctionsPage.tsx +0 -5
  186. package/frontend/src/features/database/pages/IndexesPage.tsx +0 -5
  187. package/frontend/src/features/database/pages/PoliciesPage.tsx +0 -5
  188. package/frontend/src/features/database/pages/SQLEditorPage.tsx +2 -2
  189. package/frontend/src/features/database/pages/TriggersPage.tsx +0 -5
  190. package/frontend/src/features/database/services/advance.service.ts +1 -15
  191. package/frontend/src/features/database/services/record.service.ts +4 -20
  192. package/frontend/src/features/database/services/table.service.ts +1 -4
  193. package/frontend/src/features/database/templates/ai-chatbot.ts +6 -6
  194. package/frontend/src/features/database/templates/ecommerce-platform.ts +2 -2
  195. package/frontend/src/features/database/templates/instagram-clone.ts +10 -10
  196. package/frontend/src/features/database/templates/notion-clone.ts +8 -8
  197. package/frontend/src/features/database/templates/reddit-clone.ts +10 -10
  198. package/frontend/src/features/deployments/components/DeploymentRow.tsx +93 -0
  199. package/frontend/src/features/deployments/components/DeploymentsEmptyState.tsx +15 -0
  200. package/frontend/src/features/deployments/hooks/useDeployments.ts +157 -0
  201. package/frontend/src/features/deployments/pages/DeploymentsPage.tsx +318 -0
  202. package/frontend/src/features/deployments/services/deployments.service.ts +63 -0
  203. package/frontend/src/features/functions/components/FunctionRow.tsx +72 -72
  204. package/frontend/src/features/functions/components/FunctionsSidebar.tsx +56 -56
  205. package/frontend/src/features/functions/components/SecretRow.tsx +3 -3
  206. package/frontend/src/features/functions/components/index.ts +5 -5
  207. package/frontend/src/features/functions/hooks/useFunctions.ts +5 -4
  208. package/frontend/src/features/functions/hooks/useSecrets.ts +6 -9
  209. package/frontend/src/features/functions/pages/SecretsPage.tsx +118 -118
  210. package/frontend/src/features/functions/services/function.service.ts +8 -25
  211. package/frontend/src/features/functions/services/secret.service.ts +23 -41
  212. package/frontend/src/features/login/pages/CloudLoginPage.tsx +125 -118
  213. package/frontend/src/features/logs/components/LogDetailPanel.tsx +41 -0
  214. package/frontend/src/features/logs/components/LogsDataGrid.tsx +32 -1
  215. package/frontend/src/features/logs/components/index.ts +1 -0
  216. package/frontend/src/features/logs/pages/LogsPage.tsx +36 -6
  217. package/frontend/src/features/onboard/components/ApiCredentialsSection.tsx +59 -0
  218. package/frontend/src/features/onboard/components/ConnectionStringSection.tsx +180 -0
  219. package/frontend/src/features/onboard/components/McpConnectionSection.tsx +159 -0
  220. package/frontend/src/features/onboard/components/OnboardingController.tsx +68 -0
  221. package/frontend/src/features/onboard/components/OnboardingModal.tsx +121 -267
  222. package/frontend/src/features/onboard/components/ShowPasswordButton.tsx +21 -0
  223. package/frontend/src/features/onboard/components/index.ts +9 -4
  224. package/frontend/src/features/onboard/components/mcp/CursorDeeplinkGenerator.tsx +1 -1
  225. package/frontend/src/features/onboard/components/mcp/QoderDeeplinkGenerator.tsx +36 -0
  226. package/frontend/src/features/onboard/components/mcp/helpers.tsx +123 -98
  227. package/frontend/src/features/onboard/components/mcp/index.ts +4 -3
  228. package/frontend/src/features/onboard/index.ts +17 -13
  229. package/frontend/src/features/settings/pages/SettingsPage.tsx +349 -0
  230. package/frontend/src/features/visualizer/components/AuthNode.tsx +4 -4
  231. package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +21 -8
  232. package/frontend/src/features/visualizer/pages/VisualizerPage.tsx +10 -1
  233. package/frontend/src/index.css +249 -249
  234. package/frontend/src/lib/contexts/ModalContext.tsx +35 -0
  235. package/frontend/src/lib/hooks/useMetadata.ts +45 -1
  236. package/frontend/src/lib/hooks/useModal.tsx +2 -0
  237. package/frontend/src/lib/routing/AppRoutes.tsx +103 -99
  238. package/frontend/src/lib/services/metadata.service.ts +20 -3
  239. package/frontend/src/lib/utils/menuItems.ts +223 -207
  240. package/frontend/src/lib/utils/utils.ts +196 -196
  241. package/functions/server.ts +315 -315
  242. package/functions/worker-template.js +1 -1
  243. package/openapi/ai.yaml +115 -5
  244. package/openapi/auth.yaml +97 -17
  245. package/openapi/logs.yaml +0 -2
  246. package/openapi/metadata.yaml +0 -2
  247. package/openapi/records.yaml +21 -21
  248. package/openapi/tables.yaml +1 -2
  249. package/package.json +1 -1
  250. package/shared-schemas/package.json +1 -1
  251. package/shared-schemas/src/ai-api.schema.ts +251 -143
  252. package/shared-schemas/src/ai.schema.ts +63 -63
  253. package/shared-schemas/src/auth-api.schema.ts +34 -6
  254. package/shared-schemas/src/auth.schema.ts +17 -10
  255. package/shared-schemas/src/cloud-events.schema.ts +26 -0
  256. package/shared-schemas/src/deployments-api.schema.ts +55 -0
  257. package/shared-schemas/src/deployments.schema.ts +30 -0
  258. package/shared-schemas/src/docs.schema.ts +8 -2
  259. package/shared-schemas/src/email-api.schema.ts +30 -30
  260. package/shared-schemas/src/functions-api.schema.ts +13 -4
  261. package/shared-schemas/src/functions.schema.ts +1 -1
  262. package/shared-schemas/src/index.ts +22 -18
  263. package/shared-schemas/src/metadata.schema.ts +30 -4
  264. package/shared-schemas/src/secrets-api.schema.ts +44 -0
  265. package/shared-schemas/src/secrets.schema.ts +15 -0
  266. package/zeabur/README.md +13 -0
  267. package/zeabur/template.yml +20 -51
  268. package/backend/src/types/profile.ts +0 -55
  269. package/frontend/src/components/ProjectInfoModal.tsx +0 -128
@@ -0,0 +1,258 @@
1
+ #!/bin/bash
2
+
3
+ # AI Web Search and Thinking mode test script
4
+ # Tests the new webSearch and thinking parameters for chat completion
5
+
6
+ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
7
+ source "$SCRIPT_DIR/../test-config.sh"
8
+
9
+ echo "🧪 Testing AI Web Search and Thinking features..."
10
+
11
+ API_BASE="$TEST_API_BASE"
12
+ ADMIN_TOKEN=""
13
+
14
+ # Get admin token
15
+ echo "🔑 Getting admin token..."
16
+ ADMIN_TOKEN=$(get_admin_token)
17
+
18
+ if [ -z "$ADMIN_TOKEN" ]; then
19
+ print_fail "Failed to get admin token"
20
+ exit 1
21
+ fi
22
+ print_success "Got admin token"
23
+ echo ""
24
+
25
+ # 1. Test chat completion with Web Search
26
+ echo "🔍 Test 1: Chat completion with Web Search..."
27
+ websearch_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/chat/completion" \
28
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
29
+ -H "Content-Type: application/json" \
30
+ -d '{
31
+ "model": "openai/gpt-4o",
32
+ "messages": [{"role": "user", "content": "What are the latest AI news today?"}],
33
+ "webSearch": {
34
+ "enabled": true,
35
+ "maxResults": 3
36
+ }
37
+ }')
38
+
39
+ status=$(echo "$websearch_response" | tail -n 1)
40
+ body=$(echo "$websearch_response" | sed '$d')
41
+
42
+ if [ "$status" -eq 200 ]; then
43
+ print_success "Chat completion with Web Search succeeded"
44
+ # Check if annotations are present in the response
45
+ if echo "$body" | grep -q "annotations"; then
46
+ print_success "Response contains URL citations (annotations)"
47
+ else
48
+ echo "Note: No annotations in response (may depend on model/query)"
49
+ fi
50
+ echo "Response preview: $(echo "$body" | head -c 500)"
51
+ echo ""
52
+ else
53
+ print_fail "Chat completion with Web Search failed (status: $status)"
54
+ echo "Response: $body"
55
+ track_test_failure
56
+ fi
57
+ echo ""
58
+
59
+ # 2. Test chat completion with Web Search using Exa engine
60
+ echo "🔍 Test 2: Chat completion with Web Search (Exa engine)..."
61
+ exa_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/chat/completion" \
62
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
63
+ -H "Content-Type: application/json" \
64
+ -d '{
65
+ "model": "openai/gpt-4o",
66
+ "messages": [{"role": "user", "content": "What is the current weather in Tokyo?"}],
67
+ "webSearch": {
68
+ "enabled": true,
69
+ "engine": "exa",
70
+ "maxResults": 2
71
+ }
72
+ }')
73
+
74
+ status=$(echo "$exa_response" | tail -n 1)
75
+ body=$(echo "$exa_response" | sed '$d')
76
+
77
+ if [ "$status" -eq 200 ]; then
78
+ print_success "Chat completion with Exa Web Search succeeded"
79
+ echo "Response preview: $(echo "$body" | head -c 500)"
80
+ echo ""
81
+ else
82
+ print_fail "Chat completion with Exa Web Search failed (status: $status)"
83
+ echo "Response: $body"
84
+ track_test_failure
85
+ fi
86
+ echo ""
87
+
88
+ # 3. Test chat completion with Thinking mode
89
+ echo "🧠 Test 3: Chat completion with Thinking mode..."
90
+ thinking_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/chat/completion" \
91
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
92
+ -H "Content-Type: application/json" \
93
+ -d '{
94
+ "model": "anthropic/claude-3.7-sonnet:thinking",
95
+ "messages": [{"role": "user", "content": "What is 15 + 27?"}]
96
+ }')
97
+
98
+ status=$(echo "$thinking_response" | tail -n 1)
99
+ body=$(echo "$thinking_response" | sed '$d')
100
+
101
+ if [ "$status" -eq 200 ]; then
102
+ print_success "Chat completion with Thinking mode succeeded"
103
+ echo "Response preview: $(echo "$body" | head -c 500)"
104
+ echo ""
105
+ else
106
+ print_fail "Chat completion with Thinking mode failed (status: $status)"
107
+ echo "Response: $body"
108
+ track_test_failure
109
+ fi
110
+ echo ""
111
+
112
+ # 4. Test chat completion with both Web Search and Thinking
113
+ echo "🔍🧠 Test 4: Chat completion with Web Search + Thinking..."
114
+ combined_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/chat/completion" \
115
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
116
+ -H "Content-Type: application/json" \
117
+ -d '{
118
+ "model": "anthropic/claude-3.7-sonnet",
119
+ "messages": [{"role": "user", "content": "What are the recent developments in AI?"}],
120
+ "webSearch": {
121
+ "enabled": true,
122
+ "engine": "native",
123
+ "maxResults": 3
124
+ },
125
+ "thinking": true
126
+ }')
127
+
128
+ status=$(echo "$combined_response" | tail -n 1)
129
+ body=$(echo "$combined_response" | sed '$d')
130
+
131
+ if [ "$status" -eq 200 ]; then
132
+ print_success "Chat completion with Web Search + Thinking succeeded"
133
+ echo "Response preview: $(echo "$body" | head -c 500)"
134
+ echo ""
135
+ else
136
+ print_fail "Chat completion with Web Search + Thinking failed (status: $status)"
137
+ echo "Response: $body"
138
+ track_test_failure
139
+ fi
140
+ echo ""
141
+
142
+ # 5. Test streaming with Web Search
143
+ echo "📡 Test 5: Streaming chat with Web Search..."
144
+ echo "Streaming response (first 20 events):"
145
+ stream_output=$(curl -s -N -X POST "$API_BASE/ai/chat/completion" \
146
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
147
+ -H "Content-Type: application/json" \
148
+ -d '{
149
+ "model": "openai/gpt-4o",
150
+ "messages": [{"role": "user", "content": "Latest tech news in one sentence"}],
151
+ "stream": true,
152
+ "webSearch": {
153
+ "enabled": true,
154
+ "maxResults": 2
155
+ }
156
+ }' 2>&1 | head -20)
157
+
158
+ echo "$stream_output"
159
+
160
+ if echo "$stream_output" | grep -q "data:"; then
161
+ print_success "Streaming with Web Search returned SSE events"
162
+ else
163
+ print_fail "Streaming with Web Search did not return expected SSE format"
164
+ track_test_failure
165
+ fi
166
+ echo ""
167
+
168
+ # 6. Test streaming with Thinking mode
169
+ echo "📡 Test 6: Streaming chat with Thinking mode..."
170
+ echo "Streaming response (first 20 events):"
171
+ thinking_stream=$(curl -s -N -X POST "$API_BASE/ai/chat/completion" \
172
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
173
+ -H "Content-Type: application/json" \
174
+ -d '{
175
+ "model": "anthropic/claude-3.7-sonnet",
176
+ "messages": [{"role": "user", "content": "What is 2+2?"}],
177
+ "stream": true,
178
+ "thinking": true
179
+ }' 2>&1 | head -20)
180
+
181
+ echo "$thinking_stream"
182
+
183
+ if echo "$thinking_stream" | grep -q "data:"; then
184
+ print_success "Streaming with Thinking mode returned SSE events"
185
+ else
186
+ print_fail "Streaming with Thinking mode did not return expected SSE format"
187
+ track_test_failure
188
+ fi
189
+ echo ""
190
+
191
+ # 7. Test Web Search with custom search prompt
192
+ echo "🔍 Test 7: Web Search with custom search prompt..."
193
+ custom_prompt_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/chat/completion" \
194
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
195
+ -H "Content-Type: application/json" \
196
+ -d '{
197
+ "model": "openai/gpt-4o",
198
+ "messages": [{"role": "user", "content": "Tell me about SpaceX launches"}],
199
+ "webSearch": {
200
+ "enabled": true,
201
+ "maxResults": 3,
202
+ "searchPrompt": "Here are some relevant web search results about SpaceX:"
203
+ }
204
+ }')
205
+
206
+ status=$(echo "$custom_prompt_response" | tail -n 1)
207
+ body=$(echo "$custom_prompt_response" | sed '$d')
208
+
209
+ if [ "$status" -eq 200 ]; then
210
+ print_success "Web Search with custom prompt succeeded"
211
+ echo "Response preview: $(echo "$body" | head -c 500)"
212
+ echo ""
213
+ else
214
+ print_fail "Web Search with custom prompt failed (status: $status)"
215
+ echo "Response: $body"
216
+ track_test_failure
217
+ fi
218
+ echo ""
219
+
220
+ # 8. Test PDF file processing with file-parser plugin
221
+ # Note: Using pdf-text engine (free) instead of native, as native requires models with built-in PDF support
222
+ # For URL-based PDFs, OpenRouter's file-parser plugin will fetch and parse the PDF
223
+ echo "📄 Test 8: PDF file processing with file-parser plugin..."
224
+ pdf_response=$(curl -s -w "\n%{http_code}" -X POST "$API_BASE/ai/chat/completion" \
225
+ -H "Authorization: Bearer $ADMIN_TOKEN" \
226
+ -H "Content-Type: application/json" \
227
+ -d '{
228
+ "model": "openai/gpt-4o",
229
+ "messages": [{
230
+ "role": "user",
231
+ "content": [
232
+ {"type": "text", "text": "Please summarize the content of this PDF document."},
233
+ {"type": "file", "file": {"filename": "sample.pdf", "file_data": "https://pdfco-test-files.s3.us-west-2.amazonaws.com/pdf-to-csv/sample.pdf"}}
234
+ ]
235
+ }],
236
+ "fileParser": {
237
+ "enabled": true,
238
+ "pdf": {
239
+ "engine": "pdf-text"
240
+ }
241
+ }
242
+ }')
243
+
244
+ status=$(echo "$pdf_response" | tail -n 1)
245
+ body=$(echo "$pdf_response" | sed '$d')
246
+
247
+ if [ "$status" -eq 200 ]; then
248
+ print_success "PDF file processing succeeded"
249
+ echo "Response preview: $(echo "$body" | head -c 800)"
250
+ echo ""
251
+ else
252
+ print_fail "PDF file processing failed (status: $status)"
253
+ echo "Response: $body"
254
+ track_test_failure
255
+ fi
256
+ echo ""
257
+
258
+ print_success "🎉 AI Web Search and Thinking test completed!"
@@ -74,7 +74,7 @@ test_endpoint \
74
74
  "STRICT" \
75
75
  "rawsql" \
76
76
  "Allow SELECT from system table" \
77
- "SELECT * FROM _secrets LIMIT 1;" \
77
+ "SELECT * FROM system.secrets LIMIT 1;" \
78
78
  "pass"
79
79
 
80
80
  # Test 2: Strict mode blocks system table INSERT
@@ -82,7 +82,7 @@ test_endpoint \
82
82
  "STRICT" \
83
83
  "rawsql" \
84
84
  "Block INSERT into system table" \
85
- "INSERT INTO _secrets (name, value_ciphertext) VALUES ('test', 'value');" \
85
+ "INSERT INTO system.secrets (name, value_ciphertext) VALUES ('test', 'value');" \
86
86
  "fail"
87
87
 
88
88
  # Test 3: Strict mode blocks pg_catalog
@@ -101,20 +101,20 @@ test_endpoint \
101
101
  "SELECT * FROM information_schema.tables LIMIT 1;" \
102
102
  "fail"
103
103
 
104
- # Test 5: Strict mode blocks INSERT into users
104
+ # Test 5: Strict mode blocks INSERT into auth.users
105
105
  test_endpoint \
106
106
  "STRICT" \
107
107
  "rawsql" \
108
- "Block INSERT into users table" \
109
- "INSERT INTO users (id, nickname) VALUES (gen_random_uuid(), 'testuser');" \
108
+ "Block INSERT into auth.users table" \
109
+ "INSERT INTO auth.users (id, email, metadata) VALUES (gen_random_uuid(), 'test@example.com', '{}');" \
110
110
  "fail"
111
111
 
112
112
  # Test 6: Strict mode allows regular table operations
113
113
  test_endpoint \
114
114
  "STRICT" \
115
115
  "rawsql" \
116
- "Allow SELECT from regular table" \
117
- "SELECT COUNT(*) FROM users;" \
116
+ "Allow SELECT from auth.users table" \
117
+ "SELECT COUNT(*) FROM auth.users;" \
118
118
  "pass"
119
119
 
120
120
  echo -e "${BLUE}=== RELAXED MODE TESTS (/rawsql/unrestricted) ===${NC}"
@@ -125,7 +125,7 @@ test_endpoint \
125
125
  "RELAXED" \
126
126
  "rawsql/unrestricted" \
127
127
  "Allow SELECT from system table" \
128
- "SELECT * FROM _secrets LIMIT 1;" \
128
+ "SELECT * FROM system.secrets LIMIT 1;" \
129
129
  "pass"
130
130
 
131
131
  # Test 8: Relaxed mode allows INSERT into system table
@@ -133,7 +133,7 @@ test_endpoint \
133
133
  "RELAXED" \
134
134
  "rawsql/unrestricted" \
135
135
  "Allow INSERT into system table" \
136
- "INSERT INTO _audit_logs (actor, action, module) VALUES ('test_actor', 'TEST_ACTION', 'TEST_MODULE');" \
136
+ "INSERT INTO system.audit_logs (actor, action, module) VALUES ('test_actor', 'TEST_ACTION', 'TEST_MODULE');" \
137
137
  "pass"
138
138
 
139
139
  # Test 9: Relaxed mode blocks UPDATE system table
@@ -141,7 +141,7 @@ test_endpoint \
141
141
  "RELAXED" \
142
142
  "rawsql/unrestricted" \
143
143
  "Block UPDATE system table" \
144
- "UPDATE _audit_logs SET actor = 'updated' WHERE action = 'TEST_ACTION';" \
144
+ "UPDATE system.audit_logs SET actor = 'updated' WHERE action = 'TEST_ACTION';" \
145
145
  "fail"
146
146
 
147
147
  # Test 10: Relaxed mode blocks DELETE FROM system table
@@ -149,7 +149,7 @@ test_endpoint \
149
149
  "RELAXED" \
150
150
  "rawsql/unrestricted" \
151
151
  "Block DELETE FROM system table" \
152
- "DELETE FROM _audit_logs WHERE action = 'TEST_ACTION';" \
152
+ "DELETE FROM system.audit_logs WHERE action = 'TEST_ACTION';" \
153
153
  "fail"
154
154
 
155
155
  # Test 11: Relaxed mode blocks DROP system table
@@ -157,31 +157,31 @@ test_endpoint \
157
157
  "RELAXED" \
158
158
  "rawsql/unrestricted" \
159
159
  "Block DROP system table" \
160
- "DROP TABLE _secrets;" \
160
+ "DROP TABLE system.secrets;" \
161
161
  "fail"
162
162
 
163
- # Test 12: Relaxed mode allows SELECT from users (INSERT requires foreign key to _accounts, so skip)
163
+ # Test 12: Relaxed mode allows SELECT from auth.users
164
164
  test_endpoint \
165
165
  "RELAXED" \
166
166
  "rawsql/unrestricted" \
167
- "Allow SELECT from users table" \
168
- "SELECT COUNT(*) FROM users;" \
167
+ "Allow SELECT from auth.users table" \
168
+ "SELECT COUNT(*) FROM auth.users;" \
169
169
  "pass"
170
170
 
171
- # Test 13: Relaxed mode blocks DROP users table
171
+ # Test 13: Relaxed mode blocks DROP auth.users table
172
172
  test_endpoint \
173
173
  "RELAXED" \
174
174
  "rawsql/unrestricted" \
175
- "Block DROP users table" \
176
- "DROP TABLE users;" \
175
+ "Block DROP auth.users table" \
176
+ "DROP TABLE auth.users;" \
177
177
  "fail"
178
178
 
179
- # Test 14: Relaxed mode blocks RENAME users table
179
+ # Test 14: Relaxed mode blocks RENAME auth.users table
180
180
  test_endpoint \
181
181
  "RELAXED" \
182
182
  "rawsql/unrestricted" \
183
- "Block RENAME users table" \
184
- "ALTER TABLE users RENAME TO users_backup;" \
183
+ "Block RENAME auth.users table" \
184
+ "ALTER TABLE auth.users RENAME TO users_backup;" \
185
185
  "fail"
186
186
 
187
187
  echo -e "${BLUE}=== BOTH MODES - DATABASE LEVEL BLOCKS ===${NC}"
@@ -226,18 +226,18 @@ echo ""
226
226
  echo -e "${GREEN}STRICT MODE (/rawsql):${NC}"
227
227
  echo " - ✅ Allows SELECT from system tables (read-only)"
228
228
  echo " - ❌ Blocks INSERT/UPDATE/DELETE/DROP/ALTER on system tables"
229
- echo " - ❌ Blocks ALL operations on users table"
229
+ echo " - ❌ Blocks ALL operations on auth.users table"
230
230
  echo " - ❌ Blocks pg_catalog and information_schema"
231
231
  echo " - ❌ Blocks database-level operations"
232
232
  echo ""
233
233
  echo -e "${GREEN}RELAXED MODE (/rawsql/unrestricted):${NC}"
234
234
  echo " - ✅ Allows SELECT from system tables"
235
235
  echo " - ✅ Allows INSERT into system tables"
236
- echo " - ✅ Allows SELECT from users table"
236
+ echo " - ✅ Allows SELECT from auth.users table"
237
237
  echo " - ❌ Blocks UPDATE of system tables"
238
238
  echo " - ❌ Blocks DELETE FROM system tables"
239
239
  echo " - ❌ Blocks DROP/ALTER/TRUNCATE system tables"
240
- echo " - ❌ Blocks DROP/RENAME users table"
240
+ echo " - ❌ Blocks DROP/RENAME auth.users table"
241
241
  echo " - ❌ Blocks pg_catalog and information_schema"
242
242
  echo " - ❌ Blocks database-level operations"
243
243
  echo ""