Fix: deployment

This commit is contained in:
Harshith Mullapudi 2025-08-13 09:56:16 +05:30
parent 2fc3d20cf1
commit 1c38eca103
24 changed files with 524 additions and 553 deletions

View File

@ -1,4 +1,4 @@
VERSION=0.1.14
VERSION=0.1.15
# Nest run in docker, change host to database container name
DB_HOST=localhost

Binary file not shown.

View File

@ -6,9 +6,13 @@ export const useTriggerStream = (
token: string,
apiURL?: string,
) => {
// Need to fix this later
const adjustedApiURL = apiURL?.includes("trigger-webapp")
? "http://localhost:8030"
: apiURL;
const { error, streams, run } = useRealtimeRunWithStreams(runId, {
accessToken: token,
baseURL: apiURL ?? "https://trigger.heysol.ai", // Optional if you are using a self-hosted Trigger.dev instance
baseURL: adjustedApiURL ?? "https://trigger.heysol.ai", // Optional if you are using a self-hosted Trigger.dev instance
});
const isEnd = React.useMemo(() => {

View File

@ -1,2 +0,0 @@
export * from "./ingest";
export * from "./search";

View File

@ -1,77 +0,0 @@
import { PlusIcon, Loader2 } from "lucide-react";
import { Button } from "../ui";
import { Textarea } from "../ui/textarea";
import { useState } from "react";
import { z } from "zod";
import { EpisodeType } from "@core/types";
import { useFetcher } from "@remix-run/react";
export const IngestBodyRequest = z.object({
episodeBody: z.string(),
referenceTime: z.string(),
type: z.enum([EpisodeType.Conversation, EpisodeType.Text]), // Assuming these are the EpisodeType values
source: z.string(),
spaceId: z.string().optional(),
sessionId: z.string().optional(),
});
export const Ingest = () => {
const [text, setText] = useState("");
const fetcher = useFetcher();
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
fetcher.submit(
{
episodeBody: text,
type: "TEXT",
referenceTime: new Date().toISOString(),
source: "local",
},
{ method: "POST", action: "/home/dashboard" },
);
setText("");
};
const isLoading = fetcher.state === "submitting";
return (
<div className="flex flex-col">
<form onSubmit={handleSubmit} className="flex flex-col">
<input type="hidden" name="type" value="TEXT" />
<input
type="hidden"
name="referenceTime"
value={new Date().toISOString()}
/>
<input type="hidden" name="source" value="local" />
<Textarea
name="episodeBody"
value={text}
placeholder="Tell what you want to add"
onChange={(e) => setText(e.target.value)}
disabled={isLoading}
className="max-h-[400px]"
/>
<div className="mt-2 flex justify-end">
<Button
type="submit"
variant="secondary"
className="gap-1"
disabled={isLoading}
>
{isLoading ? (
<Loader2 size={16} className="animate-spin" />
) : (
<PlusIcon size={16} />
)}
{isLoading ? "Adding..." : "Add"}
</Button>
</div>
</form>
</div>
);
};

View File

@ -1,98 +0,0 @@
import { PlusIcon, SearchIcon, Loader2 } from "lucide-react";
import { Button } from "../ui";
import { Textarea } from "../ui/textarea";
import { useState } from "react";
import { z } from "zod";
import { EpisodeType } from "@core/types";
import { useFetcher } from "@remix-run/react";
export const Search = () => {
const [text, setText] = useState("");
const fetcher = useFetcher<undefined | Record<string, string[]>>();
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
fetcher.submit(
{ query: text },
{ method: "POST", action: "/home/dashboard" },
);
};
const searchResults = () => {
const data = fetcher.data as {
episodes?: string[];
facts?: string[];
};
if (
(!data.episodes || data.episodes.length === 0) &&
(!data.facts || data.facts.length === 0)
) {
return (
<div className="mt-4">
<p className="text-muted-foreground">No results found</p>
</div>
);
}
return (
<div className="mt-4">
{data.episodes && data.episodes.length > 0 && (
<div className="mb-4">
<h3 className="mb-2 text-lg font-semibold">Episodes</h3>
{data.episodes.map((episode, index) => (
<div key={index} className="bg-secondary mb-2 rounded-lg p-3">
{episode}
</div>
))}
</div>
)}
{data.facts && data.facts.length > 0 && (
<div>
<h3 className="mb-2 text-lg font-semibold">Facts</h3>
{data.facts.map((fact, index) => (
<div key={index} className="bg-secondary mb-2 rounded-lg p-3">
{fact}
</div>
))}
</div>
)}
</div>
);
};
const isLoading = fetcher.state === "submitting";
return (
<div className="flex flex-col">
<form onSubmit={handleSubmit} className="flex flex-col">
<Textarea
name="query"
value={text}
placeholder="What do you want to search"
onChange={(e) => setText(e.target.value)}
disabled={isLoading}
/>
<div className="mt-2 flex justify-end">
<Button
type="submit"
variant="secondary"
className="gap-1"
disabled={isLoading}
>
{isLoading ? (
<Loader2 size={16} className="animate-spin" />
) : (
<SearchIcon size={16} />
)}
{isLoading ? "Searching..." : "Search"}
</Button>
</div>
</form>
{fetcher?.data && searchResults()}
</div>
);
};

View File

@ -46,3 +46,5 @@ export const addToQueue = async (
return { id: handler.id, token: handler.publicAccessToken };
};
export { IngestBodyRequest };

View File

@ -7,7 +7,6 @@ import { useTypedLoaderData } from "remix-typedjson";
import { LoaderCircle } from "lucide-react";
import { PageHeader } from "~/components/common/page-header";
import { GraphVisualizationClient } from "~/components/graph/graph-client";
import { GraphNode } from "~/components/graph/type";
export async function loader({ request }: LoaderFunctionArgs) {
// Only return userId, not the heavy nodeLinks

View File

@ -205,24 +205,24 @@ export async function updateStatementsWithNewEntity(
const queries = [
// Update statements where old entity is the subject
`
MATCH (oldEntity:Entity {uuid: $oldEntityUUID})-[:SUBJECT]->(statement:Statement)
MATCH (oldEntity:Entity {uuid: $oldEntityUUID})-[r:SUBJECT]->(statement:Statement)
MATCH (newEntity:Entity {uuid: $newEntityUUID})
DELETE oldEntity-[:SUBJECT]->statement
CREATE newEntity-[:SUBJECT]->statement
DELETE r
CREATE (newEntity)-[:SUBJECT]->(statement)
`,
// Update statements where old entity is the predicate
`
MATCH (oldEntity:Entity {uuid: $oldEntityUUID})-[:PREDICATE]->(statement:Statement)
MATCH (oldEntity:Entity {uuid: $oldEntityUUID})-[r:PREDICATE]->(statement:Statement)
MATCH (newEntity:Entity {uuid: $newEntityUUID})
DELETE oldEntity-[:PREDICATE]->statement
CREATE newEntity-[:PREDICATE]->statement
DELETE r
CREATE (newEntity)-[:PREDICATE]->(statement)
`,
// Update statements where old entity is the object
`
MATCH (oldEntity:Entity {uuid: $oldEntityUUID})-[:OBJECT]->(statement:Statement)
MATCH (oldEntity:Entity {uuid: $oldEntityUUID})-[r:OBJECT]->(statement:Statement)
MATCH (newEntity:Entity {uuid: $newEntityUUID})
DELETE oldEntity-[:OBJECT]->statement
CREATE newEntity-[:OBJECT]->statement
DELETE r
CREATE (newEntity)-[:OBJECT]->(statement)
`,
];

View File

@ -484,8 +484,6 @@
}
.tiptap {
:first-child {
margin-top: 0;

View File

@ -37,8 +37,6 @@ export const chat = task({
await updateConversationStatus("running", payload.conversationId);
try {
let creditForChat = 0;
const { previousHistory, ...otherData } = payload.context;
const { agents = [] } = payload.context;

View File

@ -19,12 +19,14 @@ export const IngestBodyRequest = z.object({
const ingestionQueue = queue({
name: "ingestion-queue",
concurrencyLimit: 1,
});
// Register the Trigger.dev task
export const ingestTask = task({
id: "ingest-episode",
queue: ingestionQueue,
machine: "medium-2x",
run: async (payload: {
body: z.infer<typeof IngestBodyRequest>;
userId: string;

View File

@ -35,7 +35,7 @@ export async function initializeStartupServices() {
}
// If we get here, the service is still not available
console.error(
`TRIGGER_API_URL/login is not available after ${timeoutMs / 1000} seconds. Exiting process.`,
`${url}/login is not available after ${timeoutMs / 1000} seconds. Exiting process.`,
);
process.exit(1);
}
@ -123,23 +123,19 @@ export async function addEnvVariablesInTrigger() {
const DATABASE_URL = getDatabaseUrl(POSTGRES_DB);
// Helper to replace 'localhost' with 'host.docker.internal'
function replaceLocalhost(val: string | undefined): string | undefined {
if (typeof val !== "string") return val;
return val.replace(/localhost/g, "host.docker.internal");
}
// Map of key to value from env, replacing 'localhost' as needed
const envVars: Record<string, string> = {
API_BASE_URL: replaceLocalhost(APP_ORIGIN) ?? "",
DATABASE_URL: replaceLocalhost(DATABASE_URL) ?? "",
EMBEDDING_MODEL: replaceLocalhost(EMBEDDING_MODEL) ?? "",
MODEL: replaceLocalhost(MODEL) ?? "",
ENCRYPTION_KEY: replaceLocalhost(ENCRYPTION_KEY) ?? "",
NEO4J_PASSWORD: replaceLocalhost(NEO4J_PASSWORD) ?? "",
NEO4J_URI: replaceLocalhost(NEO4J_URI) ?? "",
NEO4J_USERNAME: replaceLocalhost(NEO4J_USERNAME) ?? "",
OPENAI_API_KEY: replaceLocalhost(OPENAI_API_KEY) ?? "",
API_BASE_URL: APP_ORIGIN.includes("localhost")
? APP_ORIGIN.replace("localhost", "core-app")
: APP_ORIGIN,
DATABASE_URL: DATABASE_URL ?? "",
EMBEDDING_MODEL: EMBEDDING_MODEL ?? "",
MODEL: MODEL ?? "",
ENCRYPTION_KEY: ENCRYPTION_KEY ?? "",
NEO4J_PASSWORD: NEO4J_PASSWORD ?? "",
NEO4J_URI: NEO4J_URI ?? "",
NEO4J_USERNAME: NEO4J_USERNAME ?? "",
OPENAI_API_KEY: OPENAI_API_KEY ?? "",
};
const envName = "prod";

View File

@ -73,8 +73,8 @@
"@tiptap/pm": "^2.11.9",
"@tiptap/react": "^2.11.9",
"@tiptap/starter-kit": "2.11.9",
"@trigger.dev/react-hooks": "^4.0.0-v4-beta.22",
"@trigger.dev/sdk": "^4.0.0-v4-beta.22",
"@trigger.dev/react-hooks": "4.0.0-v4-beta.22",
"@trigger.dev/sdk": "4.0.0-v4-beta.22",
"@types/react-calendar-heatmap": "^1.9.0",
"ai": "4.3.14",
"axios": "^1.10.0",
@ -140,7 +140,7 @@
"@tailwindcss/forms": "^0.5.10",
"@tailwindcss/typography": "^0.5.16",
"@tailwindcss/vite": "^4.1.7",
"@trigger.dev/build": "^4.0.0-v4-beta.22",
"@trigger.dev/build": "4.0.0-v4-beta.22",
"@types/compression": "^1.7.2",
"@types/d3": "^7.4.3",
"@types/express": "^4.17.13",
@ -177,4 +177,4 @@
"engines": {
"node": ">=20.0.0"
}
}
}

View File

@ -6,7 +6,7 @@ import {
import { prismaExtension } from "@trigger.dev/build/extensions/prisma";
export default defineConfig({
project: process.env.TRIGGER_PROJECT_ID as string,
project: process.env.PROJECT_ID as string,
runtime: "node",
logLevel: "log",
// The max compute seconds a task is allowed to run. If the task run exceeds this duration, it will be stopped.

121
hosting/docker/.env Normal file
View File

@ -0,0 +1,121 @@
VERSION=0.1.15
# Nest run in docker, change host to database container name
DB_HOST=postgres
DB_PORT=5432
# POSTGRES
POSTGRES_USER=docker
POSTGRES_PASSWORD=docker
POSTGRES_DB=core
DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_HOST}:${DB_PORT}/${POSTGRES_DB}?schema=core
# This sets the URL used for direct connections to the database and should only be needed in limited circumstances
# See: https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#fields:~:text=the%20shadow%20database.-,directUrl,-No
DIRECT_URL=${DATABASE_URL}
REMIX_APP_PORT=3033
APP_ENV=production
NODE_ENV=${APP_ENV}
CORE_APP_ORIGIN=http://localhost:3033
API_BASE_URL=${CORE_APP_ORIGIN}
CORE_LOGIN_ORIGIN=http://localhost:3033
SESSION_SECRET=2818143646516f6fffd707b36f334bbb
ENCRYPTION_KEY=f686147ab967943ebbe9ed3b496e465a
MAGIC_LINK_SECRET=27192e6432564f4788d55c15131bd5ac
########### Sign.in with google ############
AUTH_GOOGLE_CLIENT_ID=
AUTH_GOOGLE_CLIENT_SECRET=
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_TLS_DISABLED=true
ENABLE_EMAIL_LOGIN=true
NEO4J_URI=bolt://neo4j:7687
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD=27192e6432564f4788d55c15131bd5ac
OPENAI_API_KEY=
NEO4J_AUTH=neo4j/27192e6432564f4788d55c15131bd5ac
OLLAMA_URL=http://ollama:11434
EMBEDDING_MODEL=text-embedding-3-small
MODEL=gpt-4.1-2025-04-14
## Trigger ##
TRIGGER_PROJECT_ID=proj_mqwudvjcukvybqxyjkjv
TRIGGER_SECRET_KEY=tr_prod_72iziCY2yWA5SdGxRFii
# ------------------------------------------------------------
# Trigger.dev self-hosting environment variables
# - These are the default values for the self-hosting stack
# - You should change them to suit your needs, especially the secrets
# - See the docs for more information: https://trigger.dev/docs/self-hosting/overview
# Secrets
# - Do NOT use these defaults in production
# - Generate your own by running `openssl rand -hex 16` for each secret
MANAGED_WORKER_SECRET=447c29678f9eaf289e9c4b70d3dd8a7f
# Worker token
# - This is the token for the worker to connect to the webapp
# - When running the combined stack, this is set automatically during bootstrap
# - For the split setup, you will have to set this manually. The token is available in the webapp logs but will only be shown once.
# - See the docs for more information: https://trigger.dev/docs/self-hosting/docker
TRIGGER_WORKER_TOKEN=tr_wgt_jtRujkUnfK3RmNtUev049Clw7gaqwg77VMPGu7Iv
TRIGGER_TASKS_IMAGE=redplanethq/proj_core:latest
# Worker URLs
# - In split setups, uncomment and set to the public URL of your webapp
# TRIGGER_API_URL=https://trigger.example.com
# OTEL_EXPORTER_OTLP_ENDPOINT=https://trigger.example.com/otel
# Postgres
# - Do NOT use these defaults in production
# - Especially if you decide to expose the database to the internet
# POSTGRES_USER=postgres
TRIGGER_DB=trigger
TRIGGER_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_HOST}:${DB_PORT}/${TRIGGER_DB}?schema=public&sslmode=disable
TRIGGER_DIRECT_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_HOST}:${DB_PORT}/${TRIGGER_DB}?schema=public&sslmode=disable
ELECTRIC_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_HOST}/${TRIGGER_DB}
# Trigger image tag
# - This is the version of the webapp and worker images to use, they should be locked to a specific version in production
# - For example: TRIGGER_IMAGE_TAG=v4.0.0-v4-beta.21
TRIGGER_IMAGE_TAG=v4-beta
# Webapp
# - These should generally be set to the same value
# - In production, these should be set to the public URL of your webapp, e.g. https://trigger.example.com
APP_ORIGIN=http://localhost:8030
LOGIN_ORIGIN=http://localhost:8030
API_ORIGIN=http://trigger-webapp:3000
DEV_OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:8030/otel
# You may need to set this when testing locally or when using the combined setup
# API_ORIGIN=http://webapp:3000
# ClickHouse
# - Do NOT use these defaults in production
CLICKHOUSE_USER=default
CLICKHOUSE_PASSWORD=password
CLICKHOUSE_URL=http://default:password@clickhouse:8123?secure=false
RUN_REPLICATION_CLICKHOUSE_URL=http://default:password@clickhouse:8123
# Docker Registry
# - When testing locally, the default values should be fine
# - When deploying to production, you will have to change these, especially the password and URL
# - See the docs for more information: https://trigger.dev/docs/self-hosting/docker#registry-setup
DOCKER_REGISTRY_URL=docker.io
DOCKER_REGISTRY_USERNAME=
DOCKER_REGISTRY_PASSWORD=

View File

@ -1,57 +0,0 @@
VERSION=0.1.14
# Nest run in docker, change host to database container name
DB_HOST=postgres
DB_PORT=5432
# POSTGRES
POSTGRES_USER=docker
POSTGRES_PASSWORD=docker
POSTGRES_DB=core
LOGIN_ORIGIN=http://localhost:3033
DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_HOST}:${DB_PORT}/${POSTGRES_DB}?schema=core
# This sets the URL used for direct connections to the database and should only be needed in limited circumstances
# See: https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#fields:~:text=the%20shadow%20database.-,directUrl,-No
DIRECT_URL=${DATABASE_URL}
REMIX_APP_PORT=3033
APP_ENV=production
NODE_ENV=${APP_ENV}
APP_ORIGIN=http://localhost:3033
API_BASE_URL=${APP_ORIGIN}
SESSION_SECRET=2818143646516f6fffd707b36f334bbb
ENCRYPTION_KEY=f686147ab967943ebbe9ed3b496e465a
########### Sign.in with google ############
AUTH_GOOGLE_CLIENT_ID=
AUTH_GOOGLE_CLIENT_SECRET=
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_TLS_DISABLED=true
ENABLE_EMAIL_LOGIN=true
NEO4J_URI=bolt://neo4j:7687
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD=27192e6432564f4788d55c15131bd5ac
OPENAI_API_KEY=
MAGIC_LINK_SECRET=27192e6432564f4788d55c15131bd5ac
NEO4J_AUTH=neo4j/27192e6432564f4788d55c15131bd5ac
OLLAMA_URL=http://ollama:11434
EMBEDDING_MODEL=text-embedding-3-small
MODEL=gpt-4.1-2025-04-14
## Trigger ##
TRIGGER_PROJECT_ID=proj_core
TRIGGER_SECRET_KEY=tr_prod_1yvnRh3pA1M2E67GBY7m
TRIGGER_API_URL=http://trigger-webapp:3000

View File

@ -1,106 +0,0 @@
version: "3.8"
services:
core:
container_name: core-app
image: redplanethq/core:${VERSION}
environment:
- NODE_ENV=${NODE_ENV}
- DATABASE_URL=${DATABASE_URL}
- DIRECT_URL=${DIRECT_URL}
- SESSION_SECRET=${SESSION_SECRET}
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
- MAGIC_LINK_SECRET=${MAGIC_LINK_SECRET}
- LOGIN_ORIGIN=${LOGIN_ORIGIN}
- APP_ORIGIN=${APP_ORIGIN}
- REDIS_HOST=${REDIS_HOST}
- REDIS_PORT=${REDIS_PORT}
- REDIS_TLS_DISABLED=${REDIS_TLS_DISABLED}
- NEO4J_URI=${NEO4J_URI}
- NEO4J_USERNAME=${NEO4J_USERNAME}
- NEO4J_PASSWORD=${NEO4J_PASSWORD}
- OPENAI_API_KEY=${OPENAI_API_KEY}
- AUTH_GOOGLE_CLIENT_ID=${AUTH_GOOGLE_CLIENT_ID}
- AUTH_GOOGLE_CLIENT_SECRET=${AUTH_GOOGLE_CLIENT_SECRET}
- ENABLE_EMAIL_LOGIN=${ENABLE_EMAIL_LOGIN}
- OLLAMA_URL=${OLLAMA_URL}
- EMBEDDING_MODEL=${EMBEDDING_MODEL}
- MODEL=${MODEL}
- TRIGGER_PROJECT_ID=${TRIGGER_PROJECT_ID}
- TRIGGER_SECRET_KEY=${TRIGGER_SECRET_KEY}
- TRIGGER_API_URL=${TRIGGER_API_URL}
- POSTGRES_DB=${POSTGRES_DB}
ports:
- "3033:3000"
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
neo4j:
condition: service_healthy
networks:
- core
postgres:
container_name: core-postgres
image: tegonhq/tegon-postgres:0.1.0-alpha
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- core
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
redis:
container_name: core-redis
image: redis:7
ports:
- "6379:6379"
networks:
- core
neo4j:
container_name: core-neo4j
image: neo4j:5
environment:
- NEO4J_AUTH=${NEO4J_AUTH}
- NEO4J_dbms_security_procedures_unrestricted=gds.*,apoc.*
- NEO4J_dbms_security_procedures_allowlist=gds.*,apoc.*
- NEO4J_apoc_export_file_enabled=true # Enable file export
- NEO4J_apoc_import_file_enabled=true # Enable file import
- NEO4J_apoc_import_file_use_neo4j_config=true
- NEO4J_dbms_memory_heap_initial__size=1G
- NEO4J_dbms_memory_heap_max__size=2G
ports:
- "7474:7474"
- "7687:7687"
volumes:
- neo4j_data:/data
networks:
- core
healthcheck:
test: ["CMD-SHELL", "cypher-shell -u $NEO4J_USERNAME -p $NEO4J_PASSWORD 'RETURN 1'"]
interval: 10s
timeout: 5s
retries: 10
start_period: 20s
networks:
core:
name: core-network
driver: bridge
volumes:
postgres_data:
neo4j_data:

View File

@ -5,27 +5,107 @@ x-logging: &logging-config
max-file: ${LOGGING_MAX_FILES:-5}
compress: ${LOGGING_COMPRESS:-true}
version: "3.8"
services:
init:
container_name: trigger-init
image: redplanethq/init:${CORE_VERSION}
restart: "no" # prevent retries
core:
container_name: core-app
image: redplanethq/core:${VERSION}
environment:
- NODE_ENV=${NODE_ENV}
- DATABASE_URL=${DATABASE_URL}
- DIRECT_URL=${DIRECT_URL}
- SESSION_SECRET=${SESSION_SECRET}
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
- MAGIC_LINK_SECRET=${MAGIC_LINK_SECRET}
- LOGIN_ORIGIN=${CORE_LOGIN_ORIGIN}
- APP_ORIGIN=${CORE_APP_ORIGIN}
- REDIS_HOST=${REDIS_HOST}
- REDIS_PORT=${REDIS_PORT}
- REDIS_TLS_DISABLED=${REDIS_TLS_DISABLED}
- NEO4J_URI=${NEO4J_URI}
- NEO4J_USERNAME=${NEO4J_USERNAME}
- NEO4J_PASSWORD=${NEO4J_PASSWORD}
- OPENAI_API_KEY=${OPENAI_API_KEY}
- AUTH_GOOGLE_CLIENT_ID=${AUTH_GOOGLE_CLIENT_ID}
- AUTH_GOOGLE_CLIENT_SECRET=${AUTH_GOOGLE_CLIENT_SECRET}
- ENABLE_EMAIL_LOGIN=${ENABLE_EMAIL_LOGIN}
- OLLAMA_URL=${OLLAMA_URL}
- EMBEDDING_MODEL=${EMBEDDING_MODEL}
- MODEL=${MODEL}
- TRIGGER_PROJECT_ID=${TRIGGER_PROJECT_ID}
- TRIGGER_SECRET_KEY=${TRIGGER_SECRET_KEY}
- TRIGGER_API_URL=${API_ORIGIN}
- POSTGRES_DB=${POSTGRES_DB}
ports:
- "3033:3000"
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
neo4j:
condition: service_healthy
networks:
- core
postgres:
container_name: core-postgres
image: tegonhq/tegon-postgres:0.1.0-alpha
environment:
- VERSION=${CORE_VERSION}
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT}
- TRIGGER_DB=${TRIGGER_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- TRIGGER_TASKS_IMAGE=${TRIGGER_TASKS_IMAGE}
- NODE_ENV=production
- POSTGRES_DB=${POSTGRES_DB}
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- webapp
- core-network
- core
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
redis:
container_name: core-redis
image: redis:7
ports:
- "6379:6379"
networks:
- core
neo4j:
container_name: core-neo4j
image: neo4j:5
environment:
- NEO4J_AUTH=${NEO4J_AUTH}
- NEO4J_dbms_security_procedures_unrestricted=gds.*,apoc.*
- NEO4J_dbms_security_procedures_allowlist=gds.*,apoc.*
- NEO4J_apoc_export_file_enabled=true # Enable file export
- NEO4J_apoc_import_file_enabled=true # Enable file import
- NEO4J_apoc_import_file_use_neo4j_config=true
- NEO4J_dbms_memory_heap_initial__size=1G
- NEO4J_dbms_memory_heap_max__size=2G
ports:
- "7474:7474"
- "7687:7687"
volumes:
- neo4j_data:/data
networks:
- core
healthcheck:
test: ["CMD-SHELL", "cypher-shell -u $NEO4J_USERNAME -p $NEO4J_PASSWORD 'RETURN 1'"]
interval: 10s
timeout: 5s
retries: 10
start_period: 20s
webapp:
container_name: trigger-webapp
image: ghcr.io/triggerdotdev/trigger.dev:${TRIGGER_IMAGE_TAG:-v4-beta}
image: ghcr.io/triggerdotdev/trigger.dev@sha256:a19c438f348ac05c939f39ed455ed27b4f189f720b4c9810aef8e71fdc731211
restart: ${RESTART_POLICY:-unless-stopped}
logging: *logging-config
ports:
@ -35,17 +115,16 @@ services:
condition: service_started
init:
condition: service_started
networks:
- webapp
- supervisor
- core-network
- core
volumes:
- shared:/home/node/shared
# Only needed for bootstrap
user: root
# Only needed for bootstrap
command: sh -c "chown -R node:node /home/node/shared && exec ./scripts/entrypoint.sh"
command: sh -c "chown -R node:node /home/node/shared && sleep 5 && exec ./scripts/entrypoint.sh"
healthcheck:
test:
[
@ -63,8 +142,8 @@ services:
LOGIN_ORIGIN: ${LOGIN_ORIGIN:-http://localhost:8030}
API_ORIGIN: ${API_ORIGIN:-http://localhost:8030}
ELECTRIC_ORIGIN: http://electric:3000
DATABASE_URL: ${DATABASE_URL:-postgresql://postgres:postgres@postgres:5432/main?schema=public&sslmode=disable}
DIRECT_URL: ${DIRECT_URL:-postgresql://postgres:postgres@postgres:5432/main?schema=public&sslmode=disable}
DATABASE_URL: ${TRIGGER_DATABASE_URL:-postgresql://postgres:postgres@postgres:5432/main?schema=public&sslmode=disable}
DIRECT_URL: ${TRIGGER_DIRECT_URL:-postgresql://postgres:postgres@postgres:5432/main?schema=public&sslmode=disable}
SESSION_SECRET: ${SESSION_SECRET}
MAGIC_LINK_SECRET: ${MAGIC_LINK_SECRET}
ENCRYPTION_KEY: ${ENCRYPTION_KEY}
@ -109,7 +188,7 @@ services:
logging: *logging-config
networks:
- webapp
- core-network
- core
environment:
DATABASE_URL: ${ELECTRIC_DATABASE_URL:-postgresql://postgres:postgres@postgres:5432/main?schema=public&sslmode=disable}
ELECTRIC_INSECURE: true
@ -170,7 +249,7 @@ services:
- supervisor
- docker-proxy
- webapp
- core-network
- core
volumes:
- shared:/home/node/shared
# Only needed for bootstrap
@ -183,8 +262,8 @@ services:
# Use the bootstrap token created by the webapp
# TRIGGER_WORKER_TOKEN: file:///home/node/shared/worker_token
MANAGED_WORKER_SECRET: ${MANAGED_WORKER_SECRET}
TRIGGER_API_URL: ${TRIGGER_API_URL:-http://webapp:3000}
OTEL_EXPORTER_OTLP_ENDPOINT: ${OTEL_EXPORTER_OTLP_ENDPOINT:-http://webapp:3000/otel}
TRIGGER_API_URL: ${TRIGGER_API_URL:-http://trigger-webapp:3000}
OTEL_EXPORTER_OTLP_ENDPOINT: ${OTEL_EXPORTER_OTLP_ENDPOINT:-http://trigger-webapp:3000/otel}
TRIGGER_WORKLOAD_API_DOMAIN: supervisor
TRIGGER_WORKLOAD_API_PORT_EXTERNAL: 8020
# Optional settings
@ -192,7 +271,7 @@ services:
ENFORCE_MACHINE_PRESETS: 1
TRIGGER_DEQUEUE_INTERVAL_MS: 1000
DOCKER_HOST: tcp://docker-proxy:2375
DOCKER_RUNNER_NETWORKS: webapp,supervisor
DOCKER_RUNNER_NETWORKS: webapp,supervisor,core
DOCKER_REGISTRY_URL: ${DOCKER_REGISTRY_URL:-localhost:5000}
DOCKER_REGISTRY_USERNAME: ${DOCKER_REGISTRY_USERNAME:-}
DOCKER_REGISTRY_PASSWORD: ${DOCKER_REGISTRY_PASSWORD:-}
@ -210,6 +289,25 @@ services:
retries: 5
start_period: 10s
init:
container_name: trigger-init
image: redplanethq/init:${VERSION}
restart: "no" # prevent retries
environment:
- VERSION=${VERSION}
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT}
- TRIGGER_DB=${TRIGGER_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- TRIGGER_TASKS_IMAGE=${TRIGGER_TASKS_IMAGE}
- NODE_ENV=production
networks:
- webapp
- core
depends_on:
- postgres
docker-proxy:
container_name: trigger-docker-proxy
image: tecnativa/docker-socket-proxy:${DOCKER_PROXY_IMAGE_TAG:-latest}
@ -233,12 +331,10 @@ services:
retries: 5
start_period: 5s
volumes:
shared:
clickhouse:
minio:
networks:
core:
name: core
driver: bridge
docker-proxy:
name: docker-proxy
supervisor:
@ -246,5 +342,10 @@ networks:
webapp:
name: webapp
driver: bridge
core-network:
external: true
volumes:
postgres_data:
neo4j_data:
shared:
clickhouse:
minio:

View File

@ -1,139 +0,0 @@
# Trigger.dev self-hosting environment variables
# - These are the default values for the self-hosting stack
# - You should change them to suit your needs, especially the secrets
# - See the docs for more information: https://trigger.dev/docs/self-hosting/overview
# Secrets
# - Do NOT use these defaults in production
# - Generate your own by running `openssl rand -hex 16` for each secret
SESSION_SECRET=2818143646516f6fffd707b36f334bbb
MAGIC_LINK_SECRET=44da78b7bbb0dfe709cf38931d25dcdd
ENCRYPTION_KEY=f686147ab967943ebbe9ed3b496e465a
MANAGED_WORKER_SECRET=447c29678f9eaf289e9c4b70d3dd8a7f
# Worker token
# - This is the token for the worker to connect to the webapp
# - When running the combined stack, this is set automatically during bootstrap
# - For the split setup, you will have to set this manually. The token is available in the webapp logs but will only be shown once.
# - See the docs for more information: https://trigger.dev/docs/self-hosting/docker
TRIGGER_WORKER_TOKEN=tr_wgt_MwNm1OkMP7nZs5EaknV4LxayPfUKAieQrwh7k5Ln
TRIGGER_TASKS_IMAGE=redplanethq/proj_core:latest
# Worker URLs
# - In split setups, uncomment and set to the public URL of your webapp
# TRIGGER_API_URL=https://trigger.example.com
# OTEL_EXPORTER_OTLP_ENDPOINT=https://trigger.example.com/otel
# Postgres
# - Do NOT use these defaults in production
# - Especially if you decide to expose the database to the internet
# POSTGRES_USER=postgres
POSTGRES_USER=docker
POSTGRES_PASSWORD=docker
TRIGGER_DB=trigger
DB_HOST=postgres
DB_PORT=5432
DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_HOST}:${DB_PORT}/${TRIGGER_DB}?schema=public&sslmode=disable
DIRECT_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_HOST}:${DB_PORT}/${TRIGGER_DB}?schema=public&sslmode=disable
ELECTRIC_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${DB_HOST}/${TRIGGER_DB}
# Trigger image tag
# - This is the version of the webapp and worker images to use, they should be locked to a specific version in production
# - For example: TRIGGER_IMAGE_TAG=v4.0.0-v4-beta.21
TRIGGER_IMAGE_TAG=v4-beta
# Webapp
# - These should generally be set to the same value
# - In production, these should be set to the public URL of your webapp, e.g. https://trigger.example.com
APP_ORIGIN=http://localhost:8030
LOGIN_ORIGIN=http://localhost:8030
API_ORIGIN=http://localhost:8030
DEV_OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:8030/otel
# You may need to set this when testing locally or when using the combined setup
# API_ORIGIN=http://webapp:3000
# Webapp - memory management
# - This sets the maximum memory allocation for Node.js heap in MiB (e.g. "4096" for 4GB)
# - It should be set according to your total webapp machine's memory or any container limits you have set
# - Setting this too high or low WILL cause crashes, inefficient memory utilization and high CPU usage
# - You should allow for some memory overhead, we suggest at least 20%, for example:
# - 2GB machine: NODE_MAX_OLD_SPACE_SIZE=1600
# - 4GB machine: NODE_MAX_OLD_SPACE_SIZE=3200
# - 6GB machine: NODE_MAX_OLD_SPACE_SIZE=4800
# - 8GB machine: NODE_MAX_OLD_SPACE_SIZE=6400
# NODE_MAX_OLD_SPACE_SIZE=8192
# ClickHouse
# - Do NOT use these defaults in production
CLICKHOUSE_USER=default
CLICKHOUSE_PASSWORD=password
CLICKHOUSE_URL=http://default:password@clickhouse:8123?secure=false
RUN_REPLICATION_CLICKHOUSE_URL=http://default:password@clickhouse:8123
# Docker Registry
# - When testing locally, the default values should be fine
# - When deploying to production, you will have to change these, especially the password and URL
# - See the docs for more information: https://trigger.dev/docs/self-hosting/docker#registry-setup
DOCKER_REGISTRY_URL=registry-1.docker.io
DOCKER_REGISTRY_USERNAME=
DOCKER_REGISTRY_PASSWORD=
# Object store
# - You need to log into the Minio dashboard and create a bucket called "packets"
# - See the docs for more information: https://trigger.dev/docs/self-hosting/docker#object-storage
OBJECT_STORE_ACCESS_KEY_ID=admin
OBJECT_STORE_SECRET_ACCESS_KEY=very-safe-password
# You will have to uncomment and configure this for production
# OBJECT_STORE_BASE_URL=http://localhost:9000
# Credentials to access the Minio dashboard at http://localhost:9001
# - You should change these credentials and not use them for the `OBJECT_STORE_` env vars above
# - Instead, setup a non-root user with access the "packets" bucket
# MINIO_ROOT_USER=admin
# MINIO_ROOT_PASSWORD=very-safe-password
# Other image tags
# - These are the versions of the other images to use
# - You should lock these to a specific version in production
# POSTGRES_IMAGE_TAG=14
# REDIS_IMAGE_TAG=7
# ELECTRIC_IMAGE_TAG=1.0.13
# CLICKHOUSE_IMAGE_TAG=latest
# REGISTRY_IMAGE_TAG=2
# MINIO_IMAGE_TAG=latest
# DOCKER_PROXY_IMAGE_TAG=latest
# TRAEFIK_IMAGE_TAG=v3.4
# Publish IPs
# - These are the IPs to publish the services to
# - Setting to 127.0.0.1 makes the service only accessible locally
# - When deploying to production, you will have to change these, depending on your setup
# WEBAPP_PUBLISH_IP=0.0.0.0
# POSTGRES_PUBLISH_IP=127.0.0.1
# REDIS_PUBLISH_IP=127.0.0.1
# ELECTRIC_PUBLISH_IP=127.0.0.1
# CLICKHOUSE_PUBLISH_IP=127.0.0.1
# REGISTRY_PUBLISH_IP=127.0.0.1
# MINIO_PUBLISH_IP=127.0.0.1
# Restart policy
# - Applies to all services, adjust as needed
# RESTART_POLICY=unless-stopped
# Docker logging
# - See the official docs: https://docs.docker.com/engine/logging/configure/
# LOGGING_DRIVER=local
# LOGGING_MAX_SIZE=20m
# LOGGING_MAX_FILES=5
# LOGGING_COMPRESS=true
# Traefik
# - Reverse proxy settings only serve as an example and require further configuration
# - See the partial overrides in docker-compose.traefik.yml for more details
# TRAEFIK_ENTRYPOINT=websecure
# TRAEFIK_HTTP_PUBLISH_IP=0.0.0.0
# TRAEFIK_HTTPS_PUBLISH_IP=0.0.0.0
# TRAEFIK_DASHBOARD_PUBLISH_IP=127.0.0.1
CORE_VERSION=0.1.14

View File

@ -1,2 +0,0 @@
# preserve the .env symlink
!.env

View File

@ -1,7 +1,7 @@
{
"name": "core",
"private": true,
"version": "0.1.14",
"version": "0.1.15",
"workspaces": [
"apps/*",
"packages/*"

239
pnpm-lock.yaml generated
View File

@ -458,10 +458,10 @@ importers:
specifier: 2.11.9
version: 2.11.9
'@trigger.dev/react-hooks':
specifier: ^4.0.0-v4-beta.22
specifier: 4.0.0-v4-beta.22
version: 4.0.0-v4-beta.22(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@trigger.dev/sdk':
specifier: ^4.0.0-v4-beta.22
specifier: 4.0.0-v4-beta.22
version: 4.0.0-v4-beta.22(ai@4.3.14(react@18.3.1)(zod@3.23.8))(zod@3.23.8)
'@types/react-calendar-heatmap':
specifier: ^1.9.0
@ -654,7 +654,7 @@ importers:
specifier: ^4.1.7
version: 4.1.9(vite@6.3.5(@types/node@20.19.7)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(sass@1.89.2)(terser@5.42.0)(tsx@4.17.0)(yaml@2.8.0))
'@trigger.dev/build':
specifier: ^4.0.0-v4-beta.22
specifier: 4.0.0-v4-beta.22
version: 4.0.0-v4-beta.22(typescript@5.8.3)
'@types/compression':
specifier: ^1.7.2
@ -2432,6 +2432,10 @@ packages:
'@open-draft/deferred-promise@2.2.0':
resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==}
'@opentelemetry/api-logs@0.203.0':
resolution: {integrity: sha512-9B9RU0H7Ya1Dx/Rkyc4stuBZSGVQF27WigitInx2QQoj6KUpEFYPKoWjdFTunJYxmXmh17HeBvbMa1EhGyPmqQ==}
engines: {node: '>=8.0.0'}
'@opentelemetry/api-logs@0.52.1':
resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==}
engines: {node: '>=14'}
@ -2446,6 +2450,12 @@ packages:
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
'@opentelemetry/context-async-hooks@2.0.1':
resolution: {integrity: sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
'@opentelemetry/core@1.25.1':
resolution: {integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==}
engines: {node: '>=14'}
@ -2458,6 +2468,18 @@ packages:
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
'@opentelemetry/core@2.0.1':
resolution: {integrity: sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
'@opentelemetry/exporter-logs-otlp-http@0.203.0':
resolution: {integrity: sha512-s0hys1ljqlMTbXx2XiplmMJg9wG570Z5lH7wMvrZX6lcODI56sG4HL03jklF63tBeyNwK2RV1/ntXGo3HgG4Qw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
'@opentelemetry/exporter-logs-otlp-http@0.52.1':
resolution: {integrity: sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA==}
engines: {node: '>=14'}
@ -2470,6 +2492,12 @@ packages:
peerDependencies:
'@opentelemetry/api': ^1.0.0
'@opentelemetry/exporter-trace-otlp-http@0.203.0':
resolution: {integrity: sha512-ZDiaswNYo0yq/cy1bBLJFe691izEJ6IgNmkjm4C6kE9ub/OMQqDXORx2D2j8fzTBTxONyzusbaZlqtfmyqURPw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
'@opentelemetry/exporter-trace-otlp-http@0.52.1':
resolution: {integrity: sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==}
engines: {node: '>=14'}
@ -2494,12 +2522,24 @@ packages:
peerDependencies:
'@opentelemetry/api': ^1.0.0
'@opentelemetry/instrumentation@0.203.0':
resolution: {integrity: sha512-ke1qyM+3AK2zPuBPb6Hk/GCsc5ewbLvPNkEuELx/JmANeEp6ZjnZ+wypPAJSucTw0wvCGrUaibDSdcrGFoWxKQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
'@opentelemetry/instrumentation@0.52.1':
resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': ^1.3.0
'@opentelemetry/otlp-exporter-base@0.203.0':
resolution: {integrity: sha512-Wbxf7k+87KyvxFr5D7uOiSq/vHXWommvdnNE7vECO3tAhsA2GfOlpWINCMWUEPdHZ7tCXxw6Epp3vgx3jU7llQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
'@opentelemetry/otlp-exporter-base@0.52.1':
resolution: {integrity: sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==}
engines: {node: '>=14'}
@ -2512,6 +2552,12 @@ packages:
peerDependencies:
'@opentelemetry/api': ^1.0.0
'@opentelemetry/otlp-transformer@0.203.0':
resolution: {integrity: sha512-Y8I6GgoCna0qDQ2W6GCRtaF24SnvqvA8OfeTi7fqigD23u8Jpb4R5KFv/pRvrlGagcCLICMIyh9wiejp4TXu/A==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': ^1.3.0
'@opentelemetry/otlp-transformer@0.52.1':
resolution: {integrity: sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==}
engines: {node: '>=14'}
@ -2536,6 +2582,18 @@ packages:
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
'@opentelemetry/resources@2.0.1':
resolution: {integrity: sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.3.0 <1.10.0'
'@opentelemetry/sdk-logs@0.203.0':
resolution: {integrity: sha512-vM2+rPq0Vi3nYA5akQD2f3QwossDnTDLvKbea6u/A2NZ3XDkPxMfo/PNrDoXhDUD/0pPo2CdH5ce/thn9K0kLw==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.4.0 <1.10.0'
'@opentelemetry/sdk-logs@0.52.1':
resolution: {integrity: sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==}
engines: {node: '>=14'}
@ -2548,6 +2606,12 @@ packages:
peerDependencies:
'@opentelemetry/api': '>=1.3.0 <1.10.0'
'@opentelemetry/sdk-metrics@2.0.1':
resolution: {integrity: sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.9.0 <1.10.0'
'@opentelemetry/sdk-node@0.52.1':
resolution: {integrity: sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==}
engines: {node: '>=14'}
@ -2560,12 +2624,24 @@ packages:
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
'@opentelemetry/sdk-trace-base@2.0.1':
resolution: {integrity: sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.3.0 <1.10.0'
'@opentelemetry/sdk-trace-node@1.25.1':
resolution: {integrity: sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==}
engines: {node: '>=14'}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
'@opentelemetry/sdk-trace-node@2.0.1':
resolution: {integrity: sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA==}
engines: {node: ^18.19.0 || >=20.6.0}
peerDependencies:
'@opentelemetry/api': '>=1.0.0 <1.10.0'
'@opentelemetry/sdk-trace-web@1.25.1':
resolution: {integrity: sha512-SS6JaSkHngcBCNdWGthzcvaKGRnDw2AeP57HyTEileLToJ7WLMeV+064iRlVyoT4+e77MRp2T2dDSrmaUyxoNg==}
engines: {node: '>=14'}
@ -2580,6 +2656,10 @@ packages:
resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==}
engines: {node: '>=14'}
'@opentelemetry/semantic-conventions@1.36.0':
resolution: {integrity: sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ==}
engines: {node: '>=14'}
'@oslojs/asn1@1.0.0':
resolution: {integrity: sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==}
@ -4711,6 +4791,10 @@ packages:
resolution: {integrity: sha512-FVaVNsW3KQgYEWStr80Iu+1l4KMyHPVU4QbV55pLQp7d126jOuP+hXYp7LhnYVZtgcQLIZSC0VjJc/UYwr4D6g==}
engines: {node: '>=18.20.0'}
'@trigger.dev/core@4.0.0-v4-beta.27':
resolution: {integrity: sha512-PJzW07GbxeHKigZ0AiO4aAtDdb2r5iioI7P6TLTqp3XfsxLb1ezPNv3zt6dy1uvZsefGR/EO4y7X0VN1pJyLTA==}
engines: {node: '>=18.20.0'}
'@trigger.dev/react-hooks@4.0.0-v4-beta.22':
resolution: {integrity: sha512-hWBoxEkNSM+IcFsUlFEJBcMZGmpaYGPy5k/o+iK9QNLURiQsKEYGYoBzKlA7iP0cVPwhIV1eNlsPediNRQyTsA==}
engines: {node: '>=18.20.0'}
@ -8101,6 +8185,10 @@ packages:
lodash.defaults@4.2.0:
resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
lodash.get@4.4.2:
resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
deprecated: This package is deprecated. Use the optional chaining (?.) operator instead.
lodash.isarguments@3.1.0:
resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==}
@ -11400,6 +11488,9 @@ packages:
zod@3.23.8:
resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
zod@3.25.76:
resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==}
zustand@4.5.7:
resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==}
engines: {node: '>=12.7.0'}
@ -13085,6 +13176,10 @@ snapshots:
'@open-draft/deferred-promise@2.2.0': {}
'@opentelemetry/api-logs@0.203.0':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs@0.52.1':
dependencies:
'@opentelemetry/api': 1.9.0
@ -13095,6 +13190,10 @@ snapshots:
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@ -13105,6 +13204,20 @@ snapshots:
'@opentelemetry/api': 1.9.0
'@opentelemetry/semantic-conventions': 1.28.0
'@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/semantic-conventions': 1.36.0
'@opentelemetry/exporter-logs-otlp-http@0.203.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.203.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-logs-otlp-http@0.52.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@ -13124,6 +13237,15 @@ snapshots:
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-trace-otlp-http@0.203.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-trace-otlp-http@0.52.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@ -13160,6 +13282,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@opentelemetry/instrumentation@0.203.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.203.0
import-in-the-middle: 1.11.0
require-in-the-middle: 7.5.2(supports-color@10.0.0)
transitivePeerDependencies:
- supports-color
'@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)(supports-color@10.0.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@ -13172,6 +13303,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@opentelemetry/otlp-exporter-base@0.203.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-exporter-base@0.52.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@ -13186,6 +13323,17 @@ snapshots:
'@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0)
'@opentelemetry/otlp-transformer@0.203.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.203.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-metrics': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0)
protobufjs: 7.5.3
'@opentelemetry/otlp-transformer@0.52.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@ -13213,6 +13361,19 @@ snapshots:
'@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.25.1
'@opentelemetry/resources@2.0.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.36.0
'@opentelemetry/sdk-logs@0.203.0(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.203.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs@0.52.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@ -13227,6 +13388,12 @@ snapshots:
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
lodash.merge: 4.6.2
'@opentelemetry/sdk-metrics@2.0.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-node@0.52.1(@opentelemetry/api@1.9.0)(supports-color@10.0.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@ -13253,6 +13420,13 @@ snapshots:
'@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.25.1
'@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.36.0
'@opentelemetry/sdk-trace-node@1.25.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@ -13263,6 +13437,13 @@ snapshots:
'@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0)
semver: 7.7.2
'@opentelemetry/sdk-trace-node@2.0.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/context-async-hooks': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-web@1.25.1(@opentelemetry/api@1.9.0)':
dependencies:
'@opentelemetry/api': 1.9.0
@ -13274,6 +13455,8 @@ snapshots:
'@opentelemetry/semantic-conventions@1.28.0': {}
'@opentelemetry/semantic-conventions@1.36.0': {}
'@oslojs/asn1@1.0.0':
dependencies:
'@oslojs/binary': 1.0.0
@ -15601,9 +15784,49 @@ snapshots:
- supports-color
- utf-8-validate
'@trigger.dev/core@4.0.0-v4-beta.27':
dependencies:
'@bugsnag/cuid': 3.2.1
'@electric-sql/client': 1.0.0-beta.1
'@google-cloud/precise-date': 4.0.0
'@jsonhero/path': 1.0.21
'@opentelemetry/api': 1.9.0
'@opentelemetry/api-logs': 0.203.0
'@opentelemetry/core': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-logs-otlp-http': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/exporter-trace-otlp-http': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/instrumentation': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-logs': 0.203.0(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.36.0
dequal: 2.0.3
eventsource: 3.0.7
eventsource-parser: 3.0.3
execa: 8.0.1
humanize-duration: 3.33.0
jose: 5.10.0
lodash.get: 4.4.2
nanoid: 3.3.8
prom-client: 15.1.3
socket.io: 4.7.4
socket.io-client: 4.7.5
std-env: 3.9.0
superjson: 2.2.2
tinyexec: 0.3.2
uncrypto: 0.1.3
zod: 3.25.76
zod-error: 1.5.0
zod-validation-error: 1.5.0(zod@3.25.76)
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
'@trigger.dev/react-hooks@4.0.0-v4-beta.22(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@trigger.dev/core': 4.0.0-v4-beta.22
'@trigger.dev/core': 4.0.0-v4-beta.27
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
swr: 2.3.3(react@18.3.1)
@ -19615,6 +19838,8 @@ snapshots:
lodash.defaults@4.2.0: {}
lodash.get@4.4.2: {}
lodash.isarguments@3.1.0: {}
lodash.isplainobject@4.0.6: {}
@ -23662,8 +23887,14 @@ snapshots:
dependencies:
zod: 3.23.8
zod-validation-error@1.5.0(zod@3.25.76):
dependencies:
zod: 3.25.76
zod@3.23.8: {}
zod@3.25.76: {}
zustand@4.5.7(@types/react@18.2.69)(react@18.3.1):
dependencies:
use-sync-external-store: 1.5.0(react@18.3.1)