mirror of
https://github.com/eliasstepanik/core.git
synced 2026-01-10 23:48:26 +00:00
Feat: add mcp oauth2.1 support (#30)
* Feat: add mcp oauth2.1 support * Fix: integration mcp is not loading * Feat: add slack integration --------- Co-authored-by: Manoj K <saimanoj58@gmail.com>
This commit is contained in:
parent
740d1fee00
commit
b380f2657f
@ -1,4 +1,4 @@
|
||||
VERSION=0.1.10
|
||||
VERSION=0.1.11
|
||||
|
||||
|
||||
|
||||
|
||||
@ -5,6 +5,7 @@ import {
|
||||
useCallback,
|
||||
useImperativeHandle,
|
||||
forwardRef,
|
||||
useState,
|
||||
} from "react";
|
||||
import Sigma from "sigma";
|
||||
import GraphologyGraph from "graphology";
|
||||
@ -186,10 +187,6 @@ export const Graph = forwardRef<GraphRef, GraphProps>(
|
||||
}
|
||||
groups[key].relations.push(triplet.relation.value);
|
||||
groups[key].relationData.push(triplet.relation);
|
||||
groups[key].label = groups[key].relations
|
||||
.join(", ")
|
||||
.replace("HAS_", "")
|
||||
.toLowerCase();
|
||||
|
||||
return groups;
|
||||
},
|
||||
@ -216,7 +213,7 @@ export const Graph = forwardRef<GraphRef, GraphProps>(
|
||||
});
|
||||
graph.forEachEdge((edge) => {
|
||||
graph.setEdgeAttribute(edge, "highlighted", false);
|
||||
graph.setEdgeAttribute(edge, "color", theme.link.stroke);
|
||||
graph.setEdgeAttribute(edge, "color", "#0000001A");
|
||||
});
|
||||
selectedNodeRef.current = null;
|
||||
selectedEdgeRef.current = null;
|
||||
@ -271,6 +268,71 @@ export const Graph = forwardRef<GraphRef, GraphProps>(
|
||||
|
||||
useImperativeHandle(ref, () => graphRefMethods.current);
|
||||
|
||||
// Calculate optimal ForceAtlas2 parameters based on graph properties
|
||||
const calculateOptimalParameters = useCallback((graph: GraphologyGraph) => {
|
||||
const nodeCount = graph.order;
|
||||
const edgeCount = graph.size;
|
||||
|
||||
if (nodeCount === 0)
|
||||
return { scalingRatio: 30, gravity: 5, iterations: 600 };
|
||||
|
||||
// Calculate graph density (0 to 1)
|
||||
const maxPossibleEdges = (nodeCount * (nodeCount - 1)) / 2;
|
||||
const density = maxPossibleEdges > 0 ? edgeCount / maxPossibleEdges : 0;
|
||||
|
||||
// Calculate optimal scaling ratio based on node count
|
||||
// More nodes = need more space to prevent overcrowding
|
||||
let scalingRatio: number;
|
||||
if (nodeCount < 10) {
|
||||
scalingRatio = 15; // Tight for small graphs
|
||||
} else if (nodeCount < 50) {
|
||||
scalingRatio = 20 + (nodeCount - 10) * 0.5; // Gradual increase
|
||||
} else if (nodeCount < 200) {
|
||||
scalingRatio = 40 + (nodeCount - 50) * 0.2; // Slower increase
|
||||
} else {
|
||||
scalingRatio = Math.min(80, 70 + (nodeCount - 200) * 0.05); // Cap at 80
|
||||
}
|
||||
|
||||
// Calculate optimal gravity based on density and node count
|
||||
let gravity: number;
|
||||
if (density > 0.3) {
|
||||
// Dense graphs need less gravity to prevent overcrowding
|
||||
gravity = 1 + density * 2;
|
||||
} else if (density > 0.1) {
|
||||
// Medium density graphs
|
||||
gravity = 3 + density * 5;
|
||||
} else {
|
||||
// Sparse graphs need more gravity to keep components together
|
||||
gravity = Math.min(8, 5 + (1 - density) * 3);
|
||||
}
|
||||
|
||||
// Adjust gravity based on node count
|
||||
if (nodeCount < 20) {
|
||||
gravity *= 1.5; // Smaller graphs benefit from stronger gravity
|
||||
} else if (nodeCount > 100) {
|
||||
gravity *= 0.8; // Larger graphs need gentler gravity
|
||||
}
|
||||
|
||||
// Calculate iterations based on complexity
|
||||
const complexity = nodeCount + edgeCount;
|
||||
let iterations: number;
|
||||
if (complexity < 50) {
|
||||
iterations = 400;
|
||||
} else if (complexity < 200) {
|
||||
iterations = 600;
|
||||
} else if (complexity < 500) {
|
||||
iterations = 800;
|
||||
} else {
|
||||
iterations = Math.min(1200, 1000 + complexity * 0.2);
|
||||
}
|
||||
|
||||
return {
|
||||
scalingRatio: Math.round(scalingRatio * 10) / 10,
|
||||
gravity: Math.round(gravity * 10) / 10,
|
||||
iterations: Math.round(iterations),
|
||||
};
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (isInitializedRef.current || !containerRef.current) return;
|
||||
isInitializedRef.current = true;
|
||||
@ -303,25 +365,28 @@ export const Graph = forwardRef<GraphRef, GraphProps>(
|
||||
// });
|
||||
// layout.start();
|
||||
|
||||
// Calculate optimal parameters for this graph
|
||||
const optimalParams = calculateOptimalParameters(graph);
|
||||
|
||||
const settings = forceAtlas2.inferSettings(graph);
|
||||
forceAtlas2.assign(graph, {
|
||||
iterations: 600,
|
||||
iterations: optimalParams.iterations,
|
||||
settings: {
|
||||
...settings,
|
||||
barnesHutOptimize: true,
|
||||
strongGravityMode: false,
|
||||
gravity: 1,
|
||||
scalingRatio: 10,
|
||||
slowDown: 5,
|
||||
strongGravityMode: true,
|
||||
gravity: optimalParams.gravity,
|
||||
scalingRatio: optimalParams.scalingRatio,
|
||||
slowDown: 3,
|
||||
},
|
||||
});
|
||||
|
||||
noverlap.assign(graph, {
|
||||
maxIterations: 150,
|
||||
maxIterations: 200,
|
||||
settings: {
|
||||
margin: 5,
|
||||
expansion: 1.1,
|
||||
gridSize: 20,
|
||||
margin: 10,
|
||||
expansion: 1.5,
|
||||
gridSize: 30,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,12 +1,14 @@
|
||||
import React, { useCallback, useState } from "react";
|
||||
import { useFetcher } from "@remix-run/react";
|
||||
import { Button } from "~/components/ui/button";
|
||||
import { Check } from "lucide-react";
|
||||
import { Check, Copy } from "lucide-react";
|
||||
import { Input } from "../ui/input";
|
||||
|
||||
interface MCPAuthSectionProps {
|
||||
integration: {
|
||||
id: string;
|
||||
name: string;
|
||||
slug: string;
|
||||
};
|
||||
activeAccount?: {
|
||||
id: string;
|
||||
@ -17,6 +19,49 @@ interface MCPAuthSectionProps {
|
||||
hasMCPAuth: boolean;
|
||||
}
|
||||
|
||||
interface MCPUrlBoxProps {
|
||||
mcpUrl: string;
|
||||
}
|
||||
|
||||
function MCPUrlBox({ mcpUrl }: MCPUrlBoxProps) {
|
||||
const [copied, setCopied] = useState(false);
|
||||
|
||||
const handleCopy = useCallback(() => {
|
||||
navigator.clipboard.writeText(mcpUrl).then(() => {
|
||||
setCopied(true);
|
||||
setTimeout(() => setCopied(false), 2000);
|
||||
});
|
||||
}, [mcpUrl]);
|
||||
|
||||
return (
|
||||
<div className="mb-3 flex items-center gap-2">
|
||||
<Input
|
||||
type="text"
|
||||
value={mcpUrl}
|
||||
readOnly
|
||||
className="w-full rounded px-2 py-1 font-mono text-sm"
|
||||
style={{ maxWidth: 400 }}
|
||||
onFocus={(e) => e.target.select()}
|
||||
/>
|
||||
<Button
|
||||
type="button"
|
||||
variant={copied ? "secondary" : "ghost"}
|
||||
onClick={handleCopy}
|
||||
aria-label={copied ? "Copied" : "Copy MCP URL"}
|
||||
disabled={copied}
|
||||
>
|
||||
{copied ? (
|
||||
<span className="flex items-center gap-1">
|
||||
<Check size={16} /> Copied
|
||||
</span>
|
||||
) : (
|
||||
<Copy size={16} />
|
||||
)}
|
||||
</Button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export function MCPAuthSection({
|
||||
integration,
|
||||
activeAccount,
|
||||
@ -26,7 +71,10 @@ export function MCPAuthSection({
|
||||
const mcpFetcher = useFetcher<{ redirectURL: string }>();
|
||||
const disconnectMcpFetcher = useFetcher();
|
||||
|
||||
const isMCPConnected = activeAccount?.integrationConfiguration?.mcp;
|
||||
const isMCPConnected = !!activeAccount?.integrationConfiguration?.mcp;
|
||||
const isConnected = !!activeAccount;
|
||||
|
||||
const mcpUrl = `https://core.heysol.ai/api/v1/mcp/${integration.slug}`;
|
||||
|
||||
const handleMCPConnect = useCallback(() => {
|
||||
setIsMCPConnecting(true);
|
||||
@ -43,7 +91,7 @@ export function MCPAuthSection({
|
||||
encType: "application/json",
|
||||
},
|
||||
);
|
||||
}, [integration.id, mcpFetcher]);
|
||||
}, [integration.id, mcpFetcher, activeAccount?.id]);
|
||||
|
||||
const handleMCPDisconnect = useCallback(() => {
|
||||
if (!activeAccount?.id) return;
|
||||
@ -77,57 +125,78 @@ export function MCPAuthSection({
|
||||
}
|
||||
}, [disconnectMcpFetcher.state, disconnectMcpFetcher.data]);
|
||||
|
||||
if (!hasMCPAuth || !activeAccount) return null;
|
||||
// Show nothing if not connected at all
|
||||
if (!isConnected) return null;
|
||||
|
||||
// Show MCP box if:
|
||||
// - hasMCPAuth is true (always show MCP section)
|
||||
// - OR hasMCPAuth is false but integration is connected (show MCP URL box only)
|
||||
return (
|
||||
<div className="mt-6 space-y-2">
|
||||
<h3 className="text-lg font-medium">MCP Authentication</h3>
|
||||
|
||||
{isMCPConnected ? (
|
||||
<div className="bg-background-3 rounded-lg p-4">
|
||||
<div className="text-sm">
|
||||
<p className="inline-flex items-center gap-2 font-medium">
|
||||
<Check size={16} /> MCP Connected
|
||||
</p>
|
||||
<p className="text-muted-foreground mb-3">
|
||||
MCP (Model Context Protocol) authentication is active
|
||||
{hasMCPAuth ? (
|
||||
isMCPConnected ? (
|
||||
<div className="bg-background-3 rounded-lg p-4">
|
||||
<div className="text-sm">
|
||||
<p className="inline-flex items-center gap-2 font-medium">
|
||||
<Check size={16} /> MCP Connected
|
||||
</p>
|
||||
<p className="text-muted-foreground mb-3">
|
||||
MCP (Model Context Protocol) authentication is active
|
||||
</p>
|
||||
<MCPUrlBox mcpUrl={mcpUrl} />
|
||||
<div className="flex w-full justify-end">
|
||||
<Button
|
||||
variant="destructive"
|
||||
disabled={disconnectMcpFetcher.state === "submitting"}
|
||||
onClick={handleMCPDisconnect}
|
||||
>
|
||||
{disconnectMcpFetcher.state === "submitting"
|
||||
? "Disconnecting..."
|
||||
: "Disconnect"}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<div className="bg-background-3 rounded-lg p-4">
|
||||
<h4 className="text-md mb-1 font-medium">
|
||||
MCP (Model Context Protocol) Authentication
|
||||
</h4>
|
||||
<p className="text-muted-foreground mb-3 text-sm">
|
||||
This integration requires MCP (Model Context Protocol)
|
||||
authentication. Please provide the required MCP credentials in
|
||||
addition to any other authentication method.
|
||||
</p>
|
||||
|
||||
<div className="flex w-full justify-end">
|
||||
<Button
|
||||
variant="destructive"
|
||||
disabled={disconnectMcpFetcher.state === "submitting"}
|
||||
onClick={handleMCPDisconnect}
|
||||
variant="secondary"
|
||||
disabled={isMCPConnecting || mcpFetcher.state === "submitting"}
|
||||
onClick={handleMCPConnect}
|
||||
>
|
||||
{disconnectMcpFetcher.state === "submitting"
|
||||
? "Disconnecting..."
|
||||
: "Disconnect"}
|
||||
{isMCPConnecting || mcpFetcher.state === "submitting"
|
||||
? "Connecting..."
|
||||
: `Connect for MCP`}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
) : activeAccount ? (
|
||||
)
|
||||
) : (
|
||||
// hasMCPAuth is false, but integration is connected: show just the MCPUrlBox
|
||||
<div className="bg-background-3 rounded-lg p-4">
|
||||
<h4 className="text-md mb-1 font-medium">
|
||||
MCP (Model Context Protocol) Authentication
|
||||
</h4>
|
||||
<p className="text-muted-foreground mb-3 text-sm">
|
||||
This integration requires MCP (Model Context Protocol)
|
||||
authentication. Please provide the required MCP credentials in
|
||||
addition to any other authentication method.
|
||||
</p>
|
||||
<div className="flex w-full justify-end">
|
||||
<Button
|
||||
variant="secondary"
|
||||
disabled={isMCPConnecting || mcpFetcher.state === "submitting"}
|
||||
onClick={handleMCPConnect}
|
||||
>
|
||||
{isMCPConnecting || mcpFetcher.state === "submitting"
|
||||
? "Connecting..."
|
||||
: `Connect for MCP`}
|
||||
</Button>
|
||||
<div className="text-sm">
|
||||
<p className="inline-flex items-center gap-2 font-medium">
|
||||
<Check size={16} /> Integration Connected
|
||||
</p>
|
||||
<p className="text-muted-foreground mb-3">
|
||||
You can use the MCP endpoint for this integration:
|
||||
</p>
|
||||
<MCPUrlBox mcpUrl={mcpUrl} />
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@ -14,7 +14,7 @@ export function Section({
|
||||
children,
|
||||
}: SectionProps) {
|
||||
return (
|
||||
<div className="flex h-full gap-6">
|
||||
<div className="flex h-full w-full gap-6">
|
||||
<div className="flex w-[400px] shrink-0 flex-col">
|
||||
{icon && <>{icon}</>}
|
||||
<h3 className="text-lg"> {title} </h3>
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
<svg width="282" height="282" viewBox="0 0 282 282" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M80.0827 34.974C92.7457 3.8081 120.792 17.7546 134.476 29.5676C135.325 30.301 135.792 31.3761 135.792 32.4985V250.806C135.792 251.98 135.258 253.117 134.349 253.858C103.339 279.155 85.2835 259.158 80.0827 245.771C44.9187 241.11 43.965 209.932 47.8837 194.925C15.173 187.722 17.5591 152.731 22.841 136.135C9.34813 107.747 33.9141 90.4097 47.8837 85.2899C40.524 50.5456 66.2831 37.2692 80.0827 34.974Z" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="95.4357" y2="-2.5" transform="matrix(0.591888 0.80602 -0.783494 0.6214 77.3574 37.2551)" stroke="#C15E50" stroke-width="5"/>
|
||||
<path d="M49.1309 84.7972L136.212 176.505" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="90.8224" y2="-2.5" transform="matrix(0.814972 0.5795 -0.549892 0.835235 32.5566 143.53)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="146.141" y2="-2.5" transform="matrix(0.686415 -0.72721 0.700262 0.713886 35.4785 139.482)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="77.4689" y2="-2.5" transform="matrix(0.528012 -0.849237 0.830187 0.557485 49.1133 196.162)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="111.328" y2="-2.5" transform="matrix(-0.979793 0.200014 -0.185721 -0.982602 135.791 117.215)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="58.5744" y2="-2.5" transform="matrix(0.532065 -0.846704 0.827428 0.561572 81.252 246.769)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="64.5426" y2="-2.5" transform="matrix(-0.503861 -0.863784 0.846088 -0.533044 137.443 252.884)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="45.7129" y2="-2.5" transform="matrix(-0.0852204 0.996362 -0.99576 -0.0919863 110.471 150.615)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="87.7453" y2="-2.5" transform="matrix(0.998935 -0.0461398 0.0427267 0.999087 49.1133 198.186)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="64.6589" y2="-2.5" transform="matrix(-0.165686 0.986178 -0.983932 -0.178541 100.73 66.6073)" stroke="#C15E50" stroke-width="5"/>
|
||||
<path d="M80.0827 34.974C92.7457 3.8081 120.792 17.7546 134.476 29.5676C135.325 30.301 135.792 31.3761 135.792 32.4985V250.806C135.792 251.98 135.258 253.117 134.349 253.858C103.339 279.155 85.2835 259.158 80.0827 245.771C44.9187 241.11 43.965 209.932 47.8837 194.925C15.173 187.722 17.5591 152.731 22.841 136.135C9.34813 107.747 33.9141 90.4097 47.8837 85.2899C40.524 50.5456 66.2831 37.2692 80.0827 34.974Z" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="95.4357" y2="-2.5" transform="matrix(0.591888 0.80602 -0.783494 0.6214 77.3574 37.2551)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<path d="M49.1309 84.7972L136.212 176.505" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="90.8224" y2="-2.5" transform="matrix(0.814972 0.5795 -0.549892 0.835235 32.5566 143.53)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="146.141" y2="-2.5" transform="matrix(0.686415 -0.72721 0.700262 0.713886 35.4785 139.482)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="77.4689" y2="-2.5" transform="matrix(0.528012 -0.849237 0.830187 0.557485 49.1133 196.162)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="111.328" y2="-2.5" transform="matrix(-0.979793 0.200014 -0.185721 -0.982602 135.791 117.215)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="58.5744" y2="-2.5" transform="matrix(0.532065 -0.846704 0.827428 0.561572 81.252 246.769)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="64.5426" y2="-2.5" transform="matrix(-0.503861 -0.863784 0.846088 -0.533044 137.443 252.884)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="45.7129" y2="-2.5" transform="matrix(-0.0852204 0.996362 -0.99576 -0.0919863 110.471 150.615)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="87.7453" y2="-2.5" transform="matrix(0.998935 -0.0461398 0.0427267 0.999087 49.1133 198.186)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="64.6589" y2="-2.5" transform="matrix(-0.165686 0.986178 -0.983932 -0.178541 100.73 66.6073)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<circle cx="103.955" cy="66.3968" r="11.0444" fill="#C15E50"/>
|
||||
<circle cx="90.4996" cy="129.403" r="11.5465" fill="#C15E50"/>
|
||||
<circle cx="103.955" cy="197.449" r="11.0444" fill="#C15E50"/>
|
||||
@ -19,18 +19,18 @@
|
||||
<circle cx="29.0525" cy="140.996" r="13.0525" fill="#C15E50"/>
|
||||
<circle cx="79.0009" cy="246.875" r="7.02828" fill="#C15E50"/>
|
||||
<path d="M53.0314 195.433C53.0314 199.869 49.4352 203.466 44.9991 203.466C40.563 203.466 36.9668 199.869 36.9668 195.433C36.9668 190.997 40.563 187.401 44.9991 187.401C49.4352 187.401 53.0314 190.997 53.0314 195.433Z" fill="#C15E50"/>
|
||||
<path d="M202.806 247.026C190.143 278.192 162.097 264.245 148.413 252.432C147.563 251.699 147.097 250.624 147.097 249.501V31.1935C147.097 30.0203 147.631 28.8833 148.54 28.1417C179.549 2.84476 197.605 22.8418 202.806 36.2294C237.97 40.8903 238.924 72.0684 235.005 87.0748C267.716 94.2779 265.33 129.269 260.048 145.865C273.541 174.253 248.975 191.59 235.005 196.71C242.365 231.454 216.606 244.731 202.806 247.026Z" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="95.4357" y2="-2.5" transform="matrix(-0.591888 -0.80602 0.783494 -0.6214 205.531 244.745)" stroke="#C15E50" stroke-width="5"/>
|
||||
<path d="M233.758 197.203L146.677 105.495" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="90.8224" y2="-2.5" transform="matrix(-0.814972 -0.5795 0.549892 -0.835235 250.332 138.47)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="146.141" y2="-2.5" transform="matrix(-0.686415 0.72721 -0.700262 -0.713886 247.41 142.518)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="77.4689" y2="-2.5" transform="matrix(-0.528012 0.849237 -0.830187 -0.557485 233.775 85.838)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="111.328" y2="-2.5" transform="matrix(0.979793 -0.200014 0.185721 0.982602 147.098 164.785)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="58.5744" y2="-2.5" transform="matrix(-0.532065 0.846704 -0.827428 -0.561572 201.637 35.2307)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="64.5426" y2="-2.5" transform="matrix(0.503861 0.863784 -0.846088 0.533044 145.445 29.1161)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="45.7129" y2="-2.5" transform="matrix(0.0852204 -0.996362 0.99576 0.0919863 172.418 131.385)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="87.7453" y2="-2.5" transform="matrix(-0.998935 0.0461398 -0.0427267 -0.999087 233.775 83.8137)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="64.6589" y2="-2.5" transform="matrix(0.165686 -0.986178 0.983932 0.178541 182.158 215.393)" stroke="#C15E50" stroke-width="5"/>
|
||||
<path d="M202.806 247.026C190.143 278.192 162.097 264.245 148.413 252.432C147.563 251.699 147.097 250.624 147.097 249.501V31.1935C147.097 30.0203 147.631 28.8833 148.54 28.1417C179.549 2.84476 197.605 22.8418 202.806 36.2294C237.97 40.8903 238.924 72.0684 235.005 87.0748C267.716 94.2779 265.33 129.269 260.048 145.865C273.541 174.253 248.975 191.59 235.005 196.71C242.365 231.454 216.606 244.731 202.806 247.026Z" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="95.4357" y2="-2.5" transform="matrix(-0.591888 -0.80602 0.783494 -0.6214 205.531 244.745)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<path d="M233.758 197.203L146.677 105.495" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="90.8224" y2="-2.5" transform="matrix(-0.814972 -0.5795 0.549892 -0.835235 250.332 138.47)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="146.141" y2="-2.5" transform="matrix(-0.686415 0.72721 -0.700262 -0.713886 247.41 142.518)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="77.4689" y2="-2.5" transform="matrix(-0.528012 0.849237 -0.830187 -0.557485 233.775 85.838)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="111.328" y2="-2.5" transform="matrix(0.979793 -0.200014 0.185721 0.982602 147.098 164.785)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="58.5744" y2="-2.5" transform="matrix(-0.532065 0.846704 -0.827428 -0.561572 201.637 35.2307)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="64.5426" y2="-2.5" transform="matrix(0.503861 0.863784 -0.846088 0.533044 145.445 29.1161)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="45.7129" y2="-2.5" transform="matrix(0.0852204 -0.996362 0.99576 0.0919863 172.418 131.385)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="87.7453" y2="-2.5" transform="matrix(-0.998935 0.0461398 -0.0427267 -0.999087 233.775 83.8137)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="64.6589" y2="-2.5" transform="matrix(0.165686 -0.986178 0.983932 0.178541 182.158 215.393)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<circle cx="178.934" cy="215.603" r="11.0444" transform="rotate(180 178.934 215.603)" fill="#C15E50"/>
|
||||
<circle cx="192.389" cy="152.597" r="11.5465" transform="rotate(180 192.389 152.597)" fill="#C15E50"/>
|
||||
<circle cx="178.934" cy="84.5506" r="11.0444" transform="rotate(180 178.934 84.5506)" fill="#C15E50"/>
|
||||
|
||||
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
@ -15,7 +15,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
<path
|
||||
d="M80.0827 34.974C92.7457 3.8081 120.792 17.7546 134.476 29.5676C135.325 30.301 135.792 31.3761 135.792 32.4985V250.806C135.792 251.98 135.258 253.117 134.349 253.858C103.339 279.155 85.2835 259.158 80.0827 245.771C44.9187 241.11 43.965 209.932 47.8837 194.925C15.173 187.722 17.5591 152.731 22.841 136.135C9.34813 107.747 33.9141 90.4097 47.8837 85.2899C40.524 50.5456 66.2831 37.2692 80.0827 34.974Z"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -23,12 +23,12 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(0.591888 0.80602 -0.783494 0.6214 77.3574 37.2551)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<path
|
||||
d="M49.1309 84.7972L136.212 176.505"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -36,7 +36,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(0.814972 0.5795 -0.549892 0.835235 32.5566 143.53)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -44,7 +44,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(0.686415 -0.72721 0.700262 0.713886 35.4785 139.482)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -52,7 +52,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(0.528012 -0.849237 0.830187 0.557485 49.1133 196.162)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -60,7 +60,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(-0.979793 0.200014 -0.185721 -0.982602 135.791 117.215)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -68,7 +68,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(0.532065 -0.846704 0.827428 0.561572 81.252 246.769)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -76,7 +76,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(-0.503861 -0.863784 0.846088 -0.533044 137.443 252.884)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -84,7 +84,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(-0.0852204 0.996362 -0.99576 -0.0919863 110.471 150.615)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -92,7 +92,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(0.998935 -0.0461398 0.0427267 0.999087 49.1133 198.186)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -100,7 +100,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(-0.165686 0.986178 -0.983932 -0.178541 100.73 66.6073)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<circle cx="103.955" cy="66.3968" r="11.0444" fill="#C15E50" />
|
||||
<circle cx="90.4996" cy="129.403" r="11.5465" fill="#C15E50" />
|
||||
@ -119,7 +119,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
<path
|
||||
d="M202.806 247.026C190.143 278.192 162.097 264.245 148.413 252.432C147.563 251.699 147.097 250.624 147.097 249.501V31.1935C147.097 30.0203 147.631 28.8833 148.54 28.1417C179.549 2.84476 197.605 22.8418 202.806 36.2294C237.97 40.8903 238.924 72.0684 235.005 87.0748C267.716 94.2779 265.33 129.269 260.048 145.865C273.541 174.253 248.975 191.59 235.005 196.71C242.365 231.454 216.606 244.731 202.806 247.026Z"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -127,12 +127,12 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(-0.591888 -0.80602 0.783494 -0.6214 205.531 244.745)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<path
|
||||
d="M233.758 197.203L146.677 105.495"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -140,7 +140,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(-0.814972 -0.5795 0.549892 -0.835235 250.332 138.47)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -148,7 +148,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(-0.686415 0.72721 -0.700262 -0.713886 247.41 142.518)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -156,7 +156,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(-0.528012 0.849237 -0.830187 -0.557485 233.775 85.838)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -164,7 +164,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(0.979793 -0.200014 0.185721 0.982602 147.098 164.785)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -172,7 +172,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(-0.532065 0.846704 -0.827428 -0.561572 201.637 35.2307)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -180,7 +180,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(0.503861 0.863784 -0.846088 0.533044 145.445 29.1161)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -188,7 +188,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(0.0852204 -0.996362 0.99576 0.0919863 172.418 131.385)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -196,7 +196,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(-0.998935 0.0461398 -0.0427267 -0.999087 233.775 83.8137)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<line
|
||||
y1="-2.5"
|
||||
@ -204,7 +204,7 @@ export default function StaticLogo({ width, height }: LogoProps) {
|
||||
y2="-2.5"
|
||||
transform="matrix(0.165686 -0.986178 0.983932 0.178541 182.158 215.393)"
|
||||
stroke="#C15E50"
|
||||
stroke-width="5"
|
||||
strokeWidth="5"
|
||||
/>
|
||||
<circle
|
||||
cx="178.934"
|
||||
|
||||
@ -42,7 +42,6 @@ const data = {
|
||||
|
||||
export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
|
||||
const user = useUser();
|
||||
console.log(user);
|
||||
|
||||
return (
|
||||
<Sidebar
|
||||
|
||||
@ -4,7 +4,7 @@ import { cva, type VariantProps } from "class-variance-authority";
|
||||
import React from "react";
|
||||
|
||||
import { cn } from "../../lib/utils";
|
||||
import { Loader } from "lucide-react";
|
||||
import { LoaderCircle } from "lucide-react";
|
||||
|
||||
const buttonVariants = cva(
|
||||
"inline-flex items-center justify-center whitespace-nowrap rounded transition-colors focus-visible:outline-none focus-visible:shadow-none disabled:pointer-events-none disabled:opacity-50 dark:focus-visible:ring-slate-300",
|
||||
@ -78,7 +78,7 @@ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
||||
{...props}
|
||||
disabled={isLoading ?? disabled}
|
||||
>
|
||||
{isLoading ? <Loader className="mr-2 animate-spin" /> : <></>}
|
||||
{isLoading ? <LoaderCircle className="mr-2 animate-spin" /> : <></>}
|
||||
{children}
|
||||
</Comp>
|
||||
);
|
||||
|
||||
25
apps/webapp/app/components/ui/slider.tsx
Normal file
25
apps/webapp/app/components/ui/slider.tsx
Normal file
@ -0,0 +1,25 @@
|
||||
import * as SliderPrimitive from "@radix-ui/react-slider";
|
||||
import * as React from "react";
|
||||
import { cn } from "~/lib/utils";
|
||||
|
||||
const Slider = React.forwardRef<
|
||||
React.ElementRef<typeof SliderPrimitive.Root>,
|
||||
React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>
|
||||
>(({ className, ...props }, ref) => (
|
||||
<SliderPrimitive.Root
|
||||
ref={ref}
|
||||
className={cn(
|
||||
"relative flex w-full touch-none items-center select-none",
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
>
|
||||
<SliderPrimitive.Track className="bg-primary/20 relative h-1.5 w-full grow overflow-hidden rounded-full">
|
||||
<SliderPrimitive.Range className="bg-primary absolute h-full" />
|
||||
</SliderPrimitive.Track>
|
||||
<SliderPrimitive.Thumb className="border-primary/50 bg-background focus-visible:ring-ring block h-4 w-4 rounded-full border shadow transition-colors focus-visible:ring-1 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50" />
|
||||
</SliderPrimitive.Root>
|
||||
));
|
||||
Slider.displayName = SliderPrimitive.Root.displayName;
|
||||
|
||||
export { Slider };
|
||||
44
apps/webapp/app/lib/usePersistentState.ts
Normal file
44
apps/webapp/app/lib/usePersistentState.ts
Normal file
@ -0,0 +1,44 @@
|
||||
import { useState, useEffect } from "react";
|
||||
|
||||
/**
|
||||
* A hook that persists state to localStorage
|
||||
* @param key - The localStorage key to store the value under
|
||||
* @param defaultValue - The default value to use if nothing is stored
|
||||
* @returns A tuple of [value, setValue] similar to useState
|
||||
*/
|
||||
export function usePersistentState<T>(
|
||||
key: string,
|
||||
defaultValue: T
|
||||
): [T, (value: T | ((prevValue: T) => T)) => void] {
|
||||
const [state, setState] = useState<T>(() => {
|
||||
// Only access localStorage on the client side
|
||||
if (typeof window === "undefined") {
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
try {
|
||||
const item = window.localStorage.getItem(key);
|
||||
return item ? JSON.parse(item) : defaultValue;
|
||||
} catch (error) {
|
||||
console.warn(`Error reading localStorage key "${key}":`, error);
|
||||
return defaultValue;
|
||||
}
|
||||
});
|
||||
|
||||
const setValue = (value: T | ((prevValue: T) => T)) => {
|
||||
try {
|
||||
// Allow value to be a function so we have the same API as useState
|
||||
const valueToStore = value instanceof Function ? value(state) : value;
|
||||
setState(valueToStore);
|
||||
|
||||
// Save to localStorage on the client side
|
||||
if (typeof window !== "undefined") {
|
||||
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn(`Error setting localStorage key "${key}":`, error);
|
||||
}
|
||||
};
|
||||
|
||||
return [state, setValue];
|
||||
}
|
||||
@ -35,6 +35,9 @@ setInterval(
|
||||
|
||||
// MCP request body schema
|
||||
const MCPRequestSchema = z.object({}).passthrough();
|
||||
const SourceParams = z.object({
|
||||
source: z.string().optional(),
|
||||
});
|
||||
|
||||
// Search parameters schema for MCP tool
|
||||
const SearchParamsSchema = z.object({
|
||||
@ -55,9 +58,12 @@ const handleMCPRequest = async (
|
||||
request: Request,
|
||||
body: any,
|
||||
authentication: any,
|
||||
params: z.infer<typeof SourceParams>,
|
||||
) => {
|
||||
const sessionId = request.headers.get("mcp-session-id") as string | undefined;
|
||||
const source = request.headers.get("source") as string | undefined;
|
||||
const source =
|
||||
(request.headers.get("source") as string | undefined) ??
|
||||
(params.source as string | undefined);
|
||||
|
||||
if (!source) {
|
||||
return json(
|
||||
@ -241,17 +247,23 @@ const handleDelete = async (request: Request, authentication: any) => {
|
||||
const { action, loader } = createHybridActionApiRoute(
|
||||
{
|
||||
body: MCPRequestSchema,
|
||||
searchParams: SourceParams,
|
||||
allowJWT: true,
|
||||
authorization: {
|
||||
action: "mcp",
|
||||
},
|
||||
corsStrategy: "all",
|
||||
},
|
||||
async ({ body, authentication, request }) => {
|
||||
async ({ body, authentication, request, searchParams }) => {
|
||||
const method = request.method;
|
||||
|
||||
if (method === "POST") {
|
||||
return await handleMCPRequest(request, body, authentication);
|
||||
return await handleMCPRequest(
|
||||
request,
|
||||
body,
|
||||
authentication,
|
||||
searchParams,
|
||||
);
|
||||
} else if (method === "DELETE") {
|
||||
return await handleDelete(request, authentication);
|
||||
} else {
|
||||
|
||||
@ -1,21 +1,38 @@
|
||||
import { createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server";
|
||||
import { callbackHandler } from "~/services/oauth/oauth.server";
|
||||
import type { CallbackParams } from "~/services/oauth/oauth-utils.server";
|
||||
import { type LoaderFunctionArgs } from "@remix-run/node";
|
||||
|
||||
// This route handles the OAuth callback, similar to the NestJS controller
|
||||
const { loader } = createActionApiRoute(
|
||||
{
|
||||
allowJWT: false,
|
||||
corsStrategy: "all",
|
||||
},
|
||||
async ({ request }) => {
|
||||
export async function loader({ request }: LoaderFunctionArgs) {
|
||||
// Handle CORS preflight
|
||||
if (request.method.toUpperCase() === "OPTIONS") {
|
||||
return new Response(null, {
|
||||
status: 200,
|
||||
headers: {
|
||||
"Access-Control-Allow-Origin": "*",
|
||||
"Access-Control-Allow-Methods": "GET, OPTIONS",
|
||||
"Access-Control-Allow-Headers": "Content-Type",
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// Only allow GET requests
|
||||
if (request.method.toUpperCase() !== "GET") {
|
||||
return new Response("Method Not Allowed", {
|
||||
status: 405,
|
||||
headers: { Allow: "GET" }
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
const url = new URL(request.url);
|
||||
const params: CallbackParams = {};
|
||||
for (const [key, value] of url.searchParams.entries()) {
|
||||
params[key] = value;
|
||||
}
|
||||
return await callbackHandler(params);
|
||||
},
|
||||
);
|
||||
|
||||
export { loader };
|
||||
} catch (error) {
|
||||
console.error("OAuth callback error:", error);
|
||||
return new Response("Internal Server Error", { status: 500 });
|
||||
}
|
||||
}
|
||||
@ -138,7 +138,7 @@ export default function IntegrationDetail() {
|
||||
const hasApiKey = !!specData?.auth?.api_key;
|
||||
const hasOAuth2 = !!specData?.auth?.OAuth2;
|
||||
const hasMCPAuth = !!(
|
||||
specData?.mcp.type === "url" && specData?.mcp.needsAuth
|
||||
specData?.mcp.type === "http" && specData?.mcp.needsAuth
|
||||
);
|
||||
const Component = getIcon(integration.icon as IconType);
|
||||
|
||||
@ -163,84 +163,86 @@ export default function IntegrationDetail() {
|
||||
},
|
||||
]}
|
||||
/>
|
||||
<div className="h-[calc(100vh_-_56px)] overflow-hidden p-4 px-5">
|
||||
<Section
|
||||
title={integration.name}
|
||||
description={integration.description}
|
||||
icon={
|
||||
<div className="bg-grayAlpha-100 flex h-12 w-12 items-center justify-center rounded">
|
||||
<Component size={24} />
|
||||
</div>
|
||||
}
|
||||
>
|
||||
<div>
|
||||
{/* Authentication Methods */}
|
||||
<div className="space-y-4">
|
||||
<h3 className="text-lg font-medium">Authentication Methods</h3>
|
||||
<div className="space-y-2">
|
||||
{hasApiKey && (
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="inline-flex items-center gap-2 text-sm">
|
||||
<Checkbox checked /> API Key authentication
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
{hasOAuth2 && (
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="inline-flex items-center gap-2 text-sm">
|
||||
<Checkbox checked />
|
||||
OAuth 2.0 authentication
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
{!hasApiKey && !hasOAuth2 && !hasMCPAuth && (
|
||||
<div className="text-muted-foreground text-sm">
|
||||
No authentication method specified
|
||||
</div>
|
||||
)}
|
||||
<div className="flex h-[calc(100vh_-_56px)] flex-col items-center overflow-hidden p-4 px-5">
|
||||
<div className="max-w-5xl">
|
||||
<Section
|
||||
title={integration.name}
|
||||
description={integration.description}
|
||||
icon={
|
||||
<div className="bg-grayAlpha-100 flex h-12 w-12 items-center justify-center rounded">
|
||||
<Component size={24} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Connect Section */}
|
||||
{!activeAccount && (hasApiKey || hasOAuth2) && (
|
||||
<div className="mt-6 space-y-4">
|
||||
<h3 className="text-lg font-medium">
|
||||
Connect to {integration.name}
|
||||
</h3>
|
||||
|
||||
{/* API Key Authentication */}
|
||||
<ApiKeyAuthSection
|
||||
integration={integration}
|
||||
specData={specData}
|
||||
activeAccount={activeAccount}
|
||||
/>
|
||||
|
||||
{/* OAuth Authentication */}
|
||||
<OAuthAuthSection
|
||||
integration={integration}
|
||||
specData={specData}
|
||||
activeAccount={activeAccount}
|
||||
/>
|
||||
}
|
||||
>
|
||||
<div>
|
||||
{/* Authentication Methods */}
|
||||
<div className="space-y-4">
|
||||
<h3 className="text-lg font-medium">Authentication Methods</h3>
|
||||
<div className="space-y-2">
|
||||
{hasApiKey && (
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="inline-flex items-center gap-2 text-sm">
|
||||
<Checkbox checked /> API Key authentication
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
{hasOAuth2 && (
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="inline-flex items-center gap-2 text-sm">
|
||||
<Checkbox checked />
|
||||
OAuth 2.0 authentication
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
{!hasApiKey && !hasOAuth2 && !hasMCPAuth && (
|
||||
<div className="text-muted-foreground text-sm">
|
||||
No authentication method specified
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Connected Account Info */}
|
||||
<ConnectedAccountSection activeAccount={activeAccount} />
|
||||
{/* Connect Section */}
|
||||
{!activeAccount && (hasApiKey || hasOAuth2) && (
|
||||
<div className="mt-6 space-y-4">
|
||||
<h3 className="text-lg font-medium">
|
||||
Connect to {integration.name}
|
||||
</h3>
|
||||
|
||||
{/* MCP Authentication Section */}
|
||||
<MCPAuthSection
|
||||
integration={integration}
|
||||
activeAccount={activeAccount as any}
|
||||
hasMCPAuth={hasMCPAuth}
|
||||
/>
|
||||
{/* API Key Authentication */}
|
||||
<ApiKeyAuthSection
|
||||
integration={integration}
|
||||
specData={specData}
|
||||
activeAccount={activeAccount}
|
||||
/>
|
||||
|
||||
{/* Ingestion Rule Section */}
|
||||
<IngestionRuleSection
|
||||
ingestionRule={ingestionRule}
|
||||
activeAccount={activeAccount}
|
||||
/>
|
||||
</div>
|
||||
</Section>
|
||||
{/* OAuth Authentication */}
|
||||
<OAuthAuthSection
|
||||
integration={integration}
|
||||
specData={specData}
|
||||
activeAccount={activeAccount}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Connected Account Info */}
|
||||
<ConnectedAccountSection activeAccount={activeAccount} />
|
||||
|
||||
{/* MCP Authentication Section */}
|
||||
<MCPAuthSection
|
||||
integration={integration}
|
||||
activeAccount={activeAccount as any}
|
||||
hasMCPAuth={hasMCPAuth}
|
||||
/>
|
||||
|
||||
{/* Ingestion Rule Section */}
|
||||
<IngestionRuleSection
|
||||
ingestionRule={ingestionRule}
|
||||
activeAccount={activeAccount}
|
||||
/>
|
||||
</div>
|
||||
</Section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
@ -14,8 +14,17 @@ import { Button } from "~/components/ui/button";
|
||||
import { Card, CardContent } from "~/components/ui/card";
|
||||
import { Arrows } from "~/components/icons";
|
||||
import Logo from "~/components/logo/logo";
|
||||
import { AlignLeft, LayoutGrid, Pen, User, Mail, Shield, Database } from "lucide-react";
|
||||
|
||||
import {
|
||||
AlignLeft,
|
||||
LayoutGrid,
|
||||
Pen,
|
||||
User,
|
||||
Mail,
|
||||
Shield,
|
||||
Database,
|
||||
LoaderCircle,
|
||||
} from "lucide-react";
|
||||
import { useState } from "react";
|
||||
|
||||
export const loader = async ({ request }: LoaderFunctionArgs) => {
|
||||
// Check if user is authenticated
|
||||
@ -30,19 +39,22 @@ export const loader = async ({ request }: LoaderFunctionArgs) => {
|
||||
}
|
||||
|
||||
const url = new URL(request.url);
|
||||
let scopeParam = url.searchParams.get("scope") || undefined;
|
||||
let scopeParam = url.searchParams.get("scope") || "mcp";
|
||||
|
||||
// If scope is present, normalize it to comma-separated format
|
||||
// Handle both space-separated (from URL encoding) and comma-separated scopes
|
||||
if (scopeParam) {
|
||||
// First, try splitting by spaces (common in OAuth2 URLs)
|
||||
let scopes = scopeParam.split(/\s+/).filter(s => s.length > 0);
|
||||
|
||||
let scopes = scopeParam.split(/\s+/).filter((s) => s.length > 0);
|
||||
|
||||
// If no spaces found, try splitting by commas
|
||||
if (scopes.length === 1) {
|
||||
scopes = scopeParam.split(",").map(s => s.trim()).filter(s => s.length > 0);
|
||||
scopes = scopeParam
|
||||
.split(",")
|
||||
.map((s) => s.trim())
|
||||
.filter((s) => s.length > 0);
|
||||
}
|
||||
|
||||
|
||||
scopeParam = scopes.join(",");
|
||||
} else {
|
||||
throw new Error("Scope is not found");
|
||||
@ -85,7 +97,7 @@ export const loader = async ({ request }: LoaderFunctionArgs) => {
|
||||
}
|
||||
|
||||
// Validate scopes
|
||||
if (!oauth2Service.validateScopes(client, params.scope || '')) {
|
||||
if (!oauth2Service.validateScopes(client, params.scope || "")) {
|
||||
return redirect(
|
||||
`${params.redirect_uri}?error=${OAuth2Errors.INVALID_SCOPE}&error_description=Invalid scope${params.state ? `&state=${params.state}` : ""}`,
|
||||
);
|
||||
@ -151,7 +163,7 @@ export const action = async ({ request }: ActionFunctionArgs) => {
|
||||
codeChallenge: params.code_challenge,
|
||||
codeChallengeMethod: params.code_challenge_method,
|
||||
workspaceId: workspace.id,
|
||||
});
|
||||
});
|
||||
// Redirect back to client with authorization code
|
||||
const redirectUrl = new URL(params.redirect_uri);
|
||||
redirectUrl.searchParams.set("code", authCode);
|
||||
@ -173,8 +185,8 @@ export const action = async ({ request }: ActionFunctionArgs) => {
|
||||
};
|
||||
|
||||
export default function OAuthAuthorize() {
|
||||
const { user, client, params } = useLoaderData<typeof loader>();
|
||||
|
||||
const { user, client, params } = useLoaderData<typeof loader>();
|
||||
const [isRedirecting, setIsRedirecting] = useState(false);
|
||||
|
||||
const getScopeIcon = (scope: string) => {
|
||||
switch (scope) {
|
||||
@ -255,68 +267,93 @@ export default function OAuthAuthorize() {
|
||||
className={`flex items-center gap-2 border-x border-t border-gray-300 p-2 ${isLast ? "border-b" : ""} ${isFirst ? "rounded-tl-md rounded-tr-md" : ""} ${isLast ? "rounded-br-md rounded-bl-md" : ""} `}
|
||||
>
|
||||
<div>{getScopeIcon(trimmedScope)}</div>
|
||||
<div>
|
||||
{getScopeDescription(trimmedScope)}
|
||||
</div>
|
||||
<div>{getScopeDescription(trimmedScope)}</div>
|
||||
</li>
|
||||
);
|
||||
})}
|
||||
</ul>
|
||||
|
||||
<Form method="post" className="space-y-3">
|
||||
<input type="hidden" name="client_id" value={params.client_id} />
|
||||
<input
|
||||
type="hidden"
|
||||
name="redirect_uri"
|
||||
value={params.redirect_uri}
|
||||
/>
|
||||
<input
|
||||
type="hidden"
|
||||
name="response_type"
|
||||
value={params.response_type}
|
||||
/>
|
||||
{params.scope && (
|
||||
<input type="hidden" name="scope" value={params.scope} />
|
||||
)}
|
||||
{params.state && (
|
||||
<input type="hidden" name="state" value={params.state} />
|
||||
)}
|
||||
{params.code_challenge && (
|
||||
<input
|
||||
type="hidden"
|
||||
name="code_challenge"
|
||||
value={params.code_challenge}
|
||||
/>
|
||||
)}
|
||||
{params.code_challenge_method && (
|
||||
<input
|
||||
type="hidden"
|
||||
name="code_challenge_method"
|
||||
value={params.code_challenge_method}
|
||||
/>
|
||||
)}
|
||||
|
||||
<div className="flex justify-end space-x-3">
|
||||
<Button
|
||||
type="submit"
|
||||
name="action"
|
||||
value="deny"
|
||||
size="lg"
|
||||
variant="secondary"
|
||||
>
|
||||
Deny
|
||||
</Button>
|
||||
<Button
|
||||
type="submit"
|
||||
name="action"
|
||||
value="allow"
|
||||
size="lg"
|
||||
className="shadow-none"
|
||||
>
|
||||
Allow Access
|
||||
</Button>
|
||||
{isRedirecting ? (
|
||||
<div className="flex flex-col items-center justify-center py-8">
|
||||
<LoaderCircle className="text-primary mb-2 h-4 w-4 animate-spin" />
|
||||
<span className="text-muted-foreground text-sm">
|
||||
Redirecting to the page... (Close this page if it doesn't
|
||||
redirect in 5 seconds)
|
||||
</span>
|
||||
</div>
|
||||
</Form>
|
||||
) : (
|
||||
<Form
|
||||
method="post"
|
||||
className="space-y-3"
|
||||
onSubmit={(e) => {
|
||||
// Only show loading if allow is clicked
|
||||
const form = e.target as HTMLFormElement;
|
||||
const allowBtn = form.querySelector(
|
||||
'button[name="action"][value="allow"]',
|
||||
);
|
||||
if ((e.nativeEvent as SubmitEvent).submitter === allowBtn) {
|
||||
setIsRedirecting(true);
|
||||
}
|
||||
}}
|
||||
>
|
||||
<input
|
||||
type="hidden"
|
||||
name="client_id"
|
||||
value={params.client_id}
|
||||
/>
|
||||
<input
|
||||
type="hidden"
|
||||
name="redirect_uri"
|
||||
value={params.redirect_uri}
|
||||
/>
|
||||
<input
|
||||
type="hidden"
|
||||
name="response_type"
|
||||
value={params.response_type}
|
||||
/>
|
||||
{params.scope && (
|
||||
<input type="hidden" name="scope" value={params.scope} />
|
||||
)}
|
||||
{params.state && (
|
||||
<input type="hidden" name="state" value={params.state} />
|
||||
)}
|
||||
{params.code_challenge && (
|
||||
<input
|
||||
type="hidden"
|
||||
name="code_challenge"
|
||||
value={params.code_challenge}
|
||||
/>
|
||||
)}
|
||||
{params.code_challenge_method && (
|
||||
<input
|
||||
type="hidden"
|
||||
name="code_challenge_method"
|
||||
value={params.code_challenge_method}
|
||||
/>
|
||||
)}
|
||||
|
||||
<div className="flex justify-end space-x-3">
|
||||
<Button
|
||||
type="submit"
|
||||
name="action"
|
||||
value="deny"
|
||||
size="lg"
|
||||
variant="secondary"
|
||||
>
|
||||
Deny
|
||||
</Button>
|
||||
<Button
|
||||
type="submit"
|
||||
name="action"
|
||||
value="allow"
|
||||
size="lg"
|
||||
className="shadow-none"
|
||||
>
|
||||
Allow Access
|
||||
</Button>
|
||||
</div>
|
||||
</Form>
|
||||
)}
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
59
apps/webapp/app/routes/oauth.register.tsx
Normal file
59
apps/webapp/app/routes/oauth.register.tsx
Normal file
@ -0,0 +1,59 @@
|
||||
import { json } from "@remix-run/node";
|
||||
import { type ActionFunctionArgs } from "@remix-run/server-runtime";
|
||||
import { oauth2Service } from "~/services/oauth2.server";
|
||||
|
||||
// Dynamic Client Registration for MCP clients (Claude, etc.)
|
||||
export async function action({ request }: ActionFunctionArgs) {
|
||||
if (request.method !== "POST") {
|
||||
throw new Response("Method Not Allowed", { status: 405 });
|
||||
}
|
||||
|
||||
try {
|
||||
const body = await request.json();
|
||||
const { client_name, redirect_uris, grant_types, response_types } = body;
|
||||
|
||||
// Validate required fields
|
||||
if (!redirect_uris || !Array.isArray(redirect_uris) || redirect_uris.length === 0) {
|
||||
return json(
|
||||
{ error: "invalid_request", error_description: "redirect_uris is required" },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
// Create MCP client with special handling
|
||||
const client = await oauth2Service.createDynamicClient({
|
||||
name: client_name || "MCP Client",
|
||||
redirectUris: redirect_uris,
|
||||
grantTypes: grant_types || ["authorization_code"],
|
||||
responseTypes: response_types || ["code"],
|
||||
clientType: "mcp", // Special flag for MCP clients
|
||||
requirePkce: true,
|
||||
allowedScopes: "mcp",
|
||||
});
|
||||
|
||||
return json ({
|
||||
client_id: client.clientId,
|
||||
client_secret: client.clientSecret, // Include if confidential client
|
||||
client_id_issued_at: Math.floor(Date.now() / 1000),
|
||||
grant_types: client.grantTypes.split(","),
|
||||
response_types: ["code"],
|
||||
redirect_uris: client.redirectUris.split(","),
|
||||
scope: client.allowedScopes,
|
||||
token_endpoint_auth_method: "client_secret_post",
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("Dynamic client registration error:", error);
|
||||
return json(
|
||||
{
|
||||
error: "invalid_request",
|
||||
error_description: "Failed to register client"
|
||||
},
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Prevent GET requests
|
||||
export async function loader() {
|
||||
throw new Response("Method Not Allowed", { status: 405 });
|
||||
}
|
||||
@ -691,6 +691,50 @@ export class OAuth2Service {
|
||||
scope: storedRefreshToken.scope || undefined,
|
||||
};
|
||||
}
|
||||
|
||||
async createDynamicClient(params: {
|
||||
name: string;
|
||||
redirectUris: string[];
|
||||
grantTypes?: string[];
|
||||
clientType?: string;
|
||||
responseTypes?: string[];
|
||||
requirePkce?: boolean;
|
||||
allowedScopes?: string;
|
||||
description?: string;
|
||||
workspaceId?: string;
|
||||
createdById?: string;
|
||||
}) {
|
||||
// Generate secure client credentials
|
||||
const clientId = crypto.randomBytes(16).toString("hex");
|
||||
const clientSecret = crypto.randomBytes(32).toString("hex");
|
||||
|
||||
// Default values for MCP clients
|
||||
const grantTypes = params.grantTypes || [
|
||||
"authorization_code",
|
||||
"refresh_token",
|
||||
];
|
||||
const allowedScopes = params.allowedScopes || "mcp";
|
||||
const requirePkce = params.requirePkce ?? true; // Default to true for security
|
||||
|
||||
const client = await prisma.oAuthClient.create({
|
||||
data: {
|
||||
clientId,
|
||||
clientSecret,
|
||||
name: params.name,
|
||||
description:
|
||||
params.description ||
|
||||
`Dynamically registered ${params.clientType || "client"}`,
|
||||
redirectUris: params.redirectUris.join(","),
|
||||
grantTypes: grantTypes.join(","),
|
||||
allowedScopes,
|
||||
requirePkce,
|
||||
clientType: "mcp",
|
||||
isActive: true,
|
||||
},
|
||||
});
|
||||
|
||||
return client;
|
||||
}
|
||||
}
|
||||
|
||||
export const oauth2Service = new OAuth2Service();
|
||||
|
||||
@ -6,7 +6,7 @@ const ONE_DAY = 60 * 60 * 24;
|
||||
|
||||
export const { commitSession, getSession } = createCookieSessionStorage({
|
||||
cookie: {
|
||||
name: "__redirectTo",
|
||||
name: "__redirectTo__core",
|
||||
path: "/",
|
||||
httpOnly: true,
|
||||
sameSite: "lax",
|
||||
|
||||
@ -635,11 +635,13 @@ async function wrapResponse(
|
||||
}
|
||||
|
||||
// New hybrid authentication types and functions
|
||||
export type HybridAuthenticationResult = ApiAuthenticationResultSuccess | {
|
||||
ok: true;
|
||||
type: "COOKIE";
|
||||
userId: string;
|
||||
};
|
||||
export type HybridAuthenticationResult =
|
||||
| ApiAuthenticationResultSuccess
|
||||
| {
|
||||
ok: true;
|
||||
type: "COOKIE";
|
||||
userId: string;
|
||||
};
|
||||
|
||||
async function authenticateHybridRequest(
|
||||
request: Request,
|
||||
@ -766,10 +768,9 @@ export function createHybridActionApiRoute<
|
||||
}
|
||||
|
||||
try {
|
||||
const authenticationResult = await authenticateHybridRequest(
|
||||
request,
|
||||
{ allowJWT },
|
||||
);
|
||||
const authenticationResult = await authenticateHybridRequest(request, {
|
||||
allowJWT,
|
||||
});
|
||||
|
||||
if (!authenticationResult) {
|
||||
return await wrapResponse(
|
||||
|
||||
@ -9,7 +9,7 @@ export const sessionStorage = createCookieSessionStorage<{
|
||||
[SESSION_KEY]: AuthUser;
|
||||
}>({
|
||||
cookie: {
|
||||
name: "__session", // use any name you want here
|
||||
name: "__session__core", // use any name you want here
|
||||
sameSite: "lax", // this helps with CSRF
|
||||
path: "/", // remember to add this so the cookie will work in all routes
|
||||
httpOnly: true, // for security reasons, make this cookie http only
|
||||
|
||||
@ -271,10 +271,33 @@ export const fetchAndSaveStdioIntegrations = async () => {
|
||||
continue;
|
||||
}
|
||||
|
||||
const content = await response.text();
|
||||
// Check if the response is binary (executable) or text
|
||||
const contentType = response.headers.get("content-type");
|
||||
const isBinary =
|
||||
contentType &&
|
||||
(contentType.includes("application/octet-stream") ||
|
||||
contentType.includes("application/executable") ||
|
||||
contentType.includes("application/x-executable") ||
|
||||
contentType.includes("binary") ||
|
||||
!contentType.includes("text/"));
|
||||
|
||||
let content: string | Buffer;
|
||||
|
||||
if (isBinary) {
|
||||
// Handle binary files
|
||||
const arrayBuffer = await response.arrayBuffer();
|
||||
content = Buffer.from(arrayBuffer);
|
||||
} else {
|
||||
// Handle text files
|
||||
content = await response.text();
|
||||
}
|
||||
|
||||
// Save the content to the target file
|
||||
fs.writeFileSync(targetFile, content);
|
||||
if (typeof content === "string") {
|
||||
fs.writeFileSync(targetFile, content);
|
||||
} else {
|
||||
fs.writeFileSync(targetFile, content);
|
||||
}
|
||||
|
||||
// Make the file executable if it's a script
|
||||
if (process.platform !== "win32") {
|
||||
|
||||
@ -19,8 +19,21 @@ export const createIntegrationAccount = async ({
|
||||
config?: Record<string, any>;
|
||||
settings?: Record<string, any>;
|
||||
}) => {
|
||||
return prisma.integrationAccount.create({
|
||||
data: {
|
||||
return prisma.integrationAccount.upsert({
|
||||
where: {
|
||||
accountId_integrationDefinitionId_workspaceId: {
|
||||
accountId,
|
||||
integrationDefinitionId,
|
||||
workspaceId,
|
||||
},
|
||||
},
|
||||
update: {
|
||||
integrationConfiguration: config || {},
|
||||
settings: settings || {},
|
||||
isActive: true,
|
||||
deleted: null,
|
||||
},
|
||||
create: {
|
||||
accountId,
|
||||
integrationDefinitionId,
|
||||
integratedById: userId,
|
||||
|
||||
@ -6,8 +6,8 @@
|
||||
"scripts": {
|
||||
"build": "remix vite:build",
|
||||
"dev": "node ./server.mjs",
|
||||
"lint": "eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .",
|
||||
"lint:fix": "eslint --fix --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .",
|
||||
"lint": "eslint --fix --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .",
|
||||
"lint:fix": "eslint 'app/**/*.{ts,tsx,js,jsx}' --rule 'turbo/no-undeclared-env-vars:error' -f table",
|
||||
"start": "remix-serve ./build/server/index.js",
|
||||
"typecheck": "tsc",
|
||||
"trigger:dev": "pnpm dlx trigger.dev@4.0.0-v4-beta.22 dev",
|
||||
@ -38,6 +38,7 @@
|
||||
"@radix-ui/react-icons": "^1.3.0",
|
||||
"@radix-ui/react-label": "^2.0.2",
|
||||
"@radix-ui/react-popover": "^1.0.7",
|
||||
"@radix-ui/react-slider": "^1.3.5",
|
||||
"@radix-ui/react-scroll-area": "^1.0.5",
|
||||
"@radix-ui/react-select": "^2.0.0",
|
||||
"@radix-ui/react-separator": "^1.1.7",
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
<svg width="282" height="282" viewBox="0 0 282 282" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M80.0827 34.974C92.7457 3.8081 120.792 17.7546 134.476 29.5676C135.325 30.301 135.792 31.3761 135.792 32.4985V250.806C135.792 251.98 135.258 253.117 134.349 253.858C103.339 279.155 85.2835 259.158 80.0827 245.771C44.9187 241.11 43.965 209.932 47.8837 194.925C15.173 187.722 17.5591 152.731 22.841 136.135C9.34813 107.747 33.9141 90.4097 47.8837 85.2899C40.524 50.5456 66.2831 37.2692 80.0827 34.974Z" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="95.4357" y2="-2.5" transform="matrix(0.591888 0.80602 -0.783494 0.6214 77.3574 37.2551)" stroke="#C15E50" stroke-width="5"/>
|
||||
<path d="M49.1309 84.7972L136.212 176.505" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="90.8224" y2="-2.5" transform="matrix(0.814972 0.5795 -0.549892 0.835235 32.5566 143.53)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="146.141" y2="-2.5" transform="matrix(0.686415 -0.72721 0.700262 0.713886 35.4785 139.482)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="77.4689" y2="-2.5" transform="matrix(0.528012 -0.849237 0.830187 0.557485 49.1133 196.162)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="111.328" y2="-2.5" transform="matrix(-0.979793 0.200014 -0.185721 -0.982602 135.791 117.215)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="58.5744" y2="-2.5" transform="matrix(0.532065 -0.846704 0.827428 0.561572 81.252 246.769)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="64.5426" y2="-2.5" transform="matrix(-0.503861 -0.863784 0.846088 -0.533044 137.443 252.884)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="45.7129" y2="-2.5" transform="matrix(-0.0852204 0.996362 -0.99576 -0.0919863 110.471 150.615)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="87.7453" y2="-2.5" transform="matrix(0.998935 -0.0461398 0.0427267 0.999087 49.1133 198.186)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="64.6589" y2="-2.5" transform="matrix(-0.165686 0.986178 -0.983932 -0.178541 100.73 66.6073)" stroke="#C15E50" stroke-width="5"/>
|
||||
<path d="M80.0827 34.974C92.7457 3.8081 120.792 17.7546 134.476 29.5676C135.325 30.301 135.792 31.3761 135.792 32.4985V250.806C135.792 251.98 135.258 253.117 134.349 253.858C103.339 279.155 85.2835 259.158 80.0827 245.771C44.9187 241.11 43.965 209.932 47.8837 194.925C15.173 187.722 17.5591 152.731 22.841 136.135C9.34813 107.747 33.9141 90.4097 47.8837 85.2899C40.524 50.5456 66.2831 37.2692 80.0827 34.974Z" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="95.4357" y2="-2.5" transform="matrix(0.591888 0.80602 -0.783494 0.6214 77.3574 37.2551)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<path d="M49.1309 84.7972L136.212 176.505" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="90.8224" y2="-2.5" transform="matrix(0.814972 0.5795 -0.549892 0.835235 32.5566 143.53)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="146.141" y2="-2.5" transform="matrix(0.686415 -0.72721 0.700262 0.713886 35.4785 139.482)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="77.4689" y2="-2.5" transform="matrix(0.528012 -0.849237 0.830187 0.557485 49.1133 196.162)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="111.328" y2="-2.5" transform="matrix(-0.979793 0.200014 -0.185721 -0.982602 135.791 117.215)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="58.5744" y2="-2.5" transform="matrix(0.532065 -0.846704 0.827428 0.561572 81.252 246.769)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="64.5426" y2="-2.5" transform="matrix(-0.503861 -0.863784 0.846088 -0.533044 137.443 252.884)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="45.7129" y2="-2.5" transform="matrix(-0.0852204 0.996362 -0.99576 -0.0919863 110.471 150.615)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="87.7453" y2="-2.5" transform="matrix(0.998935 -0.0461398 0.0427267 0.999087 49.1133 198.186)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="64.6589" y2="-2.5" transform="matrix(-0.165686 0.986178 -0.983932 -0.178541 100.73 66.6073)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<circle cx="103.955" cy="66.3968" r="11.0444" fill="#C15E50"/>
|
||||
<circle cx="90.4996" cy="129.403" r="11.5465" fill="#C15E50"/>
|
||||
<circle cx="103.955" cy="197.449" r="11.0444" fill="#C15E50"/>
|
||||
@ -19,18 +19,18 @@
|
||||
<circle cx="29.0525" cy="140.996" r="13.0525" fill="#C15E50"/>
|
||||
<circle cx="79.0009" cy="246.875" r="7.02828" fill="#C15E50"/>
|
||||
<path d="M53.0314 195.433C53.0314 199.869 49.4352 203.466 44.9991 203.466C40.563 203.466 36.9668 199.869 36.9668 195.433C36.9668 190.997 40.563 187.401 44.9991 187.401C49.4352 187.401 53.0314 190.997 53.0314 195.433Z" fill="#C15E50"/>
|
||||
<path d="M202.806 247.026C190.143 278.192 162.097 264.245 148.413 252.432C147.563 251.699 147.097 250.624 147.097 249.501V31.1935C147.097 30.0203 147.631 28.8833 148.54 28.1417C179.549 2.84476 197.605 22.8418 202.806 36.2294C237.97 40.8903 238.924 72.0684 235.005 87.0748C267.716 94.2779 265.33 129.269 260.048 145.865C273.541 174.253 248.975 191.59 235.005 196.71C242.365 231.454 216.606 244.731 202.806 247.026Z" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="95.4357" y2="-2.5" transform="matrix(-0.591888 -0.80602 0.783494 -0.6214 205.531 244.745)" stroke="#C15E50" stroke-width="5"/>
|
||||
<path d="M233.758 197.203L146.677 105.495" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="90.8224" y2="-2.5" transform="matrix(-0.814972 -0.5795 0.549892 -0.835235 250.332 138.47)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="146.141" y2="-2.5" transform="matrix(-0.686415 0.72721 -0.700262 -0.713886 247.41 142.518)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="77.4689" y2="-2.5" transform="matrix(-0.528012 0.849237 -0.830187 -0.557485 233.775 85.838)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="111.328" y2="-2.5" transform="matrix(0.979793 -0.200014 0.185721 0.982602 147.098 164.785)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="58.5744" y2="-2.5" transform="matrix(-0.532065 0.846704 -0.827428 -0.561572 201.637 35.2307)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="64.5426" y2="-2.5" transform="matrix(0.503861 0.863784 -0.846088 0.533044 145.445 29.1161)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="45.7129" y2="-2.5" transform="matrix(0.0852204 -0.996362 0.99576 0.0919863 172.418 131.385)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="87.7453" y2="-2.5" transform="matrix(-0.998935 0.0461398 -0.0427267 -0.999087 233.775 83.8137)" stroke="#C15E50" stroke-width="5"/>
|
||||
<line y1="-2.5" x2="64.6589" y2="-2.5" transform="matrix(0.165686 -0.986178 0.983932 0.178541 182.158 215.393)" stroke="#C15E50" stroke-width="5"/>
|
||||
<path d="M202.806 247.026C190.143 278.192 162.097 264.245 148.413 252.432C147.563 251.699 147.097 250.624 147.097 249.501V31.1935C147.097 30.0203 147.631 28.8833 148.54 28.1417C179.549 2.84476 197.605 22.8418 202.806 36.2294C237.97 40.8903 238.924 72.0684 235.005 87.0748C267.716 94.2779 265.33 129.269 260.048 145.865C273.541 174.253 248.975 191.59 235.005 196.71C242.365 231.454 216.606 244.731 202.806 247.026Z" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="95.4357" y2="-2.5" transform="matrix(-0.591888 -0.80602 0.783494 -0.6214 205.531 244.745)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<path d="M233.758 197.203L146.677 105.495" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="90.8224" y2="-2.5" transform="matrix(-0.814972 -0.5795 0.549892 -0.835235 250.332 138.47)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="146.141" y2="-2.5" transform="matrix(-0.686415 0.72721 -0.700262 -0.713886 247.41 142.518)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="77.4689" y2="-2.5" transform="matrix(-0.528012 0.849237 -0.830187 -0.557485 233.775 85.838)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="111.328" y2="-2.5" transform="matrix(0.979793 -0.200014 0.185721 0.982602 147.098 164.785)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="58.5744" y2="-2.5" transform="matrix(-0.532065 0.846704 -0.827428 -0.561572 201.637 35.2307)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="64.5426" y2="-2.5" transform="matrix(0.503861 0.863784 -0.846088 0.533044 145.445 29.1161)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="45.7129" y2="-2.5" transform="matrix(0.0852204 -0.996362 0.99576 0.0919863 172.418 131.385)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="87.7453" y2="-2.5" transform="matrix(-0.998935 0.0461398 -0.0427267 -0.999087 233.775 83.8137)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<line y1="-2.5" x2="64.6589" y2="-2.5" transform="matrix(0.165686 -0.986178 0.983932 0.178541 182.158 215.393)" stroke="#C15E50" strokeWidth="5"/>
|
||||
<circle cx="178.934" cy="215.603" r="11.0444" transform="rotate(180 178.934 215.603)" fill="#C15E50"/>
|
||||
<circle cx="192.389" cy="152.597" r="11.5465" transform="rotate(180 192.389 152.597)" fill="#C15E50"/>
|
||||
<circle cx="178.934" cy="84.5506" r="11.0444" transform="rotate(180 178.934 84.5506)" fill="#C15E50"/>
|
||||
|
||||
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
@ -44,10 +44,27 @@ async function init() {
|
||||
|
||||
app.use(morgan("tiny"));
|
||||
|
||||
app.get("/.well-known/oauth-authorization-server", (req, res) => {
|
||||
res.json({
|
||||
issuer: process.env.APP_ORIGIN,
|
||||
authorization_endpoint: `${process.env.APP_ORIGIN}/oauth/authorize`,
|
||||
token_endpoint: `${process.env.APP_ORIGIN}/oauth/token`,
|
||||
registration_endpoint: `${process.env.APP_ORIGIN}/oauth/register`,
|
||||
scopes_supported: ["mcp"],
|
||||
response_types_supported: ["code"],
|
||||
grant_types_supported: [
|
||||
"authorization_code",
|
||||
"refresh_token",
|
||||
"client_credentials",
|
||||
],
|
||||
code_challenge_methods_supported: ["S256"],
|
||||
token_endpoint_auth_methods_supported: ["client_secret_basic", "none"],
|
||||
});
|
||||
});
|
||||
|
||||
// handle SSR requests
|
||||
app.all("*", remixHandler);
|
||||
|
||||
|
||||
const port = process.env.REMIX_APP_PORT || 3000;
|
||||
app.listen(port, () =>
|
||||
console.log(`Express server listening at http://localhost:${port}`),
|
||||
|
||||
@ -32,15 +32,18 @@ services:
|
||||
ports:
|
||||
- "3033:3000"
|
||||
depends_on:
|
||||
- postgres
|
||||
- redis
|
||||
- neo4j
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_started
|
||||
neo4j:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
- core
|
||||
|
||||
postgres:
|
||||
container_name: core-postgres
|
||||
image: postgres:15
|
||||
image: redplanethq/postgres:0.1.0
|
||||
environment:
|
||||
- POSTGRES_USER=${POSTGRES_USER}
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
@ -51,6 +54,12 @@ services:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
networks:
|
||||
- core
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U $POSTGRES_USER"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 10s
|
||||
|
||||
redis:
|
||||
container_name: core-redis
|
||||
@ -72,6 +81,12 @@ services:
|
||||
- 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:
|
||||
|
||||
@ -1,28 +0,0 @@
|
||||
# Automation Workflow Use Cases
|
||||
|
||||
## Persona-Based Automation Workflows
|
||||
|
||||
This document outlines high-impact automation workflows for different personas using our supported integrations: Slack, Github, Google Drive, Linear, Calendar, Claude Code, and Gmail.
|
||||
|
||||
| Rule Name | Description | Persona | Integrations | Importance |
|
||||
|-----------|-------------|---------|-------------|------------|
|
||||
| **Code Review Prioritizer** | Automatically prioritize and assign code reviews based on PR size, dependencies, and team availability | Developer | Github, Slack, Calendar | 9.7 |
|
||||
| **PR to Deployment Tracker** | Track PRs from submission to deployment, notifying stakeholders at each stage with estimated completion times | Developer | Github, Slack, Linear | 9.5 |
|
||||
| **Standup Automator** | Collect daily updates from commit messages and Linear tasks, post summaries to team Slack channel before standups | Developer | Github, Linear, Slack | 9.3 |
|
||||
| **Technical Debt Tracker** | Auto-identify technical debt from code comments and Linear tickets, creating weekly summaries with prioritization suggestions | Developer | Github, Linear, Slack | 9.2 |
|
||||
| **Code Documentation Generator** | Use Claude Code to auto-generate documentation from code changes, adding to Google Drive knowledge base | Developer | Github, Claude Code, Google Drive | 9.1 |
|
||||
| **Sprint Planning Assistant** | Collect Linear backlog items, analyze GitHub PRs, and create pre-populated sprint planning documents | Product Manager | Linear, Github, Google Drive | 9.8 |
|
||||
| **Feature Impact Dashboard** | Track feature usage metrics from analytics, connect to Linear tickets, and generate impact reports | Product Manager | Linear, Gmail, Google Drive | 9.6 |
|
||||
| **Customer Feedback Connector** | Route customer feedback from Gmail to appropriate Linear tickets and notify product team in Slack | Product Manager | Gmail, Linear, Slack | 9.5 |
|
||||
| **Release Notes Automator** | Generate release notes from Linear tickets and GitHub PRs, distribute via Slack and email | Product Manager | Linear, Github, Slack, Gmail | 9.4 |
|
||||
| **Meeting Effectiveness Tracker** | Monitor calendar events, auto-document action items in Linear, and track follow-through | Product Manager | Calendar, Linear, Slack | 9.2 |
|
||||
| **Investor Update Compiler** | Aggregate key metrics from various sources into monthly investor update templates | Founder | Google Drive, Linear, Gmail | 9.9 |
|
||||
| **Competitive Intelligence Monitor** | Monitor competitor activities from various sources, creating summaries with Claude Code | Founder | Gmail, Claude Code, Google Drive | 9.7 |
|
||||
| **Strategic Alignment Tracker** | Connect company OKRs to actual work items in Linear, creating executive dashboards | Founder | Linear, Google Drive, Slack | 9.6 |
|
||||
| **Board Meeting Automator** | Collect data for board meetings, pre-populate slides, and send reminders with preparation materials | Founder | Calendar, Google Drive, Gmail | 9.5 |
|
||||
| **Team Pulse Monitor** | Analyze communication patterns and work distribution to identify burnout risks | Founder | Slack, Github, Linear | 9.3 |
|
||||
| **Deal Stage Progression** | Move deals through pipeline stages based on email interactions and scheduled meetings | Sales | Gmail, Calendar, Slack | 9.8 |
|
||||
| **Proposal Generator** | Auto-generate customized proposals using templates and client-specific data | Sales | Google Drive, Gmail, Claude Code | 9.7 |
|
||||
| **Meeting Follow-up Orchestrator** | Schedule and personalize follow-ups based on meeting notes and conversation topics | Sales | Calendar, Gmail, Slack | 9.6 |
|
||||
| **Competitive Deal Intelligence** | Alert sales team when competitors are mentioned in prospect communications | Sales | Gmail, Slack, Claude Code | 9.4 |
|
||||
| **Customer Success Handoff** | Automate post-sale transition with documentation, training materials, and onboarding schedules | Sales | Gmail, Google Drive, Calendar | 9.3 |
|
||||
@ -58,6 +58,6 @@
|
||||
"commander": "^12.0.0",
|
||||
"openai": "^4.0.0",
|
||||
"react-query": "^3.39.3",
|
||||
"@redplanethq/sdk": "0.1.0"
|
||||
"@redplanethq/sdk": "0.1.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
466
integrations/slack/pnpm-lock.yaml
generated
466
integrations/slack/pnpm-lock.yaml
generated
@ -9,8 +9,8 @@ importers:
|
||||
.:
|
||||
dependencies:
|
||||
'@redplanethq/sdk':
|
||||
specifier: 0.1.0
|
||||
version: 0.1.0
|
||||
specifier: 0.1.1
|
||||
version: 0.1.1
|
||||
axios:
|
||||
specifier: ^1.7.9
|
||||
version: 1.9.0
|
||||
@ -33,18 +33,6 @@ importers:
|
||||
'@babel/preset-typescript':
|
||||
specifier: ^7.26.0
|
||||
version: 7.27.1(@babel/core@7.27.1)
|
||||
'@rollup/plugin-commonjs':
|
||||
specifier: ^28.0.1
|
||||
version: 28.0.3(rollup@4.40.2)
|
||||
'@rollup/plugin-json':
|
||||
specifier: ^6.1.0
|
||||
version: 6.1.0(rollup@4.40.2)
|
||||
'@rollup/plugin-node-resolve':
|
||||
specifier: ^15.3.0
|
||||
version: 15.3.1(rollup@4.40.2)
|
||||
'@rollup/plugin-replace':
|
||||
specifier: ^5.0.7
|
||||
version: 5.0.7(rollup@4.40.2)
|
||||
'@types/node':
|
||||
specifier: ^18.0.20
|
||||
version: 18.19.100
|
||||
@ -56,19 +44,19 @@ importers:
|
||||
version: 10.1.3(eslint@9.26.0)
|
||||
eslint-import-resolver-alias:
|
||||
specifier: ^1.1.2
|
||||
version: 1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0))
|
||||
version: 1.1.2(eslint-plugin-import@2.31.0(eslint@9.26.0))
|
||||
eslint-plugin-import:
|
||||
specifier: ^2.31.0
|
||||
version: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)
|
||||
version: 2.31.0(eslint@9.26.0)
|
||||
eslint-plugin-jest:
|
||||
specifier: ^27.9.0
|
||||
version: 27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5)
|
||||
version: 27.9.0(@typescript-eslint/eslint-plugin@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5)
|
||||
eslint-plugin-prettier:
|
||||
specifier: ^5.2.1
|
||||
version: 5.4.0(eslint-config-prettier@10.1.3(eslint@9.26.0))(eslint@9.26.0)(prettier@3.5.3)
|
||||
eslint-plugin-unused-imports:
|
||||
specifier: ^2.0.0
|
||||
version: 2.0.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)
|
||||
version: 2.0.0(@typescript-eslint/eslint-plugin@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)
|
||||
ncc:
|
||||
specifier: 0.3.6
|
||||
version: 0.3.6
|
||||
@ -78,18 +66,6 @@ importers:
|
||||
rimraf:
|
||||
specifier: ^3.0.2
|
||||
version: 3.0.2
|
||||
rollup:
|
||||
specifier: ^4.28.1
|
||||
version: 4.40.2
|
||||
rollup-plugin-node-polyfills:
|
||||
specifier: ^0.2.1
|
||||
version: 0.2.1
|
||||
rollup-plugin-terser:
|
||||
specifier: ^7.0.2
|
||||
version: 7.0.2(rollup@4.40.2)
|
||||
rollup-plugin-typescript2:
|
||||
specifier: ^0.34.1
|
||||
version: 0.34.1(rollup@4.40.2)(typescript@4.9.5)
|
||||
tslib:
|
||||
specifier: ^2.8.1
|
||||
version: 2.8.1
|
||||
@ -459,9 +435,6 @@ packages:
|
||||
resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
|
||||
'@jridgewell/source-map@0.3.6':
|
||||
resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
|
||||
|
||||
'@jridgewell/sourcemap-codec@1.5.0':
|
||||
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
|
||||
|
||||
@ -492,59 +465,10 @@ packages:
|
||||
resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==}
|
||||
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
|
||||
|
||||
'@redplanethq/sdk@0.1.0':
|
||||
resolution: {integrity: sha512-RmPfT9XESjTSMLlAMkolZEF28PvGo5hlwrG75JQy1tAZkvaTHzC7A2mEAMbsBvOMrJuUztL3NtCmVF//C/C/+A==}
|
||||
'@redplanethq/sdk@0.1.1':
|
||||
resolution: {integrity: sha512-tfR1c9p7vNeCL5jsF9QlEZcRFLsihaHe/ZQWVKZYXzAZ6GugoIFBaayGfVvjNjyEnN3nlrl3usKBX+hhaKzg0g==}
|
||||
engines: {node: '>=18.0.0'}
|
||||
|
||||
'@rollup/plugin-commonjs@28.0.3':
|
||||
resolution: {integrity: sha512-pyltgilam1QPdn+Zd9gaCfOLcnjMEJ9gV+bTw6/r73INdvzf1ah9zLIJBm+kW7R6IUFIQ1YO+VqZtYxZNWFPEQ==}
|
||||
engines: {node: '>=16.0.0 || 14 >= 14.17'}
|
||||
peerDependencies:
|
||||
rollup: ^2.68.0||^3.0.0||^4.0.0
|
||||
peerDependenciesMeta:
|
||||
rollup:
|
||||
optional: true
|
||||
|
||||
'@rollup/plugin-json@6.1.0':
|
||||
resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
peerDependencies:
|
||||
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
|
||||
peerDependenciesMeta:
|
||||
rollup:
|
||||
optional: true
|
||||
|
||||
'@rollup/plugin-node-resolve@15.3.1':
|
||||
resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
peerDependencies:
|
||||
rollup: ^2.78.0||^3.0.0||^4.0.0
|
||||
peerDependenciesMeta:
|
||||
rollup:
|
||||
optional: true
|
||||
|
||||
'@rollup/plugin-replace@5.0.7':
|
||||
resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
peerDependencies:
|
||||
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
|
||||
peerDependenciesMeta:
|
||||
rollup:
|
||||
optional: true
|
||||
|
||||
'@rollup/pluginutils@4.2.1':
|
||||
resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
|
||||
engines: {node: '>= 8.0.0'}
|
||||
|
||||
'@rollup/pluginutils@5.1.4':
|
||||
resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
peerDependencies:
|
||||
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
|
||||
peerDependenciesMeta:
|
||||
rollup:
|
||||
optional: true
|
||||
|
||||
'@rollup/rollup-android-arm-eabi@4.40.2':
|
||||
resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==}
|
||||
cpu: [arm]
|
||||
@ -663,9 +587,6 @@ packages:
|
||||
'@types/node@18.19.100':
|
||||
resolution: {integrity: sha512-ojmMP8SZBKprc3qGrGk8Ujpo80AXkrP7G2tOT4VWr5jlr5DHjsJF+emXJz+Wm0glmy4Js62oKMdZZ6B9Y+tEcA==}
|
||||
|
||||
'@types/resolve@1.20.2':
|
||||
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
|
||||
|
||||
'@types/semver@7.7.0':
|
||||
resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==}
|
||||
|
||||
@ -680,16 +601,6 @@ packages:
|
||||
typescript:
|
||||
optional: true
|
||||
|
||||
'@typescript-eslint/parser@5.62.0':
|
||||
resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
|
||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||
peerDependencies:
|
||||
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
|
||||
typescript: '*'
|
||||
peerDependenciesMeta:
|
||||
typescript:
|
||||
optional: true
|
||||
|
||||
'@typescript-eslint/scope-manager@5.62.0':
|
||||
resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==}
|
||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||
@ -845,9 +756,6 @@ packages:
|
||||
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
|
||||
hasBin: true
|
||||
|
||||
buffer-from@1.1.2:
|
||||
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
|
||||
|
||||
bundle-require@5.1.0:
|
||||
resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==}
|
||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||
@ -912,16 +820,10 @@ packages:
|
||||
resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==}
|
||||
engines: {node: '>=20'}
|
||||
|
||||
commander@2.20.3:
|
||||
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
|
||||
|
||||
commander@4.1.1:
|
||||
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
|
||||
engines: {node: '>= 6'}
|
||||
|
||||
commondir@1.0.1:
|
||||
resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
|
||||
|
||||
concat-map@0.0.1:
|
||||
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
|
||||
|
||||
@ -991,10 +893,6 @@ packages:
|
||||
deep-is@0.1.4:
|
||||
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
|
||||
|
||||
deepmerge@4.3.1:
|
||||
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
define-data-property@1.1.4:
|
||||
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@ -1222,12 +1120,6 @@ packages:
|
||||
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
|
||||
engines: {node: '>=4.0'}
|
||||
|
||||
estree-walker@0.6.1:
|
||||
resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==}
|
||||
|
||||
estree-walker@2.0.2:
|
||||
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
|
||||
|
||||
esutils@2.0.3:
|
||||
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@ -1297,14 +1189,6 @@ packages:
|
||||
resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
find-cache-dir@3.3.2:
|
||||
resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
find-up@4.1.0:
|
||||
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
find-up@5.0.0:
|
||||
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
|
||||
engines: {node: '>=10'}
|
||||
@ -1352,10 +1236,6 @@ packages:
|
||||
resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
|
||||
engines: {node: '>= 0.8'}
|
||||
|
||||
fs-extra@10.1.0:
|
||||
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
|
||||
engines: {node: '>=12'}
|
||||
|
||||
fs.realpath@1.0.0:
|
||||
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
|
||||
|
||||
@ -1426,9 +1306,6 @@ packages:
|
||||
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
graceful-fs@4.2.11:
|
||||
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
|
||||
|
||||
graphemer@1.4.0:
|
||||
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
|
||||
|
||||
@ -1553,9 +1430,6 @@ packages:
|
||||
resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
is-module@1.0.0:
|
||||
resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
|
||||
|
||||
is-number-object@1.1.1:
|
||||
resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@ -1567,9 +1441,6 @@ packages:
|
||||
is-promise@4.0.0:
|
||||
resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
|
||||
|
||||
is-reference@1.2.1:
|
||||
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
|
||||
|
||||
is-regex@1.2.1:
|
||||
resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@ -1615,10 +1486,6 @@ packages:
|
||||
jackspeak@3.4.3:
|
||||
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
|
||||
|
||||
jest-worker@26.6.2:
|
||||
resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
|
||||
engines: {node: '>= 10.13.0'}
|
||||
|
||||
joycon@3.1.1:
|
||||
resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
|
||||
engines: {node: '>=10'}
|
||||
@ -1656,9 +1523,6 @@ packages:
|
||||
engines: {node: '>=6'}
|
||||
hasBin: true
|
||||
|
||||
jsonfile@6.1.0:
|
||||
resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
|
||||
|
||||
keyv@4.5.4:
|
||||
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
|
||||
|
||||
@ -1677,10 +1541,6 @@ packages:
|
||||
resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
|
||||
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
|
||||
|
||||
locate-path@5.0.0:
|
||||
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
locate-path@6.0.0:
|
||||
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
|
||||
engines: {node: '>=10'}
|
||||
@ -1701,16 +1561,6 @@ packages:
|
||||
lru-cache@5.1.1:
|
||||
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
|
||||
|
||||
magic-string@0.25.9:
|
||||
resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
|
||||
|
||||
magic-string@0.30.17:
|
||||
resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
|
||||
|
||||
make-dir@3.1.0:
|
||||
resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
match-sorter@6.3.4:
|
||||
resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==}
|
||||
|
||||
@ -1726,9 +1576,6 @@ packages:
|
||||
resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
|
||||
engines: {node: '>=18'}
|
||||
|
||||
merge-stream@2.0.0:
|
||||
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
|
||||
|
||||
merge2@1.4.1:
|
||||
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
|
||||
engines: {node: '>= 8'}
|
||||
@ -1876,26 +1723,14 @@ packages:
|
||||
resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
p-limit@2.3.0:
|
||||
resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
p-limit@3.1.0:
|
||||
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
p-locate@4.1.0:
|
||||
resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
p-locate@5.0.0:
|
||||
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
p-try@2.2.0:
|
||||
resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
|
||||
engines: {node: '>=6'}
|
||||
|
||||
package-json-from-dist@1.0.1:
|
||||
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
|
||||
|
||||
@ -1953,10 +1788,6 @@ packages:
|
||||
resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
|
||||
pkg-dir@4.2.0:
|
||||
resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
possible-typed-array-names@1.1.0:
|
||||
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@ -2014,9 +1845,6 @@ packages:
|
||||
queue-microtask@1.2.3:
|
||||
resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
|
||||
|
||||
randombytes@2.1.0:
|
||||
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
|
||||
|
||||
range-parser@1.2.1:
|
||||
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
|
||||
engines: {node: '>= 0.6'}
|
||||
@ -2088,28 +1916,6 @@ packages:
|
||||
deprecated: Rimraf versions prior to v4 are no longer supported
|
||||
hasBin: true
|
||||
|
||||
rollup-plugin-inject@3.0.2:
|
||||
resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==}
|
||||
deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.
|
||||
|
||||
rollup-plugin-node-polyfills@0.2.1:
|
||||
resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==}
|
||||
|
||||
rollup-plugin-terser@7.0.2:
|
||||
resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==}
|
||||
deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser
|
||||
peerDependencies:
|
||||
rollup: ^2.0.0
|
||||
|
||||
rollup-plugin-typescript2@0.34.1:
|
||||
resolution: {integrity: sha512-P4cHLtGikESmqi1CA+tdMDUv8WbQV48mzPYt77TSTOPJpERyZ9TXdDgjSDix8Fkqce6soYz3+fa4lrC93IEkcw==}
|
||||
peerDependencies:
|
||||
rollup: '>=1.26.3'
|
||||
typescript: '>=2.4.0'
|
||||
|
||||
rollup-pluginutils@2.8.2:
|
||||
resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==}
|
||||
|
||||
rollup@4.40.2:
|
||||
resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==}
|
||||
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
|
||||
@ -2159,9 +1965,6 @@ packages:
|
||||
resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==}
|
||||
engines: {node: '>= 18'}
|
||||
|
||||
serialize-javascript@4.0.0:
|
||||
resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==}
|
||||
|
||||
serve-static@2.2.0:
|
||||
resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==}
|
||||
engines: {node: '>= 18'}
|
||||
@ -2217,21 +2020,10 @@ packages:
|
||||
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
source-map-support@0.5.21:
|
||||
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
|
||||
|
||||
source-map@0.6.1:
|
||||
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
source-map@0.8.0-beta.0:
|
||||
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
sourcemap-codec@1.4.8:
|
||||
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
|
||||
deprecated: Please use @jridgewell/sourcemap-codec instead
|
||||
|
||||
statuses@2.0.1:
|
||||
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
|
||||
engines: {node: '>= 0.8'}
|
||||
@ -2289,11 +2081,6 @@ packages:
|
||||
resolution: {integrity: sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==}
|
||||
engines: {node: ^14.18.0 || >=16.0.0}
|
||||
|
||||
terser@5.39.0:
|
||||
resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==}
|
||||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
|
||||
thenify-all@1.6.0:
|
||||
resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
|
||||
engines: {node: '>=0.8'}
|
||||
@ -2410,10 +2197,6 @@ packages:
|
||||
undici-types@5.26.5:
|
||||
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
|
||||
|
||||
universalify@2.0.1:
|
||||
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
|
||||
unload@2.2.0:
|
||||
resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==}
|
||||
|
||||
@ -2861,11 +2644,6 @@ snapshots:
|
||||
|
||||
'@jridgewell/set-array@1.2.1': {}
|
||||
|
||||
'@jridgewell/source-map@0.3.6':
|
||||
dependencies:
|
||||
'@jridgewell/gen-mapping': 0.3.8
|
||||
'@jridgewell/trace-mapping': 0.3.25
|
||||
|
||||
'@jridgewell/sourcemap-codec@1.5.0': {}
|
||||
|
||||
'@jridgewell/trace-mapping@0.3.25':
|
||||
@ -2905,58 +2683,10 @@ snapshots:
|
||||
|
||||
'@pkgr/core@0.2.4': {}
|
||||
|
||||
'@redplanethq/sdk@0.1.0':
|
||||
'@redplanethq/sdk@0.1.1':
|
||||
dependencies:
|
||||
commander: 14.0.0
|
||||
|
||||
'@rollup/plugin-commonjs@28.0.3(rollup@4.40.2)':
|
||||
dependencies:
|
||||
'@rollup/pluginutils': 5.1.4(rollup@4.40.2)
|
||||
commondir: 1.0.1
|
||||
estree-walker: 2.0.2
|
||||
fdir: 6.4.4(picomatch@4.0.2)
|
||||
is-reference: 1.2.1
|
||||
magic-string: 0.30.17
|
||||
picomatch: 4.0.2
|
||||
optionalDependencies:
|
||||
rollup: 4.40.2
|
||||
|
||||
'@rollup/plugin-json@6.1.0(rollup@4.40.2)':
|
||||
dependencies:
|
||||
'@rollup/pluginutils': 5.1.4(rollup@4.40.2)
|
||||
optionalDependencies:
|
||||
rollup: 4.40.2
|
||||
|
||||
'@rollup/plugin-node-resolve@15.3.1(rollup@4.40.2)':
|
||||
dependencies:
|
||||
'@rollup/pluginutils': 5.1.4(rollup@4.40.2)
|
||||
'@types/resolve': 1.20.2
|
||||
deepmerge: 4.3.1
|
||||
is-module: 1.0.0
|
||||
resolve: 1.22.10
|
||||
optionalDependencies:
|
||||
rollup: 4.40.2
|
||||
|
||||
'@rollup/plugin-replace@5.0.7(rollup@4.40.2)':
|
||||
dependencies:
|
||||
'@rollup/pluginutils': 5.1.4(rollup@4.40.2)
|
||||
magic-string: 0.30.17
|
||||
optionalDependencies:
|
||||
rollup: 4.40.2
|
||||
|
||||
'@rollup/pluginutils@4.2.1':
|
||||
dependencies:
|
||||
estree-walker: 2.0.2
|
||||
picomatch: 2.3.1
|
||||
|
||||
'@rollup/pluginutils@5.1.4(rollup@4.40.2)':
|
||||
dependencies:
|
||||
'@types/estree': 1.0.7
|
||||
estree-walker: 2.0.2
|
||||
picomatch: 4.0.2
|
||||
optionalDependencies:
|
||||
rollup: 4.40.2
|
||||
|
||||
'@rollup/rollup-android-arm-eabi@4.40.2':
|
||||
optional: true
|
||||
|
||||
@ -3034,14 +2764,11 @@ snapshots:
|
||||
dependencies:
|
||||
undici-types: 5.26.5
|
||||
|
||||
'@types/resolve@1.20.2': {}
|
||||
|
||||
'@types/semver@7.7.0': {}
|
||||
|
||||
'@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5)':
|
||||
'@typescript-eslint/eslint-plugin@5.62.0(eslint@9.26.0)(typescript@4.9.5)':
|
||||
dependencies:
|
||||
'@eslint-community/regexpp': 4.12.1
|
||||
'@typescript-eslint/parser': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
|
||||
'@typescript-eslint/scope-manager': 5.62.0
|
||||
'@typescript-eslint/type-utils': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
|
||||
'@typescript-eslint/utils': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
|
||||
@ -3058,19 +2785,6 @@ snapshots:
|
||||
- supports-color
|
||||
optional: true
|
||||
|
||||
'@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5)':
|
||||
dependencies:
|
||||
'@typescript-eslint/scope-manager': 5.62.0
|
||||
'@typescript-eslint/types': 5.62.0
|
||||
'@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5)
|
||||
debug: 4.4.0
|
||||
eslint: 9.26.0
|
||||
optionalDependencies:
|
||||
typescript: 4.9.5
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
optional: true
|
||||
|
||||
'@typescript-eslint/scope-manager@5.62.0':
|
||||
dependencies:
|
||||
'@typescript-eslint/types': 5.62.0
|
||||
@ -3280,8 +2994,6 @@ snapshots:
|
||||
node-releases: 2.0.19
|
||||
update-browserslist-db: 1.1.3(browserslist@4.24.5)
|
||||
|
||||
buffer-from@1.1.2: {}
|
||||
|
||||
bundle-require@5.1.0(esbuild@0.25.4):
|
||||
dependencies:
|
||||
esbuild: 0.25.4
|
||||
@ -3337,12 +3049,8 @@ snapshots:
|
||||
|
||||
commander@14.0.0: {}
|
||||
|
||||
commander@2.20.3: {}
|
||||
|
||||
commander@4.1.1: {}
|
||||
|
||||
commondir@1.0.1: {}
|
||||
|
||||
concat-map@0.0.1: {}
|
||||
|
||||
consola@3.4.2: {}
|
||||
@ -3400,8 +3108,6 @@ snapshots:
|
||||
|
||||
deep-is@0.1.4: {}
|
||||
|
||||
deepmerge@4.3.1: {}
|
||||
|
||||
define-data-property@1.1.4:
|
||||
dependencies:
|
||||
es-define-property: 1.0.1
|
||||
@ -3563,9 +3269,9 @@ snapshots:
|
||||
dependencies:
|
||||
eslint: 9.26.0
|
||||
|
||||
eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)):
|
||||
eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.31.0(eslint@9.26.0)):
|
||||
dependencies:
|
||||
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)
|
||||
eslint-plugin-import: 2.31.0(eslint@9.26.0)
|
||||
|
||||
eslint-import-resolver-node@0.3.9:
|
||||
dependencies:
|
||||
@ -3575,17 +3281,16 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0):
|
||||
eslint-module-utils@2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.26.0):
|
||||
dependencies:
|
||||
debug: 3.2.7
|
||||
optionalDependencies:
|
||||
'@typescript-eslint/parser': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
|
||||
eslint: 9.26.0
|
||||
eslint-import-resolver-node: 0.3.9
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0):
|
||||
eslint-plugin-import@2.31.0(eslint@9.26.0):
|
||||
dependencies:
|
||||
'@rtsao/scc': 1.1.0
|
||||
array-includes: 3.1.8
|
||||
@ -3596,7 +3301,7 @@ snapshots:
|
||||
doctrine: 2.1.0
|
||||
eslint: 9.26.0
|
||||
eslint-import-resolver-node: 0.3.9
|
||||
eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@9.26.0)
|
||||
eslint-module-utils: 2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.26.0)
|
||||
hasown: 2.0.2
|
||||
is-core-module: 2.16.1
|
||||
is-glob: 4.0.3
|
||||
@ -3607,19 +3312,17 @@ snapshots:
|
||||
semver: 6.3.1
|
||||
string.prototype.trimend: 1.0.9
|
||||
tsconfig-paths: 3.15.0
|
||||
optionalDependencies:
|
||||
'@typescript-eslint/parser': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
|
||||
transitivePeerDependencies:
|
||||
- eslint-import-resolver-typescript
|
||||
- eslint-import-resolver-webpack
|
||||
- supports-color
|
||||
|
||||
eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5):
|
||||
eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5):
|
||||
dependencies:
|
||||
'@typescript-eslint/utils': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
|
||||
eslint: 9.26.0
|
||||
optionalDependencies:
|
||||
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5)
|
||||
'@typescript-eslint/eslint-plugin': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
- typescript
|
||||
@ -3633,12 +3336,12 @@ snapshots:
|
||||
optionalDependencies:
|
||||
eslint-config-prettier: 10.1.3(eslint@9.26.0)
|
||||
|
||||
eslint-plugin-unused-imports@2.0.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0):
|
||||
eslint-plugin-unused-imports@2.0.0(@typescript-eslint/eslint-plugin@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0):
|
||||
dependencies:
|
||||
eslint: 9.26.0
|
||||
eslint-rule-composer: 0.3.0
|
||||
optionalDependencies:
|
||||
'@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@4.9.5))(eslint@9.26.0)(typescript@4.9.5)
|
||||
'@typescript-eslint/eslint-plugin': 5.62.0(eslint@9.26.0)(typescript@4.9.5)
|
||||
|
||||
eslint-rule-composer@0.3.0: {}
|
||||
|
||||
@ -3716,10 +3419,6 @@ snapshots:
|
||||
|
||||
estraverse@5.3.0: {}
|
||||
|
||||
estree-walker@0.6.1: {}
|
||||
|
||||
estree-walker@2.0.2: {}
|
||||
|
||||
esutils@2.0.3: {}
|
||||
|
||||
etag@1.8.1: {}
|
||||
@ -3811,17 +3510,6 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
find-cache-dir@3.3.2:
|
||||
dependencies:
|
||||
commondir: 1.0.1
|
||||
make-dir: 3.1.0
|
||||
pkg-dir: 4.2.0
|
||||
|
||||
find-up@4.1.0:
|
||||
dependencies:
|
||||
locate-path: 5.0.0
|
||||
path-exists: 4.0.0
|
||||
|
||||
find-up@5.0.0:
|
||||
dependencies:
|
||||
locate-path: 6.0.0
|
||||
@ -3863,12 +3551,6 @@ snapshots:
|
||||
|
||||
fresh@2.0.0: {}
|
||||
|
||||
fs-extra@10.1.0:
|
||||
dependencies:
|
||||
graceful-fs: 4.2.11
|
||||
jsonfile: 6.1.0
|
||||
universalify: 2.0.1
|
||||
|
||||
fs.realpath@1.0.0: {}
|
||||
|
||||
fsevents@2.3.3:
|
||||
@ -3959,8 +3641,6 @@ snapshots:
|
||||
|
||||
gopd@1.2.0: {}
|
||||
|
||||
graceful-fs@4.2.11: {}
|
||||
|
||||
graphemer@1.4.0:
|
||||
optional: true
|
||||
|
||||
@ -4087,8 +3767,6 @@ snapshots:
|
||||
|
||||
is-map@2.0.3: {}
|
||||
|
||||
is-module@1.0.0: {}
|
||||
|
||||
is-number-object@1.1.1:
|
||||
dependencies:
|
||||
call-bound: 1.0.4
|
||||
@ -4098,10 +3776,6 @@ snapshots:
|
||||
|
||||
is-promise@4.0.0: {}
|
||||
|
||||
is-reference@1.2.1:
|
||||
dependencies:
|
||||
'@types/estree': 1.0.7
|
||||
|
||||
is-regex@1.2.1:
|
||||
dependencies:
|
||||
call-bound: 1.0.4
|
||||
@ -4151,12 +3825,6 @@ snapshots:
|
||||
optionalDependencies:
|
||||
'@pkgjs/parseargs': 0.11.0
|
||||
|
||||
jest-worker@26.6.2:
|
||||
dependencies:
|
||||
'@types/node': 18.19.100
|
||||
merge-stream: 2.0.0
|
||||
supports-color: 7.2.0
|
||||
|
||||
joycon@3.1.1: {}
|
||||
|
||||
js-sha3@0.8.0: {}
|
||||
@ -4181,12 +3849,6 @@ snapshots:
|
||||
|
||||
json5@2.2.3: {}
|
||||
|
||||
jsonfile@6.1.0:
|
||||
dependencies:
|
||||
universalify: 2.0.1
|
||||
optionalDependencies:
|
||||
graceful-fs: 4.2.11
|
||||
|
||||
keyv@4.5.4:
|
||||
dependencies:
|
||||
json-buffer: 3.0.1
|
||||
@ -4202,10 +3864,6 @@ snapshots:
|
||||
|
||||
load-tsconfig@0.2.5: {}
|
||||
|
||||
locate-path@5.0.0:
|
||||
dependencies:
|
||||
p-locate: 4.1.0
|
||||
|
||||
locate-path@6.0.0:
|
||||
dependencies:
|
||||
p-locate: 5.0.0
|
||||
@ -4224,18 +3882,6 @@ snapshots:
|
||||
dependencies:
|
||||
yallist: 3.1.1
|
||||
|
||||
magic-string@0.25.9:
|
||||
dependencies:
|
||||
sourcemap-codec: 1.4.8
|
||||
|
||||
magic-string@0.30.17:
|
||||
dependencies:
|
||||
'@jridgewell/sourcemap-codec': 1.5.0
|
||||
|
||||
make-dir@3.1.0:
|
||||
dependencies:
|
||||
semver: 6.3.1
|
||||
|
||||
match-sorter@6.3.4:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.27.1
|
||||
@ -4247,8 +3893,6 @@ snapshots:
|
||||
|
||||
merge-descriptors@2.0.0: {}
|
||||
|
||||
merge-stream@2.0.0: {}
|
||||
|
||||
merge2@1.4.1: {}
|
||||
|
||||
micromatch@4.0.8:
|
||||
@ -4400,24 +4044,14 @@ snapshots:
|
||||
object-keys: 1.1.1
|
||||
safe-push-apply: 1.0.0
|
||||
|
||||
p-limit@2.3.0:
|
||||
dependencies:
|
||||
p-try: 2.2.0
|
||||
|
||||
p-limit@3.1.0:
|
||||
dependencies:
|
||||
yocto-queue: 0.1.0
|
||||
|
||||
p-locate@4.1.0:
|
||||
dependencies:
|
||||
p-limit: 2.3.0
|
||||
|
||||
p-locate@5.0.0:
|
||||
dependencies:
|
||||
p-limit: 3.1.0
|
||||
|
||||
p-try@2.2.0: {}
|
||||
|
||||
package-json-from-dist@1.0.1: {}
|
||||
|
||||
parent-module@1.0.1:
|
||||
@ -4453,10 +4087,6 @@ snapshots:
|
||||
|
||||
pkce-challenge@5.0.0: {}
|
||||
|
||||
pkg-dir@4.2.0:
|
||||
dependencies:
|
||||
find-up: 4.1.0
|
||||
|
||||
possible-typed-array-names@1.1.0: {}
|
||||
|
||||
postcss-load-config@6.0.1(postcss@8.5.3)(yaml@2.7.1):
|
||||
@ -4496,10 +4126,6 @@ snapshots:
|
||||
|
||||
queue-microtask@1.2.3: {}
|
||||
|
||||
randombytes@2.1.0:
|
||||
dependencies:
|
||||
safe-buffer: 5.2.1
|
||||
|
||||
range-parser@1.2.1: {}
|
||||
|
||||
raw-body@3.0.0:
|
||||
@ -4572,38 +4198,6 @@ snapshots:
|
||||
dependencies:
|
||||
glob: 7.2.3
|
||||
|
||||
rollup-plugin-inject@3.0.2:
|
||||
dependencies:
|
||||
estree-walker: 0.6.1
|
||||
magic-string: 0.25.9
|
||||
rollup-pluginutils: 2.8.2
|
||||
|
||||
rollup-plugin-node-polyfills@0.2.1:
|
||||
dependencies:
|
||||
rollup-plugin-inject: 3.0.2
|
||||
|
||||
rollup-plugin-terser@7.0.2(rollup@4.40.2):
|
||||
dependencies:
|
||||
'@babel/code-frame': 7.27.1
|
||||
jest-worker: 26.6.2
|
||||
rollup: 4.40.2
|
||||
serialize-javascript: 4.0.0
|
||||
terser: 5.39.0
|
||||
|
||||
rollup-plugin-typescript2@0.34.1(rollup@4.40.2)(typescript@4.9.5):
|
||||
dependencies:
|
||||
'@rollup/pluginutils': 4.2.1
|
||||
find-cache-dir: 3.3.2
|
||||
fs-extra: 10.1.0
|
||||
rollup: 4.40.2
|
||||
semver: 7.7.1
|
||||
tslib: 2.8.1
|
||||
typescript: 4.9.5
|
||||
|
||||
rollup-pluginutils@2.8.2:
|
||||
dependencies:
|
||||
estree-walker: 0.6.1
|
||||
|
||||
rollup@4.40.2:
|
||||
dependencies:
|
||||
'@types/estree': 1.0.7
|
||||
@ -4693,10 +4287,6 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
serialize-javascript@4.0.0:
|
||||
dependencies:
|
||||
randombytes: 2.1.0
|
||||
|
||||
serve-static@2.2.0:
|
||||
dependencies:
|
||||
encodeurl: 2.0.0
|
||||
@ -4771,19 +4361,10 @@ snapshots:
|
||||
source-map-js@1.2.1:
|
||||
optional: true
|
||||
|
||||
source-map-support@0.5.21:
|
||||
dependencies:
|
||||
buffer-from: 1.1.2
|
||||
source-map: 0.6.1
|
||||
|
||||
source-map@0.6.1: {}
|
||||
|
||||
source-map@0.8.0-beta.0:
|
||||
dependencies:
|
||||
whatwg-url: 7.1.0
|
||||
|
||||
sourcemap-codec@1.4.8: {}
|
||||
|
||||
statuses@2.0.1: {}
|
||||
|
||||
string-width@4.2.3:
|
||||
@ -4854,13 +4435,6 @@ snapshots:
|
||||
'@pkgr/core': 0.2.4
|
||||
tslib: 2.8.1
|
||||
|
||||
terser@5.39.0:
|
||||
dependencies:
|
||||
'@jridgewell/source-map': 0.3.6
|
||||
acorn: 8.14.1
|
||||
commander: 2.20.3
|
||||
source-map-support: 0.5.21
|
||||
|
||||
thenify-all@1.6.0:
|
||||
dependencies:
|
||||
thenify: 3.3.1
|
||||
@ -5000,8 +4574,6 @@ snapshots:
|
||||
|
||||
undici-types@5.26.5: {}
|
||||
|
||||
universalify@2.0.1: {}
|
||||
|
||||
unload@2.2.0:
|
||||
dependencies:
|
||||
'@babel/runtime': 7.27.1
|
||||
|
||||
@ -5,10 +5,11 @@
|
||||
"icon": "slack",
|
||||
"mcp": {
|
||||
"type": "stdio",
|
||||
"url": "",
|
||||
"args": [ ],
|
||||
"url": "https://integrations.heysol.ai/slack/mcp/slack-mcp-server",
|
||||
"args": [],
|
||||
"env": {
|
||||
"SLACK_MCP_XOXP_TOKEN": "${config:access_token}"
|
||||
"SLACK_MCP_XOXP_TOKEN": "${config:access_token}",
|
||||
"SLACK_MCP_ADD_MESSAGE_TOOL": true
|
||||
}
|
||||
},
|
||||
"auth": {
|
||||
|
||||
@ -1,9 +1,6 @@
|
||||
import axios from 'axios';
|
||||
|
||||
export async function integrationCreate(
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
data: any,
|
||||
integrationDefinition: any,
|
||||
) {
|
||||
const { oauthResponse } = data;
|
||||
const integrationConfiguration = {
|
||||
@ -14,14 +11,14 @@ export async function integrationCreate(
|
||||
scope: oauthResponse.authed_user.scope,
|
||||
};
|
||||
|
||||
const payload = {
|
||||
settings: {},
|
||||
accountId: integrationConfiguration.userId,
|
||||
config: integrationConfiguration,
|
||||
integrationDefinitionId: integrationDefinition.id,
|
||||
};
|
||||
|
||||
const integrationAccount = (await axios.post(`/api/v1/integration_account`, payload)).data;
|
||||
|
||||
return integrationAccount;
|
||||
return [
|
||||
{
|
||||
type: 'account',
|
||||
data: {
|
||||
settings: {},
|
||||
accountId: integrationConfiguration.userId,
|
||||
config: integrationConfiguration,
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
@ -3,6 +3,23 @@ import axios from 'axios';
|
||||
|
||||
import { getUserDetails } from './utils';
|
||||
|
||||
interface SlackActivityCreateParams {
|
||||
text: string;
|
||||
sourceURL: string;
|
||||
}
|
||||
/**
|
||||
* Creates an activity message based on Linear data
|
||||
*/
|
||||
function createActivityMessage(params: SlackActivityCreateParams) {
|
||||
return {
|
||||
type: 'activity',
|
||||
data: {
|
||||
text: params.text,
|
||||
sourceURL: params.sourceURL,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
async function getMessage(accessToken: string, channel: string, ts: string) {
|
||||
const result = await axios.get('https://slack.com/api/conversations.history', {
|
||||
headers: {
|
||||
@ -64,7 +81,7 @@ export const createActivityEvent = async (
|
||||
taskId: null,
|
||||
};
|
||||
|
||||
await axios.post('/api/v1/activity', activity);
|
||||
return createActivityMessage(activity);
|
||||
}
|
||||
|
||||
if (eventData.event.type === 'reaction_added' && eventData.event.reaction === 'eyes') {
|
||||
@ -120,7 +137,7 @@ export const createActivityEvent = async (
|
||||
integrationAccountId: config.integrationAccountId,
|
||||
};
|
||||
|
||||
await axios.post('/api/v1/activity', activity);
|
||||
return createActivityMessage(activity);
|
||||
}
|
||||
return { message: `Processed activity from slack` };
|
||||
};
|
||||
|
||||
@ -10,7 +10,7 @@ import {
|
||||
export async function run(eventPayload: IntegrationEventPayload) {
|
||||
switch (eventPayload.event) {
|
||||
case IntegrationEventType.SETUP:
|
||||
return await integrationCreate(eventPayload.eventBody, eventPayload.integrationDefinition);
|
||||
return await integrationCreate(eventPayload.eventBody);
|
||||
|
||||
case IntegrationEventType.IDENTIFY:
|
||||
return eventPayload.eventBody.event.user;
|
||||
@ -40,12 +40,10 @@ class SlackCLI extends IntegrationCLI {
|
||||
description: 'Connect your workspace to Slack. Run your workflows from slack bookmarks',
|
||||
icon: 'slack',
|
||||
mcp: {
|
||||
command: 'npx',
|
||||
args: ['-y', '@modelcontextprotocol/server-slack'],
|
||||
command: 'slack-mcp-server',
|
||||
args: [],
|
||||
env: {
|
||||
SLACK_BOT_TOKEN: '${config:access_token}',
|
||||
SLACK_TEAM_ID: '${config:team_id}',
|
||||
SLACK_CHANNEL_IDS: '${config:channel_ids}',
|
||||
SLACK_MCP_XOXP_TOKEN: '${config:access_token}',
|
||||
},
|
||||
},
|
||||
auth: {
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "core",
|
||||
"private": true,
|
||||
"version": "0.1.10",
|
||||
"version": "0.1.11",
|
||||
"workspaces": [
|
||||
"apps/*",
|
||||
"packages/*"
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@redplanethq/core",
|
||||
"version": "0.1.6",
|
||||
"version": "0.1.8",
|
||||
"description": "A Command-Line Interface for Core",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
||||
@ -2,24 +2,19 @@ import { Command } from "commander";
|
||||
import { initCommand } from "../commands/init.js";
|
||||
import { startCommand } from "../commands/start.js";
|
||||
import { stopCommand } from "../commands/stop.js";
|
||||
import { VERSION } from "./version.js";
|
||||
|
||||
const program = new Command();
|
||||
|
||||
program.name("core").description("Core CLI - A Command-Line Interface for Core").version("0.1.0");
|
||||
program.name("core").description("Core CLI - A Command-Line Interface for Core").version(VERSION);
|
||||
|
||||
program
|
||||
.command("init")
|
||||
.description("Initialize Core development environment (run once)")
|
||||
.action(initCommand);
|
||||
|
||||
program
|
||||
.command("start")
|
||||
.description("Start Core development environment")
|
||||
.action(startCommand);
|
||||
program.command("start").description("Start Core development environment").action(startCommand);
|
||||
|
||||
program
|
||||
.command("stop")
|
||||
.description("Stop Core development environment")
|
||||
.action(stopCommand);
|
||||
program.command("stop").description("Stop Core development environment").action(stopCommand);
|
||||
|
||||
program.parse(process.argv);
|
||||
|
||||
1
packages/core-cli/src/cli/version.ts
Normal file
1
packages/core-cli/src/cli/version.ts
Normal file
@ -0,0 +1 @@
|
||||
export const VERSION = "0.1.7";
|
||||
@ -10,6 +10,8 @@ import { deployTriggerTasks } from "../utils/trigger-deploy.js";
|
||||
import path from "path";
|
||||
import * as fs from "fs";
|
||||
import { createTriggerConfigJson, initTriggerDatabase } from "../utils/database-init.js";
|
||||
import { parse } from "dotenv";
|
||||
import { expand } from "dotenv-expand";
|
||||
|
||||
export async function initCommand() {
|
||||
// Display the CORE brain logo
|
||||
@ -179,10 +181,17 @@ export async function initCommand() {
|
||||
|
||||
// Step 12: Restart root docker-compose with new configuration
|
||||
try {
|
||||
const file = fs.readFileSync(envPath);
|
||||
|
||||
const parsed = parse(file);
|
||||
const envVarsExpand = expand({ parsed, processEnv: {} }).parsed || {};
|
||||
|
||||
console.log(envVarsExpand);
|
||||
await executeCommandInteractive("docker compose up -d", {
|
||||
cwd: rootDir,
|
||||
message: "Starting Core services with new Trigger.dev configuration...",
|
||||
showOutput: true,
|
||||
env: envVarsExpand,
|
||||
});
|
||||
} catch (error: any) {
|
||||
outro("❌ Setup failed: " + error.message);
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
import { intro, outro, note, log, confirm } from "@clack/prompts";
|
||||
import { intro, outro, note, log } from "@clack/prompts";
|
||||
import { executeCommandInteractive } from "../utils/docker-interactive.js";
|
||||
import { printCoreBrainLogo } from "../utils/ascii.js";
|
||||
import path from "path";
|
||||
import * as fs from "fs";
|
||||
|
||||
export async function startCommand() {
|
||||
// Display the CORE brain logo
|
||||
@ -10,9 +11,19 @@ export async function startCommand() {
|
||||
intro("🚀 Starting Core Development Environment");
|
||||
|
||||
// Step 1: Confirm this is the Core repository
|
||||
const isCoreRepo = await confirm({
|
||||
message: "Are you currently in the Core repository directory?",
|
||||
});
|
||||
// Check if package.json name has "core" in it, else exit
|
||||
const pkgPath = path.join(process.cwd(), "package.json");
|
||||
let isCoreRepo = false;
|
||||
try {
|
||||
if (fs.existsSync(pkgPath)) {
|
||||
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
||||
if (typeof pkg.name === "string" && pkg.name.includes("core")) {
|
||||
isCoreRepo = true;
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
// ignore, will prompt below
|
||||
}
|
||||
|
||||
if (!isCoreRepo) {
|
||||
note(
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
import { intro, outro, log, confirm, note } from "@clack/prompts";
|
||||
import { intro, outro, log, note } from "@clack/prompts";
|
||||
import { executeCommandInteractive } from "../utils/docker-interactive.js";
|
||||
import { printCoreBrainLogo } from "../utils/ascii.js";
|
||||
import path from "path";
|
||||
import * as fs from "fs";
|
||||
|
||||
export async function stopCommand() {
|
||||
// Display the CORE brain logo
|
||||
@ -10,10 +11,19 @@ export async function stopCommand() {
|
||||
intro("🛑 Stopping Core Development Environment");
|
||||
|
||||
// Step 1: Confirm this is the Core repository
|
||||
const isCoreRepo = await confirm({
|
||||
message: "Are you currently in the Core repository directory?",
|
||||
});
|
||||
|
||||
// Check if package.json name has "core" in it, else exit
|
||||
const pkgPath = path.join(process.cwd(), "package.json");
|
||||
let isCoreRepo = false;
|
||||
try {
|
||||
if (fs.existsSync(pkgPath)) {
|
||||
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
||||
if (typeof pkg.name === "string" && pkg.name.includes("core")) {
|
||||
isCoreRepo = true;
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
// ignore, will prompt below
|
||||
}
|
||||
if (!isCoreRepo) {
|
||||
note(
|
||||
'Please navigate to the Core repository first:\n\ngit clone https://github.com/redplanethq/core.git\ncd core\n\nThen run "core stop" again.',
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import chalk from "chalk";
|
||||
import { VERSION } from "../cli/version.js";
|
||||
|
||||
export function printCoreBrainLogo(): void {
|
||||
const brain = `
|
||||
@ -20,5 +21,9 @@ export function printCoreBrainLogo(): void {
|
||||
`;
|
||||
|
||||
console.log(chalk.cyan(brain));
|
||||
console.log(chalk.bold.white(" 🧠 CORE - Contextual Observation & Recall Engine \n"));
|
||||
console.log(
|
||||
chalk.bold.white(
|
||||
` 🧠 CORE - Contextual Observation & Recall Engine ${VERSION ? chalk.gray(`(${VERSION})`) : ""}\n`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@ -2,14 +2,14 @@
|
||||
import Knex, { Knex as KnexT } from "knex";
|
||||
import { v4 as uuidv4 } from "uuid";
|
||||
import nodeCrypto from "node:crypto";
|
||||
import dotenv from "dotenv";
|
||||
import dotenvExpand from "dotenv-expand";
|
||||
import { parse } from "dotenv";
|
||||
import { expand } from "dotenv-expand";
|
||||
import path from "node:path";
|
||||
import { log } from "@clack/prompts";
|
||||
import { customAlphabet } from "nanoid";
|
||||
|
||||
import $xdgAppPaths from "xdg-app-paths";
|
||||
import { mkdirSync, writeFileSync } from "node:fs";
|
||||
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
||||
|
||||
export const xdgAppPaths = $xdgAppPaths as unknown as typeof $xdgAppPaths.default;
|
||||
|
||||
@ -241,8 +241,10 @@ export async function initTriggerDatabase(triggerDir: string) {
|
||||
|
||||
const envPath = path.join(triggerDir, ".env");
|
||||
log.step(`Loading environment variables from ${envPath}...`);
|
||||
const envVarsExpand =
|
||||
dotenvExpand.expand(dotenv.config({ path: envPath, processEnv: {} })).parsed || {};
|
||||
const file = readFileSync(envPath);
|
||||
|
||||
const parsed = parse(file);
|
||||
const envVarsExpand = expand({ parsed, processEnv: {} }).parsed || {};
|
||||
|
||||
// Set the encryption key from the .env file
|
||||
ENCRYPTION_KEY = envVarsExpand.ENCRYPTION_KEY as string;
|
||||
|
||||
@ -10,6 +10,8 @@ export interface CommandOptions {
|
||||
|
||||
export function executeCommandInteractive(command: string, options: CommandOptions): Promise<void> {
|
||||
return new Promise((resolve, reject) => {
|
||||
console.log(process.env);
|
||||
|
||||
const s = spinner();
|
||||
s.start(options.message);
|
||||
|
||||
@ -27,7 +29,7 @@ export function executeCommandInteractive(command: string, options: CommandOptio
|
||||
cwd: options.cwd,
|
||||
stdio: options.showOutput ? ["ignore", "pipe", "pipe"] : "ignore",
|
||||
detached: false,
|
||||
env: options.env ? { ...process.env, ...options.env } : {},
|
||||
env: options.env ? { ...process.env, ...options.env } : { ...process.env },
|
||||
});
|
||||
|
||||
let output = "";
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
import path from "path";
|
||||
|
||||
import dotenv from "dotenv";
|
||||
import dotenvExpand from "dotenv-expand";
|
||||
import { parse } from "dotenv";
|
||||
import { expand } from "dotenv-expand";
|
||||
import * as fs from "fs";
|
||||
|
||||
/**
|
||||
* Reads environment variables from .env file and replaces localhost URLs with host.docker.internal
|
||||
@ -12,8 +13,10 @@ export async function getDockerCompatibleEnvVars(rootDir: string): Promise<Recor
|
||||
|
||||
try {
|
||||
// Use dotenv to parse and expand variables
|
||||
const envVarsExpand =
|
||||
dotenvExpand.expand(dotenv.config({ path: envPath, processEnv: {} })).parsed || {};
|
||||
const file = fs.readFileSync(envPath);
|
||||
|
||||
const parsed = parse(file);
|
||||
const envVarsExpand = expand({ parsed, processEnv: {} }).parsed || {};
|
||||
|
||||
const getEnvValue = (key: string): string => {
|
||||
return envVarsExpand[key] || "";
|
||||
|
||||
@ -2,7 +2,6 @@ import { note, log } from "@clack/prompts";
|
||||
import { executeCommandInteractive } from "./docker-interactive.js";
|
||||
import { getDockerCompatibleEnvVars } from "./env-docker.js";
|
||||
import path from "path";
|
||||
import { createTriggerConfigJson } from "./database-init.js";
|
||||
|
||||
export async function deployTriggerTasks(rootDir: string): Promise<void> {
|
||||
const webappDir = path.join(rootDir, "apps", "webapp");
|
||||
|
||||
@ -0,0 +1,10 @@
|
||||
-- DropForeignKey
|
||||
ALTER TABLE "OAuthClient" DROP CONSTRAINT "OAuthClient_createdById_fkey";
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "OAuthClient" ADD COLUMN "clientType" TEXT NOT NULL DEFAULT 'regular',
|
||||
ALTER COLUMN "workspaceId" DROP NOT NULL,
|
||||
ALTER COLUMN "createdById" DROP NOT NULL;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "OAuthClient" ADD CONSTRAINT "OAuthClient_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
@ -287,6 +287,8 @@ model OAuthClient {
|
||||
// PKCE support
|
||||
requirePkce Boolean @default(false)
|
||||
|
||||
clientType String @default("regular")
|
||||
|
||||
// Client metadata
|
||||
logoUrl String?
|
||||
homepageUrl String?
|
||||
@ -299,12 +301,12 @@ model OAuthClient {
|
||||
isActive Boolean @default(true)
|
||||
|
||||
// Workspace relationship (like GitHub orgs)
|
||||
workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
||||
workspaceId String
|
||||
workspace Workspace? @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
|
||||
workspaceId String?
|
||||
|
||||
// Created by user (for audit trail)
|
||||
createdBy User @relation(fields: [createdById], references: [id])
|
||||
createdById String
|
||||
createdBy User? @relation(fields: [createdById], references: [id])
|
||||
createdById String?
|
||||
|
||||
// Relations
|
||||
oauthAuthorizationCodes OAuthAuthorizationCode[]
|
||||
|
||||
@ -569,6 +569,7 @@ export class MCPAuthenticationClient {
|
||||
// }
|
||||
// }
|
||||
|
||||
console.log("completeOAuthFlow", options);
|
||||
// Use the NodeOAuthClientProvider's completeAuth method
|
||||
await authProvider.completeAuth({
|
||||
authorizationCode: options.authorizationCode,
|
||||
|
||||
35
pnpm-lock.yaml
generated
35
pnpm-lock.yaml
generated
@ -114,6 +114,9 @@ importers:
|
||||
'@radix-ui/react-separator':
|
||||
specifier: ^1.1.7
|
||||
version: 1.1.7(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
'@radix-ui/react-slider':
|
||||
specifier: ^1.3.5
|
||||
version: 1.3.5(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
'@radix-ui/react-slot':
|
||||
specifier: ^1.2.3
|
||||
version: 1.2.3(@types/react@18.2.69)(react@18.3.1)
|
||||
@ -3330,6 +3333,19 @@ packages:
|
||||
'@types/react-dom':
|
||||
optional: true
|
||||
|
||||
'@radix-ui/react-slider@1.3.5':
|
||||
resolution: {integrity: sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw==}
|
||||
peerDependencies:
|
||||
'@types/react': '*'
|
||||
'@types/react-dom': '*'
|
||||
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
|
||||
peerDependenciesMeta:
|
||||
'@types/react':
|
||||
optional: true
|
||||
'@types/react-dom':
|
||||
optional: true
|
||||
|
||||
'@radix-ui/react-slot@1.0.0':
|
||||
resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==}
|
||||
peerDependencies:
|
||||
@ -14014,6 +14030,25 @@ snapshots:
|
||||
'@types/react': 18.2.69
|
||||
'@types/react-dom': 18.3.7(@types/react@18.2.69)
|
||||
|
||||
'@radix-ui/react-slider@1.3.5(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||
dependencies:
|
||||
'@radix-ui/number': 1.1.1
|
||||
'@radix-ui/primitive': 1.1.2
|
||||
'@radix-ui/react-collection': 1.1.7(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
'@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.69)(react@18.3.1)
|
||||
'@radix-ui/react-context': 1.1.2(@types/react@18.2.69)(react@18.3.1)
|
||||
'@radix-ui/react-direction': 1.1.1(@types/react@18.2.69)(react@18.3.1)
|
||||
'@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.2.69))(@types/react@18.2.69)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
'@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.69)(react@18.3.1)
|
||||
'@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.2.69)(react@18.3.1)
|
||||
'@radix-ui/react-use-previous': 1.1.1(@types/react@18.2.69)(react@18.3.1)
|
||||
'@radix-ui/react-use-size': 1.1.1(@types/react@18.2.69)(react@18.3.1)
|
||||
react: 18.3.1
|
||||
react-dom: 18.3.1(react@18.3.1)
|
||||
optionalDependencies:
|
||||
'@types/react': 18.2.69
|
||||
'@types/react-dom': 18.3.7(@types/react@18.2.69)
|
||||
|
||||
'@radix-ui/react-slot@1.0.0(react@18.3.1)':
|
||||
dependencies:
|
||||
'@babel/runtime': 7.27.6
|
||||
|
||||
@ -33,7 +33,6 @@ TRIGGER_DB=trigger
|
||||
|
||||
DB_HOST=host.docker.internal
|
||||
DB_PORT=5432
|
||||
DB_SCHEMA=sigma
|
||||
|
||||
|
||||
# POSTGRES_DB=postgres
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user