c06005b353
## Summary Adds an in-dashboard AI agent: a chat panel, reachable from any environment page, that answers questions about your runs, errors, tasks, and analytics, diagnoses why a run failed, charts your data, reads your connected repo's source, and answers product and how-to questions. It is gated behind the `hasDashboardAgentAccess` feature flag (global or per-org, default off), so this PR ships disabled: the launcher is hidden unless the flag is enabled. ## Design The agent runs as a standalone `chat.agent` Trigger task in its own internal package, with no access to the webapp database, Prisma, or ClickHouse. It reads the user's data over the public API, acting as the user via a short-lived delegated user-actor token minted server-side each turn (never in the browser), building on [#3997](https://github.com/triggerdotdev/trigger.dev/pull/3997). The error and analytics tools use [#4005](https://github.com/triggerdotdev/trigger.dev/pull/4005) and the TRQL query API. The first turn of a new chat streams from a warm webapp route (Head Start) while the durable agent boots in parallel. Structured answers (a run-failure diagnosis card, a live chart) render through a small typed view catalog rather than arbitrary markup. A knowledge lane forwards product and how-to questions to the support assistant. Conversation history lives in a separate Drizzle-backed store on its own Postgres schema, kept as a display read-model so it can never corrupt the agent's model context. The SDK changes add an `apiClient` option to `chat.createStartSessionAction` and `chat.headStart`, and keep the Head Start tool-approval tail intact across a custom `prepareMessages` hook so prompt caching and Head Start compose.
65 lines
2.2 KiB
Bash
Executable File
65 lines
2.2 KiB
Bash
Executable File
#!/bin/sh
|
||
set -xe
|
||
|
||
if [ -n "$DATABASE_HOST" ]; then
|
||
scripts/wait-for-it.sh ${DATABASE_HOST} -- echo "database is up"
|
||
fi
|
||
|
||
if [ "$SKIP_POSTGRES_MIGRATIONS" != "1" ]; then
|
||
echo "Running prisma migrations"
|
||
pnpm --filter @trigger.dev/database db:migrate:deploy
|
||
echo "Prisma migrations done"
|
||
else
|
||
echo "SKIP_POSTGRES_MIGRATIONS=1, skipping Postgres migrations."
|
||
fi
|
||
|
||
if [ "$SKIP_DASHBOARD_AGENT_MIGRATIONS" != "1" ]; then
|
||
echo "Running dashboard agent migrations"
|
||
pnpm --filter @internal/dashboard-agent-db db:migrate:deploy
|
||
echo "Dashboard agent migrations done"
|
||
else
|
||
echo "SKIP_DASHBOARD_AGENT_MIGRATIONS=1, skipping dashboard agent migrations."
|
||
fi
|
||
|
||
if [ -n "$CLICKHOUSE_URL" ] && [ "$SKIP_CLICKHOUSE_MIGRATIONS" != "1" ]; then
|
||
# Run ClickHouse migrations
|
||
echo "Running ClickHouse migrations..."
|
||
export GOOSE_DRIVER=clickhouse
|
||
|
||
# Ensure secure=true is in the connection string
|
||
if echo "$CLICKHOUSE_URL" | grep -q "secure="; then
|
||
# secure parameter already exists, use as is
|
||
export GOOSE_DBSTRING="$CLICKHOUSE_URL"
|
||
elif echo "$CLICKHOUSE_URL" | grep -q "?"; then
|
||
# URL has query parameters, append secure=true
|
||
export GOOSE_DBSTRING="${CLICKHOUSE_URL}&secure=true"
|
||
else
|
||
# URL has no query parameters, add secure=true
|
||
export GOOSE_DBSTRING="${CLICKHOUSE_URL}?secure=true"
|
||
fi
|
||
|
||
export GOOSE_MIGRATION_DIR=/triggerdotdev/internal-packages/clickhouse/schema
|
||
/usr/local/bin/goose up
|
||
echo "ClickHouse migrations complete."
|
||
elif [ "$SKIP_CLICKHOUSE_MIGRATIONS" = "1" ]; then
|
||
echo "SKIP_CLICKHOUSE_MIGRATIONS=1, skipping ClickHouse migrations."
|
||
else
|
||
echo "CLICKHOUSE_URL not set, skipping ClickHouse migrations."
|
||
fi
|
||
|
||
# Copy over required prisma files
|
||
cp internal-packages/database/prisma/schema.prisma apps/webapp/prisma/
|
||
cp node_modules/@prisma/engines/*.node apps/webapp/prisma/
|
||
|
||
cd /triggerdotdev/apps/webapp
|
||
|
||
|
||
# Decide how much old-space memory Node should get.
|
||
# Use $NODE_MAX_OLD_SPACE_SIZE if it’s set; otherwise fall back to 8192.
|
||
MAX_OLD_SPACE_SIZE="${NODE_MAX_OLD_SPACE_SIZE:-8192}"
|
||
|
||
echo "Setting max old space size to ${MAX_OLD_SPACE_SIZE}"
|
||
|
||
NODE_PATH='/triggerdotdev/node_modules/.pnpm/node_modules' exec dumb-init node --max-old-space-size=${MAX_OLD_SPACE_SIZE} ./build/server.js
|
||
|