arcie 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -6
- package/dist/agent/index.d.ts +6 -3
- package/dist/agent/index.js +6 -6
- package/dist/agent/index.js.map +1 -1
- package/dist/auth/index.d.ts +6 -5
- package/dist/auth/index.js +8 -17
- package/dist/auth/index.js.map +1 -1
- package/dist/build-TWNCPXBU.js +82 -0
- package/dist/build-TWNCPXBU.js.map +1 -0
- package/dist/channels/index.d.ts +8 -5
- package/dist/channels/index.js +10 -12
- package/dist/channels/index.js.map +1 -1
- package/dist/chunk-3CNQ6HQV.js +12 -0
- package/dist/chunk-3CNQ6HQV.js.map +1 -0
- package/dist/chunk-4L7WVCTU.js +12 -0
- package/dist/chunk-4L7WVCTU.js.map +1 -0
- package/dist/chunk-4WSILP75.js +1774 -0
- package/dist/chunk-4WSILP75.js.map +1 -0
- package/dist/chunk-6XETPLIF.js +176 -0
- package/dist/chunk-6XETPLIF.js.map +1 -0
- package/dist/chunk-CKHBEZCT.js +24 -0
- package/dist/chunk-CKHBEZCT.js.map +1 -0
- package/dist/chunk-FQ7KDNV5.js +12 -0
- package/dist/chunk-FQ7KDNV5.js.map +1 -0
- package/dist/chunk-HVBDOHTL.js +148 -0
- package/dist/chunk-HVBDOHTL.js.map +1 -0
- package/dist/chunk-HWD2Z2CH.js +742 -0
- package/dist/chunk-HWD2Z2CH.js.map +1 -0
- package/dist/chunk-KVSX4MLK.js +139 -0
- package/dist/chunk-KVSX4MLK.js.map +1 -0
- package/dist/chunk-L3BTL5FM.js +39 -0
- package/dist/chunk-L3BTL5FM.js.map +1 -0
- package/dist/chunk-LQC65UHE.js +34 -0
- package/dist/chunk-LQC65UHE.js.map +1 -0
- package/dist/chunk-N5R3TEEZ.js +15 -0
- package/dist/chunk-N5R3TEEZ.js.map +1 -0
- package/dist/chunk-PHTJLJOV.js +25 -0
- package/dist/chunk-PHTJLJOV.js.map +1 -0
- package/dist/chunk-QE46QFID.js +92 -0
- package/dist/chunk-QE46QFID.js.map +1 -0
- package/dist/chunk-SGWQZZ2A.js +54 -0
- package/dist/chunk-SGWQZZ2A.js.map +1 -0
- package/dist/chunk-WAD7VLNI.js +51 -0
- package/dist/chunk-WAD7VLNI.js.map +1 -0
- package/dist/chunk-XOFWQUOO.js +30 -0
- package/dist/chunk-XOFWQUOO.js.map +1 -0
- package/dist/chunk-ZJNHQXMO.js +20 -0
- package/dist/chunk-ZJNHQXMO.js.map +1 -0
- package/dist/cli/index.d.ts +7 -2
- package/dist/cli/index.js +171 -41
- package/dist/cli/index.js.map +1 -1
- package/dist/context/index.d.ts +14 -11
- package/dist/context/index.js +22 -37
- package/dist/context/index.js.map +1 -1
- package/dist/dev-ZZDVOWUZ.js +1967 -0
- package/dist/dev-ZZDVOWUZ.js.map +1 -0
- package/dist/discover/index.d.ts +17 -7
- package/dist/discover/index.js +6 -132
- package/dist/discover/index.js.map +1 -1
- package/dist/hooks/index.d.ts +6 -3
- package/dist/hooks/index.js +6 -6
- package/dist/hooks/index.js.map +1 -1
- package/dist/index-CElLRVTP.d.ts +136 -0
- package/dist/index.d.ts +297 -18
- package/dist/index.js +160 -13
- package/dist/index.js.map +1 -1
- package/dist/init-5F7CIVLN.js +822 -0
- package/dist/init-5F7CIVLN.js.map +1 -0
- package/dist/instructions/index.d.ts +7 -4
- package/dist/instructions/index.js +8 -32
- package/dist/instructions/index.js.map +1 -1
- package/dist/protocol/events.d.ts +47 -39
- package/dist/protocol/events.js +46 -45
- package/dist/protocol/events.js.map +1 -1
- package/dist/runner/index.d.ts +4 -18
- package/dist/runner/index.js +11 -277
- package/dist/runner/index.js.map +1 -1
- package/dist/scaffold-web-chat-OQL5C2GK.js +7 -0
- package/dist/scaffold-web-chat-OQL5C2GK.js.map +1 -0
- package/dist/schedules/index.d.ts +6 -3
- package/dist/schedules/index.js +6 -6
- package/dist/schedules/index.js.map +1 -1
- package/dist/skills/index.d.ts +7 -4
- package/dist/skills/index.js +8 -27
- package/dist/skills/index.js.map +1 -1
- package/dist/tools/index.d.ts +13 -3
- package/dist/tools/index.js +8 -9
- package/dist/tools/index.js.map +1 -1
- package/dist/types-DwxwdSa2.d.ts +151 -0
- package/docs/getting-started.md +2 -2
- package/docs/index.md +3 -2
- package/docs/project-layout.md +2 -2
- package/docs/subagents.md +95 -0
- package/package.json +15 -10
- package/templates/default/.env.local +12 -0
- package/templates/default/agent/agent.ts +2 -2
- package/templates/default/package.json +3 -3
- package/templates/web-chat/.env.local.example +4 -0
- package/templates/web-chat/README.md +51 -0
- package/templates/web-chat/app/api/chat/route.ts +43 -0
- package/templates/web-chat/app/globals.css +55 -0
- package/templates/web-chat/app/layout.tsx +15 -0
- package/templates/web-chat/app/page.tsx +9 -0
- package/templates/web-chat/components/chat.tsx +196 -0
- package/templates/web-chat/components/input-bar.tsx +74 -0
- package/templates/web-chat/components/message.tsx +63 -0
- package/templates/web-chat/components/tool-call.tsx +79 -0
- package/templates/web-chat/components/ui/button.tsx +46 -0
- package/templates/web-chat/components/ui/input.tsx +19 -0
- package/templates/web-chat/components.json +20 -0
- package/templates/web-chat/lib/stream.ts +41 -0
- package/templates/web-chat/lib/types.ts +61 -0
- package/templates/web-chat/lib/utils.ts +6 -0
- package/templates/web-chat/next.config.mjs +4 -0
- package/templates/web-chat/package.json +32 -0
- package/templates/web-chat/postcss.config.mjs +6 -0
- package/templates/web-chat/tailwind.config.ts +59 -0
- package/templates/web-chat/tsconfig.json +23 -0
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/channels/index.d.ts.map +0 -1
- package/dist/cli/banner.d.ts +0 -2
- package/dist/cli/banner.d.ts.map +0 -1
- package/dist/cli/banner.js +0 -10
- package/dist/cli/banner.js.map +0 -1
- package/dist/cli/build.d.ts +0 -5
- package/dist/cli/build.d.ts.map +0 -1
- package/dist/cli/build.js +0 -54
- package/dist/cli/build.js.map +0 -1
- package/dist/cli/dev.d.ts +0 -5
- package/dist/cli/dev.d.ts.map +0 -1
- package/dist/cli/dev.js +0 -74
- package/dist/cli/dev.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/init.d.ts +0 -4
- package/dist/cli/init.d.ts.map +0 -1
- package/dist/cli/init.js +0 -75
- package/dist/cli/init.js.map +0 -1
- package/dist/context/index.d.ts.map +0 -1
- package/dist/discover/index.d.ts.map +0 -1
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/instructions/index.d.ts.map +0 -1
- package/dist/loader.d.ts +0 -7
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -102
- package/dist/loader.js.map +0 -1
- package/dist/protocol/events.d.ts.map +0 -1
- package/dist/runner/index.d.ts.map +0 -1
- package/dist/schedules/index.d.ts.map +0 -1
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/types.d.ts +0 -118
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import ReactMarkdown from "react-markdown";
|
|
5
|
+
import remarkGfm from "remark-gfm";
|
|
6
|
+
import { AlertTriangle } from "lucide-react";
|
|
7
|
+
import { cn } from "@/lib/utils";
|
|
8
|
+
import type { UiMessage } from "@/lib/types";
|
|
9
|
+
import { ToolCall } from "@/components/tool-call";
|
|
10
|
+
|
|
11
|
+
export function Message({ message }: { message: UiMessage }) {
|
|
12
|
+
const isUser = message.role === "user";
|
|
13
|
+
return (
|
|
14
|
+
<div className={cn("flex w-full", isUser ? "justify-end" : "justify-start")}>
|
|
15
|
+
<div
|
|
16
|
+
className={cn(
|
|
17
|
+
"max-w-[85%] rounded-lg px-4 py-2.5 text-sm animate-fade-in",
|
|
18
|
+
isUser
|
|
19
|
+
? "bg-primary text-primary-foreground"
|
|
20
|
+
: "bg-muted text-foreground",
|
|
21
|
+
message.errored && "border border-destructive/40",
|
|
22
|
+
)}
|
|
23
|
+
>
|
|
24
|
+
{message.errored && (
|
|
25
|
+
<div className="mb-2 flex items-center gap-2 text-xs text-destructive">
|
|
26
|
+
<AlertTriangle className="h-3 w-3" />
|
|
27
|
+
<span>Error</span>
|
|
28
|
+
</div>
|
|
29
|
+
)}
|
|
30
|
+
{message.reasoning && (
|
|
31
|
+
<details className="mb-2 text-xs text-muted-foreground">
|
|
32
|
+
<summary className="cursor-pointer select-none">thinking</summary>
|
|
33
|
+
<div className="mt-1 whitespace-pre-wrap italic">{message.reasoning}</div>
|
|
34
|
+
</details>
|
|
35
|
+
)}
|
|
36
|
+
{message.content.length > 0 &&
|
|
37
|
+
(isUser ? (
|
|
38
|
+
<div className="whitespace-pre-wrap">{message.content}</div>
|
|
39
|
+
) : (
|
|
40
|
+
<div className="prose prose-sm prose-zinc max-w-none dark:prose-invert">
|
|
41
|
+
<ReactMarkdown remarkPlugins={[remarkGfm]}>
|
|
42
|
+
{message.content}
|
|
43
|
+
</ReactMarkdown>
|
|
44
|
+
</div>
|
|
45
|
+
))}
|
|
46
|
+
{message.toolCalls && message.toolCalls.length > 0 && (
|
|
47
|
+
<div className="mt-2 flex flex-col gap-1.5">
|
|
48
|
+
{message.toolCalls.map((call) => (
|
|
49
|
+
<ToolCall key={call.callId} call={call} />
|
|
50
|
+
))}
|
|
51
|
+
</div>
|
|
52
|
+
)}
|
|
53
|
+
{message.streaming && message.content.length === 0 && !message.toolCalls?.length && (
|
|
54
|
+
<div className="flex gap-1">
|
|
55
|
+
<span className="h-1.5 w-1.5 animate-pulse rounded-full bg-muted-foreground" />
|
|
56
|
+
<span className="h-1.5 w-1.5 animate-pulse rounded-full bg-muted-foreground [animation-delay:150ms]" />
|
|
57
|
+
<span className="h-1.5 w-1.5 animate-pulse rounded-full bg-muted-foreground [animation-delay:300ms]" />
|
|
58
|
+
</div>
|
|
59
|
+
)}
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
63
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { CheckCircle2, Loader2, XCircle, HelpCircle } from "lucide-react";
|
|
5
|
+
import { cn } from "@/lib/utils";
|
|
6
|
+
import type { UiToolCall } from "@/lib/types";
|
|
7
|
+
|
|
8
|
+
function summarize(input: unknown, max = 60): string {
|
|
9
|
+
if (input === undefined || input === null) return "";
|
|
10
|
+
if (typeof input !== "object") return String(input).slice(0, max);
|
|
11
|
+
if (Array.isArray(input)) return `[${input.length}]`;
|
|
12
|
+
const entries = Object.entries(input as Record<string, unknown>);
|
|
13
|
+
if (entries.length === 0) return "";
|
|
14
|
+
const parts = entries.map(([key, value]) => {
|
|
15
|
+
if (typeof value === "string") return `${key}="${value.slice(0, 24)}"`;
|
|
16
|
+
if (typeof value === "object") {
|
|
17
|
+
return `${key}=${Array.isArray(value) ? `[${value.length}]` : "{…}"}`;
|
|
18
|
+
}
|
|
19
|
+
return `${key}=${String(value)}`;
|
|
20
|
+
});
|
|
21
|
+
const joined = parts.join(", ");
|
|
22
|
+
return joined.length > max ? `${joined.slice(0, max - 1)}…` : joined;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function resultText(call: UiToolCall): string | undefined {
|
|
26
|
+
if (call.status === "error") return call.errorMessage;
|
|
27
|
+
if (call.status === "approval") return call.errorMessage ?? "awaiting approval";
|
|
28
|
+
if (call.output === undefined || call.output === null) return undefined;
|
|
29
|
+
if (typeof call.output === "string") {
|
|
30
|
+
return call.output.split("\n").find((line) => line.trim().length > 0) ?? undefined;
|
|
31
|
+
}
|
|
32
|
+
if (typeof call.output !== "object") return String(call.output);
|
|
33
|
+
const record = call.output as Record<string, unknown>;
|
|
34
|
+
for (const key of ["result", "text", "message", "summary", "value", "output"]) {
|
|
35
|
+
const value = record[key];
|
|
36
|
+
if (value !== undefined && typeof value !== "object") return String(value);
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function ToolCall({ call }: { call: UiToolCall }) {
|
|
42
|
+
const args = summarize(call.input);
|
|
43
|
+
const result = resultText(call);
|
|
44
|
+
return (
|
|
45
|
+
<div
|
|
46
|
+
className={cn(
|
|
47
|
+
"flex flex-col gap-1 rounded-md border border-border bg-muted/40 px-3 py-2 text-sm",
|
|
48
|
+
)}
|
|
49
|
+
>
|
|
50
|
+
<div className="flex items-center gap-2">
|
|
51
|
+
<StatusGlyph status={call.status} />
|
|
52
|
+
<span className="font-mono font-medium">{call.name}</span>
|
|
53
|
+
{args.length > 0 && (
|
|
54
|
+
<span className="truncate font-mono text-xs text-muted-foreground">{args}</span>
|
|
55
|
+
)}
|
|
56
|
+
</div>
|
|
57
|
+
{result !== undefined && (
|
|
58
|
+
<div className="ml-6 truncate text-xs text-muted-foreground">
|
|
59
|
+
→ <span className="font-mono">{result}</span>
|
|
60
|
+
</div>
|
|
61
|
+
)}
|
|
62
|
+
</div>
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function StatusGlyph({ status }: { status: UiToolCall["status"] }) {
|
|
67
|
+
switch (status) {
|
|
68
|
+
case "running":
|
|
69
|
+
return <Loader2 className="h-4 w-4 animate-spin text-muted-foreground" />;
|
|
70
|
+
case "done":
|
|
71
|
+
return <CheckCircle2 className="h-4 w-4 text-emerald-500" />;
|
|
72
|
+
case "error":
|
|
73
|
+
return <XCircle className="h-4 w-4 text-destructive" />;
|
|
74
|
+
case "approval":
|
|
75
|
+
return <HelpCircle className="h-4 w-4 text-amber-500" />;
|
|
76
|
+
default:
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
3
|
+
import { cn } from "@/lib/utils";
|
|
4
|
+
|
|
5
|
+
const buttonVariants = cva(
|
|
6
|
+
"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
7
|
+
{
|
|
8
|
+
variants: {
|
|
9
|
+
variant: {
|
|
10
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
11
|
+
destructive:
|
|
12
|
+
"bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
13
|
+
outline:
|
|
14
|
+
"border border-input bg-background hover:bg-accent hover:text-accent-foreground",
|
|
15
|
+
secondary:
|
|
16
|
+
"bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
17
|
+
ghost: "hover:bg-accent hover:text-accent-foreground",
|
|
18
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
19
|
+
},
|
|
20
|
+
size: {
|
|
21
|
+
default: "h-10 px-4 py-2",
|
|
22
|
+
sm: "h-9 rounded-md px-3",
|
|
23
|
+
lg: "h-11 rounded-md px-8",
|
|
24
|
+
icon: "h-10 w-10",
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
defaultVariants: { variant: "default", size: "default" },
|
|
28
|
+
},
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
export interface ButtonProps
|
|
32
|
+
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
33
|
+
VariantProps<typeof buttonVariants> {}
|
|
34
|
+
|
|
35
|
+
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
|
|
36
|
+
({ className, variant, size, ...props }, ref) => (
|
|
37
|
+
<button
|
|
38
|
+
className={cn(buttonVariants({ variant, size, className }))}
|
|
39
|
+
ref={ref}
|
|
40
|
+
{...props}
|
|
41
|
+
/>
|
|
42
|
+
),
|
|
43
|
+
);
|
|
44
|
+
Button.displayName = "Button";
|
|
45
|
+
|
|
46
|
+
export { Button, buttonVariants };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { cn } from "@/lib/utils";
|
|
3
|
+
|
|
4
|
+
const Input = React.forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement>>(
|
|
5
|
+
({ className, type, ...props }, ref) => (
|
|
6
|
+
<input
|
|
7
|
+
type={type}
|
|
8
|
+
className={cn(
|
|
9
|
+
"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
|
|
10
|
+
className,
|
|
11
|
+
)}
|
|
12
|
+
ref={ref}
|
|
13
|
+
{...props}
|
|
14
|
+
/>
|
|
15
|
+
),
|
|
16
|
+
);
|
|
17
|
+
Input.displayName = "Input";
|
|
18
|
+
|
|
19
|
+
export { Input };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
+
"style": "default",
|
|
4
|
+
"rsc": true,
|
|
5
|
+
"tsx": true,
|
|
6
|
+
"tailwind": {
|
|
7
|
+
"config": "tailwind.config.ts",
|
|
8
|
+
"css": "app/globals.css",
|
|
9
|
+
"baseColor": "zinc",
|
|
10
|
+
"cssVariables": true,
|
|
11
|
+
"prefix": ""
|
|
12
|
+
},
|
|
13
|
+
"aliases": {
|
|
14
|
+
"components": "@/components",
|
|
15
|
+
"utils": "@/lib/utils",
|
|
16
|
+
"ui": "@/components/ui",
|
|
17
|
+
"lib": "@/lib",
|
|
18
|
+
"hooks": "@/hooks"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ArcieStreamEvent } from "./types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Reads an NDJSON stream from `response.body` and yields decoded events.
|
|
5
|
+
* Tolerates partial lines split across chunks and skips malformed rows so
|
|
6
|
+
* one bad event doesn't stop the stream.
|
|
7
|
+
*/
|
|
8
|
+
export async function* readArcieStream(
|
|
9
|
+
response: Response,
|
|
10
|
+
): AsyncIterable<ArcieStreamEvent> {
|
|
11
|
+
if (response.body === null) return;
|
|
12
|
+
const reader = response.body.getReader();
|
|
13
|
+
const decoder = new TextDecoder();
|
|
14
|
+
let buffer = "";
|
|
15
|
+
|
|
16
|
+
while (true) {
|
|
17
|
+
const { done, value } = await reader.read();
|
|
18
|
+
if (done) break;
|
|
19
|
+
buffer += decoder.decode(value, { stream: true });
|
|
20
|
+
const lines = buffer.split("\n");
|
|
21
|
+
buffer = lines.pop() ?? "";
|
|
22
|
+
for (const line of lines) {
|
|
23
|
+
const trimmed = line.trim();
|
|
24
|
+
if (trimmed.length === 0) continue;
|
|
25
|
+
try {
|
|
26
|
+
yield JSON.parse(trimmed) as ArcieStreamEvent;
|
|
27
|
+
} catch {
|
|
28
|
+
// Ignore malformed lines; a partial chunk may still finish next round.
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const tail = buffer.trim();
|
|
34
|
+
if (tail.length > 0) {
|
|
35
|
+
try {
|
|
36
|
+
yield JSON.parse(tail) as ArcieStreamEvent;
|
|
37
|
+
} catch {
|
|
38
|
+
/* ignore */
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export type ChatRole = "user" | "assistant";
|
|
2
|
+
|
|
3
|
+
export interface UiMessage {
|
|
4
|
+
id: string;
|
|
5
|
+
role: ChatRole;
|
|
6
|
+
content: string;
|
|
7
|
+
toolCalls?: UiToolCall[];
|
|
8
|
+
reasoning?: string;
|
|
9
|
+
streaming?: boolean;
|
|
10
|
+
errored?: boolean;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface UiToolCall {
|
|
14
|
+
callId: string;
|
|
15
|
+
name: string;
|
|
16
|
+
input?: unknown;
|
|
17
|
+
output?: unknown;
|
|
18
|
+
status: "running" | "done" | "error" | "approval";
|
|
19
|
+
errorMessage?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type ArcieStreamEvent =
|
|
23
|
+
| { type: "session.started"; data: { sessionId: string } }
|
|
24
|
+
| { type: "turn.started"; data: { turnId: string } }
|
|
25
|
+
| { type: "message.received"; data: { message: string; turnId: string } }
|
|
26
|
+
| {
|
|
27
|
+
type: "message.appended";
|
|
28
|
+
data: { delta: string; textSoFar: string; turnId: string; stepIndex: number };
|
|
29
|
+
}
|
|
30
|
+
| {
|
|
31
|
+
type: "message.completed";
|
|
32
|
+
data: { text: string | null; turnId: string; stepIndex: number };
|
|
33
|
+
}
|
|
34
|
+
| {
|
|
35
|
+
type: "reasoning.appended";
|
|
36
|
+
data: { delta: string; soFar: string; turnId: string; stepIndex: number };
|
|
37
|
+
}
|
|
38
|
+
| {
|
|
39
|
+
type: "reasoning.completed";
|
|
40
|
+
data: { text: string; turnId: string; stepIndex: number };
|
|
41
|
+
}
|
|
42
|
+
| {
|
|
43
|
+
type: "tool.started";
|
|
44
|
+
data: { name: string; input: unknown; callId: string; turnId: string };
|
|
45
|
+
}
|
|
46
|
+
| {
|
|
47
|
+
type: "tool.completed";
|
|
48
|
+
data: {
|
|
49
|
+
name: string;
|
|
50
|
+
output: unknown;
|
|
51
|
+
callId: string;
|
|
52
|
+
status: string;
|
|
53
|
+
error?: { code: string; message: string };
|
|
54
|
+
turnId: string;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
| {
|
|
58
|
+
type: "step.failed" | "turn.failed" | "session.failed";
|
|
59
|
+
data: { code: string; message: string };
|
|
60
|
+
}
|
|
61
|
+
| { type: string; data: unknown };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "web-chat",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "next dev --port 3001",
|
|
7
|
+
"build": "next build",
|
|
8
|
+
"start": "next start --port 3001",
|
|
9
|
+
"lint": "next lint"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"class-variance-authority": "^0.7.0",
|
|
13
|
+
"clsx": "^2.1.1",
|
|
14
|
+
"lucide-react": "^0.475.0",
|
|
15
|
+
"next": "^15.1.0",
|
|
16
|
+
"react": "^19.0.0",
|
|
17
|
+
"react-dom": "^19.0.0",
|
|
18
|
+
"react-markdown": "^9.0.1",
|
|
19
|
+
"remark-gfm": "^4.0.0",
|
|
20
|
+
"tailwind-merge": "^2.5.5",
|
|
21
|
+
"tailwindcss-animate": "^1.0.7"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^22.10.0",
|
|
25
|
+
"@types/react": "^19.0.0",
|
|
26
|
+
"@types/react-dom": "^19.0.0",
|
|
27
|
+
"autoprefixer": "^10.4.20",
|
|
28
|
+
"postcss": "^8.4.49",
|
|
29
|
+
"tailwindcss": "^3.4.17",
|
|
30
|
+
"typescript": "^5.7.2"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { Config } from "tailwindcss";
|
|
2
|
+
|
|
3
|
+
const config: Config = {
|
|
4
|
+
darkMode: ["class"],
|
|
5
|
+
content: ["./app/**/*.{ts,tsx}", "./components/**/*.{ts,tsx}"],
|
|
6
|
+
theme: {
|
|
7
|
+
container: { center: true, padding: "2rem", screens: { "2xl": "1400px" } },
|
|
8
|
+
extend: {
|
|
9
|
+
colors: {
|
|
10
|
+
border: "hsl(var(--border))",
|
|
11
|
+
input: "hsl(var(--input))",
|
|
12
|
+
ring: "hsl(var(--ring))",
|
|
13
|
+
background: "hsl(var(--background))",
|
|
14
|
+
foreground: "hsl(var(--foreground))",
|
|
15
|
+
primary: {
|
|
16
|
+
DEFAULT: "hsl(var(--primary))",
|
|
17
|
+
foreground: "hsl(var(--primary-foreground))",
|
|
18
|
+
},
|
|
19
|
+
secondary: {
|
|
20
|
+
DEFAULT: "hsl(var(--secondary))",
|
|
21
|
+
foreground: "hsl(var(--secondary-foreground))",
|
|
22
|
+
},
|
|
23
|
+
destructive: {
|
|
24
|
+
DEFAULT: "hsl(var(--destructive))",
|
|
25
|
+
foreground: "hsl(var(--destructive-foreground))",
|
|
26
|
+
},
|
|
27
|
+
muted: {
|
|
28
|
+
DEFAULT: "hsl(var(--muted))",
|
|
29
|
+
foreground: "hsl(var(--muted-foreground))",
|
|
30
|
+
},
|
|
31
|
+
accent: {
|
|
32
|
+
DEFAULT: "hsl(var(--accent))",
|
|
33
|
+
foreground: "hsl(var(--accent-foreground))",
|
|
34
|
+
},
|
|
35
|
+
card: {
|
|
36
|
+
DEFAULT: "hsl(var(--card))",
|
|
37
|
+
foreground: "hsl(var(--card-foreground))",
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
borderRadius: {
|
|
41
|
+
lg: "var(--radius)",
|
|
42
|
+
md: "calc(var(--radius) - 2px)",
|
|
43
|
+
sm: "calc(var(--radius) - 4px)",
|
|
44
|
+
},
|
|
45
|
+
keyframes: {
|
|
46
|
+
"fade-in": {
|
|
47
|
+
"0%": { opacity: "0", transform: "translateY(4px)" },
|
|
48
|
+
"100%": { opacity: "1", transform: "translateY(0)" },
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
animation: {
|
|
52
|
+
"fade-in": "fade-in 0.2s ease-out",
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
plugins: [require("tailwindcss-animate")],
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export default config;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "preserve",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [{ "name": "next" }],
|
|
17
|
+
"paths": {
|
|
18
|
+
"@/*": ["./*"]
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
22
|
+
"exclude": ["node_modules"]
|
|
23
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAK5D"}
|
package/dist/auth/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD,CAAC,CAAC;AAEH,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CAMxD;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,UAAU,CAAC;CACtB,GAAG,cAAc,CAMjB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/channels/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAKlE;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,CAEhF;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,CAE/E"}
|
package/dist/cli/banner.d.ts
DELETED
package/dist/cli/banner.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/cli/banner.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,IAAI,CAQjC"}
|
package/dist/cli/banner.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export function showBanner() {
|
|
2
|
-
console.log();
|
|
3
|
-
console.log(" ╔══════════════════════════════════╗");
|
|
4
|
-
console.log(" ║ Eline ║");
|
|
5
|
-
console.log(" ║ The electronic line — build ║");
|
|
6
|
-
console.log(" ║ agents at the speed of light. ║");
|
|
7
|
-
console.log(" ╚══════════════════════════════════╝");
|
|
8
|
-
console.log();
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=banner.js.map
|
package/dist/cli/banner.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/cli/banner.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
package/dist/cli/build.d.ts
DELETED
package/dist/cli/build.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DhB"}
|
package/dist/cli/build.js
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, writeFileSync, existsSync } from "node:fs";
|
|
2
|
-
import { resolve, join } from "node:path";
|
|
3
|
-
import { loadAgent } from "../loader.js";
|
|
4
|
-
import { discoverAgent } from "../discover/index.js";
|
|
5
|
-
export async function buildCommand(options) {
|
|
6
|
-
const agentDirPath = resolve(process.cwd(), options.agentDir);
|
|
7
|
-
const outDir = resolve(process.cwd(), options.outDir);
|
|
8
|
-
console.log(`\n Building agent...\n`);
|
|
9
|
-
if (!existsSync(agentDirPath)) {
|
|
10
|
-
console.error(` Agent directory not found: ${agentDirPath}`);
|
|
11
|
-
process.exit(1);
|
|
12
|
-
}
|
|
13
|
-
const { agent: discovered, diagnostics } = discoverAgent(agentDirPath);
|
|
14
|
-
if (diagnostics.some((d) => d.severity === "error")) {
|
|
15
|
-
for (const d of diagnostics) {
|
|
16
|
-
console.error(` ✖ ${d.code}: ${d.message}`);
|
|
17
|
-
}
|
|
18
|
-
process.exit(1);
|
|
19
|
-
}
|
|
20
|
-
try {
|
|
21
|
-
const agent = await loadAgent(agentDirPath);
|
|
22
|
-
mkdirSync(outDir, { recursive: true });
|
|
23
|
-
const manifest = {
|
|
24
|
-
config: agent.manifest.config,
|
|
25
|
-
instructions: agent.manifest.instructions,
|
|
26
|
-
tools: Object.keys(agent.manifest.tools),
|
|
27
|
-
skills: Object.keys(agent.manifest.skills),
|
|
28
|
-
hooks: Object.keys(agent.manifest.hooks),
|
|
29
|
-
channels: Object.keys(agent.manifest.channels),
|
|
30
|
-
schedules: Object.keys(agent.manifest.schedules),
|
|
31
|
-
discovered: {
|
|
32
|
-
tools: discovered.tools.map((t) => t.name),
|
|
33
|
-
skills: discovered.skills.map((s) => s.name),
|
|
34
|
-
hooks: discovered.hooks.map((h) => h.name),
|
|
35
|
-
channels: discovered.channels.map((c) => c.name),
|
|
36
|
-
schedules: discovered.schedules.map((s) => s.name),
|
|
37
|
-
},
|
|
38
|
-
session: agent.manifest.session,
|
|
39
|
-
policy: agent.manifest.policy,
|
|
40
|
-
};
|
|
41
|
-
writeFileSync(join(outDir, "manifest.json"), JSON.stringify(manifest, null, 2));
|
|
42
|
-
console.log(` Written to ${outDir}/manifest.json`);
|
|
43
|
-
console.log(` Tools: ${manifest.tools.length}`);
|
|
44
|
-
console.log(` Skills: ${manifest.skills.length}`);
|
|
45
|
-
console.log(` Channels: ${manifest.channels.length}`);
|
|
46
|
-
console.log(` Schedules: ${manifest.schedules.length}`);
|
|
47
|
-
console.log(`\n Done.\n`);
|
|
48
|
-
}
|
|
49
|
-
catch (err) {
|
|
50
|
-
console.error(` Build failed:`, err);
|
|
51
|
-
process.exit(1);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=build.js.map
|
package/dist/cli/build.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/dev.d.ts
DELETED
package/dist/cli/dev.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/cli/dev.ts"],"names":[],"mappings":"AAQA,wBAAsB,UAAU,CAAC,OAAO,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0EhB"}
|