eve 0.44.0 → 0.44.2

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.
Files changed (78) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/src/chunks/{use-eve-agent-C0SG1Ttk.js → use-eve-agent-BsLJiIbc.js} +224 -62
  3. package/dist/src/chunks/{use-eve-agent-D71oDil7.js → use-eve-agent-DpUEwS23.js} +222 -62
  4. package/dist/src/cli/commands/extension-init.js +1 -1
  5. package/dist/src/cli/commands/init.js +1 -1
  6. package/dist/src/cli/dev/tui/setup-commands.js +1 -1
  7. package/dist/src/client/eve-agent-store-helpers.d.ts +12 -0
  8. package/dist/src/client/eve-agent-store-helpers.js +2 -0
  9. package/dist/src/client/eve-agent-store.d.ts +8 -6
  10. package/dist/src/client/eve-agent-store.js +1 -2
  11. package/dist/src/client/ndjson.d.ts +3 -1
  12. package/dist/src/client/ndjson.js +3 -3
  13. package/dist/src/client/open-stream.d.ts +3 -0
  14. package/dist/src/client/open-stream.js +1 -1
  15. package/dist/src/context/build-dynamic-tools.js +1 -1
  16. package/dist/src/context/dynamic-tool-lifecycle.d.ts +5 -1
  17. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  18. package/dist/src/context/keys.d.ts +4 -2
  19. package/dist/src/context/keys.js +1 -1
  20. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  21. package/dist/src/execution/dispatch-turn-step.js +1 -1
  22. package/dist/src/execution/eve-workflow-attributes.d.ts +3 -0
  23. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  24. package/dist/src/execution/pending-turn-state.d.ts +9 -0
  25. package/dist/src/execution/pending-turn-state.js +1 -0
  26. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  27. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  28. package/dist/src/execution/turn-workflow.js +1 -1
  29. package/dist/src/execution/workflow-steps.js +1 -1
  30. package/dist/src/harness/channel-delivery-instrumentation.js +1 -1
  31. package/dist/src/harness/instrumentation/content-policy.d.ts +6 -0
  32. package/dist/src/harness/instrumentation/content-policy.js +1 -0
  33. package/dist/src/harness/instrumentation/lifecycle.d.ts +2 -0
  34. package/dist/src/harness/instrumentation/runtime-context.js +1 -1
  35. package/dist/src/harness/runtime-actions.js +1 -1
  36. package/dist/src/harness/tool-loop.js +2 -2
  37. package/dist/src/internal/application/package.js +1 -1
  38. package/dist/src/internal/workflow-bundle/dynamic-remote-agent-transform.js +2 -2
  39. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.d.ts +4 -4
  40. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +3 -4
  41. package/dist/src/internal/workflow-bundle/stable-module-id.d.ts +6 -0
  42. package/dist/src/internal/workflow-bundle/stable-module-id.js +1 -0
  43. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  44. package/dist/src/public/channels/eve.js +3 -3
  45. package/dist/src/public/tools/approval/approval-helpers.js +1 -1
  46. package/dist/src/react/use-eve-agent.d.ts +10 -1
  47. package/dist/src/react/use-eve-agent.js +1 -1
  48. package/dist/src/runtime/attributes/emit.d.ts +1 -1
  49. package/dist/src/runtime/attributes/normalize.d.ts +1 -1
  50. package/dist/src/runtime/attributes/normalize.js +1 -1
  51. package/dist/src/runtime/framework-tools/connection-search-dynamic.js +2 -2
  52. package/dist/src/runtime/framework-tools/subagent/local.js +1 -1
  53. package/dist/src/runtime/sessions/runtime-context-keys.js +1 -1
  54. package/dist/src/setup/integrations/linq/connect.js +1 -1
  55. package/dist/src/setup/primitives/pm/npm.js +1 -1
  56. package/dist/src/setup/primitives/pm/pnpm.js +5 -9
  57. package/dist/src/setup/primitives/pm/types.d.ts +0 -2
  58. package/dist/src/setup/scaffold/create/project.js +1 -1
  59. package/dist/src/setup/scaffold/create/web-template.d.ts +9 -4
  60. package/dist/src/setup/scaffold/create/web-template.js +296 -73
  61. package/dist/src/shared/durable-dynamic-tool-callbacks.d.ts +43 -19
  62. package/dist/src/shared/durable-dynamic-tool-callbacks.js +1 -1
  63. package/dist/src/svelte/index.js +1 -1
  64. package/dist/src/svelte/use-eve-agent.d.ts +4 -0
  65. package/dist/src/svelte/use-eve-agent.js +1 -1
  66. package/dist/src/tasks/delivery-context.d.ts +9 -0
  67. package/dist/src/tasks/delivery-context.js +5 -2
  68. package/dist/src/vue/index.js +1 -1
  69. package/dist/src/vue/use-eve-agent.d.ts +4 -0
  70. package/dist/src/vue/use-eve-agent.js +1 -1
  71. package/docs/concepts/sessions-runs-and-streaming.md +1 -1
  72. package/docs/guides/dynamic-capabilities.md +10 -2
  73. package/docs/guides/frontend/nextjs.mdx +23 -0
  74. package/docs/guides/frontend/overview.mdx +24 -9
  75. package/docs/guides/frontend/use-eve-agent-svelte.mdx +9 -9
  76. package/docs/guides/frontend/use-eve-agent-vue.mdx +9 -9
  77. package/docs/tools/overview.mdx +5 -4
  78. package/package.json +1 -1
@@ -1,4 +1,7 @@
1
- import{getSessionTaskIndex}from"#tasks/session-index.js";import{EMPTY_DELIVERY_SENTINEL}from"#shared/empty-delivery.js";const TASK_DELIVERY_CONTEXT_LABEL=`[Task state]`,TASK_DELIVERY_PENDING_INSTRUCTION=`Background task control: incomplete cohort
1
+ import{getSessionTaskIndex}from"#tasks/session-index.js";import{EMPTY_DELIVERY_SENTINEL}from"#shared/empty-delivery.js";const TASK_DELIVERY_CONTEXT_LABEL=`[Task state]`,TASK_DELIVERY_INITIATING_INSTRUCTION=`Background task reporting: launch acknowledgement
2
+ The accompanying ${TASK_DELIVERY_CONTEXT_LABEL} system message is runtime-authored and lists background tasks accepted so far from the current turn. They continue independently after this turn.
3
+
4
+ Continue carrying out the user's request, including starting any remaining background work. When no further tool calls are needed in this turn, send one brief user-facing acknowledgement that the background work has started. Do not wait for results or report results that are not available yet. End the turn after the acknowledgement.`,TASK_DELIVERY_PENDING_INSTRUCTION=`Background task control: incomplete cohort
2
5
  This framework-authored instruction overrides any earlier instruction to report, summarize, acknowledge, or otherwise handle background results.
3
6
 
4
7
  The accompanying ${TASK_DELIVERY_CONTEXT_LABEL} message is runtime-authored and lists tasks started by the same parent turn. At least one of those tasks is still pending, so the combined report is not ready.
@@ -14,4 +17,4 @@ Delivery:
14
17
 
15
18
  Incorrect: "Two of three tasks have completed."
16
19
  Incorrect: "Still waiting for the remaining task."
17
- Correct: ${EMPTY_DELIVERY_SENTINEL}`,TASK_DELIVERY_SETTLED_INSTRUCTION=`Background task reporting\nThis turn was triggered by background task activity. The accompanying ${TASK_DELIVERY_CONTEXT_LABEL} message is runtime-authored and lists tasks started by the same parent turn, all settled, with every available terminal output. Do not reply with ${EMPTY_DELIVERY_SENTINEL}. Send one user-facing response that combines their useful results.`;function resolveTaskDeliveryContext(t){let n=getSessionTaskIndex(t.state),r=n.find(e=>t.taskDeliveryId.startsWith(`${e.taskId}:`));if(r===void 0)return;let i=n.filter(e=>e.createdByTurnId===r.createdByTurnId),a=i.every(e=>e.terminalView!==void 0),o=i.map(e=>({name:e.metadata.name,output:a?e.terminalView?.lastOutput:void 0,status:e.terminalView?.status??`pending`,taskId:e.taskId}));return{context:`${TASK_DELIVERY_CONTEXT_LABEL}\n${JSON.stringify({tasks:o})}`,phase:a?`settled`:`pending`}}export{TASK_DELIVERY_CONTEXT_LABEL,TASK_DELIVERY_PENDING_INSTRUCTION,TASK_DELIVERY_SETTLED_INSTRUCTION,resolveTaskDeliveryContext};
20
+ Correct: ${EMPTY_DELIVERY_SENTINEL}`,TASK_DELIVERY_SETTLED_INSTRUCTION=`Background task reporting\nThis turn was triggered by background task activity. The accompanying ${TASK_DELIVERY_CONTEXT_LABEL} message is runtime-authored and lists tasks started by the same parent turn, all settled, with every available terminal output. Do not reply with ${EMPTY_DELIVERY_SENTINEL}. Send one user-facing response that combines their useful results.`;function resolveTaskDeliveryContext(t){let n=getSessionTaskIndex(t.state),r=n.find(e=>t.taskDeliveryId.startsWith(`${e.taskId}:`));return r===void 0?void 0:projectTaskCohort(n.filter(e=>e.createdByTurnId===r.createdByTurnId))}function resolveInitiatingTaskContext(t){let n=getSessionTaskIndex(t.state).filter(e=>e.createdByTurnId===t.turnId);if(n.some(e=>e.executor!==void 0&&e.terminalView===void 0))return{...projectTaskCohort(n),phase:`initiating`}}function projectTaskCohort(e){let t=e.every(e=>e.terminalView!==void 0),r=e.map(e=>({name:e.metadata.name,output:t?e.terminalView?.lastOutput:void 0,status:e.terminalView?.status??`pending`,taskId:e.taskId}));return{context:`${TASK_DELIVERY_CONTEXT_LABEL}\n${JSON.stringify({tasks:r})}`,phase:t?`settled`:`pending`}}export{TASK_DELIVERY_CONTEXT_LABEL,TASK_DELIVERY_INITIATING_INSTRUCTION,TASK_DELIVERY_PENDING_INSTRUCTION,TASK_DELIVERY_SETTLED_INSTRUCTION,resolveInitiatingTaskContext,resolveTaskDeliveryContext};
@@ -1,3 +1,3 @@
1
- import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-D71oDil7.js";
1
+ import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-DpUEwS23.js";
2
2
 
3
3
  export { defaultMessageReducer, useEveAgent };
@@ -33,6 +33,8 @@ export interface UseEveAgentReturn<TData> {
33
33
  readonly error: ComputedRef<Error | undefined>;
34
34
  /** Raw server events from this session (authoritative stream). */
35
35
  readonly events: ComputedRef<readonly MessageStreamEvent[]>;
36
+ /** Replay the attached durable session and follow its in-flight turn, if any. */
37
+ readonly resume: () => Promise<void>;
36
38
  /** Clear all state and start a new session. */
37
39
  readonly reset: () => void;
38
40
  /** Send a message with optional turn settings. */
@@ -98,6 +100,8 @@ export interface UseEveAgentOptions<TData> extends EveAgentStoreCallbacks<TData>
98
100
  * @default defaultMessageReducer()
99
101
  */
100
102
  readonly reducer?: EveAgentReducer<TData>;
103
+ /** Replay the attached durable session after mount. Requires `initialSession` or `session`. */
104
+ readonly resume?: boolean;
101
105
  /**
102
106
  * Externally owned {@link ClientSession} to bind instead of creating one.
103
107
  *
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-D71oDil7.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-DpUEwS23.js";
2
2
 
3
3
  export { useEveAgent };
@@ -86,7 +86,7 @@ Note: consider the privacy, confidentiality, and user-experience implications fo
86
86
 
87
87
  A delegated subagent publishes progress on its own child-session stream. The parent only emits `subagent.called` with a `childSessionId`, which a client uses to attach.
88
88
 
89
- `step.failed` and `turn.failed` carry `{ code, message, details? }` for the failed fragment or turn, and `session.failed` is the terminal session-level variant. `turn.cancelled` is not a failure: the cancelled turn ends without any failure event, `session.waiting` follows, and the session accepts the next message normally — whatever the turn streamed before cancellation stays on the stream, while durable history keeps only what had already settled. When a turn requested an output schema, the finalized payload lands on `result.completed` as `data.result` before the turn boundary. `authorization.required` carries the sign-in challenge (`data.authorization` may include `url`, `userCode`, `expiresAt`, `instructions`), and `authorization.completed` carries `data.outcome` (`"authorized" | "declined" | "failed" | "timed-out"`).
89
+ `step.failed` and `turn.failed` carry `{ code, message, details? }` for the failed fragment or turn, and `session.failed` is the terminal session-level variant. `turn.cancelled` is not a failure: the cancelled turn ends without any failure event, `session.waiting` follows, and the session accepts the next message normally. Whatever the turn streamed before cancellation stays on the stream. Durable history keeps the accepted user input and previously settled work, but discards incomplete assistant output and unfinished tool state. When a turn requested an output schema, the finalized payload lands on `result.completed` as `data.result` before the turn boundary. `authorization.required` carries the sign-in challenge (`data.authorization` may include `url`, `userCode`, `expiresAt`, `instructions`), and `authorization.completed` carries `data.outcome` (`"authorized" | "declined" | "failed" | "timed-out"`).
90
90
 
91
91
  ## The event envelope
92
92
 
@@ -166,7 +166,15 @@ Write callback properties as inline function expressions, arrows, method shortha
166
166
 
167
167
  Closure values must be JSON-serializable. Plain objects, arrays, strings, finite numbers, booleans, and `null` are supported; `undefined` object properties are omitted. Functions, class instances, `Date`, `Map`, symbols, non-finite numbers, and cyclic values fail resolution with the tool name and callback phase instead of being serialized lossily.
168
168
 
169
- Call expressions such as `execute: makeExecutor()` are not transformed. Put the callback body directly in `defineTool()` inside an authored module; eve-provided factories may also supply pre-registered callbacks. eve rejects a dynamic tool if any present callback lacks durable metadata, and replay never reruns the current resolver to recover one.
169
+ Call expressions such as `execute: makeExecutor()` are not transformed. Put the callback body directly in `defineTool()` inside an authored module; eve-provided factories may also supply pre-registered callbacks. eve rejects a dynamic tool if any present callback lacks durable metadata.
170
+
171
+ ### Identity and redeploys
172
+
173
+ A parked call binds to its callback by **tool name and phase** — the same identity a static tool uses — never by source position. This gives dynamic tools static-tool semantics across deploys:
174
+
175
+ - Editing a callback body (or anything else that does not change tool names) is safe: replaying a parked call runs the latest deployed code with the closure values snapshotted when the call was made.
176
+ - If a persisted callback has no registered implementation (fresh process after a crash, or after a redeploy), eve re-runs `session.started` resolvers once to rebind it, then replays.
177
+ - If the tool no longer exists under that name, replay fails closed with an explicit error instead of invoking something else. Turn-scoped and step-scoped tools are not rebound; a parked call to a missing one errors.
170
178
 
171
179
  ### Naming
172
180
 
@@ -189,7 +197,7 @@ A dynamic tool or skill whose name matches an **authored** one **overrides** it
189
197
  | `turn.started` | Once per turn | Every model call in the turn |
190
198
  | `step.started` | Before each model call | That model call |
191
199
 
192
- ¹ Workflow recovery can redeliver a resolver event, so keep resolvers idempotent. Replaying a parked callback does not depend on running the resolver again.
200
+ ¹ Workflow recovery can redeliver a resolver event, so keep resolvers idempotent. Replaying a parked callback does not depend on running the resolver again — except for the one-shot rebind described under [Identity and redeploys](#identity-and-redeploys).
193
201
 
194
202
  ### Execution order
195
203
 
@@ -90,6 +90,29 @@ const agent = useEveAgent({
90
90
 
91
91
  The browser still needs a production authentication policy. See [Authenticate browser requests](./overview#authenticate-browser-requests) for the default fail-closed behavior and channel configuration.
92
92
 
93
+ ## Use the generated Web Chat routes
94
+
95
+ `eve init --channel-web-nextjs` and `eve add channel/web` generate a chat UI with URL-addressed durable sessions:
96
+
97
+ - `/` is the initial landing page.
98
+ - `/s` opens the conversation layout without creating an eve session. The first message creates the session.
99
+ - `/s/[sessionId]` attaches to that durable session, replays its transcript, and follows an in-flight turn.
100
+
101
+ After the first message is accepted, Web Chat replaces the browser URL with `/s/{sessionId}` without remounting the active stream. Reloading that URL passes the session to `useEveAgent` with `resume: true`, so completed history is replayed and an unfinished response continues streaming. **New chat** navigates to the sessionless `/s` route; it does not reset or delete the prior session, which remains available at its URL.
102
+
103
+ The generated UI keeps transcript scroll position in browser `sessionStorage`. This is presentation state only and is not written to the eve session.
104
+
105
+ For a custom Next.js chat route, pass the route session ID explicitly:
106
+
107
+ ```tsx
108
+ const agent = useEveAgent({
109
+ initialSession: { sessionId, streamIndex: 0 },
110
+ resume: true,
111
+ });
112
+ ```
113
+
114
+ See [Resumable sessions](./overview#resumable-sessions) for persistence and replay semantics.
115
+
93
116
  ## Dev vs deploy topology
94
117
 
95
118
  - **Local dev.** `npm run dev` boots the eve dev server next to `next dev` and rewrites the eve routes over to it. The browser only ever talks to the Next.js origin.
@@ -26,7 +26,7 @@ For a public demo, use `none()` from `eve/channels/auth` to admit anonymous requ
26
26
 
27
27
  ## Basic chat (React)
28
28
 
29
- The hook lives in `eve/react`. Render `data.messages`, gate the composer on `status`, and send text with `send`:
29
+ The hook lives in `eve/react`. Render `data.messages`, use `status` to steer follow-ups during an active turn, and send text with `send`:
30
30
 
31
31
  ```tsx
32
32
  "use client";
@@ -44,7 +44,7 @@ export function Chat() {
44
44
  const form = new FormData(event.currentTarget);
45
45
  const message = String(form.get("message") ?? "").trim();
46
46
  if (message.length > 0) {
47
- void agent.send(message);
47
+ void agent.send(message, isBusy ? { turnPolicy: "steer" } : undefined);
48
48
  }
49
49
  }}
50
50
  >
@@ -56,10 +56,8 @@ export function Chat() {
56
56
  )}
57
57
  </article>
58
58
  ))}
59
- <input name="message" disabled={isBusy} />
60
- <button disabled={isBusy} type="submit">
61
- Send
62
- </button>
59
+ <input name="message" />
60
+ <button type="submit">Send</button>
63
61
  </form>
64
62
  );
65
63
  }
@@ -78,6 +76,7 @@ export function Chat() {
78
76
  | `session` | Serializable fixed session cursor (`sessionId`, `streamIndex`). |
79
77
  | `send` | Send text or a multi-part message, with per-turn options. |
80
78
  | `respond` | Answer pending HITL input requests, with per-turn options. |
79
+ | `resume` | Replay an attached session and follow its in-flight turn. |
81
80
  | `cancel` | Request durable cancellation of the active turn. |
82
81
  | `reset` | Clear local events, data, errors, and the local session cursor. |
83
82
 
@@ -105,7 +104,13 @@ await agent.send([
105
104
  ]);
106
105
  ```
107
106
 
108
- Assistant text, reasoning, tool calls, and tool results stream into `data` as they arrive, and `status` moves from `ready` to `submitted` to `streaming` and back. Call `cancel()` to stop the durable server-side turn, and `reset()` to clear local state so the next send starts a fresh durable session.
107
+ Assistant text, reasoning, tool calls, and tool results stream into `data` as they arrive, and `status` moves from `ready` to `submitted` to `streaming` and back. To replace an active turn with a follow-up, send the message with `turnPolicy: "steer"`. eve accepts the message through the durable session, cancels the active turn, and keeps the hook attached through the replacement turn:
108
+
109
+ ```tsx
110
+ await agent.send(message, { turnPolicy: "steer" });
111
+ ```
112
+
113
+ Other message sends and HITL responses reject while the hook is processing a turn. Call `cancel()` to stop the durable server-side turn without replacing it, and `reset()` to clear local state so the next send starts a fresh durable session.
109
114
 
110
115
  `cancel()` can be called as soon as `status` is `"submitted"`; the hook waits for the active response to identify its turn when necessary, sends one guarded cancellation request, and keeps the event stream attached. The promise resolves when eve accepts the request or reports that no turn is active, and rejects if the cancellation request fails. The turn then settles on the same stream as `turn.cancelled` followed by `session.waiting`, so the session is safe to continue.
111
116
 
@@ -275,6 +280,7 @@ const [saved] = useState<SavedEveChat>(() => {
275
280
  const agent = useEveAgent({
276
281
  initialEvents: saved.events ?? [],
277
282
  initialSession: saved.session,
283
+ resume: saved.session !== undefined,
278
284
  onFinish(snapshot) {
279
285
  localStorage.setItem(
280
286
  "eve-chat",
@@ -295,9 +301,18 @@ then save a final snapshot in `onFinish`.
295
301
 
296
302
  `initialEvents` must be an ordered prefix of the same session's stream, but its endpoint does not have to line up exactly with where the stream resumes. Every event carries a stable [`meta.id`](/docs/concepts/sessions-runs-and-streaming#the-event-envelope), and the store drops any event whose id it has already applied — so a saved log that overlaps the replayed prefix renders once, and `onEvent` only fires for events your UI has not seen.
297
303
 
298
- For multiple chat threads, keep one saved event log and session cursor per thread. `agent`, `host`, `reducer`, `session`, `initialEvents`, `initialSession`, `auth`, `headers`, and `optimistic` are read when the hook creates its store, so remount the chat component when switching threads, for example with `key={chat.id}`.
304
+ For multiple chat threads, keep one saved event log and session cursor per thread. `agent`, `host`, `reducer`, `session`, `initialEvents`, `initialSession`, `auth`, `headers`, `optimistic`, and `resume` are read when the hook creates its store, so remount the chat component when switching threads, for example with `key={chat.id}`.
305
+
306
+ Pass `resume: true` with `initialSession` to rebuild the projection from the durable stream after mount. If the stream ends at an in-flight turn, the binding stays attached until that turn reaches its boundary. If the stream already ends at a settled session boundary, replay stops at the history tail.
307
+
308
+ ```tsx
309
+ const agent = useEveAgent({
310
+ initialSession: { sessionId, streamIndex: 0 },
311
+ resume: true,
312
+ });
313
+ ```
299
314
 
300
- If the user can refresh or navigate immediately after pressing send, create your app-level chat row and store the pending user message before calling `send()`. After the request starts, persist the session state as soon as it contains a `sessionId`, then reconnect an interrupted in-flight turn with `session.stream({ startIndex: savedEvents.length })` from the lower-level client.
315
+ If the user can refresh or navigate immediately after pressing send, create your app-level chat row before calling `send()`, then persist the session ID from `onSessionChange`. This lets the reloaded UI mount with that ID and pass `resume: true` while the durable turn is still running.
301
316
 
302
317
  ## Custom hosts and headers
303
318
 
@@ -44,14 +44,14 @@ Call the binding once for a conversation and read its reactive getters directly.
44
44
 
45
45
  The state fields are reactive getters; the commands are ordinary methods:
46
46
 
47
- | Property | Svelte shape |
48
- | ------------------------------------ | --------------------------------- |
49
- | `data` | `TData` |
50
- | `status` | `UseEveAgentStatus` |
51
- | `error` | `Error \| undefined` |
52
- | `events` | `readonly MessageStreamEvent[]` |
53
- | `session` | `ClientSessionState \| undefined` |
54
- | `send`, `respond`, `cancel`, `reset` | Methods |
47
+ | Property | Svelte shape |
48
+ | ---------------------------------------------- | --------------------------------- |
49
+ | `data` | `TData` |
50
+ | `status` | `UseEveAgentStatus` |
51
+ | `error` | `Error \| undefined` |
52
+ | `events` | `readonly MessageStreamEvent[]` |
53
+ | `session` | `ClientSessionState \| undefined` |
54
+ | `send`, `respond`, `resume`, `cancel`, `reset` | Methods |
55
55
 
56
56
  Read the getters directly in templates, `$derived`, or `$effect`. The [shared returned-state reference](./overview#returned-state) describes what each value and command does.
57
57
 
@@ -106,7 +106,7 @@ See [Human-in-the-loop prompts](./overview#human-in-the-loop-prompts) for reques
106
106
 
107
107
  ## Cancel, reset, and resume
108
108
 
109
- Call `agent.cancel()` to stop the durable server-side turn while the binding remains attached through settlement. Destroying the component only disconnects its local stream; it does not cancel server execution. Call `agent.reset()` to clear local state and start a new session. Pass `initialSession` and `initialEvents` to restore a saved conversation. See [Resumable sessions](./overview#resumable-sessions) for the persistence contract and [Sending and streaming](./overview#sending-and-streaming) for cancellation behavior.
109
+ Call `agent.cancel()` to stop the durable server-side turn while the binding remains attached through settlement. Destroying the component only disconnects its local stream; it does not cancel server execution. Call `agent.reset()` to clear local state and start a new session. Pass `initialSession`, `initialEvents`, and `resume: true` to restore a saved conversation and follow an in-flight turn. Use `agent.resume()` directly when restoration is controlled imperatively. See [Resumable sessions](./overview#resumable-sessions) for the persistence contract and [Sending and streaming](./overview#sending-and-streaming) for cancellation behavior.
110
110
 
111
111
  ## Custom host and credentials
112
112
 
@@ -43,14 +43,14 @@ async function handleSubmit() {
43
43
 
44
44
  The state fields are computed refs; the commands are ordinary methods:
45
45
 
46
- | Property | Vue shape |
47
- | ------------------------------------ | ---------------------------------------------- |
48
- | `data` | `ComputedRef<TData>` |
49
- | `status` | `ComputedRef<UseEveAgentStatus>` |
50
- | `error` | `ComputedRef<Error \| undefined>` |
51
- | `events` | `ComputedRef<readonly MessageStreamEvent[]>` |
52
- | `session` | `ComputedRef<ClientSessionState \| undefined>` |
53
- | `send`, `respond`, `cancel`, `reset` | Methods |
46
+ | Property | Vue shape |
47
+ | ---------------------------------------------- | ---------------------------------------------- |
48
+ | `data` | `ComputedRef<TData>` |
49
+ | `status` | `ComputedRef<UseEveAgentStatus>` |
50
+ | `error` | `ComputedRef<Error \| undefined>` |
51
+ | `events` | `ComputedRef<readonly MessageStreamEvent[]>` |
52
+ | `session` | `ComputedRef<ClientSessionState \| undefined>` |
53
+ | `send`, `respond`, `resume`, `cancel`, `reset` | Methods |
54
54
 
55
55
  Destructuring preserves reactivity because each state value remains a ref. Read refs with `.value` in `<script>` and without `.value` in a template. The [shared returned-state reference](./overview#returned-state) describes what each value and command does.
56
56
 
@@ -108,7 +108,7 @@ See [Human-in-the-loop prompts](./overview#human-in-the-loop-prompts) for reques
108
108
 
109
109
  ## Cancel, reset, and resume
110
110
 
111
- Call `cancel()` to stop the durable server-side turn while the composable remains attached through settlement. Disposing the component only disconnects its local stream; it does not cancel server execution. Call `reset()` to clear local state and start a new session. Pass `initialSession` and `initialEvents` to restore a saved conversation. See [Resumable sessions](./overview#resumable-sessions) for the persistence contract and [Sending and streaming](./overview#sending-and-streaming) for cancellation behavior.
111
+ Call `cancel()` to stop the durable server-side turn while the composable remains attached through settlement. Disposing the component only disconnects its local stream; it does not cancel server execution. Call `reset()` to clear local state and start a new session. Pass `initialSession`, `initialEvents`, and `resume: true` to restore a saved conversation and follow an in-flight turn. Use `resume()` directly when restoration is controlled imperatively. See [Resumable sessions](./overview#resumable-sessions) for the persistence contract and [Sending and streaming](./overview#sending-and-streaming) for cancellation behavior.
112
112
 
113
113
  ## Custom host and credentials
114
114
 
@@ -70,10 +70,11 @@ progress with `task.send({ kind: "update", message })` and the terminal result w
70
70
  in-memory callback dies with the process — so the cross-process executor wire remains
71
71
  framework-owned and is not yet a stable authored-tool API.
72
72
 
73
- Each task-triggered parent turn includes runtime-authored state for tasks started by the same
74
- parent turn. The model is instructed to keep related intermediate results silent while that state
75
- contains pending tasks. Once every related task is terminal, the state includes their outputs so
76
- the model can combine the useful results.
73
+ After the initiating turn accepts background tasks, eve supplies runtime-authored state for that
74
+ cohort and instructs the model to acknowledge that the work started without waiting for results.
75
+ Later task-triggered parent turns receive fresh state for the same cohort. The model is instructed
76
+ to keep related intermediate results silent while any task remains pending. Once every related
77
+ task is terminal, the state includes their outputs so the model can combine the useful results.
77
78
 
78
79
  ### The `ctx` parameter
79
80
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eve",
3
- "version": "0.44.0",
3
+ "version": "0.44.2",
4
4
  "private": false,
5
5
  "description": "Filesystem-first framework for durable backend AI agents that run anywhere.",
6
6
  "keywords": [