eve 0.26.1 → 0.27.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.
Files changed (97) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/src/chunks/{use-eve-agent-CruinZmd.js → use-eve-agent-AeQLLhu9.js} +118 -92
  3. package/dist/src/chunks/{use-eve-agent-BkztZA0v.js → use-eve-agent-PMY2WkAt.js} +118 -92
  4. package/dist/src/cli/commands/info.d.ts +2 -0
  5. package/dist/src/cli/commands/info.js +1 -1
  6. package/dist/src/client/message-action-parts.d.ts +43 -0
  7. package/dist/src/client/message-action-parts.js +1 -0
  8. package/dist/src/client/message-reducer.js +1 -1
  9. package/dist/src/compiled/.vendor-stamp.json +4 -4
  10. package/dist/src/compiled/@chat-adapter/slack/blocks.d.ts +47 -2
  11. package/dist/src/compiled/@chat-adapter/slack/blocks.js +10 -8
  12. package/dist/src/compiled/@chat-adapter/slack/index.d.ts +168 -8
  13. package/dist/src/compiled/@chat-adapter/slack/index.js +28 -28
  14. package/dist/src/compiled/@chat-adapter/slack/{types-AntsVifS.d.ts → types-CdGmMyOr.d.ts} +1 -1
  15. package/dist/src/compiled/@chat-adapter/slack/webhook.d.ts +2 -2
  16. package/dist/src/compiled/@chat-adapter/twilio/index.d.ts +1 -1
  17. package/dist/src/compiled/@chat-adapter/twilio/index.js +1 -1
  18. package/dist/src/compiled/@chat-adapter/twilio/webhook.d.ts +2 -2
  19. package/dist/src/compiled/@vercel/sandbox/index.js +12 -12
  20. package/dist/src/compiled/_chunks/node/{auth-Cuszvn7l.js → auth-BuQkq4Gr.js} +2 -2
  21. package/dist/src/compiled/_chunks/node/{dist-CdH_Yoxt.js → dist-BweCayKF.js} +42 -35
  22. package/dist/src/compiled/_chunks/node/{dist-Drt-_JVK.js → dist-DvkWiagq.js} +6 -4
  23. package/dist/src/compiled/chat/index.d.ts +17 -6
  24. package/dist/src/compiled/chat/index.js +1 -1
  25. package/dist/src/compiled/chat/{jsx-runtime-CzthIo1o.d.ts → jsx-runtime-_JEEAotp.d.ts} +125 -5
  26. package/dist/src/compiler/model-catalog.js +1 -1
  27. package/dist/src/evals/autoevals-client.js +1 -1
  28. package/dist/src/execution/sandbox/bindings/vercel-credentials.js +1 -1
  29. package/dist/src/execution/sandbox/bindings/vercel-lookup.js +1 -1
  30. package/dist/src/execution/session.d.ts +0 -2
  31. package/dist/src/execution/session.js +1 -1
  32. package/dist/src/execution/skills/instructions.d.ts +3 -3
  33. package/dist/src/execution/skills/instructions.js +2 -2
  34. package/dist/src/execution/workflow-steps.js +1 -1
  35. package/dist/src/harness/compaction-prompt.d.ts +19 -1
  36. package/dist/src/harness/compaction-prompt.js +7 -5
  37. package/dist/src/harness/compaction.d.ts +4 -11
  38. package/dist/src/harness/compaction.js +1 -1
  39. package/dist/src/harness/messages.d.ts +7 -0
  40. package/dist/src/harness/messages.js +1 -1
  41. package/dist/src/harness/prompt-cache.d.ts +16 -5
  42. package/dist/src/harness/prompt-cache.js +1 -1
  43. package/dist/src/harness/stale-input-responses.js +2 -2
  44. package/dist/src/harness/token-estimate.d.ts +9 -0
  45. package/dist/src/harness/token-estimate.js +1 -0
  46. package/dist/src/harness/tool-loop.js +2 -2
  47. package/dist/src/internal/application/compiled-artifacts.js +9 -3
  48. package/dist/src/internal/application/package.js +1 -1
  49. package/dist/src/internal/gateway.d.ts +19 -0
  50. package/dist/src/internal/gateway.js +1 -0
  51. package/dist/src/internal/nitro/host/copy-host-middleware.js +1 -1
  52. package/dist/src/internal/user-agent.d.ts +11 -0
  53. package/dist/src/internal/user-agent.js +1 -0
  54. package/dist/src/public/channels/auth.d.ts +59 -9
  55. package/dist/src/public/channels/auth.js +1 -1
  56. package/dist/src/public/next/index.js +1 -1
  57. package/dist/src/public/nuxt/index.d.ts +1 -1
  58. package/dist/src/public/nuxt/index.js +1 -1
  59. package/dist/src/public/nuxt/module.d.ts +10 -24
  60. package/dist/src/public/nuxt/module.js +1 -1
  61. package/dist/src/public/nuxt/routing.d.ts +5 -39
  62. package/dist/src/public/nuxt/routing.js +1 -1
  63. package/dist/src/public/nuxt/vercel-services.d.ts +117 -0
  64. package/dist/src/public/nuxt/vercel-services.js +1 -0
  65. package/dist/src/public/tools/defaults.d.ts +3 -3
  66. package/dist/src/runtime/framework-tools/index.d.ts +3 -2
  67. package/dist/src/runtime/framework-tools/index.js +1 -1
  68. package/dist/src/runtime/framework-tools/skill.d.ts +6 -1
  69. package/dist/src/runtime/framework-tools/skill.js +1 -1
  70. package/dist/src/runtime/framework-tools/todo.js +1 -1
  71. package/dist/src/runtime/governance/auth/http-basic.js +1 -1
  72. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  73. package/dist/src/setup/boxes/select-model.js +1 -1
  74. package/dist/src/setup/gateway-models.js +1 -1
  75. package/dist/src/setup/scaffold/create/project.js +1 -1
  76. package/dist/src/setup/validate-gateway-key.js +1 -1
  77. package/dist/src/{public/next → shared}/resolve-eve-binary.d.ts +1 -1
  78. package/dist/src/svelte/index.js +1 -1
  79. package/dist/src/svelte/use-eve-agent.js +1 -1
  80. package/dist/src/vue/index.js +1 -1
  81. package/dist/src/vue/use-eve-agent.js +1 -1
  82. package/docs/concepts/sessions-runs-and-streaming.md +7 -7
  83. package/docs/extensions.md +115 -77
  84. package/docs/guides/auth-and-route-protection.md +14 -1
  85. package/docs/guides/frontend/nuxt.mdx +22 -1
  86. package/docs/meta.json +1 -0
  87. package/docs/reference/cli.md +1 -1
  88. package/docs/schedules.mdx +1 -1
  89. package/docs/skills.mdx +1 -1
  90. package/package.json +5 -5
  91. package/dist/src/execution/sandbox/bindings/vercel-user-agent.d.ts +0 -6
  92. package/dist/src/execution/sandbox/bindings/vercel-user-agent.js +0 -1
  93. package/dist/src/execution/workflow-skill-root.d.ts +0 -6
  94. package/dist/src/execution/workflow-skill-root.js +0 -1
  95. package/dist/src/public/nuxt/vercel-json.d.ts +0 -17
  96. package/dist/src/public/nuxt/vercel-json.js +0 -1
  97. /package/dist/src/{public/next → shared}/resolve-eve-binary.js +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # eve
2
2
 
3
+ ## 0.27.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 1db41fd: `eve/nuxt` now deploys the agent through Vercel's stable services model: on Vercel builds the module generates an eve Build Output service and a `/eve/v1/*` service route instead of writing legacy `experimentalServices` to `vercel.json`, which Vercel no longer routes (every agent request returned a platform NOT_FOUND). The `configureVercelJson` and `servicePrefix` module options and the `EVE_NUXT_SERVICE_PREFIX` export were removed. Delete any generated `experimentalServices` block from `vercel.json` — the module warns when it sees one — or declare the eve service and its rewrite yourself under the stable `services` field to keep managing routing manually.
8
+
9
+ A generated eve service build now also skips host middleware preservation when the host's Build Output config is not yet present, instead of failing the build. Unlike the Next.js integration, which writes that config early, the Nuxt web service emits it only at the end of its own build, so an isolated eve service build could crash reading a file that had no middleware to preserve.
10
+
11
+ ### Patch Changes
12
+
13
+ - 707de7f: Anthropic models served through the standard `@ai-sdk/amazon-bedrock` Converse provider are now detected as cacheable. Prompt-cache breakpoints previously only matched on the provider name, so Bedrock (which reports provider `amazon-bedrock` and carries the Anthropic identity in the model id) fell through to no caching. The cache marker now also carries the Bedrock `cachePoint` namespace that the Converse provider reads.
14
+ - 7df0bf1: Compaction now reserves room for its checkpoint prompt before reaching the configured threshold. The prompt asks the compaction model to distinguish completed work from remaining work, and later compactions receive the previous checkpoint intact instead of truncating it with ordinary transcript text.
15
+ - 7df0bf1: Compaction now feeds the summarizer full-fidelity conversation text (tool payloads stay compact) and first tries evicting older tool results before summarizing; the kept recent window retains tool results verbatim. Agents lose less context per compaction and stop re-running completed tools.
16
+ - c0e368a: Routes protected by `httpBasic()` now advertise a standards-compliant `WWW-Authenticate: Basic` challenge on 401, using an optional realm that defaults to `"eve"`; HTTP Basic credentials are normalized to Unicode NFC to match the advertised UTF-8 encoding. `routeAuth` collects challenges from the configured auth strategies instead of always emitting `Bearer`.
17
+
18
+ ## 0.26.2
19
+
20
+ ### Patch Changes
21
+
22
+ - dbca15c: Bump the vendored chat SDK (`chat`, `@chat-adapter/*`) from 4.31.0 to 4.34.0. Slack card tables now render as native data table blocks — paginated and sortable — instead of plain table blocks, and `Table()` supports optional `caption` and `pageSize` fields.
23
+ - 938ef92: Identify Eve and its version on AI Gateway, Sandbox, and Workflow service requests.
24
+ - d034e01: Fixed the default chat message reducer dropping assistant text when a single turn produced more than one message — for example, text shown before an OAuth authorization prompt was overwritten by the text that followed it once authorization completed. Each message now renders in the order it arrived.
25
+ - dad9472: `eve info` now reports discovered subagents and schedules in both the human table and the `--json` output, matching what the CLI reference already documented. Previously both surfaces silently omitted them even though discovery resolved them correctly.
26
+ - f1253c5: Listing or loading static skills no longer requires opening a sandbox. Dynamic skills and access to supporting skill package files, such as references, assets, and scripts, remain sandbox-backed.
27
+ - de917a6: Fix a crash when an agent is triggered by a bare mention with no text (e.g. sending just `@bot` in a Microsoft Teams channel). The agent now responds normally instead of failing.
28
+
3
29
  ## 0.26.1
4
30
 
5
31
  ### Patch Changes
@@ -1268,6 +1268,97 @@ function formatAuthorizationDisplayName(name) {
1268
1268
  return `${name.charAt(0).toUpperCase()}${name.slice(1)}`;
1269
1269
  }
1270
1270
 
1271
+ //#endregion
1272
+ //#region src/client/message-action-parts.ts
1273
+ function toMessageInputRequest(request) {
1274
+ return {
1275
+ allowFreeform: request.allowFreeform,
1276
+ display: request.display,
1277
+ options: request.options,
1278
+ prompt: request.prompt,
1279
+ requestId: request.requestId
1280
+ };
1281
+ }
1282
+ function createToolMetadata(descriptor, extra) {
1283
+ return { eve: {
1284
+ inputRequest: extra?.inputRequest,
1285
+ kind: descriptor.kind,
1286
+ name: descriptor.name
1287
+ } };
1288
+ }
1289
+ function mergeToolMetadata(current, next) {
1290
+ const kind = next.eve?.kind ?? current?.eve?.kind ?? "unknown";
1291
+ const name = next.eve?.name ?? current?.eve?.name ?? "unknown";
1292
+ return { eve: {
1293
+ ...current?.eve,
1294
+ ...next.eve,
1295
+ inputRequest: next.eve?.inputRequest ?? current?.eve?.inputRequest,
1296
+ inputResponse: next.eve?.inputResponse ?? current?.eve?.inputResponse,
1297
+ kind,
1298
+ name
1299
+ } };
1300
+ }
1301
+ function approvedApproval(part) {
1302
+ if (!part?.approval?.id) return;
1303
+ return {
1304
+ approved: true,
1305
+ id: part.approval.id,
1306
+ isAutomatic: part.approval.isAutomatic,
1307
+ reason: part.approval.reason
1308
+ };
1309
+ }
1310
+ function normalizeActionRequest(action) {
1311
+ switch (action.kind) {
1312
+ case "load-skill": return {
1313
+ kind: "load-skill",
1314
+ name: "load_skill",
1315
+ toolName: "eve:load-skill"
1316
+ };
1317
+ case "tool-call": return {
1318
+ kind: "tool-call",
1319
+ name: action.toolName,
1320
+ toolName: action.toolName
1321
+ };
1322
+ case "subagent-call": return {
1323
+ kind: "subagent-call",
1324
+ name: action.subagentName,
1325
+ toolName: `eve:subagent:${action.subagentName}`
1326
+ };
1327
+ case "remote-agent-call": return {
1328
+ kind: "subagent-call",
1329
+ name: action.remoteAgentName,
1330
+ toolName: `eve:subagent:${action.remoteAgentName}`
1331
+ };
1332
+ }
1333
+ }
1334
+ function normalizeActionResult(result) {
1335
+ switch (result.kind) {
1336
+ case "load-skill-result": return {
1337
+ kind: "load-skill",
1338
+ name: result.name ?? "load_skill",
1339
+ toolName: "eve:load-skill"
1340
+ };
1341
+ case "tool-result": return {
1342
+ kind: "tool-call",
1343
+ name: result.toolName,
1344
+ toolName: result.toolName
1345
+ };
1346
+ case "subagent-result": return {
1347
+ kind: "subagent-call",
1348
+ name: result.subagentName,
1349
+ toolName: `eve:subagent:${result.subagentName}`
1350
+ };
1351
+ }
1352
+ }
1353
+ function stringifyUnknown(value) {
1354
+ if (typeof value === "string") return value;
1355
+ try {
1356
+ return JSON.stringify(value);
1357
+ } catch {
1358
+ return "Action failed.";
1359
+ }
1360
+ }
1361
+
1271
1362
  //#endregion
1272
1363
  //#region src/client/message-reducer.ts
1273
1364
  function defaultMessageReducer() {
@@ -1321,13 +1412,13 @@ function reduceMessageData(data, event) {
1321
1412
  role: "user"
1322
1413
  });
1323
1414
  case "step.started": return updateAssistantMessage(data, event.data.turnId, (message) => ensureStepStartPart(message, event.data.stepIndex));
1324
- case "reasoning.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), {
1415
+ case "reasoning.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
1325
1416
  state: "streaming",
1326
1417
  stepIndex: event.data.stepIndex,
1327
1418
  text: event.data.reasoningSoFar,
1328
1419
  type: "reasoning"
1329
1420
  }));
1330
- case "reasoning.completed": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), {
1421
+ case "reasoning.completed": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
1331
1422
  state: "done",
1332
1423
  stepIndex: event.data.stepIndex,
1333
1424
  text: event.data.reasoning,
@@ -1408,7 +1499,7 @@ function reduceMessageData(data, event) {
1408
1499
  }
1409
1500
  case "authorization.required": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), createAuthorizationRequiredPart(event)));
1410
1501
  case "authorization.completed": return completeAuthorization(data, event);
1411
- case "message.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), {
1502
+ case "message.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
1412
1503
  state: "streaming",
1413
1504
  stepIndex: event.data.stepIndex,
1414
1505
  text: event.data.messageSoFar,
@@ -1416,7 +1507,7 @@ function reduceMessageData(data, event) {
1416
1507
  }));
1417
1508
  case "message.completed": return updateAssistantMessage(data, event.data.turnId, (message) => {
1418
1509
  if (event.data.message === null) return removeTextPart(message, event.data.stepIndex);
1419
- return upsertPart(ensureStepStartPart(message, event.data.stepIndex), {
1510
+ return upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
1420
1511
  state: "done",
1421
1512
  stepIndex: event.data.stepIndex,
1422
1513
  text: event.data.message,
@@ -1509,6 +1600,29 @@ function upsertPart(message, next) {
1509
1600
  parts
1510
1601
  };
1511
1602
  }
1603
+ function upsertRun(message, next) {
1604
+ let lastIndex = -1;
1605
+ for (let index = message.parts.length - 1; index >= 0; index -= 1) {
1606
+ const part = message.parts[index];
1607
+ if (part?.type === next.type && part.stepIndex === next.stepIndex) {
1608
+ lastIndex = index;
1609
+ break;
1610
+ }
1611
+ }
1612
+ const parts = lastIndex !== -1 && message.parts[lastIndex].state === "streaming" ? [
1613
+ ...message.parts.slice(0, lastIndex),
1614
+ next,
1615
+ ...message.parts.slice(lastIndex + 1)
1616
+ ] : [...message.parts, next];
1617
+ return {
1618
+ ...message,
1619
+ metadata: {
1620
+ ...message.metadata,
1621
+ status: next.type === "text" && next.state === "done" ? "complete" : "streaming"
1622
+ },
1623
+ parts
1624
+ };
1625
+ }
1512
1626
  function removeTextPart(message, stepIndex) {
1513
1627
  const parts = message.parts.filter((part) => part.type !== "text" || part.stepIndex !== stepIndex);
1514
1628
  if (parts.length === message.parts.length) return message;
@@ -1589,97 +1703,9 @@ function upsertMessage(data, next) {
1589
1703
  ...data.messages.slice(index + 1)
1590
1704
  ] };
1591
1705
  }
1592
- function toMessageInputRequest(request) {
1593
- return {
1594
- allowFreeform: request.allowFreeform,
1595
- display: request.display,
1596
- options: request.options,
1597
- prompt: request.prompt,
1598
- requestId: request.requestId
1599
- };
1600
- }
1601
- function createToolMetadata(descriptor, extra) {
1602
- return { eve: {
1603
- inputRequest: extra?.inputRequest,
1604
- kind: descriptor.kind,
1605
- name: descriptor.name
1606
- } };
1607
- }
1608
- function mergeToolMetadata(current, next) {
1609
- const kind = next.eve?.kind ?? current?.eve?.kind ?? "unknown";
1610
- const name = next.eve?.name ?? current?.eve?.name ?? "unknown";
1611
- return { eve: {
1612
- ...current?.eve,
1613
- ...next.eve,
1614
- inputRequest: next.eve?.inputRequest ?? current?.eve?.inputRequest,
1615
- inputResponse: next.eve?.inputResponse ?? current?.eve?.inputResponse,
1616
- kind,
1617
- name
1618
- } };
1619
- }
1620
- function approvedApproval(part) {
1621
- if (!part?.approval?.id) return;
1622
- return {
1623
- approved: true,
1624
- id: part.approval.id,
1625
- isAutomatic: part.approval.isAutomatic,
1626
- reason: part.approval.reason
1627
- };
1628
- }
1629
- function normalizeActionRequest(action) {
1630
- switch (action.kind) {
1631
- case "load-skill": return {
1632
- kind: "load-skill",
1633
- name: "load_skill",
1634
- toolName: "eve:load-skill"
1635
- };
1636
- case "tool-call": return {
1637
- kind: "tool-call",
1638
- name: action.toolName,
1639
- toolName: action.toolName
1640
- };
1641
- case "subagent-call": return {
1642
- kind: "subagent-call",
1643
- name: action.subagentName,
1644
- toolName: `eve:subagent:${action.subagentName}`
1645
- };
1646
- case "remote-agent-call": return {
1647
- kind: "subagent-call",
1648
- name: action.remoteAgentName,
1649
- toolName: `eve:subagent:${action.remoteAgentName}`
1650
- };
1651
- }
1652
- }
1653
- function normalizeActionResult(result) {
1654
- switch (result.kind) {
1655
- case "load-skill-result": return {
1656
- kind: "load-skill",
1657
- name: result.name ?? "load_skill",
1658
- toolName: "eve:load-skill"
1659
- };
1660
- case "tool-result": return {
1661
- kind: "tool-call",
1662
- name: result.toolName,
1663
- toolName: result.toolName
1664
- };
1665
- case "subagent-result": return {
1666
- kind: "subagent-call",
1667
- name: result.subagentName,
1668
- toolName: `eve:subagent:${result.subagentName}`
1669
- };
1670
- }
1671
- }
1672
1706
  function optimisticUserMessageId(submissionId) {
1673
1707
  return `optimistic:${submissionId}:user`;
1674
1708
  }
1675
- function stringifyUnknown(value) {
1676
- if (typeof value === "string") return value;
1677
- try {
1678
- return JSON.stringify(value);
1679
- } catch {
1680
- return "Action failed.";
1681
- }
1682
- }
1683
1709
 
1684
1710
  //#endregion
1685
1711
  //#region src/svelte/use-eve-agent.ts
@@ -1268,6 +1268,97 @@ function formatAuthorizationDisplayName(name) {
1268
1268
  return `${name.charAt(0).toUpperCase()}${name.slice(1)}`;
1269
1269
  }
1270
1270
 
1271
+ //#endregion
1272
+ //#region src/client/message-action-parts.ts
1273
+ function toMessageInputRequest(request) {
1274
+ return {
1275
+ allowFreeform: request.allowFreeform,
1276
+ display: request.display,
1277
+ options: request.options,
1278
+ prompt: request.prompt,
1279
+ requestId: request.requestId
1280
+ };
1281
+ }
1282
+ function createToolMetadata(descriptor, extra) {
1283
+ return { eve: {
1284
+ inputRequest: extra?.inputRequest,
1285
+ kind: descriptor.kind,
1286
+ name: descriptor.name
1287
+ } };
1288
+ }
1289
+ function mergeToolMetadata(current, next) {
1290
+ const kind = next.eve?.kind ?? current?.eve?.kind ?? "unknown";
1291
+ const name = next.eve?.name ?? current?.eve?.name ?? "unknown";
1292
+ return { eve: {
1293
+ ...current?.eve,
1294
+ ...next.eve,
1295
+ inputRequest: next.eve?.inputRequest ?? current?.eve?.inputRequest,
1296
+ inputResponse: next.eve?.inputResponse ?? current?.eve?.inputResponse,
1297
+ kind,
1298
+ name
1299
+ } };
1300
+ }
1301
+ function approvedApproval(part) {
1302
+ if (!part?.approval?.id) return;
1303
+ return {
1304
+ approved: true,
1305
+ id: part.approval.id,
1306
+ isAutomatic: part.approval.isAutomatic,
1307
+ reason: part.approval.reason
1308
+ };
1309
+ }
1310
+ function normalizeActionRequest(action) {
1311
+ switch (action.kind) {
1312
+ case "load-skill": return {
1313
+ kind: "load-skill",
1314
+ name: "load_skill",
1315
+ toolName: "eve:load-skill"
1316
+ };
1317
+ case "tool-call": return {
1318
+ kind: "tool-call",
1319
+ name: action.toolName,
1320
+ toolName: action.toolName
1321
+ };
1322
+ case "subagent-call": return {
1323
+ kind: "subagent-call",
1324
+ name: action.subagentName,
1325
+ toolName: `eve:subagent:${action.subagentName}`
1326
+ };
1327
+ case "remote-agent-call": return {
1328
+ kind: "subagent-call",
1329
+ name: action.remoteAgentName,
1330
+ toolName: `eve:subagent:${action.remoteAgentName}`
1331
+ };
1332
+ }
1333
+ }
1334
+ function normalizeActionResult(result) {
1335
+ switch (result.kind) {
1336
+ case "load-skill-result": return {
1337
+ kind: "load-skill",
1338
+ name: result.name ?? "load_skill",
1339
+ toolName: "eve:load-skill"
1340
+ };
1341
+ case "tool-result": return {
1342
+ kind: "tool-call",
1343
+ name: result.toolName,
1344
+ toolName: result.toolName
1345
+ };
1346
+ case "subagent-result": return {
1347
+ kind: "subagent-call",
1348
+ name: result.subagentName,
1349
+ toolName: `eve:subagent:${result.subagentName}`
1350
+ };
1351
+ }
1352
+ }
1353
+ function stringifyUnknown(value) {
1354
+ if (typeof value === "string") return value;
1355
+ try {
1356
+ return JSON.stringify(value);
1357
+ } catch {
1358
+ return "Action failed.";
1359
+ }
1360
+ }
1361
+
1271
1362
  //#endregion
1272
1363
  //#region src/client/message-reducer.ts
1273
1364
  function defaultMessageReducer() {
@@ -1321,13 +1412,13 @@ function reduceMessageData(data, event) {
1321
1412
  role: "user"
1322
1413
  });
1323
1414
  case "step.started": return updateAssistantMessage(data, event.data.turnId, (message) => ensureStepStartPart(message, event.data.stepIndex));
1324
- case "reasoning.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), {
1415
+ case "reasoning.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
1325
1416
  state: "streaming",
1326
1417
  stepIndex: event.data.stepIndex,
1327
1418
  text: event.data.reasoningSoFar,
1328
1419
  type: "reasoning"
1329
1420
  }));
1330
- case "reasoning.completed": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), {
1421
+ case "reasoning.completed": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
1331
1422
  state: "done",
1332
1423
  stepIndex: event.data.stepIndex,
1333
1424
  text: event.data.reasoning,
@@ -1408,7 +1499,7 @@ function reduceMessageData(data, event) {
1408
1499
  }
1409
1500
  case "authorization.required": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), createAuthorizationRequiredPart(event)));
1410
1501
  case "authorization.completed": return completeAuthorization(data, event);
1411
- case "message.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), {
1502
+ case "message.appended": return updateAssistantMessage(data, event.data.turnId, (message) => upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
1412
1503
  state: "streaming",
1413
1504
  stepIndex: event.data.stepIndex,
1414
1505
  text: event.data.messageSoFar,
@@ -1416,7 +1507,7 @@ function reduceMessageData(data, event) {
1416
1507
  }));
1417
1508
  case "message.completed": return updateAssistantMessage(data, event.data.turnId, (message) => {
1418
1509
  if (event.data.message === null) return removeTextPart(message, event.data.stepIndex);
1419
- return upsertPart(ensureStepStartPart(message, event.data.stepIndex), {
1510
+ return upsertRun(ensureStepStartPart(message, event.data.stepIndex), {
1420
1511
  state: "done",
1421
1512
  stepIndex: event.data.stepIndex,
1422
1513
  text: event.data.message,
@@ -1509,6 +1600,29 @@ function upsertPart(message, next) {
1509
1600
  parts
1510
1601
  };
1511
1602
  }
1603
+ function upsertRun(message, next) {
1604
+ let lastIndex = -1;
1605
+ for (let index = message.parts.length - 1; index >= 0; index -= 1) {
1606
+ const part = message.parts[index];
1607
+ if (part?.type === next.type && part.stepIndex === next.stepIndex) {
1608
+ lastIndex = index;
1609
+ break;
1610
+ }
1611
+ }
1612
+ const parts = lastIndex !== -1 && message.parts[lastIndex].state === "streaming" ? [
1613
+ ...message.parts.slice(0, lastIndex),
1614
+ next,
1615
+ ...message.parts.slice(lastIndex + 1)
1616
+ ] : [...message.parts, next];
1617
+ return {
1618
+ ...message,
1619
+ metadata: {
1620
+ ...message.metadata,
1621
+ status: next.type === "text" && next.state === "done" ? "complete" : "streaming"
1622
+ },
1623
+ parts
1624
+ };
1625
+ }
1512
1626
  function removeTextPart(message, stepIndex) {
1513
1627
  const parts = message.parts.filter((part) => part.type !== "text" || part.stepIndex !== stepIndex);
1514
1628
  if (parts.length === message.parts.length) return message;
@@ -1589,97 +1703,9 @@ function upsertMessage(data, next) {
1589
1703
  ...data.messages.slice(index + 1)
1590
1704
  ] };
1591
1705
  }
1592
- function toMessageInputRequest(request) {
1593
- return {
1594
- allowFreeform: request.allowFreeform,
1595
- display: request.display,
1596
- options: request.options,
1597
- prompt: request.prompt,
1598
- requestId: request.requestId
1599
- };
1600
- }
1601
- function createToolMetadata(descriptor, extra) {
1602
- return { eve: {
1603
- inputRequest: extra?.inputRequest,
1604
- kind: descriptor.kind,
1605
- name: descriptor.name
1606
- } };
1607
- }
1608
- function mergeToolMetadata(current, next) {
1609
- const kind = next.eve?.kind ?? current?.eve?.kind ?? "unknown";
1610
- const name = next.eve?.name ?? current?.eve?.name ?? "unknown";
1611
- return { eve: {
1612
- ...current?.eve,
1613
- ...next.eve,
1614
- inputRequest: next.eve?.inputRequest ?? current?.eve?.inputRequest,
1615
- inputResponse: next.eve?.inputResponse ?? current?.eve?.inputResponse,
1616
- kind,
1617
- name
1618
- } };
1619
- }
1620
- function approvedApproval(part) {
1621
- if (!part?.approval?.id) return;
1622
- return {
1623
- approved: true,
1624
- id: part.approval.id,
1625
- isAutomatic: part.approval.isAutomatic,
1626
- reason: part.approval.reason
1627
- };
1628
- }
1629
- function normalizeActionRequest(action) {
1630
- switch (action.kind) {
1631
- case "load-skill": return {
1632
- kind: "load-skill",
1633
- name: "load_skill",
1634
- toolName: "eve:load-skill"
1635
- };
1636
- case "tool-call": return {
1637
- kind: "tool-call",
1638
- name: action.toolName,
1639
- toolName: action.toolName
1640
- };
1641
- case "subagent-call": return {
1642
- kind: "subagent-call",
1643
- name: action.subagentName,
1644
- toolName: `eve:subagent:${action.subagentName}`
1645
- };
1646
- case "remote-agent-call": return {
1647
- kind: "subagent-call",
1648
- name: action.remoteAgentName,
1649
- toolName: `eve:subagent:${action.remoteAgentName}`
1650
- };
1651
- }
1652
- }
1653
- function normalizeActionResult(result) {
1654
- switch (result.kind) {
1655
- case "load-skill-result": return {
1656
- kind: "load-skill",
1657
- name: result.name ?? "load_skill",
1658
- toolName: "eve:load-skill"
1659
- };
1660
- case "tool-result": return {
1661
- kind: "tool-call",
1662
- name: result.toolName,
1663
- toolName: result.toolName
1664
- };
1665
- case "subagent-result": return {
1666
- kind: "subagent-call",
1667
- name: result.subagentName,
1668
- toolName: `eve:subagent:${result.subagentName}`
1669
- };
1670
- }
1671
- }
1672
1706
  function optimisticUserMessageId(submissionId) {
1673
1707
  return `optimistic:${submissionId}:user`;
1674
1708
  }
1675
- function stringifyUnknown(value) {
1676
- if (typeof value === "string") return value;
1677
- try {
1678
- return JSON.stringify(value);
1679
- } catch {
1680
- return "Action failed.";
1681
- }
1682
- }
1683
1709
 
1684
1710
  //#endregion
1685
1711
  //#region src/vue/use-eve-agent.ts
@@ -21,6 +21,8 @@ export interface ApplicationInfoJson {
21
21
  instructions: string | null;
22
22
  skills: string[];
23
23
  tools: string[];
24
+ subagents: string[];
25
+ schedules: string[];
24
26
  channels: {
25
27
  name: string;
26
28
  kind: string | null;
@@ -1,2 +1,2 @@
1
- import{createCliTheme,renderCliBanner,renderCliSection}from"#cli/ui/output.js";import{inspectApplication}from"#services/inspect-application.js";function buildApplicationInfoJson(e){let{application:t,compiledState:n,messaging:r}=e;return{appRoot:t.appRoot,agentRoot:n?.project.agentRoot??null,layout:n?.project.layout??null,status:n?.metadata.status??`unavailable`,diagnostics:n?{errors:n.metadata.discovery.summary.errors,warnings:n.metadata.discovery.summary.warnings}:null,model:n?.manifest.config.model.id??null,instructions:n?.manifest.instructions?.logicalPath??null,skills:(n?.manifest.skills??[]).map(e=>e.name),tools:(n?.manifest.tools??[]).map(e=>e.name),channels:(n?.manifest.channels??[]).map(e=>e.kind===`channel`?{name:e.name,kind:e.adapterKind??null,method:e.method,urlPath:e.urlPath}:{name:e.name,kind:`disabled`,method:null,urlPath:null}),messaging:{create:r.createSessionRoutePath,continue:r.continueSessionRoutePattern,stream:r.streamRoutePattern},artifacts:n?{compiledManifest:n.paths.compiledManifestPath,discoveryManifest:n.paths.discoveryManifestPath,diagnostics:n.paths.diagnosticsPath,moduleMap:n.paths.moduleMapPath,metadata:n.paths.compileMetadataPath}:null}}function pluralize(e,t){return`${e} ${t}${e===1?``:`s`}`}function formatDiscoverySummary(e,t){return`${pluralize(e,`error`)}, ${pluralize(t,`warning`)}`}function resolveCompileTone(e){switch(e){case`ready`:return`success`;case`failed`:return`danger`;default:return`warning`}}async function printApplicationInfo(i,a,o={}){let s=await inspectApplication(a);if(o.json){i.log(JSON.stringify(buildApplicationInfoJson(s),null,2));return}let c=s.compiledState,l=s.application,u=createCliTheme(),d=[{label:`App Root`,value:l.appRoot}],f=[{label:`Workflow Build`,value:l.workflowBuildDir},{label:`Output`,value:l.outputDir}],p=[];c===null?d.push({label:`Compile`,tone:`warning`,value:`unavailable`}):(d.push({label:`Agent Root`,value:c.project.agentRoot},{label:`Layout`,value:c.project.layout},{label:`Compile`,tone:resolveCompileTone(c.metadata.status),value:c.metadata.status},{label:`Diagnostics`,tone:c.metadata.discovery.summary.errors>0?`danger`:c.metadata.discovery.summary.warnings>0?`warning`:`success`,value:formatDiscoverySummary(c.metadata.discovery.summary.errors,c.metadata.discovery.summary.warnings)},{label:`Instructions`,value:c.manifest.instructions?.logicalPath??`none`},{label:`Skills`,value:pluralize(c.manifest.skills.length,`skill`)}),f.unshift({label:`Compiled Manifest`,value:c.paths.compiledManifestPath},{label:`Discovery Manifest`,value:c.paths.discoveryManifestPath},{label:`Diagnostics`,value:c.paths.diagnosticsPath},{label:`Module Map`,value:c.paths.moduleMapPath},{label:`Metadata`,value:c.paths.compileMetadataPath}),p.push(c.manifest.instructions===void 0?{label:`Instructions`,value:`No instructions prompt discovered.`}:{label:`Instructions`,value:c.manifest.instructions.logicalPath})),i.log([renderCliBanner(u,{subtitle:`Resolved application paths and the active message contract.`,title:`eve Info`}),``,renderCliSection(u,{rows:d,title:`Application`}),``,renderCliSection(u,{rows:f,title:`Artifacts`}),...c===null?[]:[``,renderCliSection(u,{rows:p,title:`Instructions`})],``,renderCliSection(u,{rows:[{label:`Workflow ID`,value:l.workflowId},{label:`Source Dir`,value:l.workflowSourceDir},{label:`Create`,tone:`info`,value:`POST ${s.messaging.createSessionRoutePath}`},{label:`Continue`,tone:`info`,value:`POST ${s.messaging.continueSessionRoutePattern}`},{label:`Stream`,tone:`info`,value:`GET ${s.messaging.streamRoutePattern}`}],title:`Messaging`})].join(`
1
+ import{createCliTheme,renderCliBanner,renderCliSection}from"#cli/ui/output.js";import{inspectApplication}from"#services/inspect-application.js";function buildApplicationInfoJson(e){let{application:t,compiledState:n,messaging:r}=e;return{appRoot:t.appRoot,agentRoot:n?.project.agentRoot??null,layout:n?.project.layout??null,status:n?.metadata.status??`unavailable`,diagnostics:n?{errors:n.metadata.discovery.summary.errors,warnings:n.metadata.discovery.summary.warnings}:null,model:n?.manifest.config.model.id??null,instructions:n?.manifest.instructions?.logicalPath??null,skills:(n?.manifest.skills??[]).map(e=>e.name),tools:(n?.manifest.tools??[]).map(e=>e.name),subagents:(n?.manifest.subagents??[]).map(e=>e.name),schedules:(n?.manifest.schedules??[]).map(e=>e.name),channels:(n?.manifest.channels??[]).map(e=>e.kind===`channel`?{name:e.name,kind:e.adapterKind??null,method:e.method,urlPath:e.urlPath}:{name:e.name,kind:`disabled`,method:null,urlPath:null}),messaging:{create:r.createSessionRoutePath,continue:r.continueSessionRoutePattern,stream:r.streamRoutePattern},artifacts:n?{compiledManifest:n.paths.compiledManifestPath,discoveryManifest:n.paths.discoveryManifestPath,diagnostics:n.paths.diagnosticsPath,moduleMap:n.paths.moduleMapPath,metadata:n.paths.compileMetadataPath}:null}}function pluralize(e,t){return`${e} ${t}${e===1?``:`s`}`}function formatDiscoverySummary(e,t){return`${pluralize(e,`error`)}, ${pluralize(t,`warning`)}`}function resolveCompileTone(e){switch(e){case`ready`:return`success`;case`failed`:return`danger`;default:return`warning`}}async function printApplicationInfo(i,a,o={}){let s=await inspectApplication(a);if(o.json){i.log(JSON.stringify(buildApplicationInfoJson(s),null,2));return}let c=s.compiledState,l=s.application,u=createCliTheme(),d=[{label:`App Root`,value:l.appRoot}],f=[{label:`Workflow Build`,value:l.workflowBuildDir},{label:`Output`,value:l.outputDir}],p=[];c===null?d.push({label:`Compile`,tone:`warning`,value:`unavailable`}):(d.push({label:`Agent Root`,value:c.project.agentRoot},{label:`Layout`,value:c.project.layout},{label:`Compile`,tone:resolveCompileTone(c.metadata.status),value:c.metadata.status},{label:`Diagnostics`,tone:c.metadata.discovery.summary.errors>0?`danger`:c.metadata.discovery.summary.warnings>0?`warning`:`success`,value:formatDiscoverySummary(c.metadata.discovery.summary.errors,c.metadata.discovery.summary.warnings)},{label:`Instructions`,value:c.manifest.instructions?.logicalPath??`none`},{label:`Skills`,value:pluralize(c.manifest.skills.length,`skill`)},{label:`Subagents`,value:pluralize(c.manifest.subagents.length,`subagent`)},{label:`Schedules`,value:pluralize(c.manifest.schedules.length,`schedule`)}),f.unshift({label:`Compiled Manifest`,value:c.paths.compiledManifestPath},{label:`Discovery Manifest`,value:c.paths.discoveryManifestPath},{label:`Diagnostics`,value:c.paths.diagnosticsPath},{label:`Module Map`,value:c.paths.moduleMapPath},{label:`Metadata`,value:c.paths.compileMetadataPath}),p.push(c.manifest.instructions===void 0?{label:`Instructions`,value:`No instructions prompt discovered.`}:{label:`Instructions`,value:c.manifest.instructions.logicalPath})),i.log([renderCliBanner(u,{subtitle:`Resolved application paths and the active message contract.`,title:`eve Info`}),``,renderCliSection(u,{rows:d,title:`Application`}),``,renderCliSection(u,{rows:f,title:`Artifacts`}),...c===null?[]:[``,renderCliSection(u,{rows:p,title:`Instructions`})],``,renderCliSection(u,{rows:[{label:`Workflow ID`,value:l.workflowId},{label:`Source Dir`,value:l.workflowSourceDir},{label:`Create`,tone:`info`,value:`POST ${s.messaging.createSessionRoutePath}`},{label:`Continue`,tone:`info`,value:`POST ${s.messaging.continueSessionRoutePattern}`},{label:`Stream`,tone:`info`,value:`GET ${s.messaging.streamRoutePattern}`}],title:`Messaging`})].join(`
2
2
  `))}export{buildApplicationInfoJson,printApplicationInfo};
@@ -0,0 +1,43 @@
1
+ import type { RuntimeActionRequest, RuntimeActionResult } from "#runtime/actions/types.js";
2
+ import type { InputRequest } from "#runtime/input/types.js";
3
+ import type { EveDynamicToolPart, EveMessageInputRequest, EveMessageToolMetadata } from "#client/message-reducer-types.js";
4
+ /**
5
+ * Normalized tool descriptor derived from a runtime action request or result.
6
+ *
7
+ * The default message reducer projects load-skill, subagent, remote-agent, and
8
+ * plain tool calls onto a single `dynamic-tool` UI part; this descriptor is the
9
+ * shared shape those variants collapse to before rendering.
10
+ */
11
+ export interface ActionDescriptor {
12
+ readonly kind: "load-skill" | "subagent-call" | "tool-call";
13
+ readonly name: string;
14
+ readonly toolName: string;
15
+ }
16
+ /** Projects a runtime input request onto its UI-facing subset. */
17
+ export declare function toMessageInputRequest(request: InputRequest): EveMessageInputRequest;
18
+ /** Builds tool metadata for a freshly projected tool part. */
19
+ export declare function createToolMetadata(descriptor: ActionDescriptor, extra?: {
20
+ readonly inputRequest?: EveMessageInputRequest;
21
+ }): EveMessageToolMetadata;
22
+ /**
23
+ * Merges freshly derived tool metadata over any metadata already attached to a
24
+ * tool part, preferring the new values while preserving earlier request and
25
+ * response context.
26
+ */
27
+ export declare function mergeToolMetadata(current: EveMessageToolMetadata | undefined, next: EveMessageToolMetadata): EveMessageToolMetadata;
28
+ /**
29
+ * Derives the approved-approval descriptor a resolved tool result carries
30
+ * forward, or `undefined` when the tool part never had an approval.
31
+ */
32
+ export declare function approvedApproval(part: EveDynamicToolPart | undefined): {
33
+ readonly id: string;
34
+ readonly approved: true;
35
+ readonly reason?: string;
36
+ readonly isAutomatic?: boolean;
37
+ } | undefined;
38
+ /** Maps a runtime action request onto its normalized tool descriptor. */
39
+ export declare function normalizeActionRequest(action: RuntimeActionRequest): ActionDescriptor;
40
+ /** Maps a runtime action result onto its normalized tool descriptor. */
41
+ export declare function normalizeActionResult(result: RuntimeActionResult): ActionDescriptor;
42
+ /** Best-effort string rendering of an unknown tool output for error display. */
43
+ export declare function stringifyUnknown(value: unknown): string;
@@ -0,0 +1 @@
1
+ function toMessageInputRequest(e){return{allowFreeform:e.allowFreeform,display:e.display,options:e.options,prompt:e.prompt,requestId:e.requestId}}function createToolMetadata(e,t){return{eve:{inputRequest:t?.inputRequest,kind:e.kind,name:e.name}}}function mergeToolMetadata(e,t){let n=t.eve?.kind??e?.eve?.kind??`unknown`,r=t.eve?.name??e?.eve?.name??`unknown`;return{eve:{...e?.eve,...t.eve,inputRequest:t.eve?.inputRequest??e?.eve?.inputRequest,inputResponse:t.eve?.inputResponse??e?.eve?.inputResponse,kind:n,name:r}}}function approvedApproval(e){if(e?.approval?.id)return{approved:!0,id:e.approval.id,isAutomatic:e.approval.isAutomatic,reason:e.approval.reason}}function normalizeActionRequest(e){switch(e.kind){case`load-skill`:return{kind:`load-skill`,name:`load_skill`,toolName:`eve:load-skill`};case`tool-call`:return{kind:`tool-call`,name:e.toolName,toolName:e.toolName};case`subagent-call`:return{kind:`subagent-call`,name:e.subagentName,toolName:`eve:subagent:${e.subagentName}`};case`remote-agent-call`:return{kind:`subagent-call`,name:e.remoteAgentName,toolName:`eve:subagent:${e.remoteAgentName}`}}}function normalizeActionResult(e){switch(e.kind){case`load-skill-result`:return{kind:`load-skill`,name:e.name??`load_skill`,toolName:`eve:load-skill`};case`tool-result`:return{kind:`tool-call`,name:e.toolName,toolName:e.toolName};case`subagent-result`:return{kind:`subagent-call`,name:e.subagentName,toolName:`eve:subagent:${e.subagentName}`}}}function stringifyUnknown(e){if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return`Action failed.`}}export{approvedApproval,createToolMetadata,mergeToolMetadata,normalizeActionRequest,normalizeActionResult,stringifyUnknown,toMessageInputRequest};