Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
66af47d
Enhance documentation tools integration
mantrakp04 Mar 23, 2026
30d53e8
Merge branch 'dev' into dario-likes-mcps
mantrakp04 Mar 23, 2026
5078747
Enhance error handling and API response for documentation tools
mantrakp04 Mar 24, 2026
aaf49db
Merge branch 'dev' into dario-likes-mcps
mantrakp04 Mar 24, 2026
844e916
Refactor askStackAuth key to ask_stack_auth in API documentation
mantrakp04 Mar 24, 2026
274c742
fix: register private submodule gitlink in the index
mantrakp04 Mar 25, 2026
c7a3cca
Merge branch 'dev' into dario-likes-mcps
mantrakp04 Mar 25, 2026
ef2289f
Merge branch 'dev' into dario-likes-mcps
mantrakp04 Apr 3, 2026
d8065c4
Update environment configurations and remove internal secret validati…
mantrakp04 Apr 4, 2026
3b27eee
Merge branch 'dev' into dario-likes-mcps
mantrakp04 Apr 6, 2026
b82efa4
Merge branch 'dev' into dario-likes-mcps
mantrakp04 Apr 6, 2026
158498b
Merge branch 'dev' into dario-likes-mcps
mantrakp04 Apr 8, 2026
b22d4b0
Merge branch 'dev' into dario-likes-mcps
mantrakp04 Apr 9, 2026
95ca0a2
initial commit
aadesh18 Apr 10, 2026
fbab066
Merge remote-tracking branch 'origin/dario-likes-mcps' into llm-mcp-flow
aadesh18 Apr 10, 2026
73152a1
pnpm lock
aadesh18 Apr 10, 2026
e16040c
changed port
aadesh18 Apr 10, 2026
a07dbab
spacetime db ci change
aadesh18 Apr 10, 2026
ef77edc
ci fix
aadesh18 Apr 10, 2026
84dffa2
security fix
aadesh18 Apr 10, 2026
a0486e9
security fixes
aadesh18 Apr 11, 2026
8c596ec
Merge branch 'dev' into dario-likes-mcps
mantrakp04 Apr 12, 2026
ef6963d
Merge branch 'dev' into dario-likes-mcps
N2D4 Apr 12, 2026
1c69185
Merge branch 'dario-likes-mcps' into llm-mcp-flow
aadesh18 Apr 12, 2026
f794bd6
Merge remote-tracking branch 'origin/dev' into llm-mcp-flow
aadesh18 Apr 12, 2026
59a060a
merge error
aadesh18 Apr 13, 2026
0485c73
pr comment changes
aadesh18 Apr 13, 2026
97ee052
Merge branch 'dev' into llm-mcp-flow
aadesh18 Apr 13, 2026
411f775
bug fix
aadesh18 Apr 13, 2026
c514efd
Merge branch 'llm-mcp-flow' of https://github.com/stack-auth/stack-au…
aadesh18 Apr 13, 2026
516c424
Merge branch 'dev' into llm-mcp-flow
aadesh18 Apr 13, 2026
b0e3341
pr comments
aadesh18 Apr 13, 2026
a630be1
Merge branch 'llm-mcp-flow' of https://github.com/stack-auth/stack-au…
aadesh18 Apr 13, 2026
8c7bc54
tests failing
aadesh18 Apr 13, 2026
7a54be9
comment changes
aadesh18 Apr 13, 2026
bd3925d
Merge branch 'dev' into llm-mcp-flow
aadesh18 Apr 13, 2026
ca461d4
tests fix
aadesh18 Apr 13, 2026
224468c
Merge branch 'llm-mcp-flow' of https://github.com/stack-auth/stack-au…
aadesh18 Apr 13, 2026
042e616
tests fix
aadesh18 Apr 13, 2026
149d6d7
fixed the order
aadesh18 Apr 13, 2026
574cc4a
Merge branch 'dev' into llm-mcp-flow
aadesh18 Apr 13, 2026
3293845
Merge branch 'dev' into llm-mcp-flow
aadesh18 Apr 13, 2026
d8e99d6
Merge branch 'dev' into llm-mcp-flow
aadesh18 Apr 14, 2026
fa4c814
Merge branch 'dev' into llm-mcp-flow
aadesh18 Apr 14, 2026
a4c3306
pr changes
aadesh18 Apr 14, 2026
35739af
Merge branch 'dev' into llm-mcp-flow
aadesh18 Apr 14, 2026
15e5879
Merge remote-tracking branch 'origin/dev' into llm-mcp-flow
aadesh18 Apr 15, 2026
140ee7e
Merge branch 'dev' into llm-mcp-flow
aadesh18 Apr 15, 2026
afd84bc
minor fix
aadesh18 Apr 15, 2026
b0a329f
initial commit
aadesh18 Apr 15, 2026
c819537
proxy logging implemented
aadesh18 Apr 15, 2026
7a2332f
Merge remote-tracking branch 'origin/dev' into ai-analytics
aadesh18 Apr 15, 2026
83a37d1
pr message fixes
aadesh18 Apr 17, 2026
4fb5154
internal tool security update
aadesh18 Apr 19, 2026
30e3e5c
Merge branch 'dev' into ai-analytics
aadesh18 Apr 19, 2026
edd33b1
added e2e tests
aadesh18 Apr 20, 2026
a43eb11
bot comment
aadesh18 Apr 20, 2026
1ccef9c
Update seed function to preserve existing user metadata when updating…
aadesh18 Apr 20, 2026
4965534
refactor: replace callReducer with callReducerStrict for improved err…
aadesh18 Apr 20, 2026
9ba7b5e
clean up
aadesh18 Apr 20, 2026
ddde9c6
feat: implement timeout for SpacetimeDB HTTP calls to prevent hanging…
aadesh18 Apr 20, 2026
c329a46
fix: improve error handling for missing SpacetimeDB service token in …
aadesh18 Apr 20, 2026
26ce83f
fix: encode URI components in fetch requests to prevent errors with s…
aadesh18 Apr 20, 2026
f9386a8
bot fixes
aadesh18 Apr 20, 2026
dc5ab66
fix: add log token retrieval in getServiceToken function
aadesh18 Apr 20, 2026
2532632
fix: enhance error handling in isSpacetimedbReachable and update priv…
aadesh18 Apr 20, 2026
53a9f2c
fix: update footer separator in ConversationReplay component for impr…
aadesh18 Apr 20, 2026
0eff6b2
bug fix
aadesh18 Apr 20, 2026
170b4fe
fix: refactor MCP review authorization and improve logging mechanisms
aadesh18 Apr 21, 2026
a0bab5d
tests clean up
aadesh18 Apr 21, 2026
3654af5
Merge remote-tracking branch 'origin/dev' into ai-analytics
aadesh18 Apr 21, 2026
dbc7988
bug fix
aadesh18 Apr 21, 2026
d8b7499
Custom Dashboard Improvements (#1359)
aadesh18 Apr 24, 2026
331d208
Update backend environment variables and refactor AI query route imports
aadesh18 Apr 28, 2026
49d2c04
Enhance image attachment validation in AI query route
aadesh18 Apr 28, 2026
60c538b
Add context to system prompt in AI query route
aadesh18 Apr 28, 2026
0aea8ef
edited comment
aadesh18 Apr 28, 2026
39facf4
added comment
aadesh18 Apr 28, 2026
45ff5f2
aman comment changes
aadesh18 May 4, 2026
89d43b1
Merge remote-tracking branch 'origin/dev' into ai-analytics
aadesh18 May 4, 2026
971bad9
merge changes
aadesh18 May 4, 2026
16542f1
removed mcpCorrelationId
aadesh18 May 5, 2026
10e6cfc
Enhance qaId validation in MCP review routes to ensure it is a non-ne…
aadesh18 May 5, 2026
5552bd7
Refactor reviewer handling in MCP review route to improve readability…
aadesh18 May 5, 2026
2e78347
Implement update_qa_entry_with_publish reducer to streamline QA entry…
aadesh18 May 5, 2026
0cedc49
Refactor AI query logging to handle serialization errors gracefully a…
aadesh18 May 5, 2026
a087f6b
Refactor AI query logging to encapsulate error handling within async …
aadesh18 May 5, 2026
7e850db
Update tool call instructions in AI prompts to specify usage of patch…
aadesh18 May 5, 2026
7527bcf
Enhance occurrenceIndex validation in applyDashboardPatches to ensure…
aadesh18 May 5, 2026
cfcedeb
Refactor applyDashboardPatches to use 'draft' instead of 'running' fo…
aadesh18 May 5, 2026
9500e1e
sizing fix
aadesh18 May 5, 2026
9599254
Merge branch 'dev' into ai-analytics
aadesh18 May 6, 2026
c664a1d
Merge remote-tracking branch 'origin/dev' into ai-analytics
aadesh18 May 8, 2026
1389d37
lint fix
aadesh18 May 8, 2026
185d245
update reviewer authentication and API calls
aadesh18 May 11, 2026
29a6a88
Merge remote-tracking branch 'origin/dev' into ai-analytics
aadesh18 May 11, 2026
d63bb9c
test fix
aadesh18 May 12, 2026
6b8838e
Merge branch 'dev' into ai-analytics
aadesh18 May 12, 2026
26f0ff6
bot comments
aadesh18 May 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
security fix
  • Loading branch information
aadesh18 committed Apr 10, 2026
commit 84dffa29f0c5071e3e6daaab67c3366814621b28
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import { getConnection } from "@/lib/ai/mcp-logger";
import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler";
import { adaptSchema, yupBoolean, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
import { getEnvVariable } from "@stackframe/stack-shared/dist/utils/env";
import { StatusError } from "@stackframe/stack-shared/dist/utils/errors";

export const POST = createSmartRouteHandler({
metadata: { hidden: true },
request: yupObject({
auth: yupObject({
type: adaptSchema,
user: adaptSchema.defined(),
project: adaptSchema,
}).defined(),
body: yupObject({
question: yupString().defined(),
answer: yupString().defined(),
publish: yupBoolean().defined(),
reviewedBy: yupString().defined(),
}).defined(),
method: yupString().oneOf(["POST"]).defined(),
}),
response: yupObject({
statusCode: yupNumber().oneOf([200]).defined(),
bodyType: yupString().oneOf(["json"]).defined(),
body: yupObject({
success: yupBoolean().defined(),
}).defined(),
}),
handler: async ({ body }, fullReq) => {
const metadata = fullReq.auth?.user?.client_read_only_metadata;
if (!(metadata && typeof metadata === "object" && "approved" in metadata && metadata.approved === true)) {
throw new StatusError(StatusError.Forbidden, "You are not approved to perform MCP review operations.");
}

const conn = await getConnection();
if (!conn) {
throw new StatusError(503, "SpacetimeDB unavailable");
}

const token = getEnvVariable("STACK_MCP_LOG_TOKEN", "change-me");
await conn.reducers.addManualQa({
token,
question: body.question,
answer: body.answer,
publish: body.publish,
reviewedBy: body.reviewedBy,
});

return {
statusCode: 200,
bodyType: "json" as const,
body: { success: true },
};
},
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { getConnection } from "@/lib/ai/mcp-logger";
import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler";
import { adaptSchema, yupBoolean, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
import { getEnvVariable } from "@stackframe/stack-shared/dist/utils/env";
import { StatusError } from "@stackframe/stack-shared/dist/utils/errors";

export const POST = createSmartRouteHandler({
metadata: { hidden: true },
request: yupObject({
auth: yupObject({
type: adaptSchema,
user: adaptSchema.defined(),
project: adaptSchema,
}).defined(),
body: yupObject({
correlationId: yupString().defined(),
}).defined(),
method: yupString().oneOf(["POST"]).defined(),
}),
response: yupObject({
statusCode: yupNumber().oneOf([200]).defined(),
bodyType: yupString().oneOf(["json"]).defined(),
body: yupObject({
success: yupBoolean().defined(),
}).defined(),
}),
handler: async ({ body }, fullReq) => {
const metadata = fullReq.auth?.user?.client_read_only_metadata;
if (!(metadata && typeof metadata === "object" && "approved" in metadata && metadata.approved === true)) {
throw new StatusError(StatusError.Forbidden, "You are not approved to perform MCP review operations.");
}

const conn = await getConnection();
if (!conn) {
throw new StatusError(503, "SpacetimeDB unavailable");
}

const token = getEnvVariable("STACK_MCP_LOG_TOKEN", "change-me");
await conn.reducers.deleteQaEntry({
token,
correlationId: body.correlationId,
});

return {
statusCode: 200,
bodyType: "json" as const,
body: { success: true },
};
},
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { getConnection } from "@/lib/ai/mcp-logger";
import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler";
import { adaptSchema, yupBoolean, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
import { getEnvVariable } from "@stackframe/stack-shared/dist/utils/env";
import { StatusError } from "@stackframe/stack-shared/dist/utils/errors";

export const POST = createSmartRouteHandler({
metadata: { hidden: true },
request: yupObject({
auth: yupObject({
type: adaptSchema,
user: adaptSchema.defined(),
project: adaptSchema,
}).defined(),
body: yupObject({
correlationId: yupString().defined(),
reviewedBy: yupString().defined(),
}).defined(),
method: yupString().oneOf(["POST"]).defined(),
}),
response: yupObject({
statusCode: yupNumber().oneOf([200]).defined(),
bodyType: yupString().oneOf(["json"]).defined(),
body: yupObject({
success: yupBoolean().defined(),
}).defined(),
}),
handler: async ({ body }, fullReq) => {
const metadata = fullReq.auth?.user?.client_read_only_metadata;
if (!(metadata && typeof metadata === "object" && "approved" in metadata && metadata.approved === true)) {
throw new StatusError(StatusError.Forbidden, "You are not approved to perform MCP review operations.");
}

const conn = await getConnection();
if (!conn) {
throw new StatusError(503, "SpacetimeDB unavailable");
}

const token = getEnvVariable("STACK_MCP_LOG_TOKEN", "change-me");
await conn.reducers.markHumanReviewed({
token,
correlationId: body.correlationId,
reviewedBy: body.reviewedBy,
});

return {
statusCode: 200,
bodyType: "json" as const,
body: { success: true },
};
},
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { getConnection } from "@/lib/ai/mcp-logger";
import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler";
import { adaptSchema, yupBoolean, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
import { getEnvVariable } from "@stackframe/stack-shared/dist/utils/env";
import { StatusError } from "@stackframe/stack-shared/dist/utils/errors";

export const POST = createSmartRouteHandler({
metadata: { hidden: true },
request: yupObject({
auth: yupObject({
type: adaptSchema,
user: adaptSchema.defined(),
project: adaptSchema,
}).defined(),
body: yupObject({
correlationId: yupString().defined(),
correctedQuestion: yupString().defined(),
correctedAnswer: yupString().defined(),
publish: yupBoolean().defined(),
reviewedBy: yupString().defined(),
}).defined(),
method: yupString().oneOf(["POST"]).defined(),
}),
response: yupObject({
statusCode: yupNumber().oneOf([200]).defined(),
bodyType: yupString().oneOf(["json"]).defined(),
body: yupObject({
success: yupBoolean().defined(),
}).defined(),
}),
handler: async ({ body }, fullReq) => {
const metadata = fullReq.auth?.user?.client_read_only_metadata;
if (!(metadata && typeof metadata === "object" && "approved" in metadata && metadata.approved === true)) {
throw new StatusError(StatusError.Forbidden, "You are not approved to perform MCP review operations.");
}

const conn = await getConnection();
if (!conn) {
throw new StatusError(503, "SpacetimeDB unavailable");
}

const token = getEnvVariable("STACK_MCP_LOG_TOKEN", "change-me");
await conn.reducers.updateHumanCorrection({
token,
correlationId: body.correlationId,
correctedQuestion: body.correctedQuestion,
correctedAnswer: body.correctedAnswer,
publish: body.publish,
reviewedBy: body.reviewedBy,
});

return {
statusCode: 200,
bodyType: "json" as const,
body: { success: true },
};
},
});
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
} from "spacetimedb";

export default {
token: __t.string(),
question: __t.string(),
answer: __t.string(),
publish: __t.bool(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@ import {
} from "spacetimedb";

export default {
token: __t.string(),
correlationId: __t.string(),
};
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
} from "spacetimedb";

export default {
token: __t.string(),
correlationId: __t.string(),
reviewedBy: __t.string(),
};
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
} from "spacetimedb";

export default {
token: __t.string(),
correlationId: __t.string(),
correctedQuestion: __t.string(),
correctedAnswer: __t.string(),
Expand Down
1 change: 0 additions & 1 deletion apps/backend/src/lib/ai/verified-qa.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ async function getVerifiedQaContextInner(): Promise<string> {
}
}

console.log(`[verified-qa] Found ${pairs.length} published Q&A pairs`);
if (pairs.length === 0) return "";

const formatted = pairs.map((p, i) =>
Expand Down
16 changes: 16 additions & 0 deletions apps/internal-tool/spacetimedb/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,14 @@ export const update_mcp_qa_review = spacetimedb.reducer(

export const mark_human_reviewed = spacetimedb.reducer(
{
token: t.string(),
correlationId: t.string(),
reviewedBy: t.string(),
},
(ctx, args) => {
if (args.token !== EXPECTED_LOG_TOKEN) {
throw new SenderError('Invalid log token');
}
for (const row of ctx.db.mcpCallLog.iter()) {
if (row.correlationId === args.correlationId) {
ctx.db.mcpCallLog.delete(row);
Expand All @@ -149,13 +153,17 @@ export const mark_human_reviewed = spacetimedb.reducer(

export const update_human_correction = spacetimedb.reducer(
{
token: t.string(),
correlationId: t.string(),
correctedQuestion: t.string(),
correctedAnswer: t.string(),
publish: t.bool(),
reviewedBy: t.string(),
},
(ctx, args) => {
if (args.token !== EXPECTED_LOG_TOKEN) {
throw new SenderError('Invalid log token');
}
for (const row of ctx.db.mcpCallLog.iter()) {
if (row.correlationId === args.correlationId) {
ctx.db.mcpCallLog.delete(row);
Expand All @@ -177,12 +185,16 @@ export const update_human_correction = spacetimedb.reducer(

export const add_manual_qa = spacetimedb.reducer(
{
token: t.string(),
question: t.string(),
answer: t.string(),
publish: t.bool(),
reviewedBy: t.string(),
},
(ctx, args) => {
if (args.token !== EXPECTED_LOG_TOKEN) {
throw new SenderError('Invalid log token');
}
ctx.db.mcpCallLog.insert({
id: 0n,
correlationId: ctx.newUuidV4().toString(),
Expand All @@ -208,9 +220,13 @@ export const add_manual_qa = spacetimedb.reducer(

export const delete_qa_entry = spacetimedb.reducer(
{
token: t.string(),
correlationId: t.string(),
},
(ctx, args) => {
if (args.token !== EXPECTED_LOG_TOKEN) {
throw new SenderError('Invalid log token');
}
for (const row of ctx.db.mcpCallLog.iter()) {
if (row.correlationId === args.correlationId) {
ctx.db.mcpCallLog.delete(row);
Expand Down
23 changes: 10 additions & 13 deletions apps/internal-tool/src/app/app-client.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { AddManualQa } from "../components/AddManualQa";
import { KnowledgeBase } from "../components/KnowledgeBase";
import { Analytics } from "../components/Analytics";
import { useMcpCallLogs } from "../hooks/useSpacetimeDB";
import { mcpReviewApi } from "../lib/mcp-review-api";
import type { McpCallLogRow } from "../types";

type Tab = "calls" | "knowledge" | "analytics";
Expand All @@ -16,7 +17,7 @@ export default function App() {
const [selectedRow, setSelectedRow] = useState<McpCallLogRow | null>(null);
const [showAddQa, setShowAddQa] = useState(false);
const [tab, setTab] = useState<Tab>("calls");
const { rows, connectionState, connection } = useMcpCallLogs();
const { rows, connectionState } = useMcpCallLogs();

if (!user) {
return (
Expand Down Expand Up @@ -126,13 +127,12 @@ export default function App() {
<AddManualQa
onClose={() => setShowAddQa(false)}
onSave={(question, answer, publish) => {
if (!connection) return;
connection.reducers.addManualQa({
mcpReviewApi.addManual({
question,
answer,
publish,
reviewedBy,
}).catch(() => {});
}).catch(() => { /* errors are surfaced by UI state */ });
}}
/>
)}
Expand All @@ -154,14 +154,13 @@ export default function App() {
allRows={rows}
onClose={() => setSelectedRow(null)}
onSaveCorrection={(correlationId, correctedQuestion, correctedAnswer, publish) => {
if (!connection) return;
connection.reducers.updateHumanCorrection({
mcpReviewApi.updateCorrection({
correlationId,
correctedQuestion,
correctedAnswer,
publish,
reviewedBy,
}).catch(() => {});
}).catch(() => { /* errors are surfaced by UI state */ });
}}
/>
</aside>
Expand All @@ -174,20 +173,18 @@ export default function App() {
<KnowledgeBase
rows={rows}
onSave={(correlationId, question, answer, publish) => {
if (!connection) return;
connection.reducers.updateHumanCorrection({
mcpReviewApi.updateCorrection({
correlationId,
correctedQuestion: question,
correctedAnswer: answer,
publish,
reviewedBy,
}).catch(() => {});
}).catch(() => { /* errors are surfaced by UI state */ });
}}
onDelete={(correlationId) => {
if (!connection) return;
connection.reducers.deleteQaEntry({
mcpReviewApi.delete({
correlationId,
}).catch(() => {});
}).catch(() => { /* errors are surfaced by UI state */ });
}}
/>
</main>
Expand Down
Loading
Loading