eve 0.40.0 → 0.42.0
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/CHANGELOG.md +23 -0
- package/dist/src/channel/channel-operations.d.ts +2 -2
- package/dist/src/channel/channel-operations.js +1 -1
- package/dist/src/channel/session.d.ts +2 -2
- package/dist/src/channel/session.js +1 -1
- package/dist/src/chunks/{use-eve-agent-CTI9fHaO.js → use-eve-agent-C0SG1Ttk.js} +4 -1
- package/dist/src/chunks/{use-eve-agent-DlkXRQVo.js → use-eve-agent-D71oDil7.js} +4 -1
- package/dist/src/cli/dev/tui/tool-presentation.js +1 -1
- package/dist/src/client/index.d.ts +1 -1
- package/dist/src/client/index.js +1 -1
- package/dist/src/client/session.js +1 -1
- package/dist/src/compiled/.vendor-stamp.json +2 -1
- package/dist/src/compiled/@linqapp/chat-sdk-adapter/LICENSE +201 -0
- package/dist/src/compiled/@linqapp/chat-sdk-adapter/index.d.ts +3 -0
- package/dist/src/compiled/@linqapp/chat-sdk-adapter/index.js +8 -0
- package/dist/src/compiler/extension-compatibility.d.ts +4 -4
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/execution/tasks/parent/hitl-proxy-steps.js +1 -1
- package/dist/src/execution/wire/session-inbox-wire.v1.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/packages/eve-catalog/src/index.js +1 -1
- package/dist/src/public/channels/discord/hitl.d.ts +3 -3
- package/dist/src/public/channels/discord/hitl.js +1 -1
- package/dist/src/public/channels/eve.js +1 -1
- package/dist/src/public/channels/linq/inboundContent.d.ts +4 -0
- package/dist/src/public/channels/linq/inboundContent.js +1 -0
- package/dist/src/public/channels/linq/index.d.ts +1 -0
- package/dist/src/public/channels/linq/index.js +1 -0
- package/dist/src/public/channels/linq/linqChannel.d.ts +66 -0
- package/dist/src/public/channels/linq/linqChannel.js +1 -0
- package/dist/src/public/channels/mcp.js +1 -1
- package/dist/src/public/channels/slack/hitl.d.ts +4 -5
- package/dist/src/public/channels/slack/hitl.js +2 -2
- package/dist/src/public/channels/slack/interactions.js +1 -1
- package/dist/src/public/channels/slack/session-operations.d.ts +2 -2
- package/dist/src/public/channels/slack/slackChannel.d.ts +4 -4
- package/dist/src/public/channels/teams/api.js +2 -2
- package/dist/src/public/channels/teams/defaults.js +1 -1
- package/dist/src/public/channels/teams/hitl.d.ts +11 -2
- package/dist/src/public/channels/teams/hitl.js +1 -1
- package/dist/src/public/channels/teams/index.d.ts +1 -1
- package/dist/src/public/channels/teams/index.js +1 -1
- package/dist/src/public/channels/teams/teamsChannel.d.ts +8 -0
- package/dist/src/public/channels/teams/teamsChannel.js +1 -1
- package/dist/src/public/channels/telegram/hitl.d.ts +4 -4
- package/dist/src/public/channels/telegram/hitl.js +1 -1
- package/dist/src/runtime/framework-tools/ask-question.js +1 -1
- package/dist/src/runtime/framework-tools/tasks.d.ts +3 -11
- package/dist/src/runtime/framework-tools/tasks.js +1 -1
- package/dist/src/runtime/input/types.d.ts +19 -1
- package/dist/src/runtime/input/types.js +1 -1
- package/dist/src/runtime/prompt/compose.js +1 -1
- package/dist/src/runtime/session-callback-route.js +1 -1
- package/dist/src/setup/integrations/linq/connect.d.ts +32 -0
- package/dist/src/setup/integrations/linq/connect.js +1 -0
- package/dist/src/setup/integrations/linq/setup.d.ts +22 -0
- package/dist/src/setup/integrations/linq/setup.js +15 -0
- package/dist/src/setup/integrations/registry.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/setup/scaffold/create/web-template.d.ts +2 -2
- package/dist/src/setup/scaffold/create/web-template.js +74 -50
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/channels/custom.mdx +12 -0
- package/docs/channels/linq.mdx +67 -0
- package/docs/channels/meta.json +1 -0
- package/docs/channels/overview.mdx +3 -2
- package/docs/channels/teams.mdx +2 -0
- package/docs/guides/client/streaming.mdx +1 -1
- package/package.json +7 -1
|
@@ -17,32 +17,40 @@ export default eveChannel({
|
|
|
17
17
|
|
|
18
18
|
import type { UserContent } from "ai";
|
|
19
19
|
import { useEveAgent } from "eve/react";
|
|
20
|
-
import { AlertCircleIcon } from "lucide-react";
|
|
20
|
+
import { AlertCircleIcon, BrainIcon } from "lucide-react";
|
|
21
21
|
import { useState } from "react";
|
|
22
22
|
import {
|
|
23
23
|
Conversation,
|
|
24
24
|
ConversationContent,
|
|
25
25
|
ConversationScrollButton,
|
|
26
26
|
} from "@/components/ai-elements/conversation";
|
|
27
|
+
import { Message, MessageContent } from "@/components/ai-elements/message";
|
|
27
28
|
import {
|
|
28
29
|
PromptInput,
|
|
29
30
|
type PromptInputMessage,
|
|
30
31
|
PromptInputSubmit,
|
|
31
32
|
PromptInputTextarea,
|
|
32
33
|
} from "@/components/ai-elements/prompt-input";
|
|
34
|
+
import { Shimmer } from "@/components/ai-elements/shimmer";
|
|
33
35
|
import { cn } from "@/lib/utils";
|
|
34
36
|
import { AgentMessage } from "./agent-message";
|
|
35
37
|
|
|
36
38
|
const AGENT_NAME = "__EVE_INIT_APP_NAME__";
|
|
37
39
|
|
|
38
|
-
type AgentStatus = ReturnType<typeof useEveAgent>["status"];
|
|
39
|
-
|
|
40
40
|
export function AgentChat() {
|
|
41
41
|
const [cancellationError, setCancellationError] = useState<string>();
|
|
42
42
|
const agent = useEveAgent();
|
|
43
43
|
const isBusy = agent.status === "submitted" || agent.status === "streaming";
|
|
44
44
|
const isEmpty = agent.data.messages.length === 0;
|
|
45
|
-
const
|
|
45
|
+
const lastMessage = agent.data.messages.at(-1);
|
|
46
|
+
const isPendingAssistantShell =
|
|
47
|
+
lastMessage?.role === "assistant" &&
|
|
48
|
+
lastMessage.parts.every((part) => part.type === "step-start");
|
|
49
|
+
const showPendingThinking =
|
|
50
|
+
isBusy &&
|
|
51
|
+
(agent.status === "submitted" || lastMessage?.role !== "assistant" || isPendingAssistantShell);
|
|
52
|
+
const turnFailure = isBusy ? undefined : getLatestTurnFailure(agent.events);
|
|
53
|
+
const errorMessage = cancellationError ?? agent.error?.message ?? turnFailure;
|
|
46
54
|
|
|
47
55
|
const requestCancellation = () => {
|
|
48
56
|
setCancellationError(undefined);
|
|
@@ -80,7 +88,7 @@ export function AgentChat() {
|
|
|
80
88
|
|
|
81
89
|
const composer = (
|
|
82
90
|
<PromptInput onSubmit={handleSubmit}>
|
|
83
|
-
<PromptInputTextarea placeholder="Send a message…" />
|
|
91
|
+
<PromptInputTextarea disabled={isBusy} placeholder="Send a message…" />
|
|
84
92
|
<PromptInputSubmit onStop={requestCancellation} status={agent.status} />
|
|
85
93
|
</PromptInput>
|
|
86
94
|
);
|
|
@@ -88,17 +96,17 @@ export function AgentChat() {
|
|
|
88
96
|
return (
|
|
89
97
|
<main className="flex h-dvh flex-col overflow-hidden bg-background text-foreground">
|
|
90
98
|
{isEmpty ? null : (
|
|
91
|
-
<header className="flex h-14 shrink-0 items-center justify-center
|
|
92
|
-
<span className="
|
|
93
|
-
<span className="truncate text-muted-foreground text-sm">{AGENT_NAME}</span>
|
|
94
|
-
<StatusDot status={agent.status} />
|
|
95
|
-
</span>
|
|
99
|
+
<header className="flex h-14 shrink-0 items-center justify-center pl-4 pr-2">
|
|
100
|
+
<span className="truncate text-muted-foreground text-sm">{AGENT_NAME}</span>
|
|
96
101
|
</header>
|
|
97
102
|
)}
|
|
98
103
|
|
|
99
104
|
{errorMessage ? (
|
|
100
105
|
<div className="mx-auto w-full max-w-3xl shrink-0 px-4 pt-2 sm:px-6">
|
|
101
|
-
<div
|
|
106
|
+
<div
|
|
107
|
+
className="flex items-start gap-3 rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2.5 text-sm"
|
|
108
|
+
role="alert"
|
|
109
|
+
>
|
|
102
110
|
<AlertCircleIcon className="mt-0.5 size-4 shrink-0 text-destructive" />
|
|
103
111
|
<div>
|
|
104
112
|
<p className="font-medium">Request failed</p>
|
|
@@ -111,20 +119,25 @@ export function AgentChat() {
|
|
|
111
119
|
{isEmpty ? null : (
|
|
112
120
|
<Conversation className="min-h-0 flex-1">
|
|
113
121
|
<ConversationContent className="mx-auto w-full max-w-3xl gap-6 px-4 py-6 sm:px-6">
|
|
114
|
-
{agent.data.messages.map((message, index) =>
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
122
|
+
{agent.data.messages.map((message, index) =>
|
|
123
|
+
showPendingThinking &&
|
|
124
|
+
isPendingAssistantShell &&
|
|
125
|
+
message.id === lastMessage.id ? null : (
|
|
126
|
+
<AgentMessage
|
|
127
|
+
canRespond={!isBusy}
|
|
128
|
+
isStreaming={
|
|
129
|
+
agent.status === "streaming" && index === agent.data.messages.length - 1
|
|
130
|
+
}
|
|
131
|
+
key={message.id}
|
|
132
|
+
message={message}
|
|
133
|
+
onInputResponses={(inputResponses) => {
|
|
134
|
+
setCancellationError(undefined);
|
|
135
|
+
return agent.respond(inputResponses);
|
|
136
|
+
}}
|
|
137
|
+
/>
|
|
138
|
+
),
|
|
139
|
+
)}
|
|
140
|
+
{showPendingThinking ? <PendingThinking /> : null}
|
|
128
141
|
</ConversationContent>
|
|
129
142
|
<ConversationScrollButton />
|
|
130
143
|
</Conversation>
|
|
@@ -149,34 +162,45 @@ export function AgentChat() {
|
|
|
149
162
|
);
|
|
150
163
|
}
|
|
151
164
|
|
|
165
|
+
function PendingThinking() {
|
|
166
|
+
return (
|
|
167
|
+
<Message aria-live="polite" from="assistant">
|
|
168
|
+
<MessageContent>
|
|
169
|
+
<div className="mb-4 flex w-full items-center gap-2 text-muted-foreground text-sm">
|
|
170
|
+
<BrainIcon className="size-4" />
|
|
171
|
+
<Shimmer duration={1}>Thinking</Shimmer>
|
|
172
|
+
</div>
|
|
173
|
+
</MessageContent>
|
|
174
|
+
</Message>
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
152
178
|
function toErrorMessage(error: unknown): string {
|
|
153
179
|
return error instanceof Error ? error.message : "Unable to cancel the response.";
|
|
154
180
|
}
|
|
155
181
|
|
|
156
|
-
function
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
: isLive
|
|
162
|
-
? "bg-emerald-500"
|
|
163
|
-
: status === "ready"
|
|
164
|
-
? "bg-muted-foreground"
|
|
165
|
-
: "bg-muted-foreground/50";
|
|
182
|
+
function getLatestTurnFailure(
|
|
183
|
+
events: ReturnType<typeof useEveAgent>["events"],
|
|
184
|
+
): string | undefined {
|
|
185
|
+
for (let index = events.length - 1; index >= 0; index -= 1) {
|
|
186
|
+
const event = events[index];
|
|
166
187
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
188
|
+
if (event.type === "turn.failed") {
|
|
189
|
+
return event.data.code === "MODEL_CALL_FAILED"
|
|
190
|
+
? "The model is temporarily unavailable. Please try again."
|
|
191
|
+
: event.data.message;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
if (event.type === "turn.completed" || event.type === "turn.cancelled") {
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (event.type === "message.received") {
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return undefined;
|
|
180
204
|
}
|
|
181
205
|
`,"app/_components/agent-message.tsx":`"use client";
|
|
182
206
|
|
|
@@ -1845,7 +1869,7 @@ import { Spinner } from "@/components/ui/spinner";
|
|
|
1845
1869
|
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
|
|
1846
1870
|
import { cn } from "@/lib/utils";
|
|
1847
1871
|
import type { ChatStatus, FileUIPart, SourceDocumentUIPart } from "ai";
|
|
1848
|
-
import { ArrowUpIcon, ImageIcon, Monitor, PlusIcon,
|
|
1872
|
+
import { ArrowUpIcon, ImageIcon, Monitor, PlusIcon, XIcon } from "lucide-react";
|
|
1849
1873
|
import { nanoid } from "nanoid";
|
|
1850
1874
|
import type {
|
|
1851
1875
|
ChangeEvent,
|
|
@@ -2954,7 +2978,7 @@ export const PromptInputSubmit = ({
|
|
|
2954
2978
|
if (status === "submitted") {
|
|
2955
2979
|
Icon = <Spinner />;
|
|
2956
2980
|
} else if (status === "streaming") {
|
|
2957
|
-
Icon = <
|
|
2981
|
+
Icon = <span aria-hidden className="size-2.5 rounded-[2px] bg-current" />;
|
|
2958
2982
|
} else if (status === "error") {
|
|
2959
2983
|
Icon = <XIcon className="size-4" />;
|
|
2960
2984
|
}
|
package/dist/src/svelte/index.js
CHANGED
package/dist/src/vue/index.js
CHANGED
package/docs/channels/custom.mdx
CHANGED
|
@@ -111,6 +111,18 @@ await session.reset({ reason: "Retire this session" });
|
|
|
111
111
|
await session.getEventStream({ startIndex: 12 });
|
|
112
112
|
```
|
|
113
113
|
|
|
114
|
+
`respond()` accepts exact response literals directly. If responses have already
|
|
115
|
+
been widened to `InputResponse[]`—for example, after decoding a platform
|
|
116
|
+
payload—validate them with eve's strict schema before delivery. The validated
|
|
117
|
+
type preserves that proof across channel wrappers:
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
import { parseInputResponses } from "eve/client";
|
|
121
|
+
|
|
122
|
+
const inputResponses = parseInputResponses(decodedResponses);
|
|
123
|
+
await source.respond(inputResponses, { auth });
|
|
124
|
+
```
|
|
125
|
+
|
|
114
126
|
Message sends use the channel's `turnPolicy`, which defaults to `"steer"`. An accepted message arriving during an active turn is durably buffered before eve cancels that turn and starts the message as a replacement turn. Configure `turnPolicy: "queue"` on `defineChannel(...)` when active turns should finish in order, or override one send:
|
|
115
127
|
|
|
116
128
|
```ts
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Linq
|
|
3
|
+
description: Connect an eve agent to iMessage and SMS through Linq.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use `linqChannel` to receive and reply to iMessage and SMS conversations through Linq.
|
|
7
|
+
|
|
8
|
+
Run `eve add channel/linq` to choose Vercel Connect or portable credentials. With Vercel Connect, eve signs you in and creates or links a Vercel project when needed. Then choose whether to create a managed Linq account and line or connect an existing Linq account with its partner API token and phone numbers. eve configures the connector and webhook through Connect:
|
|
9
|
+
|
|
10
|
+
```ts title="agent/channels/linq.ts"
|
|
11
|
+
import { connectLinqCredentials } from "@vercel/connect/eve";
|
|
12
|
+
import { linqChannel } from "eve/channels/linq";
|
|
13
|
+
|
|
14
|
+
export default linqChannel({
|
|
15
|
+
credentials: connectLinqCredentials("linq/my-agent"),
|
|
16
|
+
});
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The default webhook route is `/eve/v1/linq`. The channel verifies forwarded webhooks with same-project Vercel OIDC by default, marks accepted messages as read, and continues the same eve session for every message in a Linq conversation. A new accepted message cooperatively cancels an active turn and steers its replacement turn.
|
|
20
|
+
|
|
21
|
+
Set `turnPolicy: "queue"` when every response should finish before Linq starts the next message.
|
|
22
|
+
|
|
23
|
+
Customize inbound dispatch with `onMessage`. Return `null` to ignore a message, or return `title` alongside `auth` to set the title when the dispatch starts a run:
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
export default linqChannel({
|
|
27
|
+
credentials: connectLinqCredentials("linq/my-agent"),
|
|
28
|
+
onMessage(_ctx, message) {
|
|
29
|
+
if (message.author.isBot) return null;
|
|
30
|
+
return {
|
|
31
|
+
auth: null,
|
|
32
|
+
context: [`The sender is ${message.author.fullName}.`],
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Set `route` to override the webhook path or `webhookVerifier` to use a different trusted-forwarder verifier.
|
|
39
|
+
|
|
40
|
+
## Other hosts
|
|
41
|
+
|
|
42
|
+
For a host without Vercel Connect, choose **Use portable credentials** during `eve add channel/linq`. eve writes `LINQ_API_KEY` and `LINQ_WEBHOOK_SECRET` to `.env.local`.
|
|
43
|
+
|
|
44
|
+
After deploying the agent:
|
|
45
|
+
|
|
46
|
+
1. Create a Linq webhook for your public `https://…/eve/v1/linq` URL with `message.received`, `reaction.added`, and `reaction.removed` events.
|
|
47
|
+
2. Set `LINQ_API_KEY` and `LINQ_WEBHOOK_SECRET` in the host's encrypted environment variables.
|
|
48
|
+
|
|
49
|
+
To configure the channel by hand, pass the API key and webhook signing secret:
|
|
50
|
+
|
|
51
|
+
```ts title="agent/channels/linq.ts"
|
|
52
|
+
import { linqChannel } from "eve/channels/linq";
|
|
53
|
+
|
|
54
|
+
export default linqChannel({
|
|
55
|
+
credentials: {
|
|
56
|
+
apiKey: process.env.LINQ_API_KEY!,
|
|
57
|
+
signingSecret: process.env.LINQ_WEBHOOK_SECRET!,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
For direct Linq webhooks, pass `signingSecret`. A supplied `webhookVerifier` takes precedence over it.
|
|
63
|
+
|
|
64
|
+
## What to read next
|
|
65
|
+
|
|
66
|
+
- [Channels overview](./overview): the channel contract and every built-in channel
|
|
67
|
+
- [Auth & route protection](../guides/auth-and-route-protection): authenticating inbound traffic
|
package/docs/channels/meta.json
CHANGED
|
@@ -47,7 +47,7 @@ agent/
|
|
|
47
47
|
intake.ts
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
Install a channel from the registry with `eve add channel
|
|
50
|
+
Install a channel from the registry with `eve add channel/<name>`, such as `eve add channel/slack` or `eve add channel/web`. You can also author the file by hand.
|
|
51
51
|
|
|
52
52
|
## The eve HTTP channel (default)
|
|
53
53
|
|
|
@@ -73,6 +73,7 @@ eve's first-class channels use eve-owned runtimes for webhook handling, verifica
|
|
|
73
73
|
| Local tooling, SDK clients, `curl` | [eve HTTP channel](./eve) (default) |
|
|
74
74
|
| MCP clients delegating durable work | [MCP](./mcp) |
|
|
75
75
|
| Slack mentions, DMs, buttons | [Slack](./slack) |
|
|
76
|
+
| iMessage and SMS | [Linq](./linq) |
|
|
76
77
|
| iMessage | [Photon](./photon) |
|
|
77
78
|
| Discord slash commands, components | [Discord](./discord) |
|
|
78
79
|
| Microsoft Teams messages + Adaptive Cards | [Teams](./teams) |
|
|
@@ -94,7 +95,7 @@ Where an eve agent communicates with people, you may be required to disclose tha
|
|
|
94
95
|
- [eve HTTP channel](./eve): the default session API behind the TUI, SDK clients, and browser UIs
|
|
95
96
|
- [Slack](./slack): the most common platform channel, end to end
|
|
96
97
|
- [MCP](./mcp): expose the agent as a durable invocation service
|
|
97
|
-
- [Photon](./photon), [Discord](./discord), [Teams](./teams), [Telegram](./telegram), [Twilio](./twilio), [GitHub](./github), and [Linear](./linear): the other first-class platform channels
|
|
98
|
+
- [Linq](./linq), [Photon](./photon), [Discord](./discord), [Teams](./teams), [Telegram](./telegram), [Twilio](./twilio), [GitHub](./github), and [Linear](./linear): the other first-class platform channels
|
|
98
99
|
- [Chat SDK adapters](./chat-sdk): reach services eve has no first-class channel for
|
|
99
100
|
- [Custom channels](./custom): build a channel for any surface with `defineChannel`
|
|
100
101
|
- [Durable cross-channel notifications](../patterns/durable-cross-channel-notifications): post to another platform without starting an agent turn
|
package/docs/channels/teams.mdx
CHANGED
|
@@ -56,6 +56,8 @@ A human-in-the-loop (HITL) `input.requested` event renders as an Adaptive Card.
|
|
|
56
56
|
|
|
57
57
|
By default, submissions use the Teams identity of the user who clicked the card. If you customize `onMessage` for an allowlist, configure the same policy in `onInputResponse`; eve otherwise rejects HITL submissions rather than bypassing the message gate.
|
|
58
58
|
|
|
59
|
+
When a tool approval settles, eve replaces its Adaptive Card with the outcome and responder name. A response rejected by an approval policy leaves the shared card unchanged.
|
|
60
|
+
|
|
59
61
|
For invokes that aren't HITL, handle them in `onInvoke(ctx, activity)`.
|
|
60
62
|
|
|
61
63
|
### Proactive sessions
|
|
@@ -124,7 +124,7 @@ client-resolvable `http(s)` and `data:` URLs.
|
|
|
124
124
|
|
|
125
125
|
`authorization.required` is different from the normal `session.waiting` boundary. It means a connection needs OAuth or another authorization challenge before the parked turn can continue. Chat UIs should render the authorization prompt, disable ordinary text input for that session, and persist the event with the rest of the chat history.
|
|
126
126
|
|
|
127
|
-
If you support refresh while an authorization prompt is pending, keep the session cursor from the started session and rehydrate the saved events on load
|
|
127
|
+
The stream can emit an interim `session.waiting` while the authorization callback is pending. An active `send()` or `respond()` response stays attached across that parking boundary until the authorization resolves and the resumed turn reaches its next boundary. If you support refresh while an authorization prompt is pending, keep the session cursor from the started session and rehydrate the saved events on load; the callback or a structured decline resumes the same eve session.
|
|
128
128
|
|
|
129
129
|
## Reconnection
|
|
130
130
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eve",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.42.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Filesystem-first framework for durable backend AI agents that run anywhere.",
|
|
6
6
|
"keywords": [
|
|
@@ -251,6 +251,11 @@
|
|
|
251
251
|
"import": "./dist/src/public/channels/photon/index.js",
|
|
252
252
|
"default": "./dist/src/public/channels/photon/index.js"
|
|
253
253
|
},
|
|
254
|
+
"./channels/linq": {
|
|
255
|
+
"types": "./dist/src/public/channels/linq/index.d.ts",
|
|
256
|
+
"import": "./dist/src/public/channels/linq/index.js",
|
|
257
|
+
"default": "./dist/src/public/channels/linq/index.js"
|
|
258
|
+
},
|
|
254
259
|
"./channels/github": {
|
|
255
260
|
"types": "./dist/src/public/channels/github/index.d.ts",
|
|
256
261
|
"import": "./dist/src/public/channels/github/index.js",
|
|
@@ -315,6 +320,7 @@
|
|
|
315
320
|
"@chat-adapter/state-memory": "4.34.0",
|
|
316
321
|
"@chat-adapter/twilio": "4.34.0",
|
|
317
322
|
"@clack/core": "1.3.1",
|
|
323
|
+
"@linqapp/chat-sdk-adapter": "^0.3.0",
|
|
318
324
|
"@modelcontextprotocol/server": "2.0.0",
|
|
319
325
|
"@nuxt/kit": "^4.0.0",
|
|
320
326
|
"@opentelemetry/context-async-hooks": "2.6.1",
|