diff --git a/frontend/src/app/data-providers/cloud-data-provider.tsx b/frontend/src/app/data-providers/cloud-data-provider.tsx index fb5bf22933..0f554e3905 100644 --- a/frontend/src/app/data-providers/cloud-data-provider.tsx +++ b/frontend/src/app/data-providers/cloud-data-provider.tsx @@ -1,7 +1,7 @@ import type { Clerk } from "@clerk/clerk-js"; import { type Rivet, RivetClient } from "@rivet-gg/cloud"; -import { type FetchFunction, fetcher } from "@rivetkit/engine-api-full/core"; -import { infiniteQueryOptions, QueryKey, QueryOptions, queryOptions, UseQueryOptions } from "@tanstack/react-query"; +import { fetcher } from "@rivetkit/engine-api-full/core"; +import { infiniteQueryOptions, queryOptions } from "@tanstack/react-query"; import { cloudEnv } from "@/lib/env"; import { queryClient } from "@/queries/global"; import { RECORDS_PER_PAGE } from "./default-data-provider"; @@ -339,19 +339,21 @@ export const createNamespaceContext = ({ } & ReturnType & ReturnType & ReturnType) => { + const token = async () => { + const response = await queryClient.fetchQuery( + parent.accessTokenQueryOptions({ namespace }), + ); + + return response.token; + }; return { ...createEngineNamespaceContext({ ...parent, namespace: engineNamespaceName, namespaceId: engineNamespaceId, + engineToken: token, client: createEngineClient(cloudEnv().VITE_APP_API_URL, { - token: async () => { - const response = await queryClient.fetchQuery( - parent.accessTokenQueryOptions({ namespace }), - ); - - return response.token; - }, + token, }), }), namespaceQueryOptions() { diff --git a/frontend/src/app/data-providers/default-data-provider.tsx b/frontend/src/app/data-providers/default-data-provider.tsx index 2327925cb5..3e845c1a3f 100644 --- a/frontend/src/app/data-providers/default-data-provider.tsx +++ b/frontend/src/app/data-providers/default-data-provider.tsx @@ -311,6 +311,7 @@ const defaultContext = { destroyedAt: data.destroyedAt ? new Date(data.destroyedAt) : null, + runner: data.runner ?? undefined, sleepingAt: data.sleepingAt ? new Date(data.sleepingAt) : null, startedAt: data.startedAt ? new Date(data.startedAt) : null, }), diff --git a/frontend/src/app/data-providers/engine-data-provider.tsx b/frontend/src/app/data-providers/engine-data-provider.tsx index 76460c5478..e5893038db 100644 --- a/frontend/src/app/data-providers/engine-data-provider.tsx +++ b/frontend/src/app/data-providers/engine-data-provider.tsx @@ -49,9 +49,9 @@ export function createClient( environment: "", ...opts, fetcher: async (args) => { - Object.keys(args.headers).forEach((key) => { + Object.keys(args.headers || {}).forEach((key) => { if (key.toLowerCase().startsWith("x-fern-")) { - delete args.headers[key]; + delete args.headers?.[key]; } }); return await fetcher(args); @@ -60,13 +60,14 @@ export function createClient( } export const createGlobalContext = (opts: { - engineToken: (() => string) | string; + engineToken: (() => string) | string | (() => Promise); }) => { const client = createClient(engineEnv().VITE_APP_API_URL, { token: opts.engineToken, }); return { client, + ...opts, namespacesQueryOptions() { return infiniteQueryOptions({ queryKey: ["namespaces"] as any, @@ -138,6 +139,7 @@ export const createNamespaceContext = ({ const def = createDefaultGlobalContext(); const dataProvider = { ...def, + endpoint: engineEnv().VITE_APP_API_URL, features: { canCreateActors: true, canDeleteActors: true, @@ -190,7 +192,7 @@ export const createNamespaceContext = ({ return queryOptions({ ...def.regionQueryOptions(regionId), queryKey: [ - { namespace, namespaceId }, + { namespace }, ...def.regionQueryOptions(regionId).queryKey, ], queryFn: async ({ client }) => { @@ -426,6 +428,7 @@ export const createNamespaceContext = ({ return { engineNamespace: namespace, + engineToken: parent.engineToken, ...dataProvider, runnersQueryOptions() { return infiniteQueryOptions({ diff --git a/frontend/src/app/dialogs/connect-railway-frame.tsx b/frontend/src/app/dialogs/connect-railway-frame.tsx index 717aa9e3df..91291b6191 100644 --- a/frontend/src/app/dialogs/connect-railway-frame.tsx +++ b/frontend/src/app/dialogs/connect-railway-frame.tsx @@ -177,8 +177,8 @@ export function EnvVariablesStep() {

Value

- +
diff --git a/frontend/src/components/actors/actor-editable-state.tsx b/frontend/src/components/actors/actor-editable-state.tsx index 4a1e04bb36..f631915450 100644 --- a/frontend/src/components/actors/actor-editable-state.tsx +++ b/frontend/src/components/actors/actor-editable-state.tsx @@ -14,11 +14,7 @@ import { JsonCode, } from "@/components/code-mirror"; import { ActorStateChangeIndicator } from "./actor-state-change-indicator"; -import { - type ActorId, - useActorStatePatchMutation, - useActorStateStream, -} from "./queries"; +import { type ActorId, useActorStatePatchMutation } from "./queries"; const isValidJson = (json: string | null): json is string => { if (!json) return false; @@ -50,7 +46,7 @@ export function ActorEditableState({ const isValid = isValidJson(value) ? JSON.parse(value) : false; - const { mutate, isPending } = useActorStatePatchMutation(actorId); + const { mutateAsync, isPending } = useActorStatePatchMutation(actorId); // useActorStateStream(actorId); @@ -88,8 +84,8 @@ export function ActorEditableState({ variant="outline" isLoading={isPending} disabled={!isValid || !isEditing} - onClick={() => { - mutate(JSON.parse(value || "")); + onClick={async () => { + await mutateAsync(JSON.parse(value || "")); setIsEditing(false); setValue(null); }} diff --git a/frontend/src/components/actors/queries/actor.ts b/frontend/src/components/actors/queries/actor.ts index dc2f908714..dbfffcc476 100644 --- a/frontend/src/components/actors/queries/actor.ts +++ b/frontend/src/components/actors/queries/actor.ts @@ -1,8 +1,8 @@ import { fetchEventSource } from "@microsoft/fetch-event-source"; import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { applyPatch, compare } from "fast-json-patch"; +import { compare } from "fast-json-patch"; import { useCallback, useEffect, useMemo } from "react"; -import type { ActorId, Patch, RecordedRealtimeEvent } from "rivetkit/inspector"; +import type { ActorId, RecordedRealtimeEvent } from "rivetkit/inspector"; import { useActor } from "../actor-queries-context"; import { useAsyncMemo } from "@/components/hooks/use-async-memo"; @@ -59,12 +59,15 @@ export const useActorStatePatchMutation = ( if (!response.ok) { throw response; } - return await response.json(); + return (await response.json()) as { + state: unknown; + enabled: boolean; + }; }, onSuccess: (data) => { queryClient.setQueryData( queries.actorStateQueryOptions(actorId).queryKey, - () => ({ enabled: true, state: data }), + () => ({ enabled: true, state: data.state }), ); }, ...options, diff --git a/frontend/src/components/actors/worker/actor-repl.worker.ts b/frontend/src/components/actors/worker/actor-repl.worker.ts index fc37a0e106..28bbbed62b 100644 --- a/frontend/src/components/actors/worker/actor-repl.worker.ts +++ b/frontend/src/components/actors/worker/actor-repl.worker.ts @@ -1,11 +1,12 @@ import { fromJs } from "esast-util-from-js"; import { toJs } from "estree-util-to-js"; -import { createClient } from "rivetkit/client"; +import { createActorInspectorClient } from "rivetkit/inspector"; import { createHighlighterCore, createOnigurumaEngine, type HighlighterCore, } from "shiki"; +import { match } from "ts-pattern"; import { type InitMessage, MessageSchema, @@ -113,12 +114,7 @@ addEventListener("message", async (event) => { } if (data.type === "init") { - init = { - rpcs: data.rpcs ?? [], - endpoint: data.endpoint, - name: data.name, - id: data.id, - }; + init = structuredClone(data); respond({ type: "ready", }); @@ -181,9 +177,43 @@ function respond(msg: Response) { async function callAction({ name, args }: { name: string; args: unknown[] }) { if (!init) throw new Error("Actor not initialized"); - const client = createClient({ - endpoint: init.endpoint, - token: init.engineToken, - }).getForId(init.name, init.id); - return await client.action({ name, args }); + const url = new URL(`inspect`, init.endpoint).href; + + // we need to build this from scratch because we don't have access to + // createInspectorActorContext in the worker + // and we want to avoid bundling the entire RivetKit here, issues with @react-refresh + const client = createActorInspectorClient(url, { + headers: { + Authorization: init.inspectorToken + ? `Bearer ${init.inspectorToken}` + : "", + "x-rivet-target": "actor", + "x-rivet-actor": init.id, + "X-RivetKit-Query": JSON.stringify({ + getForId: { actorId: init.id }, + }), + + ...match(__APP_TYPE__) + .with("engine", () => { + return init?.engineToken + ? { "X-Rivet-Token": init.engineToken } + : {}; + }) + .otherwise(() => ({})), + }, + }); + + const response = await client.action.$post({ + json: { name, params: args }, + }); + + if (!response.ok) { + try { + return await response.json(); + } catch { + return await response.text(); + } + } + + return (await response.json()).result; } diff --git a/frontend/src/components/actors/worker/actor-worker-container.ts b/frontend/src/components/actors/worker/actor-worker-container.ts index dc987063df..3a1a580eb8 100644 --- a/frontend/src/components/actors/worker/actor-worker-container.ts +++ b/frontend/src/components/actors/worker/actor-worker-container.ts @@ -33,42 +33,38 @@ export type ContainerState = { commands: ReplCommand[]; }; +interface Meta { + actorId: string; + rpcs: string[]; + endpoint?: string; + name?: string; + engineToken?: string | (() => Promise) | (() => string); + runnerName?: string; + namespace?: string; + inspectorToken?: string; +} + export class ActorWorkerContainer { #state: ContainerState = { status: { type: "unknown" }, commands: [], }; - #meta: { - actorId: string; - rpcs: string[]; - endpoint?: string; - name?: string; - engineToken?: string; - } | null = null; + #meta: Meta | null = null; #listeners: (() => void)[] = []; #worker: Worker | undefined; // async init({ - actorId, signal, - rpcs = [], - endpoint, - name, - engineToken, + ...meta }: { - actorId: string; signal: AbortSignal; - rpcs?: string[]; - endpoint?: string; - name?: string; - engineToken?: string; - }) { + } & Meta) { this.terminate(); - this.#meta = { actorId, rpcs, endpoint, name, engineToken }; + this.#meta = { ...meta }; this.#state.status = { type: "pending" }; this.#update(); try { @@ -81,12 +77,12 @@ export class ActorWorkerContainer { // If we reached this point, the actor is supported // check if we still operate on the same actor - if (this.#meta.actorId !== actorId) { + if (this.#meta.actorId !== meta.actorId) { // if not, we don't need to do anything return null; } - const worker = new ActorWorker({ name: `actor-${actorId}` }); + const worker = new ActorWorker({ name: `actor-${meta.actorId}` }); signal.throwIfAborted(); // now worker needs to check if the actor is supported this.#setupWorker(worker); @@ -123,7 +119,7 @@ export class ActorWorkerContainer { this.#update(); } - #setupWorker(worker: Worker) { + async #setupWorker(worker: Worker) { this.#worker = worker; this.#worker.addEventListener("message", (event) => { try { @@ -145,7 +141,13 @@ export class ActorWorkerContainer { id: this.#meta?.actorId ?? "", endpoint: this.#meta?.endpoint ?? "", name: this.#meta?.name ?? "", - engineToken: this.#meta?.engineToken ?? "", + engineToken: + typeof this.#meta?.engineToken === "function" + ? await this.#meta?.engineToken() + : this.#meta?.engineToken, + namespace: this.#meta?.namespace, + runnerName: this.#meta?.runnerName, + inspectorToken: this.#meta?.inspectorToken, } satisfies InitMessage); } @@ -238,9 +240,9 @@ export class ActorWorkerContainer { } if (msg.type === "error") { + console.error("Actor Worker Error", msg); if (!msg.id) { this.#state.status = { type: "error", error: msg.data }; - console.error("Actor Worker Error", msg.data); this.#update(); return; } diff --git a/frontend/src/components/actors/worker/actor-worker-context.tsx b/frontend/src/components/actors/worker/actor-worker-context.tsx index a5a589f4da..ca426e9664 100644 --- a/frontend/src/components/actors/worker/actor-worker-context.tsx +++ b/frontend/src/components/actors/worker/actor-worker-context.tsx @@ -8,10 +8,11 @@ import { useState, useSyncExternalStore, } from "react"; -import { getConfig } from "@/components/lib/config"; +import { match } from "ts-pattern"; +import { useInspectorCredentials } from "@/app/credentials-context"; import { assertNonNullable, ls } from "../../lib/utils"; import { useActor } from "../actor-queries-context"; -import { useDataProvider } from "../data-provider"; +import { useDataProvider, useEngineCompatDataProvider } from "../data-provider"; import { ActorFeature, type ActorId } from "../queries"; import { ActorWorkerContainer } from "./actor-worker-container"; @@ -25,6 +26,23 @@ export const useActorWorker = () => { return value; }; +const useInspectorToken = (runnerName: string) => { + return match(__APP_TYPE__) + .with("inspector", () => { + return useInspectorCredentials().credentials?.token; + }) + .otherwise(() => { + const provider = useEngineCompatDataProvider(); + const { data } = useQuery( + provider.runnerByNameQueryOptions({ + runnerName, + }), + ); + + return (data?.metadata?.inspectorToken as string) || ""; + }); +}; + interface ActorWorkerContextProviderProps { actorId: ActorId; children: ReactNode; @@ -33,6 +51,9 @@ export const ActorWorkerContextProvider = ({ children, actorId, }: ActorWorkerContextProviderProps) => { + const dataProvider = useDataProvider(); + const engineToken = dataProvider.engineToken; + const namespace = dataProvider.engineNamespace; const { data: { features, @@ -41,8 +62,11 @@ export const ActorWorkerContextProvider = ({ destroyedAt, startedAt, sleepingAt, + runner, } = {}, - } = useQuery(useDataProvider().actorWorkerQueryOptions(actorId)); + } = useQuery(dataProvider.actorWorkerQueryOptions(actorId)); + const inspectorToken = useInspectorToken(runner || ""); + const enabled = (features?.includes(ActorFeature.Console) && !destroyedAt && @@ -69,8 +93,11 @@ export const ActorWorkerContextProvider = ({ endpoint, name, signal: ctrl.signal, - rpcs, - engineToken: ls.engineCredentials.get(getConfig().apiUrl) || "", + rpcs: rpcs ?? [], + engineToken, + runnerName: runner, + namespace, + inspectorToken, }); } @@ -78,7 +105,17 @@ export const ActorWorkerContextProvider = ({ ctrl.abort(); container.terminate(); }; - }, [actorId, enabled, rpcs, name, endpoint]); + }, [ + actorId, + enabled, + rpcs, + name, + endpoint, + engineToken, + inspectorToken, + namespace, + runner, + ]); return ( diff --git a/frontend/src/components/actors/worker/actor-worker-schema.ts b/frontend/src/components/actors/worker/actor-worker-schema.ts index aee77201f7..a90aee8ad0 100644 --- a/frontend/src/components/actors/worker/actor-worker-schema.ts +++ b/frontend/src/components/actors/worker/actor-worker-schema.ts @@ -10,10 +10,15 @@ const CodeMessageSchema = z.object({ const InitMessageSchema = z.object({ type: z.literal("init"), rpcs: z.array(z.string()).optional(), - engineToken: z.string().optional(), endpoint: z.string(), name: z.string(), id: z.string(), + + // engine related + engineToken: z.string().optional(), + namespace: z.string().optional(), + runnerName: z.string().optional(), + inspectorToken: z.string().optional(), }); export const MessageSchema = z.discriminatedUnion("type", [ diff --git a/frontend/src/lib/waitForClerk.ts b/frontend/src/lib/waitForClerk.ts index e0cc13ebb0..71c76dbfea 100644 --- a/frontend/src/lib/waitForClerk.ts +++ b/frontend/src/lib/waitForClerk.ts @@ -35,8 +35,10 @@ function identify(clerk: Clerk) { email: clerk.user?.primaryEmailAddress?.emailAddress, }); - Plain.setCustomerDetails({ - clerkId: clerk.user?.id, - email: clerk.user?.primaryEmailAddress?.emailAddress, - }); + if (typeof Plain !== "undefined") { + Plain?.setCustomerDetails({ + clerkId: clerk.user?.id, + email: clerk.user?.primaryEmailAddress?.emailAddress, + }); + } } diff --git a/frontend/src/lib/words.ts b/frontend/src/lib/words.ts index d3603af595..f1bb0e2009 100644 --- a/frontend/src/lib/words.ts +++ b/frontend/src/lib/words.ts @@ -1,1315 +1,151 @@ export const getRandomKey = () => { const prefix = adjectives[Math.floor(Math.random() * adjectives.length)]; - const suffix = heroes[Math.floor(Math.random() * heroes.length)]; + const suffix = tools[Math.floor(Math.random() * tools.length)]; const key = `${prefix}-${suffix}`; return key; }; +// synonym for descriptive words, qualities, or characteristics +// synonyms that are easy to visualize and commonly known +// synonyms that are short and simple words +// synonyms that fit well with a two-word combination with tools, machines, or mechanical parts export const adjectives = [ - "abandoned", - "aberrant", - "abnormal", - "absent", - "absurd", - "acoustic", - "adorable", - "amazing", - "ambiguous", - "ambitious", - "amused", - "amusing", - "ancient", - "aromatic", - "aspiring", - "awesome", - "bent", - "big", - "bitter", - "bizarre", - "black", - "blue", - "blushing", - "bored", - "boring", - "bouncy", - "brainy", - "brave", - "breezy", - "brief", "bright", - "broad", - "broken", - "brown", - "bumpy", - "burly", - "busy", - "calm", - "careful", - "careless", - "certain", - "charming", - "cheerful", - "chemical", - "chief", - "chilly", - "chubby", - "chunky", - "clammy", - "classy", + "sharp", + "strong", + "quick", + "smooth", + "solid", "clean", - "clear", - "clever", - "cloudy", - "closed", - "clumsy", - "cold", - "colorful", - "colossal", - "common", - "complete", - "complex", - "concerned", - "condemned", - "confused", - "conscious", - "cooing", - "cool", - "crazy", - "cuddly", - "cultured", - "curious", - "curly", - "curved", - "curvy", - "cute", - "cynical", - "daffy", - "daily", - "damp", - "dapper", - "dark", - "dashing", - "dazzling", - "dear", - "deep", - "demonic", - "dizzy", - "dry", - "dusty", - "eager", - "early", - "easy", - "elite", - "eminent", - "empty", - "equal", - "even", - "exotic", - "fair", - "faithful", - "familiar", - "famous", - "fancy", - "fantastic", - "far", "fast", - "fat", - "faulty", - "fearless", - "fine", - "first", - "fixed", - "flaky", - "flashy", - "flat", - "flawless", - "flimsy", - "flippant", - "flowery", - "fluffy", - "foamy", - "free", - "freezing", - "fresh", - "friendly", - "funny", - "furry", - "futuristic", - "fuzzy", - "giant", - "gifted", - "gigantic", - "glamorous", - "glorious", - "glossy", - "good", - "goofy", - "gorgeous", - "graceful", - "gray", - "great", - "greedy", - "green", - "grey", - "groovy", - "handy", - "happy", - "hard", - "harsh", "heavy", - "hesitant", - "high", - "hot", - "huge", - "icy", - "illegal", - "jazzy", - "jittery", - "keen", - "kind", - "known", - "lame", - "large", - "last", - "late", - "lazy", - "lean", - "left", - "legal", - "lethal", "light", - "little", - "lively", - "living", - "lonely", - "long", - "loose", - "loud", - "lovely", - "loving", - "low", - "lowly", - "lucky", - "lumpy", - "lush", - "luxuriant", - "lying", - "lyrical", - "magenta", - "magical", - "majestic", - "many", - "massive", - "married", - "marvelous", - "material", - "mature", - "mean", - "medical", - "melodic", - "melted", - "messy", - "mighty", - "military", - "milky", - "minor", - "misty", - "mixed", - "moaning", - "modern", - "motionless", - "mushy", - "mute", - "mysterious", - "naive", - "nappy", - "narrow", - "nasty", - "natural", - "neat", - "nebulous", - "needy", - "nervous", - "new", - "next", - "nice", - "nifty", - "noisy", - "normal", - "nostalgic", - "nosy", - "numerous", - "odd", - "old", - "omniscient", - "open", - "opposite", - "optimal", - "orange", - "ordinary", - "organic", - "outgoing", - "outstanding", - "oval", - "overconfident", - "overjoyed", - "overrated", - "pale", - "panoramic", - "parallel", - "parched", - "past", - "peaceful", - "perfect", - "perpetual", - "petite", - "pink", - "plain", - "polite", - "powerful", - "premium", - "pretty", - "previous", - "productive", - "public", - "purple", - "puzzling", - "quick", - "quiet", - "rainy", - "rapid", - "rare", - "real", - "red", - "redundant", - "reflective", - "regular", - "remarkable", - "rich", - "right", - "robust", - "romantic", - "round", - "sad", - "safe", - "salty", - "same", - "secret", - "serious", - "shallow", - "sharp", - "shiny", - "shocking", - "short", - "silent", - "silky", - "silly", - "simple", - "skinny", - "sleepy", - "slim", - "slimy", - "slippery", - "sloppy", - "slow", - "small", - "smart", - "smiling", - "smooth", + "tough", "soft", - "solid", - "sour", - "sparkling", - "special", - "spicy", - "spooky", - "spotty", - "square", - "stale", - "steady", - "steep", - "sticky", - "stiff", - "stormy", - "strange", - "striped", - "strong", - "sturdy", - "sudden", - "superb", - "supreme", - "sweet", - "swift", - "talented", - "tan", - "tearful", - "tense", - "thankful", + "hard", + "rough", + "fine", "thick", "thin", - "third", - "tidy", + "wide", + "narrow", + "long", + "short", + "deep", + "shallow", + "high", + "low", + "big", + "small", "tiny", - "tired", - "tiresome", - "tough", - "tranquil", - "tricky", - "true", - "typical", - "uneven", - "unique", - "unknown", - "unusual", - "useful", - "vengeful", - "violet", - "volatile", - "wakeful", - "wandering", + "huge", + "giant", + "mini", + "micro", + "bold", + "calm", + "cool", "warm", - "watery", - "wealthy", - "wet", - "white", - "whole", - "wide", - "wild", - "windy", - "wise", - "wonderful", - "wooden", - "woozy", - "workable", - "worried", - "worthless", - "yellow", - "yielding", + "hot", + "cold", + "fresh", + "old", + "new", "young", - "youthful", - "yummy", - "zippy", + "aged", + "sleek", + "glossy", + "matte", + "shiny", + "dull", + "rusty", + "polished", + "worn", + "sturdy", + "stable", + "flexible", + "rigid", + "loose", + "tight", + "dense", + "sparse", + "compact", + "wide", + "broad", + "slim", + "lean", ]; -export const heroes = [ - "aaron-stack", - "abomination", - "absorbing-man", - "adam-destine", - "adam-warlock", - "agent-brand", - "agent-zero", - "albert-cleary", - "alex-power", - "alex-wilder", - "alice", - "amazoness", - "amphibian", - "angel", - "anita-blake", - "annihilus", - "anthem", - "apocalypse", - "aqueduct", - "arachne", - "archangel", - "arclight", - "ares", - "argent", - "avengers", - "azazel", - "banshee", - "baron-strucker", - "baron-zemo", - "barracuda", - "bastion", - "beast", - "bedlam", - "ben-grimm", - "ben-parker", - "ben-urich", - "betty-brant", - "betty-ross", - "beyonder", - "big-bertha", - "bill-hollister", - "bishop", - "black-bird", - "black-bolt", - "black-cat", - "black-crow", - "black-knight", - "black-panther", - "black-queen", - "black-tarantula", - "black-tom", - "black-widow", - "blackheart", - "blacklash", - "blade", - "blazing-skull", - "blindfold", - "blink", - "blizzard", - "blob", - "blockbuster", - "blonde-phantom", - "bloodaxe", - "bloodscream", - "bloodstorm", - "bloodstrike", - "blue-blade", - "blue-marvel", - "blue-shield", - "blur", - "boom-boom", - "boomer", - "boomerang", - "bromley", - "brood", - "brother-voodoo", - "bruce-banner", - "bucky", - "bug", - "bulldozer", - "bullseye", - "bushwacker", - "butterfly", +// synonyms for tools, equipments (e.g., hammer, saw, wrench), machines (e.g., lathe, drill), mechanical parts (e.g., gear, lever), or implements used in various trades and crafts +// synonyms related to construction, crafting, or mechanical work] +// synonyms that are easy to visualize and commonly known +// synonyms that are short and simple words +// synonyms that fit well in a two-word combination with adjectives +// synonyms that are not brand names or trademarked terms +// synonyms that are appropriate for a wide audience +export const tools = [ + "hammer", + "saw", + "drill", + "wrench", + "screw", + "nail", + "bolt", + "gear", + "lever", + "pulley", + "wheel", + "axle", + "spring", + "valve", + "pipe", + "tube", + "wire", "cable", - "callisto", - "calypso", - "cammi", - "cannonball", - "captain-america", - "captain-britain", - "captain-cross", - "captain-flint", - "captain-marvel", - "captain-midlands", - "captain-stacy", - "captain-universe", - "cardiac", - "caretaker", - "cargill", - "carlie-cooper", - "carmella-unuscione", - "carnage", - "cassandra-nova", - "catseye", - "celestials", - "centennial", - "cerebro", - "cerise", - "chamber", - "chameleon", - "champions", - "changeling", - "charles-xavier", - "chat", - "chimera", - "christian-walker", - "chronomancer", - "clea", - "clint-barton", - "cloak", - "cobalt-man", - "colleen-wing", - "colonel-america", - "colossus", - "corsair", - "crusher-hogan", - "crystal", - "cyclops", - "dagger", - "daimon-hellstrom", - "dakota-north", - "daredevil", - "dark-beast", - "dark-phoenix", - "darkhawk", - "darkstar", - "darwin", - "dazzler", - "deadpool", - "deathbird", - "deathstrike", - "demogoblin", - "devos", - "dexter-bennett", - "diamondback", - "doctor-doom", - "doctor-faustus", - "doctor-octopus", - "doctor-spectrum", - "doctor-strange", - "domino", - "donald-blake", - "doomsday", - "doorman", - "dorian-gray", - "dormammu", - "dracula", - "dragon-lord", - "dragon-man", - "drax", - "dreadnoughts", - "dreaming-celestial", - "dust", - "earthquake", - "echo", - "eddie-brock", - "edwin-jarvis", - "ego", - "electro", - "elektra", - "emma-frost", - "enchantress", - "ender-wiggin", - "energizer", - "epoch", - "eternals", - "eternity", - "excalibur", - "exiles", - "exodus", - "expediter", - "ezekiel", - "ezekiel-stane", - "fabian-cortez", - "falcon", - "fallen-one", - "famine", - "fantastic-four", - "fat-cobra", - "felicia-hardy", - "fenris", - "firebird", - "firebrand", - "firedrake", - "firelord", - "firestar", - "fixer", - "flatman", + "chain", + "rope", + "hook", + "clamp", + "vise", + "plier", + "chisel", + "file", + "rasp", + "blade", + "knife", + "cutter", + "grinder", + "sander", + "brush", + "roller", + "mallet", + "anvil", "forge", - "forgotten-one", - "frank-castle", - "franklin-richards", - "franklin-storm", - "freak", - "frightful-four", - "frog-thor", - "gabe-jones", - "galactus", - "gambit", - "gamma-corps", - "gamora", - "gargoyle", - "garia", - "gateway", - "gauntlet", - "genesis", - "george-stacy", - "gertrude-yorkes", - "ghost-rider", - "giant-girl", - "giant-man", - "gideon", - "gladiator", - "glorian", - "goblin-queen", - "golden-guardian", - "goliath", - "gorgon", - "gorilla-man", - "grandmaster", - "gravity", - "green-goblin", - "gressill", - "grey-gargoyle", - "greymalkin", - "grim-reaper", - "groot", - "guardian", - "guardsmen", - "gunslinger", - "gwen-stacy", - "hairball", - "hammerhead", - "hannibal-king", - "hardball", - "harpoon", - "harrier", - "harry-osborn", - "havok", - "hawkeye", - "hedge-knight", - "hellcat", - "hellfire-club", - "hellion", - "hemingway", - "hercules", - "hex", - "hiroim", - "hitman", - "hobgoblin", - "hulk", - "human-cannonball", - "human-fly", - "human-robot", - "human-torch", - "husk", - "hydra", - "iceman", - "ikaris", - "imperial-guard", - "impossible-man", - "inertia", - "infant-terrible", - "inhumans", - "ink", - "invaders", - "invisible-woman", - "iron-fist", - "iron-lad", - "iron-man", - "iron-monger", - "iron-patriot", - "ironclad", - "jack-flag", - "jack-murdock", - "jack-power", - "jackal", - "jackpot", - "james-howlett", - "jamie-braddock", - "jane-foster", - "jasper-sitwell", - "jazinda", - "jean-grey", - "jetstream", - "jigsaw", - "jimmy-woo", - "jocasta", - "johnny-blaze", - "johnny-storm", - "joseph", - "joshua-kane", - "joystick", - "jubilee", - "juggernaut", - "junta", - "justice", - "justin-hammer", - "kabuki", - "kang", - "karen-page", - "karma", - "karnak", - "kat-farrell", - "kate-bishop", - "katie-power", - "ken-ellis", - "khan", - "kid-colt", - "killer-shrike", - "killmonger", - "killraven", - "king-bedlam", - "king-cobra", - "kingpin", - "kinsey-walden", - "kitty-pryde", - "klaw", - "komodo", - "korath", - "korg", - "korvac", - "kree", - "krista-starr", - "kronos", - "kulan-gath", - "kylun", - "la-nuit", - "lady-bullseye", - "lady-deathstrike", - "lady-mastermind", - "lady-ursula", - "lady-vermin", - "lake", - "landau", - "layla-miller", - "leader", - "leech", - "legion", - "lenny-balinger", - "leo", - "leopardon", - "leper-queen", - "lester", - "lethal-legion", - "lifeguard", - "lightspeed", - "lila-cheney", - "lilandra", - "lilith", - "lily-hollister", - "lionheart", - "living-lightning", - "living-mummy", - "living-tribunal", - "liz-osborn", - "lizard", - "loa", - "lockheed", - "lockjaw", - "logan", - "loki", - "loners", - "longshot", - "lord-hawal", - "lord-tyger", - "lorna-dane", - "luckman", - "lucky-pierre", - "luke-cage", - "luminals", - "lyja", - "ma-gnuci", - "mac-gargan", - "mach-iv", - "machine-man", - "mad-thinker", - "madame-hydra", - "madame-masque", - "madame-web", - "maddog", - "madelyne-pryor", - "madripoor", - "madrox", - "maelstrom", - "maestro", - "magdalene", - "maggott", - "magik", - "maginty", - "magma", - "magneto", - "magus", - "major-mapleleaf", - "makkari", - "malcolm-colcord", - "malice", - "mandarin", - "mandrill", - "mandroid", - "manta", - "mantis", - "marauders", - "maria-hill", - "mariko-yashida", - "marrow", - "marten-broadcloak", - "martin-li", - "marvel-apes", - "marvel-boy", - "marvel-zombies", - "marvex", - "masked-marvel", - "masque", - "master-chief", - "master-mold", - "mastermind", - "mathemanic", - "matthew-murdock", - "mattie-franklin", - "mauler", - "maverick", - "maximus", - "may-parker", - "medusa", - "meggan", - "meltdown", - "menace", - "mentallo", - "mentor", - "mephisto", - "mephistopheles", - "mercury", - "mesmero", - "metal-master", - "meteorite", - "micromacro", - "microbe", - "microchip", - "micromax", - "midnight", - "miek", - "mikhail-rasputin", - "millenium-guard", - "mimic", - "mindworm", - "miracleman", - "miss-america", - "mister-fear", - "mister-sinister", - "misty-knight", - "mockingbird", - "moira-mactaggert", - "mojo", - "mole-man", - "molecule-man", - "molly-hayes", - "molten-man", - "mongoose", - "mongu", - "monster-badoon", - "moon-knight", - "moondragon", - "moonstone", - "morbius", - "mordo", - "morg", - "morgan-stark", - "morlocks", - "morlun", - "morph", - "mother-askani", - "mulholland-black", - "multiple-man", - "mysterio", - "mystique", - "namor", - "namora", - "namorita", - "naoko", - "natasha-romanoff", - "nebula", - "nehzno", - "nekra", - "nemesis", - "network", - "newton-destine", - "next-avengers", - "nextwave", - "nick-fury", - "nico-minoru", - "nicolaos", - "night-nurse", - "night-thrasher", - "nightcrawler", - "nighthawk", - "nightmare", - "nightshade", - "nitro", - "nocturne", - "nomad", - "norman-osborn", - "norrin-radd", - "northstar", - "nova", - "nuke", - "obadiah-stane", - "odin", - "ogun", - "old-lace", - "omega-flight", - "omega-red", - "omega-sentinel", - "onslaught", - "oracle", - "orphan", - "otto-octavius", - "outlaw-kid", - "overlord", - "owl", - "ozymandias", - "paibok", - "paladin", - "pandemic", - "paper-doll", - "patch", - "patriot", - "payback", - "penance", - "pepper-potts", - "pestilence", - "pet-avengers", - "pete-wisdom", - "peter-parker", - "peter-quill", - "phalanx", - "phantom-reporter", - "phil-sheldon", - "photon", - "piledriver", - "pixie", - "plazm", - "polaris", - "post", - "power-man", - "power-pack", - "praxagora", - "preak", - "pretty-boy", - "pride", - "prima", - "princess-powerful", - "prism", - "prodigy", - "proemial-gods", - "professor-monster", - "proteus", - "proudstar", - "prowler", - "psylocke", - "psynapse", - "puck", - "puff-adder", - "puma", - "punisher", - "puppet-master", - "purifiers", - "purple-man", - "pyro", - "quasar", - "quasimodo", - "queen-noir", - "quentin-quire", - "quicksilver", - "rachel-grey", - "radioactive-man", - "rafael-vega", - "rage", - "raider", - "randall", - "randall-flagg", - "random", - "rattler", - "ravenous", - "rawhide-kid", - "raza", - "reaper", - "reavers", - "red-ghost", - "red-hulk", - "red-shift", - "red-skull", - "red-wolf", - "redwing", - "reptil", - "retro-girl", - "revanche", - "rhino", - "rhodey", - "richard-fisk", - "rick-jones", - "ricochet", - "rictor", - "riptide", - "risque", - "robbie-robertson", - "robin-chapel", - "rocket-raccoon", - "rocket-racer", - "rockslide", - "rogue", - "roland-deschain", - "romulus", - "ronan", - "roughhouse", - "roulette", - "roxanne-simpson", - "rumiko-fujikawa", - "runaways", - "sabra", - "sabretooth", - "sage", - "sally-floyd", - "salo", - "sandman", - "santa-claus", - "saracen", - "sasquatch", - "satana", - "sauron", - "scalphunter", - "scarecrow", - "scarlet-spider", - "scarlet-witch", - "scorpion", - "scourge", - "scrambler", - "scream", - "screwball", - "sebastian-shaw", - "secret-warriors", - "selene", - "senator-kelly", - "sentinel", - "sentinels", - "sentry", - "ser-duncan", - "serpent-society", - "sersi", - "shadow-king", - "shadowcat", - "shaman", - "shape", - "shard", - "sharon-carter", - "sharon-ventura", - "shatterstar", - "shen", - "sheva-callister", - "shinko-yamashiro", - "shinobi-shaw", - "shiva", - "shiver-man", - "shocker", - "shockwave", - "shooting-star", - "shotgun", - "shriek", - "silhouette", - "silk-fever", - "silver-centurion", - "silver-fox", - "silver-sable", - "silver-samurai", - "silver-surfer", - "silverclaw", - "silvermane", - "sinister-six", - "sir-ram", - "siren", - "sister-grimm", - "skaar", - "skin", - "skreet", - "skrulls", - "skullbuster", - "slapstick", - "slayback", - "sleeper", - "sleepwalker", - "slipstream", - "slyde", - "smasher", - "smiling-tiger", - "snowbird", - "solo", - "songbird", - "spacker-dave", - "spectrum", - "speed", - "speed-demon", - "speedball", - "spencer-smythe", - "sphinx", - "spiral", - "spirit", - "spitfire", - "spot", - "sprite", - "spyke", - "squadron-sinister", - "squadron-supreme", - "squirrel-girl", - "star-brand", - "starbolt", - "stardust", - "starfox", - "starhawk", - "starjammers", - "stark-industries", - "stature", - "steel-serpent", - "stellaris", - "stepford-cuckoos", - "stephen-strange", - "steve-rogers", - "stick", - "stingray", - "stone-men", - "storm", - "stranger", - "strong-guy", - "stryfe", - "sue-storm", - "sugar-man", - "sumo", - "sunfire", - "sunset-bain", - "sunspot", - "supernaut", - "supreme-intelligence", - "surge", - "susan-delgado", - "swarm", - "sway", - "switch", - "swordsman", - "synch", - "tag", - "talisman", - "talkback", - "talon", - "talos", - "tana-nile", - "tarantula", - "tarot", - "taskmaster", - "tattoo", - "ted-forrester", - "tempest", - "tenebrous", - "terrax", - "terror", - "texas-twister", - "thaddeus-ross", - "thanos", - "the-anarchist", - "the-call", - "the-captain", - "the-enforcers", - "the-executioner", - "the-fallen", - "the-fury", - "the-hand", - "the-hood", - "the-hunter", - "the-initiative", - "the-leader", - "the-liberteens", - "the-order", - "the-phantom", - "the-professor", - "the-renegades", - "the-santerians", - "the-spike", - "the-stranger", - "the-twelve", - "the-watchers", - "thena", - "thing", - "thor", - "thor-girl", - "thunderball", - "thunderbird", - "thunderbolt", - "thunderbolt-ross", - "thunderbolts", - "thundra", - "tiger-shark", - "tigra", - "timeslip", - "tinkerer", - "titania", - "titanium-man", - "toad", - "toad-men", - "tomas", - "tombstone", - "tomorrow-man", - "tony-stark", - "toro", - "toxin", - "trauma", - "triathlon", - "trish-tilby", - "triton", - "true-believers", - "turbo", - "tusk", - "tyger-tiger", - "typhoid-mary", - "tyrannus", - "ulik", - "ultimates", - "ultimatum", - "ultimo", - "ultragirl", - "ultron", - "umar", - "unicorn", - "union-jack", - "unus", - "valeria-richards", - "valkyrie", - "vampiro", - "vance-astro", - "vanisher", - "vapor", - "vargas", - "vector", - "veda", - "vengeance", - "venom", - "venus", - "vermin", - "vertigo", - "victor-mancha", - "vin-gonzales", - "vindicator", - "violations", - "viper", - "virginia-dare", - "vision", - "vivisector", - "vulcan", - "vulture", - "wallflower", - "wallop", - "wallow", - "war-machine", - "warbird", - "warbound", - "warhawk", - "warlock", - "warpath", - "warstar", - "wasp", - "weapon-omega", - "wendell-rand", - "wendell-vaughn", - "wendigo", - "whiplash", - "whirlwind", - "whistler", - "white-queen", - "white-tiger", - "whizzer", - "wiccan", - "wild-child", - "wild-pack", - "wildside", - "william-stryker", - "wilson-fisk", - "wind-dancer", - "winter-soldier", - "wither", - "wolf-cub", - "wolfpack", - "wolfsbane", - "wolverine", - "wonder-man", - "wong", - "wraith", - "wrecker", - "wrecking-crew", - "xavin", - "xorn", - "yellow-claw", - "yellowjacket", - "young-avengers", - "zaladane", - "zaran", - "zarda", - "zarek", - "zeigeist", - "zemo", - "zodiak", - "zombie", - "zuras", - "zzzax", + "lathe", + "press", + "jack", + "pump", + "motor", + "engine", + "piston", + "bearing", + "shaft", + "belt", + "pulley", + "socket", + "spanner", + "crowbar", + "sledge", + "pick", + "shovel", + "rake", + "hoe", + "trowel", + "level", + "ruler", + "gauge", + "meter", + "scale", + "balance", + "weight", ]; diff --git a/frontend/src/queries/global.ts b/frontend/src/queries/global.ts index bf9f46ebba..0951c02e8c 100644 --- a/frontend/src/queries/global.ts +++ b/frontend/src/queries/global.ts @@ -24,6 +24,7 @@ const queryCache = new QueryCache({ const mutationCache = new MutationCache({ onError(error, variables, context, mutation) { + console.error(error); if (mutation.meta?.hideErrorToast) { return; } diff --git a/frontend/src/routes/_context/_cloud/orgs.$organization/projects.$project/ns.$namespace/connect.tsx b/frontend/src/routes/_context/_cloud/orgs.$organization/projects.$project/ns.$namespace/connect.tsx index 1c02a2348a..54398ab366 100644 --- a/frontend/src/routes/_context/_cloud/orgs.$organization/projects.$project/ns.$namespace/connect.tsx +++ b/frontend/src/routes/_context/_cloud/orgs.$organization/projects.$project/ns.$namespace/connect.tsx @@ -347,14 +347,6 @@ export function RouteComponent() {
- -
- -
- - - -
); diff --git a/frontend/vendor/rivetkit-actor.tgz b/frontend/vendor/rivetkit-actor.tgz deleted file mode 100644 index 16c5093158..0000000000 --- a/frontend/vendor/rivetkit-actor.tgz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:349d1cc6f3fbd9209ec0cb3d430a2f3ad017a84c6cee84dfe336a9665ed723b8 -size 6136 diff --git a/frontend/vendor/rivetkit-core.tgz b/frontend/vendor/rivetkit-core.tgz deleted file mode 100644 index df5c018436..0000000000 --- a/frontend/vendor/rivetkit-core.tgz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6b8410a26ae53aae2784015cfa5e876e985472b6104913285d2f11149b334f6 -size 622279