eve 0.78.0 → 0.79.1
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 +43 -0
- package/dist/src/approval/definition.d.ts +42 -0
- package/dist/src/chunks/{use-eve-agent-BSYe_Re7.js → use-eve-agent-Ch-Q-s12.js} +43 -13
- package/dist/src/chunks/{use-eve-agent-B8brxCk-.js → use-eve-agent-Vsl-S0yI.js} +43 -13
- package/dist/src/cli/commands/trace-detail.d.ts +2 -2
- package/dist/src/cli/commands/trace-detail.js +1 -1
- package/dist/src/cli/commands/trace.d.ts +1 -1
- package/dist/src/cli/commands/trace.js +1 -1
- package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +1 -1
- package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -1
- package/dist/src/cli/dev/tui/traces/trace-store.d.ts +1 -1
- package/dist/src/cli/dev/tui/traces/trace-store.js +1 -1
- package/dist/src/cli/dev/tui/traces/trace-view.d.ts +1 -1
- package/dist/src/cli/dev/tui/traces/trace-view.js +1 -1
- package/dist/src/cli/dev/tui/traces/trace-viewer-state.d.ts +1 -1
- package/dist/src/client/abort-signal.d.ts +2 -0
- package/dist/src/client/abort-signal.js +1 -0
- package/dist/src/client/conversation-client.d.ts +2 -0
- package/dist/src/client/conversation-client.js +1 -1
- package/dist/src/client/eve-agent-store-state.d.ts +9 -0
- package/dist/src/client/eve-agent-store.js +1 -1
- package/dist/src/client/ndjson.js +1 -1
- package/dist/src/client/open-stream.js +1 -1
- package/dist/src/client/session-turn-dispatch.js +1 -1
- package/dist/src/client/session-utils.js +1 -1
- package/dist/src/client/session.js +1 -1
- package/dist/src/compiled/.vendor-stamp.json +3 -1
- package/dist/src/compiled/@eve/tracing/adapters/agent-transport.d.ts +8 -0
- package/dist/src/compiled/@eve/tracing/adapters/ai-sdk-payload.d.ts +15 -0
- package/dist/src/compiled/@eve/tracing/adapters/ai-sdk-telemetry.d.ts +14 -0
- package/dist/src/{tracing/agent-span-id-generator.d.ts → compiled/@eve/tracing/adapters/otel-ids.d.ts} +1 -1
- package/dist/src/compiled/@eve/tracing/adapters/otel.d.ts +33 -0
- package/dist/src/{tracing/agent-otel-content.d.ts → compiled/@eve/tracing/adapters/serialization.d.ts} +9 -3
- package/dist/src/compiled/@eve/tracing/agent-tracing.d.ts +84 -0
- package/dist/src/compiled/@eve/tracing/ai-sdk.d.ts +7 -0
- package/dist/src/compiled/@eve/tracing/ai-sdk.js +1 -0
- package/dist/src/compiled/@eve/tracing/capture.d.ts +5 -0
- package/dist/src/compiled/@eve/tracing/core/activation.d.ts +3 -0
- package/dist/src/compiled/@eve/tracing/core/attributes.d.ts +14 -0
- package/dist/src/{tracing/content-attributes.d.ts → compiled/@eve/tracing/core/content-policy.d.ts} +1 -1
- package/dist/src/compiled/@eve/tracing/core/context.d.ts +3 -0
- package/dist/src/compiled/@eve/tracing/core/delegation.d.ts +13 -0
- package/dist/src/compiled/@eve/tracing/core/mcp.d.ts +24 -0
- package/dist/src/compiled/@eve/tracing/core/scopes.d.ts +59 -0
- package/dist/src/compiled/@eve/tracing/core/snapshot.d.ts +7 -0
- package/dist/src/compiled/@eve/tracing/core/span-kinds.d.ts +12 -0
- package/dist/src/compiled/@eve/tracing/core/types.d.ts +297 -0
- package/dist/src/compiled/@eve/tracing/core/writer.d.ts +15 -0
- package/dist/src/compiled/@eve/tracing/delegation.d.ts +2 -0
- package/dist/src/compiled/@eve/tracing/delegation.js +1 -0
- package/dist/src/compiled/@eve/tracing/index.d.ts +6 -0
- package/dist/src/compiled/@eve/tracing/index.js +1 -0
- package/dist/src/compiled/@eve/tracing/operations.d.ts +96 -0
- package/dist/src/compiled/@eve/tracing/otel.d.ts +12 -0
- package/dist/src/compiled/@eve/tracing/otel.js +1 -0
- package/dist/src/compiled/@opentelemetry/api/index.d.ts +4 -0
- package/dist/src/compiled/@workflow/world-vercel/index.js +7 -7
- package/dist/src/compiled/_chunks/workflow/delegation-BqhZ398D.js +1 -0
- package/dist/src/compiled/_chunks/workflow/mcp-C01bDEX-.js +5 -0
- package/dist/src/compiler/extension-compatibility.d.ts +6 -6
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/compiler/project-sources.js +1 -1
- package/dist/src/context/build-dynamic-tools.js +1 -1
- package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
- package/dist/src/context/memory-tools.js +1 -1
- package/dist/src/evals/assertions/collector.d.ts +4 -1
- package/dist/src/evals/assertions/collector.js +1 -1
- package/dist/src/evals/context.js +1 -1
- package/dist/src/evals/index.d.ts +1 -1
- package/dist/src/evals/runner/artifacts.js +1 -1
- package/dist/src/evals/runner/reporters/assertion-diagnostics.js +2 -2
- package/dist/src/evals/runner/reporters/assertion-scores.d.ts +13 -2
- package/dist/src/evals/runner/reporters/assertion-scores.js +1 -1
- package/dist/src/evals/runner/reporters/braintrust.js +1 -1
- package/dist/src/evals/runner/reporters/console.js +1 -1
- package/dist/src/evals/runner/reporters/datadog.js +2 -2
- package/dist/src/evals/runner/reporters/junit.js +1 -1
- package/dist/src/evals/runner/verdict.d.ts +2 -2
- package/dist/src/evals/runner/verdict.js +1 -1
- package/dist/src/evals/types.d.ts +22 -6
- package/dist/src/eve-channel/index.js +1 -1
- package/dist/src/eve-channel/request.js +1 -1
- package/dist/src/eve-channel/stream-headers.d.ts +1 -0
- package/dist/src/eve-channel/stream-headers.js +1 -0
- package/dist/src/execution/agent-sessions/context.d.ts +1 -1
- package/dist/src/execution/agent-sessions/context.js +1 -1
- package/dist/src/execution/agent-sessions/remote.js +1 -1
- package/dist/src/execution/agent-sessions/steps.js +1 -1
- package/dist/src/execution/authorization-callback-match.d.ts +2 -2
- package/dist/src/execution/authorization-callback-match.js +1 -1
- package/dist/src/execution/cancelled-model-call-batch.js +1 -1
- package/dist/src/execution/catalog/connection-entry.js +1 -1
- package/dist/src/execution/durable-session-store.js +1 -1
- package/dist/src/execution/dynamic-workflow/tool.js +1 -1
- package/dist/src/execution/eve-workflow-attributes.js +1 -1
- package/dist/src/execution/forward-session-input.js +1 -1
- package/dist/src/execution/invoke-tool.d.ts +1 -1
- package/dist/src/execution/invoke-tool.js +1 -1
- package/dist/src/execution/proxied-deliver-step.js +1 -1
- package/dist/src/execution/publish-session-events.d.ts +13 -2
- package/dist/src/execution/publish-session-events.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel-create-sdk.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel-credentials.d.ts +2 -0
- package/dist/src/execution/sandbox/bindings/vercel-credentials.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel-lifecycle.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel-lookup.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel.d.ts +3 -6
- package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
- package/dist/src/execution/session/checkpoint-migrations.js +1 -1
- package/dist/src/execution/session/handoff-steps.js +1 -1
- package/dist/src/execution/session/handoff.d.ts +1 -1
- package/dist/src/execution/session/handoff.js +1 -1
- package/dist/src/execution/session/input-queue.d.ts +13 -6
- package/dist/src/execution/session/input-queue.js +1 -1
- package/dist/src/execution/session/pending-turn-state.js +1 -1
- package/dist/src/execution/session/turn-step.js +1 -1
- package/dist/src/execution/session/turn.d.ts +4 -1
- package/dist/src/execution/session/turn.js +1 -1
- package/dist/src/execution/tasks/steps.d.ts +1 -1
- package/dist/src/execution/tasks/steps.js +1 -1
- package/dist/src/execution/tool-auth.js +1 -1
- package/dist/src/execution/tools/agent-router-workflow.js +1 -1
- package/dist/src/execution/tools/workflow/answer.d.ts +1 -1
- package/dist/src/execution/tools/workflow/withdraw-step.d.ts +2 -2
- package/dist/src/execution/tools/workflow/withdraw-step.js +1 -1
- package/dist/src/execution/workflow-callback-url.d.ts +10 -1
- package/dist/src/execution/workflow-callback-url.js +1 -1
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/harness/authorization.d.ts +3 -13
- package/dist/src/harness/authorization.js +1 -1
- package/dist/src/harness/compaction/step.d.ts +1 -0
- package/dist/src/harness/compaction/step.js +1 -1
- package/dist/src/harness/coordination.js +1 -1
- package/dist/src/harness/execute-tool.d.ts +2 -2
- package/dist/src/harness/hitl/approvals.d.ts +1 -1
- package/dist/src/harness/hitl/approvals.js +1 -1
- package/dist/src/harness/hitl/approved-calls.d.ts +3 -0
- package/dist/src/harness/hitl/approved-calls.js +1 -1
- package/dist/src/harness/hitl/candidates.d.ts +13 -0
- package/dist/src/harness/hitl/candidates.js +1 -1
- package/dist/src/harness/hitl/coordinator.js +1 -1
- package/dist/src/harness/hitl/index.d.ts +2 -5
- package/dist/src/harness/hitl/index.js +1 -1
- package/dist/src/harness/hitl/intake.js +1 -1
- package/dist/src/harness/{proxy-input-requests.d.ts → hitl/relays.d.ts} +3 -39
- package/dist/src/harness/hitl/relays.js +1 -0
- package/dist/src/harness/hitl/requests.d.ts +64 -0
- package/dist/src/harness/hitl/requests.js +1 -0
- package/dist/src/harness/hitl/sign-ins.d.ts +9 -0
- package/dist/src/harness/hitl/sign-ins.js +1 -0
- package/dist/src/harness/inline-tool-authorization.js +1 -1
- package/dist/src/harness/input-extraction.js +1 -1
- package/dist/src/harness/model-call/call.js +1 -1
- package/dist/src/harness/model-call/model.d.ts +3 -1
- package/dist/src/harness/model-call/model.js +1 -1
- package/dist/src/harness/session-machine/commit.d.ts +14 -3
- package/dist/src/harness/session-machine/commit.js +1 -1
- package/dist/src/harness/session-machine/transitions.d.ts +16 -0
- package/dist/src/harness/session-machine/transitions.js +1 -1
- package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
- package/dist/src/instrumentation/dispatch.js +1 -1
- package/dist/src/instrumentation/memory.d.ts +1 -4
- package/dist/src/instrumentation/memory.js +1 -1
- package/dist/src/instrumentation/principal-summary.js +1 -1
- package/dist/src/instrumentation/providers.js +1 -1
- package/dist/src/instrumentation/runtime-context.d.ts +1 -1
- package/dist/src/instrumentation/runtime.d.ts +4 -3
- package/dist/src/instrumentation/runtime.js +1 -1
- package/dist/src/instrumentation/session-init.js +1 -1
- package/dist/src/internal/application/stamped-package-version.js +1 -1
- package/dist/src/internal/authored-definition/approval.d.ts +3 -1
- package/dist/src/internal/authored-definition/approval.js +1 -1
- package/dist/src/internal/authored-definition/schema-backed.js +1 -1
- package/dist/src/internal/authored-definition/source-identity.d.ts +6 -0
- package/dist/src/internal/authored-definition/source-identity.js +1 -1
- package/dist/src/internal/authored-module-map-loader.js +1 -1
- package/dist/src/internal/helpers/markdown.js +1 -1
- package/dist/src/internal/logging.js +1 -1
- package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
- package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
- package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +10 -31
- package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
- package/dist/src/internal/nitro/routes/route-invoke-tool.d.ts +1 -1
- package/dist/src/internal/workflow/is-inactive-workflow-run-error.d.ts +2 -0
- package/dist/src/internal/workflow/is-inactive-workflow-run-error.js +1 -1
- package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
- package/dist/src/protocol/baggage.d.ts +1 -0
- package/dist/src/protocol/baggage.js +1 -1
- package/dist/src/public/channels/slack/hitl.js +1 -1
- package/dist/src/public/definitions/approval.d.ts +1 -1
- package/dist/src/public/definitions/connections/mcp.js +1 -1
- package/dist/src/public/definitions/connections/openapi.js +1 -1
- package/dist/src/public/instrumentation/otel.d.ts +2 -2
- package/dist/src/public/instrumentation/otel.js +1 -1
- package/dist/src/public/sandbox/vercel.d.ts +2 -0
- package/dist/src/public/tools/approval/index.d.ts +1 -1
- package/dist/src/public/tools/index.d.ts +1 -1
- package/dist/src/public/tools/result.d.ts +10 -7
- package/dist/src/react/use-eve-agent.d.ts +6 -0
- package/dist/src/react/use-eve-agent.js +1 -1
- package/dist/src/runtime/authorization-context.d.ts +5 -0
- package/dist/src/runtime/authorization-context.js +1 -1
- package/dist/src/runtime/connections/mcp-tracing.d.ts +10 -18
- package/dist/src/runtime/connections/mcp-tracing.js +1 -1
- package/dist/src/runtime/connections/openapi-operations.js +1 -1
- package/dist/src/runtime/connections/scoped-authorization.d.ts +6 -0
- package/dist/src/runtime/connections/scoped-authorization.js +1 -1
- package/dist/src/runtime/resolve-connection.js +1 -1
- package/dist/src/runtime/resolve-tool.js +1 -1
- package/dist/src/runtime/types.d.ts +2 -2
- package/dist/src/self-modification/extension/subagents/agent/tools/inspect_trace.d.ts +12 -12
- package/dist/src/self-modification/extension/subagents/agent/tools/inspect_trace.js +1 -1
- package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.d.ts +1 -1
- package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.js +1 -1
- package/dist/src/self-modification/extension/trace-inspection.d.ts +1 -1
- package/dist/src/self-modification/extension/trace-inspection.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
- package/dist/src/setup/scaffold/create/web-template.js +18 -10
- package/dist/src/shared/git.js +1 -1
- package/dist/src/shared/instrumentation-content.d.ts +1 -1
- package/dist/src/shared/instrumentation-content.js +1 -1
- package/dist/src/shared/instrumentation-decision.d.ts +3 -0
- package/dist/src/shared/instrumentation-decision.js +1 -1
- package/dist/src/shared/skill-package.js +1 -1
- package/dist/src/shared/trace-policy.d.ts +3 -0
- package/dist/src/shared/trace-policy.js +1 -1
- package/dist/src/subagents/adapter.js +1 -1
- package/dist/src/subagents/event-proxy-step.d.ts +1 -1
- package/dist/src/subagents/event-proxy-step.js +1 -1
- package/dist/src/subagents/hitl-proxy.d.ts +1 -1
- package/dist/src/subagents/hitl-proxy.js +1 -1
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.d.ts +6 -0
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/tools/definition.d.ts +41 -4
- package/dist/src/tools/durable-callbacks.d.ts +5 -3
- package/dist/src/tools/durable-callbacks.js +1 -1
- package/dist/src/tools/dynamic.d.ts +2 -2
- package/dist/src/tools/provided/ask-question-workflow.js +1 -1
- package/dist/src/tools/provided/sleep-workflow.js +1 -1
- package/dist/src/tools/workflow-definition.d.ts +2 -2
- package/dist/src/tracing/eve/agent-approval-instrumentation.d.ts +8 -0
- package/dist/src/tracing/eve/agent-approval-instrumentation.js +1 -0
- package/dist/src/tracing/{agent-channel-delivery-instrumentation.d.ts → eve/agent-channel-delivery-instrumentation.d.ts} +1 -1
- package/dist/src/tracing/{agent-channel-delivery-instrumentation.js → eve/agent-channel-delivery-instrumentation.js} +1 -1
- package/dist/src/tracing/eve/agent-invocation-coordinator.js +1 -0
- package/dist/src/tracing/eve/agent-memory-instrumentation.d.ts +12 -0
- package/dist/src/tracing/eve/agent-memory-instrumentation.js +1 -0
- package/dist/src/tracing/{agent-otel-provider.d.ts → eve/agent-otel-provider.d.ts} +6 -8
- package/dist/src/tracing/eve/agent-otel-provider.js +1 -0
- package/dist/src/tracing/eve/agent-tool-instrumentation.d.ts +44 -0
- package/dist/src/tracing/eve/agent-tool-instrumentation.js +1 -0
- package/dist/src/tracing/{agent-trace-context-store.d.ts → eve/agent-trace-context-store.d.ts} +8 -16
- package/dist/src/tracing/eve/agent-trace-context-store.js +1 -0
- package/dist/src/tracing/eve/agent-trace-context.js +1 -0
- package/dist/src/tracing/eve/agent-trace-state.d.ts +75 -0
- package/dist/src/tracing/{batch-span-processor.d.ts → eve/batch-span-processor.d.ts} +5 -1
- package/dist/src/tracing/eve/batch-span-processor.js +1 -0
- package/dist/src/tracing/{content-span-processor.d.ts → eve/content-span-processor.d.ts} +1 -1
- package/dist/src/tracing/eve/content-span-processor.js +1 -0
- package/dist/src/tracing/eve/delegation.d.ts +20 -0
- package/dist/src/tracing/eve/delegation.js +1 -0
- package/dist/src/tracing/eve/gateway.d.ts +17 -0
- package/dist/src/tracing/eve/gateway.js +1 -0
- package/dist/src/tracing/{install-instrumentation-runtime.d.ts → eve/install-instrumentation-runtime.d.ts} +1 -1
- package/dist/src/tracing/eve/install-instrumentation-runtime.js +1 -0
- package/dist/src/tracing/eve/invoke-tool-span.js +1 -0
- package/dist/src/tracing/eve/mcp.d.ts +29 -0
- package/dist/src/tracing/eve/mcp.js +1 -0
- package/dist/src/tracing/eve/metadata.d.ts +7 -0
- package/dist/src/tracing/eve/metadata.js +1 -0
- package/dist/src/tracing/eve/operation-input.d.ts +30 -0
- package/dist/src/tracing/eve/operation-input.js +1 -0
- package/dist/src/tracing/eve/otel-configuration.d.ts +70 -0
- package/dist/src/tracing/eve/otel-configuration.js +1 -0
- package/dist/src/tracing/{otel-declaration.d.ts → eve/otel-declaration.d.ts} +13 -19
- package/dist/src/tracing/eve/otel-declaration.js +1 -0
- package/dist/src/tracing/{otel-registration.d.ts → eve/otel-registration.d.ts} +12 -5
- package/dist/src/tracing/eve/otel-registration.js +1 -0
- package/dist/src/tracing/eve/policy.d.ts +15 -0
- package/dist/src/tracing/eve/policy.js +1 -0
- package/dist/src/tracing/eve/profile.d.ts +7 -0
- package/dist/src/tracing/eve/profile.js +1 -0
- package/dist/src/tracing/eve/session.d.ts +27 -0
- package/dist/src/tracing/eve/session.js +1 -0
- package/dist/src/tracing/{vercel-runtime-span-exporter.d.ts → eve/vercel-runtime-span-exporter.d.ts} +1 -1
- package/dist/src/tracing/local/agent-trace-span-processor.js +1 -0
- package/dist/src/tracing/local/inspection.d.ts +15 -0
- package/dist/src/tracing/local/inspection.js +1 -0
- package/dist/src/tracing/{local-instrumentation-runtime.d.ts → local/instrumentation-runtime.d.ts} +1 -1
- package/dist/src/tracing/local/instrumentation-runtime.js +1 -0
- package/dist/src/tracing/{local-trace-analysis.d.ts → local/trace-analysis.d.ts} +2 -2
- package/dist/src/tracing/{local-trace-analysis.js → local/trace-analysis.js} +1 -1
- package/dist/src/tracing/{local-trace-operations.d.ts → local/trace-operations.d.ts} +1 -1
- package/dist/src/tracing/{local-trace-query.d.ts → local/trace-query.d.ts} +1 -1
- package/dist/src/tracing/local/trace-reader.js +1 -0
- package/dist/src/tracing/{local-trace-retention.js → local/trace-retention.js} +1 -1
- package/dist/src/tracing/{local-trace-span-processor.js → local/trace-span-processor.js} +1 -1
- package/dist/src/tracing/{local-trace-summary.d.ts → local/trace-summary.d.ts} +1 -1
- package/dist/src/tracing/local/trace-summary.js +1 -0
- package/dist/src/tracing/{local-traces.d.ts → local/traces.d.ts} +1 -1
- package/dist/src/tracing/local/traces.js +1 -0
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.d.ts +6 -0
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/agent-config.md +48 -0
- package/docs/channels/eve.mdx +2 -0
- package/docs/connections/mcp.mdx +22 -1
- package/docs/connections/overview.mdx +9 -6
- package/docs/evals/assertions.mdx +50 -3
- package/docs/evals/overview.mdx +2 -1
- package/docs/evals/reporters.mdx +3 -1
- package/docs/guides/frontend/overview.mdx +10 -1
- package/docs/guides/hooks.md +2 -2
- package/docs/guides/instrumentation/otel.mdx +3 -0
- package/docs/reference/cli.md +1 -1
- package/docs/reference/typescript-api.md +7 -6
- package/docs/sandbox/vercel.mdx +9 -0
- package/docs/skills.mdx +1 -1
- package/docs/tools/human-in-the-loop.md +44 -1
- package/package.json +2 -1
- package/dist/src/harness/proxy-input-requests.js +0 -1
- package/dist/src/tracing/agent-approval-instrumentation.d.ts +0 -11
- package/dist/src/tracing/agent-approval-instrumentation.js +0 -1
- package/dist/src/tracing/agent-invocation-coordinator.js +0 -1
- package/dist/src/tracing/agent-memory-instrumentation.d.ts +0 -16
- package/dist/src/tracing/agent-memory-instrumentation.js +0 -1
- package/dist/src/tracing/agent-otel-attributes.d.ts +0 -10
- package/dist/src/tracing/agent-otel-attributes.js +0 -1
- package/dist/src/tracing/agent-otel-content.js +0 -4
- package/dist/src/tracing/agent-otel-provider.js +0 -2
- package/dist/src/tracing/agent-otel-runtime-context.d.ts +0 -36
- package/dist/src/tracing/agent-otel-runtime-context.js +0 -1
- package/dist/src/tracing/agent-otel-session-context.d.ts +0 -22
- package/dist/src/tracing/agent-otel-session-context.js +0 -1
- package/dist/src/tracing/agent-otel-turn-state.d.ts +0 -6
- package/dist/src/tracing/agent-otel-turn-state.js +0 -1
- package/dist/src/tracing/agent-otel-usage.d.ts +0 -10
- package/dist/src/tracing/agent-otel-usage.js +0 -1
- package/dist/src/tracing/agent-span-contract.d.ts +0 -34
- package/dist/src/tracing/agent-span-contract.js +0 -1
- package/dist/src/tracing/agent-span-error.js +0 -1
- package/dist/src/tracing/agent-span-id-generator.js +0 -1
- package/dist/src/tracing/agent-span-naming.d.ts +0 -1
- package/dist/src/tracing/agent-span-naming.js +0 -1
- package/dist/src/tracing/agent-tool-instrumentation.d.ts +0 -40
- package/dist/src/tracing/agent-tool-instrumentation.js +0 -1
- package/dist/src/tracing/agent-tool-span-context.d.ts +0 -16
- package/dist/src/tracing/agent-tool-span-context.js +0 -1
- package/dist/src/tracing/agent-trace-context-codec.d.ts +0 -15
- package/dist/src/tracing/agent-trace-context-codec.js +0 -1
- package/dist/src/tracing/agent-trace-context-store.js +0 -1
- package/dist/src/tracing/agent-trace-context.js +0 -1
- package/dist/src/tracing/agent-trace-span-processor.js +0 -1
- package/dist/src/tracing/agent-trace-state.d.ts +0 -91
- package/dist/src/tracing/batch-span-processor.js +0 -1
- package/dist/src/tracing/bounded-error.d.ts +0 -1
- package/dist/src/tracing/bounded-error.js +0 -1
- package/dist/src/tracing/content-attributes.js +0 -1
- package/dist/src/tracing/content-span-processor.js +0 -1
- package/dist/src/tracing/error-content-context.d.ts +0 -3
- package/dist/src/tracing/error-content-context.js +0 -1
- package/dist/src/tracing/install-instrumentation-runtime.js +0 -1
- package/dist/src/tracing/invoke-tool-span.js +0 -1
- package/dist/src/tracing/local-instrumentation-runtime.js +0 -1
- package/dist/src/tracing/local-trace-reader.js +0 -1
- package/dist/src/tracing/local-trace-summary.js +0 -1
- package/dist/src/tracing/local-traces.js +0 -1
- package/dist/src/tracing/otel-declaration.js +0 -1
- package/dist/src/tracing/otel-registration.js +0 -1
- package/dist/src/tracing/sampled-trace.d.ts +0 -4
- package/dist/src/tracing/sampled-trace.js +0 -1
- package/dist/src/tracing/suppress-tracing.d.ts +0 -2
- package/dist/src/tracing/suppress-tracing.js +0 -1
- package/dist/src/tracing/telemetry-budget.d.ts +0 -3
- package/dist/src/tracing/telemetry-budget.js +0 -1
- /package/dist/src/{tracing/agent-span-error.d.ts → compiled/@eve/tracing/adapters/otel-error.d.ts} +0 -0
- /package/dist/src/tracing/{agent-invocation-coordinator.d.ts → eve/agent-invocation-coordinator.d.ts} +0 -0
- /package/dist/src/tracing/{agent-trace-context.d.ts → eve/agent-trace-context.d.ts} +0 -0
- /package/dist/src/tracing/{agent-trace-state.js → eve/agent-trace-state.js} +0 -0
- /package/dist/src/tracing/{channel-audience-context.d.ts → eve/channel-audience-context.d.ts} +0 -0
- /package/dist/src/tracing/{channel-audience-context.js → eve/channel-audience-context.js} +0 -0
- /package/dist/src/tracing/{conversation-context.d.ts → eve/conversation-context.d.ts} +0 -0
- /package/dist/src/tracing/{conversation-context.js → eve/conversation-context.js} +0 -0
- /package/dist/src/tracing/{invoke-tool-span.d.ts → eve/invoke-tool-span.d.ts} +0 -0
- /package/dist/src/tracing/{span-export-policy.d.ts → eve/span-export-policy.d.ts} +0 -0
- /package/dist/src/tracing/{span-export-policy.js → eve/span-export-policy.js} +0 -0
- /package/dist/src/tracing/{vercel-runtime-span-exporter.js → eve/vercel-runtime-span-exporter.js} +0 -0
- /package/dist/src/tracing/{agent-trace-span-processor.d.ts → local/agent-trace-span-processor.d.ts} +0 -0
- /package/dist/src/tracing/{local-trace-discovery-index.d.ts → local/trace-discovery-index.d.ts} +0 -0
- /package/dist/src/tracing/{local-trace-discovery-index.js → local/trace-discovery-index.js} +0 -0
- /package/dist/src/tracing/{local-trace-operations.js → local/trace-operations.js} +0 -0
- /package/dist/src/tracing/{local-trace-query.js → local/trace-query.js} +0 -0
- /package/dist/src/tracing/{local-trace-reader.d.ts → local/trace-reader.d.ts} +0 -0
- /package/dist/src/tracing/{local-trace-retention.d.ts → local/trace-retention.d.ts} +0 -0
- /package/dist/src/tracing/{local-trace-span-processor.d.ts → local/trace-span-processor.d.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
# eve
|
|
2
2
|
|
|
3
|
+
## 0.79.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 68b9d58: Approved `defineTool` calls can read who approved them: `ctx.approval.responder` is the approver and `ctx.approval.responder.getToken(provider)` resolves their token, while the call still runs as the requester.
|
|
8
|
+
- 620022b: The Braintrust eval reporter no longer aborts the run when an eval produces no agent output. Those evals are now logged with an empty output.
|
|
9
|
+
- 2e45423: Allow `eve/client` to use an `AbortSignal` that does not implement `throwIfAborted`, including the signal provided by React Native.
|
|
10
|
+
- afa7741: Sync dynamic skill files to the sandbox about 7× faster by writing them concurrently.
|
|
11
|
+
- 70f75ed: Connection sign-in callback URLs no longer include `VERCEL_AUTOMATION_BYPASS_SECRET`, so the secret stays out of the links shown to users and the `redirect_uri` sent to providers. On a deployment behind Deployment Protection, the person signing in now passes protection on their own, for example through Vercel Authentication or a Deployment Protection Exception.
|
|
12
|
+
- 4c6fc60: Record `agent.input.messages.omitted` on model spans when the oldest prompt messages are dropped to fit the 32 KB content cap, so a long conversation no longer looks like it starts partway through.
|
|
13
|
+
- 7f5a5e6: Reading a session stream whose history passed the World's retention now returns `410` with `code: "session_expired"` instead of a retryable `503` or `404`. The TypeScript client fails on the first response instead of retrying for about 38 seconds.
|
|
14
|
+
- 624be47: Pass `followIdle: false` to `useEveAgent()` (React, Vue, and Svelte) or `EveAgentStore` to close the session stream while the session is idle instead of reconnecting it indefinitely. The stream reopens from its cursor on the next send, answer, or resume, and a prewarmed session opens no stream until its first message.
|
|
15
|
+
- 4bf1efa: Propagate configured trace context at each AI Gateway model request.
|
|
16
|
+
- 7921fb0: Self-modification now rejects target branch names Git rejects: path components starting with `.` (such as `.hidden` or `feature/.hidden`) and names containing the DEL character.
|
|
17
|
+
- 71479ce: Let a message sent with `turnPolicy: "queue"` right after a tool approval or sign-in appears steer the held turn again. A message that arrived while the step raising the request was still finishing was treated as sent before the request, so it stayed queued behind a turn that could not end until the person acted.
|
|
18
|
+
- 0fd4240: Honor explicit OpenTelemetry trace policies that enable inputs or outputs for DMs, private channels, and unknown audiences. Default capture remains audience-aware, and inherited capture limits and destination redaction still apply.
|
|
19
|
+
- 3aa9a3a: Expose the live Vercel Sandbox name on `VercelSandboxSession` so tools can create Vercel git-credential-broker grants scoped to their session sandbox.
|
|
20
|
+
- 9d046f8: Memory provider tools are now offered on a turn whose message carries a file attachment. Before, the agent lost its memory tools on exactly that turn.
|
|
21
|
+
- 8d5b75f: `eve build` now works for apps with mounted extensions on filesystems without hard-link support, such as some NFS and FUSE mounts. It no longer fails with `Unknown system error -524` while writing the authored module map.
|
|
22
|
+
- d8414ad: OpenAPI connections whose operation names collide at 64 characters now keep the suffixed tool names within the 64-character provider limit.
|
|
23
|
+
- 8f336b8: Prewarm new Web Chat sessions when the user starts typing, so durable session startup overlaps with composing the first message.
|
|
24
|
+
- 0dea0de: Keep a message sent with `turnPolicy: "queue"` before a tool approval or sign-in was requested in the queue, so it can no longer answer a prompt the person had not seen. Messages sent after the prompt still steer the held turn.
|
|
25
|
+
- d7fef87: Import skills with structured or non-string metadata without failing, treating metadata outside eve's modeled shape like other unmodeled frontmatter.
|
|
26
|
+
- f2e0f67: Vercel sandbox creation now reads `VERCEL_TOKEN`, `VERCEL_TEAM_ID`/`VERCEL_ORG_ID`, and `VERCEL_PROJECT_ID` from the environment, like sandbox lookup and deletion already do. A CI runner without a linked project can now create sandboxes.
|
|
27
|
+
- a4af301: Labeled assertions now report to Braintrust and Datadog under their label, so `t.score(x).label("grounding")` logs as `grounding` instead of `score [grounding]` or `score_grounding`. Display names in the console and run artifacts are unchanged, and labeled metrics start a new series under the bare label.
|
|
28
|
+
- d91d27c: Keep the answer a turn already wrote when it waits on tasks and resumes without new text, so `MessageResponse` results, `eve invoke`, and eval turns no longer report an empty message.
|
|
29
|
+
- 57d4272: Connections that share a host, such as Jira and Confluence on one Atlassian domain, no longer trigger the "could not assign a unique toolResultFrom identity" warning, and `toolResultFrom` now accepts OpenAPI connections, including ones without a `baseUrl`.
|
|
30
|
+
- 0e6bc96: `eve build` now reports why an extension mount failed to resolve, for example an extension that requires an unsupported tool contract or a package that isn't installed. Before, the build stopped with `Selected module binding "extensions/<name>.ts" has no compile or runtime usage.` and hid the cause.
|
|
31
|
+
|
|
32
|
+
## 0.79.0
|
|
33
|
+
|
|
34
|
+
### Minor Changes
|
|
35
|
+
|
|
36
|
+
- bc2be45: Adds `t.score(evaluation)` for recording a score from 0 to 1, named with `.label(key)` and gated with `.gate()` or `.atLeast()`. `AssertionResult` gains `key`, and `score`, `threshold`, and `passed` are now optional: `score` is absent when the scorer threw, and `threshold` and `passed` are absent when no rule applies, so custom reporters should treat `passed === false` as the failure signal. `eve eval` warns when soft assertions in one eval share a name with different scores.
|
|
37
|
+
|
|
38
|
+
### Patch Changes
|
|
39
|
+
|
|
40
|
+
- 76f6854: eve's agent spans now come from the shared tracing library, and durable turns recover from one checkpoint per turn. Each tool call is still one `execute_tool` span, a local subagent's first turn still nests under its caller, and trace schema version 4 is unchanged.
|
|
41
|
+
- f5e5183: Connection approval policies now receive `toolAnnotations`, the hints an MCP server declared for the called tool (such as `readOnlyHint` and `destructiveHint`), so a policy can skip approval for read-only tools. It is `undefined` when the server declares none.
|
|
42
|
+
- 302a4d3: Tools can now define `approval.prompt` to show a human-readable, input-aware summary in approval requests. Slack keeps the complete tool input available in a collapsed block below the approval card.
|
|
43
|
+
- 422b628: Extract reusable agent tracing with wrapped execution, model stream completion, remote delegation, and durable turns that save and resume themselves through a checkpointer. Preserve trace schema version 4 while sharing one span lifecycle with eve.
|
|
44
|
+
- 485d0f5: The agent tracing library now writes schema 4's `agent.action.kind`, `agent.action.name`, and `agent.action.outcome` on tool and approval spans itself, so hosts other than eve render correctly in Agent Runs. eve's trace output is unchanged.
|
|
45
|
+
|
|
3
46
|
## 0.78.0
|
|
4
47
|
|
|
5
48
|
### Minor Changes
|
|
@@ -4,6 +4,17 @@ import type { ToolAuthOptions, ToolAuthProvider } from "#tools/auth.js";
|
|
|
4
4
|
import type { SessionContext } from "#context/session-context.js";
|
|
5
5
|
import type { TokenResult } from "#shared/connection-types.js";
|
|
6
6
|
type ApprovalToolInput<TInput> = TInput extends object ? Readonly<TInput> : TInput;
|
|
7
|
+
/** Context passed to an approval prompt callback. */
|
|
8
|
+
export interface ApprovalPromptContext<TInput = Record<string, unknown>> {
|
|
9
|
+
/** Id of the tool call awaiting approval. */
|
|
10
|
+
readonly callId: string;
|
|
11
|
+
/** Validated input proposed for the tool call. */
|
|
12
|
+
readonly input: TInput;
|
|
13
|
+
/** Final runtime name of the tool. */
|
|
14
|
+
readonly toolName: string;
|
|
15
|
+
}
|
|
16
|
+
/** Builds the human-readable prompt shown when a tool call requires approval. */
|
|
17
|
+
export type ApprovalPrompt<TInput = Record<string, unknown>> = (context: ApprovalPromptContext<TInput>) => string;
|
|
7
18
|
/**
|
|
8
19
|
* Context passed to an {@link ApprovalPolicy} function.
|
|
9
20
|
*
|
|
@@ -15,9 +26,33 @@ export interface ApprovalContext<TInput = Record<string, unknown>> extends Sessi
|
|
|
15
26
|
readonly abortSignal: AbortSignal;
|
|
16
27
|
readonly approvedTools: ReadonlySet<string>;
|
|
17
28
|
readonly callId: string;
|
|
29
|
+
/**
|
|
30
|
+
* Behavior hints the connection's server declared for this tool, such as
|
|
31
|
+
* MCP's `readOnlyHint` and `destructiveHint`. Absent for authored tools and
|
|
32
|
+
* for servers that declare none. Hints are only as trustworthy as the server.
|
|
33
|
+
*/
|
|
34
|
+
readonly toolAnnotations?: ConnectionToolAnnotations;
|
|
18
35
|
readonly toolInput?: ApprovalToolInput<TInput>;
|
|
19
36
|
readonly toolName: string;
|
|
20
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Behavior hints a connection's server declares for one of its tools. The
|
|
40
|
+
* named fields follow MCP's `ToolAnnotations`; other keys pass through as the
|
|
41
|
+
* server sent them.
|
|
42
|
+
*/
|
|
43
|
+
export interface ConnectionToolAnnotations {
|
|
44
|
+
/** Human-readable tool title. */
|
|
45
|
+
readonly title?: string;
|
|
46
|
+
/** The tool does not modify its environment. */
|
|
47
|
+
readonly readOnlyHint?: boolean;
|
|
48
|
+
/** The tool may perform destructive updates. Meaningful only when not read-only. */
|
|
49
|
+
readonly destructiveHint?: boolean;
|
|
50
|
+
/** Repeating a call with the same arguments has no additional effect. */
|
|
51
|
+
readonly idempotentHint?: boolean;
|
|
52
|
+
/** The tool may interact with an open world of external entities. */
|
|
53
|
+
readonly openWorldHint?: boolean;
|
|
54
|
+
readonly [key: string]: unknown;
|
|
55
|
+
}
|
|
21
56
|
/** Request-time approval decision returned by an {@link ApprovalPolicy}. */
|
|
22
57
|
export type ApprovalStatus = undefined | boolean | "not-applicable" | "approved" | "denied" | "user-approval" | {
|
|
23
58
|
readonly type: "not-applicable";
|
|
@@ -95,6 +130,13 @@ export interface ApprovalConfiguration<TInput = Record<string, unknown>> {
|
|
|
95
130
|
}
|
|
96
131
|
/** Shared approval definition used by authored tools and connections. */
|
|
97
132
|
export type Approval<TInput = Record<string, unknown>> = ApprovalPolicy<TInput> | ApprovalConfiguration<TInput>;
|
|
133
|
+
/** Approval configuration for a tool, including its optional presentation prompt. */
|
|
134
|
+
export interface ToolApprovalConfiguration<TInput = Record<string, unknown>> extends ApprovalConfiguration<TInput> {
|
|
135
|
+
/** Optional human-readable prompt shown when this tool requires approval. */
|
|
136
|
+
readonly prompt?: ApprovalPrompt<TInput>;
|
|
137
|
+
}
|
|
138
|
+
/** Approval definition used by authored tools. */
|
|
139
|
+
export type ToolApproval<TInput = Record<string, unknown>> = ApprovalPolicy<TInput> | ToolApprovalConfiguration<TInput>;
|
|
98
140
|
/** Returns the request-time policy from either approval authoring shape. */
|
|
99
141
|
export declare function resolveApprovalPolicy<TInput>(approval: Approval<TInput>): ApprovalPolicy<TInput>;
|
|
100
142
|
export {};
|
|
@@ -4,6 +4,22 @@ import { z } from "#compiled/zod/index.js";
|
|
|
4
4
|
import "ai";
|
|
5
5
|
import { Validator } from "#compiled/@cfworker/json-schema/index.js";
|
|
6
6
|
|
|
7
|
+
//#region src/client/abort-signal.ts
|
|
8
|
+
function throwIfAborted(signal) {
|
|
9
|
+
if (signal === void 0) return;
|
|
10
|
+
const nativeThrowIfAborted = signal.throwIfAborted;
|
|
11
|
+
if (typeof nativeThrowIfAborted === "function") {
|
|
12
|
+
nativeThrowIfAborted.call(signal);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (!signal.aborted) return;
|
|
16
|
+
if (signal.reason !== void 0) throw signal.reason;
|
|
17
|
+
const error = /* @__PURE__ */ new Error("The operation was aborted.");
|
|
18
|
+
error.name = "AbortError";
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
7
23
|
//#region src/protocol/routes.ts
|
|
8
24
|
const EVE_ROUTE_PREFIX = "/eve/v1";
|
|
9
25
|
const EVE_PRODUCTION_CRON_ROUTE_PATTERN = `${EVE_ROUTE_PREFIX}/cron/:token`;
|
|
@@ -1152,7 +1168,6 @@ function summarizeTurnEvents(events) {
|
|
|
1152
1168
|
if (segment.observe(event)) boundary = event;
|
|
1153
1169
|
if (isTurnFailureEvent(event)) failure = event;
|
|
1154
1170
|
if (isFinalMessageCompleted(event)) message = event.data.message ?? void 0;
|
|
1155
|
-
if (event.type === "turn.waiting") message = void 0;
|
|
1156
1171
|
}
|
|
1157
1172
|
return {
|
|
1158
1173
|
boundary,
|
|
@@ -1336,9 +1351,9 @@ async function* readNdjsonStream(body, options) {
|
|
|
1336
1351
|
options.signal?.addEventListener("abort", abort, { once: true });
|
|
1337
1352
|
try {
|
|
1338
1353
|
while (true) {
|
|
1339
|
-
options.signal
|
|
1354
|
+
throwIfAborted(options.signal);
|
|
1340
1355
|
const result = await readWithIdleTimeout(reader, options?.idleTimeoutMs);
|
|
1341
|
-
options.signal
|
|
1356
|
+
throwIfAborted(options.signal);
|
|
1342
1357
|
if (result.done) {
|
|
1343
1358
|
reachedEof = true;
|
|
1344
1359
|
buffer += decoder.decode();
|
|
@@ -1616,10 +1631,10 @@ async function openStreamBody(input) {
|
|
|
1616
1631
|
if (input.requestTailIndex === true) searchParams.includeTailIndex = "1";
|
|
1617
1632
|
if (input.follow === false) searchParams.follow = "false";
|
|
1618
1633
|
for (let attempt = 0; attempt < openRetryPolicy.maxAttempts; attempt += 1) {
|
|
1619
|
-
input.signal
|
|
1634
|
+
throwIfAborted(input.signal);
|
|
1620
1635
|
const url = createClientUrl(input.host, input.path, Object.keys(searchParams).length > 0 ? searchParams : void 0);
|
|
1621
1636
|
const headers = await input.resolveHeaders();
|
|
1622
|
-
input.signal
|
|
1637
|
+
throwIfAborted(input.signal);
|
|
1623
1638
|
const connectionController = new AbortController();
|
|
1624
1639
|
const signal = input.signal ? AbortSignal.any([input.signal, connectionController.signal]) : connectionController.signal;
|
|
1625
1640
|
let response;
|
|
@@ -2325,14 +2340,14 @@ var ClientSession = class ClientSession {
|
|
|
2325
2340
|
return this.#state;
|
|
2326
2341
|
}
|
|
2327
2342
|
async snapshot(options) {
|
|
2328
|
-
options?.signal
|
|
2343
|
+
throwIfAborted(options?.signal);
|
|
2329
2344
|
const events = [];
|
|
2330
2345
|
for await (const event of this.#readStream({
|
|
2331
2346
|
follow: false,
|
|
2332
2347
|
signal: options?.signal,
|
|
2333
2348
|
startIndex: 0
|
|
2334
2349
|
})) events.push(event);
|
|
2335
|
-
options?.signal
|
|
2350
|
+
throwIfAborted(options?.signal);
|
|
2336
2351
|
return {
|
|
2337
2352
|
events,
|
|
2338
2353
|
session: {
|
|
@@ -2500,7 +2515,7 @@ async function postSessionSend(context, path, input) {
|
|
|
2500
2515
|
if (remainingMs <= 0) throw error;
|
|
2501
2516
|
await sleep(Math.min(retryDelayMs, remainingMs), input.signal);
|
|
2502
2517
|
}
|
|
2503
|
-
input.signal
|
|
2518
|
+
throwIfAborted(input.signal);
|
|
2504
2519
|
retryDelayMs = Math.min(retryDelayMs * 2, SESSION_SEND_RETRY_MAX_DELAY_MS);
|
|
2505
2520
|
}
|
|
2506
2521
|
}
|
|
@@ -4198,11 +4213,14 @@ var ConversationClient = class {
|
|
|
4198
4213
|
this.#stream = new SessionEventStream(session, options);
|
|
4199
4214
|
return this.#stream;
|
|
4200
4215
|
}
|
|
4216
|
+
closeStream() {
|
|
4217
|
+
this.#stream?.close();
|
|
4218
|
+
this.#stream = void 0;
|
|
4219
|
+
}
|
|
4201
4220
|
stop() {
|
|
4202
4221
|
this.#follower?.abortAll();
|
|
4203
4222
|
this.#follower = void 0;
|
|
4204
|
-
this
|
|
4205
|
-
this.#stream = void 0;
|
|
4223
|
+
this.closeStream();
|
|
4206
4224
|
}
|
|
4207
4225
|
reset() {
|
|
4208
4226
|
this.stop();
|
|
@@ -4223,7 +4241,7 @@ async function dispatchSessionTurn(input) {
|
|
|
4223
4241
|
...turn,
|
|
4224
4242
|
message: turn.message
|
|
4225
4243
|
});
|
|
4226
|
-
turn.signal
|
|
4244
|
+
throwIfAborted(turn.signal);
|
|
4227
4245
|
return {
|
|
4228
4246
|
...created,
|
|
4229
4247
|
created: true
|
|
@@ -4256,6 +4274,7 @@ var EveAgentStore = class {
|
|
|
4256
4274
|
#attached = false;
|
|
4257
4275
|
#conversationClient;
|
|
4258
4276
|
#followChildStreams;
|
|
4277
|
+
#followIdle;
|
|
4259
4278
|
#externalSession;
|
|
4260
4279
|
#subscribers = /* @__PURE__ */ new Set();
|
|
4261
4280
|
#activeTurn;
|
|
@@ -4273,6 +4292,7 @@ var EveAgentStore = class {
|
|
|
4273
4292
|
constructor(init) {
|
|
4274
4293
|
this.#autoPrewarm = init.prewarm ?? false;
|
|
4275
4294
|
this.#followChildStreams = init.followSubagents ?? false;
|
|
4295
|
+
this.#followIdle = init.followIdle ?? true;
|
|
4276
4296
|
this.#externalSession = init.session !== void 0;
|
|
4277
4297
|
this.#client = this.#externalSession ? void 0 : init.client ?? new Client({
|
|
4278
4298
|
auth: init.auth,
|
|
@@ -4313,7 +4333,7 @@ var EveAgentStore = class {
|
|
|
4313
4333
|
this.#error = void 0;
|
|
4314
4334
|
if (this.#status === "error") this.#status = "ready";
|
|
4315
4335
|
this.#adoptSession(created.session);
|
|
4316
|
-
this.#ensureStream();
|
|
4336
|
+
if (this.#followIdle) this.#ensureStream();
|
|
4317
4337
|
} catch (error) {
|
|
4318
4338
|
if (generation === this.#prewarmGeneration && this.#activeTurn === void 0 && this.#error === void 0) this.#fail(error);
|
|
4319
4339
|
throw error;
|
|
@@ -4569,7 +4589,7 @@ var EveAgentStore = class {
|
|
|
4569
4589
|
await waitWithSignal(this.#prewarmPromise.catch((error) => {
|
|
4570
4590
|
if (this.#session !== void 0) throw error;
|
|
4571
4591
|
}), input.signal);
|
|
4572
|
-
input.signal
|
|
4592
|
+
throwIfAborted(input.signal);
|
|
4573
4593
|
}
|
|
4574
4594
|
const session = this.#session;
|
|
4575
4595
|
let reader;
|
|
@@ -4635,6 +4655,7 @@ var EveAgentStore = class {
|
|
|
4635
4655
|
if (!this.#isActiveTurn(turn)) return;
|
|
4636
4656
|
turn.resolveResponse(void 0);
|
|
4637
4657
|
this.#activeTurn = void 0;
|
|
4658
|
+
this.#closeStreamWhenIdle();
|
|
4638
4659
|
try {
|
|
4639
4660
|
this.#callbacks.onSessionChange?.(this.#session?.state);
|
|
4640
4661
|
this.#publish();
|
|
@@ -4668,8 +4689,16 @@ var EveAgentStore = class {
|
|
|
4668
4689
|
this.#callbacks.onSessionChange?.(this.#session?.state);
|
|
4669
4690
|
if (this.#status !== "resuming") this.#publish();
|
|
4670
4691
|
if (this.#activeTurn === void 0 && wasStreaming && settled) this.#callbacks.onFinish?.(this.#snapshot);
|
|
4692
|
+
if (this.#activeTurn === void 0) this.#closeStreamWhenIdle();
|
|
4671
4693
|
return true;
|
|
4672
4694
|
}
|
|
4695
|
+
#closeStreamWhenIdle() {
|
|
4696
|
+
if (this.#followIdle) return;
|
|
4697
|
+
const { conversation } = this.#conversationClient;
|
|
4698
|
+
if (conversation.activeTurnId !== void 0) return;
|
|
4699
|
+
if (this.#events.length > 0 && !isSettledSessionTail(this.#events, conversation)) return;
|
|
4700
|
+
if (!Object.values(conversation.tasks).some((task) => Object.values(task.calls).some((call) => call.status === "working"))) this.#conversationClient.closeStream();
|
|
4701
|
+
}
|
|
4673
4702
|
#correlate(submissionId, response) {
|
|
4674
4703
|
const deliveryId = getMessageResponseDeliveryId(response);
|
|
4675
4704
|
const reconciled = this.#messageSubmissions.correlate(submissionId, deliveryId, this.#events);
|
|
@@ -4809,6 +4838,7 @@ function useEveAgent(options = {}) {
|
|
|
4809
4838
|
initialSession: options.initialSession,
|
|
4810
4839
|
optimistic: options.optimistic,
|
|
4811
4840
|
followSubagents: options.followSubagents,
|
|
4841
|
+
followIdle: options.followIdle,
|
|
4812
4842
|
prewarm: options.prewarm,
|
|
4813
4843
|
reducer,
|
|
4814
4844
|
session: options.session
|
|
@@ -3,6 +3,22 @@ import { z } from "#compiled/zod/index.js";
|
|
|
3
3
|
import "ai";
|
|
4
4
|
import { Validator } from "#compiled/@cfworker/json-schema/index.js";
|
|
5
5
|
|
|
6
|
+
//#region src/client/abort-signal.ts
|
|
7
|
+
function throwIfAborted(signal) {
|
|
8
|
+
if (signal === void 0) return;
|
|
9
|
+
const nativeThrowIfAborted = signal.throwIfAborted;
|
|
10
|
+
if (typeof nativeThrowIfAborted === "function") {
|
|
11
|
+
nativeThrowIfAborted.call(signal);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (!signal.aborted) return;
|
|
15
|
+
if (signal.reason !== void 0) throw signal.reason;
|
|
16
|
+
const error = /* @__PURE__ */ new Error("The operation was aborted.");
|
|
17
|
+
error.name = "AbortError";
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
6
22
|
//#region src/protocol/routes.ts
|
|
7
23
|
const EVE_ROUTE_PREFIX = "/eve/v1";
|
|
8
24
|
const EVE_PRODUCTION_CRON_ROUTE_PATTERN = `${EVE_ROUTE_PREFIX}/cron/:token`;
|
|
@@ -1151,7 +1167,6 @@ function summarizeTurnEvents(events) {
|
|
|
1151
1167
|
if (segment.observe(event)) boundary = event;
|
|
1152
1168
|
if (isTurnFailureEvent(event)) failure = event;
|
|
1153
1169
|
if (isFinalMessageCompleted(event)) message = event.data.message ?? void 0;
|
|
1154
|
-
if (event.type === "turn.waiting") message = void 0;
|
|
1155
1170
|
}
|
|
1156
1171
|
return {
|
|
1157
1172
|
boundary,
|
|
@@ -1335,9 +1350,9 @@ async function* readNdjsonStream(body, options) {
|
|
|
1335
1350
|
options.signal?.addEventListener("abort", abort, { once: true });
|
|
1336
1351
|
try {
|
|
1337
1352
|
while (true) {
|
|
1338
|
-
options.signal
|
|
1353
|
+
throwIfAborted(options.signal);
|
|
1339
1354
|
const result = await readWithIdleTimeout(reader, options?.idleTimeoutMs);
|
|
1340
|
-
options.signal
|
|
1355
|
+
throwIfAborted(options.signal);
|
|
1341
1356
|
if (result.done) {
|
|
1342
1357
|
reachedEof = true;
|
|
1343
1358
|
buffer += decoder.decode();
|
|
@@ -1615,10 +1630,10 @@ async function openStreamBody(input) {
|
|
|
1615
1630
|
if (input.requestTailIndex === true) searchParams.includeTailIndex = "1";
|
|
1616
1631
|
if (input.follow === false) searchParams.follow = "false";
|
|
1617
1632
|
for (let attempt = 0; attempt < openRetryPolicy.maxAttempts; attempt += 1) {
|
|
1618
|
-
input.signal
|
|
1633
|
+
throwIfAborted(input.signal);
|
|
1619
1634
|
const url = createClientUrl(input.host, input.path, Object.keys(searchParams).length > 0 ? searchParams : void 0);
|
|
1620
1635
|
const headers = await input.resolveHeaders();
|
|
1621
|
-
input.signal
|
|
1636
|
+
throwIfAborted(input.signal);
|
|
1622
1637
|
const connectionController = new AbortController();
|
|
1623
1638
|
const signal = input.signal ? AbortSignal.any([input.signal, connectionController.signal]) : connectionController.signal;
|
|
1624
1639
|
let response;
|
|
@@ -2324,14 +2339,14 @@ var ClientSession = class ClientSession {
|
|
|
2324
2339
|
return this.#state;
|
|
2325
2340
|
}
|
|
2326
2341
|
async snapshot(options) {
|
|
2327
|
-
options?.signal
|
|
2342
|
+
throwIfAborted(options?.signal);
|
|
2328
2343
|
const events = [];
|
|
2329
2344
|
for await (const event of this.#readStream({
|
|
2330
2345
|
follow: false,
|
|
2331
2346
|
signal: options?.signal,
|
|
2332
2347
|
startIndex: 0
|
|
2333
2348
|
})) events.push(event);
|
|
2334
|
-
options?.signal
|
|
2349
|
+
throwIfAborted(options?.signal);
|
|
2335
2350
|
return {
|
|
2336
2351
|
events,
|
|
2337
2352
|
session: {
|
|
@@ -2499,7 +2514,7 @@ async function postSessionSend(context, path, input) {
|
|
|
2499
2514
|
if (remainingMs <= 0) throw error;
|
|
2500
2515
|
await sleep(Math.min(retryDelayMs, remainingMs), input.signal);
|
|
2501
2516
|
}
|
|
2502
|
-
input.signal
|
|
2517
|
+
throwIfAborted(input.signal);
|
|
2503
2518
|
retryDelayMs = Math.min(retryDelayMs * 2, SESSION_SEND_RETRY_MAX_DELAY_MS);
|
|
2504
2519
|
}
|
|
2505
2520
|
}
|
|
@@ -4197,11 +4212,14 @@ var ConversationClient = class {
|
|
|
4197
4212
|
this.#stream = new SessionEventStream(session, options);
|
|
4198
4213
|
return this.#stream;
|
|
4199
4214
|
}
|
|
4215
|
+
closeStream() {
|
|
4216
|
+
this.#stream?.close();
|
|
4217
|
+
this.#stream = void 0;
|
|
4218
|
+
}
|
|
4200
4219
|
stop() {
|
|
4201
4220
|
this.#follower?.abortAll();
|
|
4202
4221
|
this.#follower = void 0;
|
|
4203
|
-
this
|
|
4204
|
-
this.#stream = void 0;
|
|
4222
|
+
this.closeStream();
|
|
4205
4223
|
}
|
|
4206
4224
|
reset() {
|
|
4207
4225
|
this.stop();
|
|
@@ -4222,7 +4240,7 @@ async function dispatchSessionTurn(input) {
|
|
|
4222
4240
|
...turn,
|
|
4223
4241
|
message: turn.message
|
|
4224
4242
|
});
|
|
4225
|
-
turn.signal
|
|
4243
|
+
throwIfAborted(turn.signal);
|
|
4226
4244
|
return {
|
|
4227
4245
|
...created,
|
|
4228
4246
|
created: true
|
|
@@ -4255,6 +4273,7 @@ var EveAgentStore = class {
|
|
|
4255
4273
|
#attached = false;
|
|
4256
4274
|
#conversationClient;
|
|
4257
4275
|
#followChildStreams;
|
|
4276
|
+
#followIdle;
|
|
4258
4277
|
#externalSession;
|
|
4259
4278
|
#subscribers = /* @__PURE__ */ new Set();
|
|
4260
4279
|
#activeTurn;
|
|
@@ -4272,6 +4291,7 @@ var EveAgentStore = class {
|
|
|
4272
4291
|
constructor(init) {
|
|
4273
4292
|
this.#autoPrewarm = init.prewarm ?? false;
|
|
4274
4293
|
this.#followChildStreams = init.followSubagents ?? false;
|
|
4294
|
+
this.#followIdle = init.followIdle ?? true;
|
|
4275
4295
|
this.#externalSession = init.session !== void 0;
|
|
4276
4296
|
this.#client = this.#externalSession ? void 0 : init.client ?? new Client({
|
|
4277
4297
|
auth: init.auth,
|
|
@@ -4312,7 +4332,7 @@ var EveAgentStore = class {
|
|
|
4312
4332
|
this.#error = void 0;
|
|
4313
4333
|
if (this.#status === "error") this.#status = "ready";
|
|
4314
4334
|
this.#adoptSession(created.session);
|
|
4315
|
-
this.#ensureStream();
|
|
4335
|
+
if (this.#followIdle) this.#ensureStream();
|
|
4316
4336
|
} catch (error) {
|
|
4317
4337
|
if (generation === this.#prewarmGeneration && this.#activeTurn === void 0 && this.#error === void 0) this.#fail(error);
|
|
4318
4338
|
throw error;
|
|
@@ -4568,7 +4588,7 @@ var EveAgentStore = class {
|
|
|
4568
4588
|
await waitWithSignal(this.#prewarmPromise.catch((error) => {
|
|
4569
4589
|
if (this.#session !== void 0) throw error;
|
|
4570
4590
|
}), input.signal);
|
|
4571
|
-
input.signal
|
|
4591
|
+
throwIfAborted(input.signal);
|
|
4572
4592
|
}
|
|
4573
4593
|
const session = this.#session;
|
|
4574
4594
|
let reader;
|
|
@@ -4634,6 +4654,7 @@ var EveAgentStore = class {
|
|
|
4634
4654
|
if (!this.#isActiveTurn(turn)) return;
|
|
4635
4655
|
turn.resolveResponse(void 0);
|
|
4636
4656
|
this.#activeTurn = void 0;
|
|
4657
|
+
this.#closeStreamWhenIdle();
|
|
4637
4658
|
try {
|
|
4638
4659
|
this.#callbacks.onSessionChange?.(this.#session?.state);
|
|
4639
4660
|
this.#publish();
|
|
@@ -4667,8 +4688,16 @@ var EveAgentStore = class {
|
|
|
4667
4688
|
this.#callbacks.onSessionChange?.(this.#session?.state);
|
|
4668
4689
|
if (this.#status !== "resuming") this.#publish();
|
|
4669
4690
|
if (this.#activeTurn === void 0 && wasStreaming && settled) this.#callbacks.onFinish?.(this.#snapshot);
|
|
4691
|
+
if (this.#activeTurn === void 0) this.#closeStreamWhenIdle();
|
|
4670
4692
|
return true;
|
|
4671
4693
|
}
|
|
4694
|
+
#closeStreamWhenIdle() {
|
|
4695
|
+
if (this.#followIdle) return;
|
|
4696
|
+
const { conversation } = this.#conversationClient;
|
|
4697
|
+
if (conversation.activeTurnId !== void 0) return;
|
|
4698
|
+
if (this.#events.length > 0 && !isSettledSessionTail(this.#events, conversation)) return;
|
|
4699
|
+
if (!Object.values(conversation.tasks).some((task) => Object.values(task.calls).some((call) => call.status === "working"))) this.#conversationClient.closeStream();
|
|
4700
|
+
}
|
|
4672
4701
|
#correlate(submissionId, response) {
|
|
4673
4702
|
const deliveryId = getMessageResponseDeliveryId(response);
|
|
4674
4703
|
const reconciled = this.#messageSubmissions.correlate(submissionId, deliveryId, this.#events);
|
|
@@ -4741,6 +4770,7 @@ function useEveAgent(options = {}) {
|
|
|
4741
4770
|
initialSession: options.initialSession,
|
|
4742
4771
|
optimistic: options.optimistic,
|
|
4743
4772
|
followSubagents: options.followSubagents,
|
|
4773
|
+
followIdle: options.followIdle,
|
|
4744
4774
|
prewarm: options.prewarm,
|
|
4745
4775
|
reducer,
|
|
4746
4776
|
session: options.session
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* module: the tree renderer stays compact while these helpers answer "what
|
|
4
4
|
* does this span carry" — inline metric chips and the `--verbose` per-span block.
|
|
5
5
|
*/
|
|
6
|
-
import type { LocalTraceSpan } from "#tracing/local
|
|
7
|
-
import { type LocalTraceSummary } from "#tracing/local
|
|
6
|
+
import type { LocalTraceSpan } from "#tracing/local/trace-reader.js";
|
|
7
|
+
import { type LocalTraceSummary } from "#tracing/local/trace-summary.js";
|
|
8
8
|
/**
|
|
9
9
|
* Compact metrics for one tree row: token chips (`↑1.4K`/`↓213`), cost
|
|
10
10
|
* (`$0.0031`). Only chips whose attributes the span actually carries — rows
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{sanitizeForTerminal}from"#cli/ui/output.js";import{formatElapsed}from"#cli/format-elapsed.js";import{formatCompactTokenCount}from"#cli/dev/tui/stream-format.js";import{formatAttributeContent}from"#cli/dev/tui/traces/trace-content.js";import{localTraceSpanCostUsd}from"#tracing/local
|
|
1
|
+
import{sanitizeForTerminal}from"#cli/ui/output.js";import{formatElapsed}from"#cli/format-elapsed.js";import{formatCompactTokenCount}from"#cli/dev/tui/stream-format.js";import{formatAttributeContent}from"#cli/dev/tui/traces/trace-content.js";import{localTraceSpanCostUsd}from"#tracing/local/trace-summary.js";function spanMetricChips(e){let t=[],n=e.attributes[`gen_ai.operation.name`],r=n===`chat`||n===`invoke_agent`?`gen_ai.usage`:`agent.usage`,i=numberAttribute(e,`${r}.input_tokens`),a=numberAttribute(e,`${r}.output_tokens`);i!==void 0&&t.push(`↑${formatCompactTokenCount(i)}`),a!==void 0&&t.push(`↓${formatCompactTokenCount(a)}`);let o=localTraceSpanCostUsd(e);return o!==void 0&&t.push(formatCostUsd(o)),t}function formatTokenSummary(e){let t=[`↑${formatCompactTokenCount(e.inputTokens)} in`,`↓${formatCompactTokenCount(e.outputTokens)} out`];return e.cacheReadTokens>0&&t.push(`${formatCompactTokenCount(e.cacheReadTokens)} cached`),e.cacheWriteTokens>0&&t.push(`${formatCompactTokenCount(e.cacheWriteTokens)} cache write`),t.join(` · `)}function formatCostUsd(e){return e>=1?`$${e.toFixed(2)}`:`$${e.toFixed(4)}`}function renderSpanDetailTree(e,t){let n=spanDetailEntries(e,t.width-t.margin.length-3),r=[];return n.forEach((e,r)=>{let i=r===n.length-1&&!t.childrenFollow;emit(e,t.margin,i?`└─ `:`├─ `)}),r;function emit(e,n,i){r.push(t.mute(`${n}${i}${e.head}`));let a=`${n}${i===`└─ `?` `:`│ `}`;for(let n of e.lines)r.push(t.mute(`${a} ${n}`));e.entries.forEach((t,n)=>{emit(t,a,n===e.entries.length-1?`└─ `:`├─ `)})}}function spanDetailEntries(e,t){let dim=e=>e,n=Math.max(40,t),r=[],push=(e,t=[],n=[])=>{r.push({entries:n,head:e,lines:t})},i=e.statusCode===2;push(`status: ${i&&e.statusMessage!==void 0?`ERROR — ${sanitizeForTerminal(e.statusMessage)}`:i?`ERROR`:`ok`}`),push(`duration: ${formatElapsed(durationMs(e.startTimeNs,e.endTimeNs))}`),push(`started: ${new Date(Number(e.startTimeNs/1000000n)).toISOString()}`),push(`span: ${e.spanId}`),e.parentSpanId!==void 0&&push(`parent: ${e.parentSpanId}`),e.scope!==void 0&&push(`scope: ${sanitizeForTerminal(e.scope)}`),e.kind!==void 0&&e.kind!==1&&push(`kind: ${spanKind(e.kind)}`);for(let t of Object.keys(e.attributes).sort()){let r=formatAttributeContent(t,e.attributes[t],dim,n-2),i=sanitizeForTerminal(t);r.length===1?push(`${i}: ${r[0]}`):push(`${i}:`,r)}return e.events.length>0&&push(`events:`,[],e.events.map(t=>{let r=Math.max(0,durationMs(e.startTimeNs,t.timeNs)),i=[];for(let e of Object.keys(t.attributes).sort()){let r=formatAttributeContent(e,t.attributes[e],dim,n-6),a=sanitizeForTerminal(e);r.length===1?i.push(`${a}: ${r[0]}`):i.push(`${a}:`,...r.map(e=>` ${e}`))}return{entries:[],head:`${sanitizeForTerminal(t.name)} +${formatElapsed(r)}`,lines:i}})),r}function spanKind(e){switch(e){case 2:return`server`;case 3:return`client`;case 4:return`producer`;case 5:return`consumer`;default:return`unknown (${e})`}}function numberAttribute(e,t){let n=e.attributes[t];if(typeof n==`number`)return n;if(typeof n==`string`&&n!==``){let e=Number(n);return Number.isFinite(e)?e:void 0}}function durationMs(e,t){return Number(t-e)/1e6}export{formatCostUsd,formatTokenSummary,renderSpanDetailTree,spanMetricChips};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{basename}from"node:path";import{createCliTheme,renderCliSection,sanitizeForTerminal}from"#cli/ui/output.js";import{formatElapsed}from"#cli/format-elapsed.js";import{summarizeLocalTrace}from"#tracing/local
|
|
1
|
+
import{basename}from"node:path";import{createCliTheme,renderCliSection,sanitizeForTerminal}from"#cli/ui/output.js";import{formatElapsed}from"#cli/format-elapsed.js";import{summarizeLocalTrace}from"#tracing/local/trace-summary.js";import{formatCostUsd,formatTokenSummary,renderSpanDetailTree,spanMetricChips}from"#cli/commands/trace-detail.js";import{compareLocalTraceSpans,describeLocalTraceSpan,listLocalTraces}from"#tracing/local/trace-reader.js";const TRACE_DISPLAY_DIRECTORY=`.eve/traces/v1`;function resolveLocalTraces(e,t){let n=t.replaceAll(`\\`,`/`),r=basename(n),i=n===r?[n]:[n,r],a=e.find(e=>i.includes(e.traceId));if(a!==void 0)return[a];let o=e.filter(e=>e.conversationIds.some(e=>i.includes(e)));if(o.length>0)return orderWindows(o);let s=e.filter(e=>i.some(t=>e.traceId.startsWith(t)||e.conversationIds.some(e=>e.startsWith(t))));if(s.length===0)throw Error(`No local trace matches "${sanitizeForTerminal(t)}". Run \`eve traces list\` to list traces.`);if(s.length===1)return s;if(new Set(s.map(e=>e.conversationId??e.traceId)).size>1)throw ambiguousTraceError(s,t);return orderWindows(s)}function orderWindows(e){return[...e].sort((e,t)=>e.startTimeNs===t.startTimeNs?e.traceId.localeCompare(t.traceId):e.startTimeNs<t.startTimeNs?-1:1)}async function runTraceListCommand(e,t,n={}){let r=await listLocalTraces(t);if(n.json===!0){e.log(JSON.stringify(r.map(e=>({agentName:e.agentName??null,durationMs:durationMs(e.startTimeNs,e.endTimeNs),conversationId:e.conversationId??null,spanCount:e.spans.length,startedAt:toDate(e.startTimeNs).toISOString(),traceId:e.traceId})),null,2));return}if(r.length===0){e.log(`No local traces found under ${TRACE_DISPLAY_DIRECTORY}.`);return}let i=r.map(e=>[e.traceId,sanitizeForTerminal(e.conversationId??`unknown`),sanitizeForTerminal(e.agentName??`unknown`),toDate(e.startTimeNs).toISOString(),formatElapsed(durationMs(e.startTimeNs,e.endTimeNs)),String(e.spans.length)]),a=[`TRACE`,`CONVERSATION`,`AGENT`,`STARTED`,`DURATION`,`SPANS`],o=a.map((e,t)=>Math.max(e.length,...i.map(e=>e[t].length)));e.log([a,...i].map(e=>e.map((e,t)=>e.padEnd(o[t])).join(` `).trimEnd()).join(`
|
|
2
2
|
`))}async function runTraceShowCommand(e,t,n,r={}){let i=await listLocalTraces(t);if(i.length===0){let t=`No local traces found under ${TRACE_DISPLAY_DIRECTORY}.`;if(n!==void 0)throw Error(t);e.log(t);return}let a=n===void 0?[i[0]]:resolveLocalTraces(i,n);if(r.json===!0){e.log(JSON.stringify(a.map(serializeTraceForJson),null,2));return}let o=createCliTheme();e.log(a.map(e=>[renderCliSection(o,{rows:traceHeaderRows(e),title:`Trace`}),`${o.accent(`Spans`)}\n${renderSpanTree(e.spans,{dim:o.muted,verbose:r.verbose===!0})}`].join(`
|
|
3
3
|
|
|
4
4
|
`)).join(`
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* latency waterfall. Activation and tool spans provide the user and tool
|
|
5
5
|
* cards directly; model response spans provide assistant cards.
|
|
6
6
|
*/
|
|
7
|
-
import type { LocalTrace, LocalTraceSpan } from "#tracing/local
|
|
7
|
+
import type { LocalTrace, LocalTraceSpan } from "#tracing/local/trace-reader.js";
|
|
8
8
|
import type { Theme } from "../theme.js";
|
|
9
9
|
import type { TraceViewerSurfaces } from "./trace-surfaces.js";
|
|
10
10
|
export interface ConversationItem {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{formatCompactTokenCount}from"../stream-format.js";import{formatPayloadContent,wrapPlainText}from"./trace-content.js";import{SURFACE_CLOSE}from"./trace-surfaces.js";import{formatElapsed}from"#cli/format-elapsed.js";import{clipVisible,stripTerminalControls,visibleLength}from"#cli/ui/terminal-text.js";import{localTraceSpanCostUsd}from"#tracing/local
|
|
1
|
+
import{formatCompactTokenCount}from"../stream-format.js";import{formatPayloadContent,wrapPlainText}from"./trace-content.js";import{SURFACE_CLOSE}from"./trace-surfaces.js";import{formatElapsed}from"#cli/format-elapsed.js";import{clipVisible,stripTerminalControls,visibleLength}from"#cli/ui/terminal-text.js";import{localTraceSpanCostUsd}from"#tracing/local/trace-summary.js";import{formatCostUsd}from"#cli/commands/trace-detail.js";import{compareLocalTraceSpans,isAgentTurnSpan}from"#tracing/local/trace-reader.js";import{agentTurnIdentity}from"#tracing/local/inspection.js";import{traceStringAttribute}from"#tracing/local/trace-operations.js";function buildConversationItems(e){let t=new Map(e.spans.map(e=>[e.spanId,e])),n=new Map;for(let r of e.spans){if(!isAgentTurnSpan(r))continue;let e=agentTurnIdentity(r),i=turnSubagent(r,t);e!==void 0&&i!==void 0&&n.set(e,i)}let r=[],i;for(let t of[...e.spans].sort(compareLocalTraceSpans)){let e=isModelSpan(t)?systemInstructionsText(t.attributes):void 0;if(e!==void 0){i={span:t,text:e};break}}i!==void 0&&r.push({item:{kind:`system`,durationMs:0,error:!1,span:i.span,subagent:subagentFor(i.span,n,t),text:i.text},order:0n});for(let i of e.spans){let e=subagentFor(i,n,t),a=stringAttribute(i,`agent.channel.delivery.input`);if(a!==void 0){let t=deliveryText(a);if(t===void 0)continue;r.push({item:{kind:`user`,durationMs:0,error:!1,span:i,subagent:e,text:t},order:i.startTimeNs});continue}if(isModelSpan(i)){let n=stringAttribute(i,`ai.response.text`),a=stringAttribute(i,`ai.response.reasoning`),o=numberAttribute(i,`gen_ai.usage.input_tokens`),s=numberAttribute(i,`gen_ai.usage.output_tokens`),c=o!==void 0||s!==void 0,l=i.attributes[`ai.response.tool_calls`]!==void 0;if((n===void 0||n.trim().length===0)&&(a===void 0||a.trim().length===0)&&!c&&!l&&i.statusCode!==2)continue;r.push({item:{kind:`assistant`,costUsd:stepCostUsd(i,t),durationMs:spanDurationMs(i),error:i.statusCode===2,inputTokens:o,model:stringAttribute(i,`gen_ai.request.model`),outputTokens:s,reasoning:a,span:i,subagent:e,text:n,toolCallNames:l?parseToolCallNames(stringAttribute(i,`ai.response.tool_calls`)):void 0},order:i.startTimeNs});for(let t of parseProviderToolResults(stringAttribute(i,`ai.response.tool_results`)))r.push({item:{kind:`tool`,args:t.args,durationMs:0,error:t.error,name:stripTerminalControls(t.name),result:t.result,span:i,subagent:e},order:i.startTimeNs});continue}(i.attributes[`gen_ai.operation.name`]===`execute_tool`||i.name===`agent.action`)&&r.push({item:{kind:`tool`,args:stringAttribute(i,`gen_ai.tool.call.arguments`),durationMs:spanDurationMs(i),error:i.statusCode===2,name:stripTerminalControls(stringAttribute(i,`gen_ai.tool.name`)??stringAttribute(i,`agent.action.name`)??`tool`),result:unwrapJsonString(stringAttribute(i,`gen_ai.tool.call.result`)),span:i,subagent:e},order:i.startTimeNs})}return r.sort((e,t)=>e.order===t.order?0:e.order<t.order?-1:1).map(e=>e.item)}function systemInstructionsText(e){let t=e[`gen_ai.system_instructions`];if(typeof t==`string`)try{let e=JSON.parse(t);if(!Array.isArray(e))return;let n=e.flatMap(e=>typeof e!=`object`||!e||!(`type`in e)||e.type!==`text`||!(`content`in e)||typeof e.content!=`string`?[]:[e.content]).join(`
|
|
2
2
|
|
|
3
3
|
`);return n.length>0?n:void 0}catch{return}}function subagentFor(e,t,n){let r=e;for(;r!==void 0;){let e=agentTurnIdentity(r);if(e!==void 0)return t.get(e);r=r.parentSpanId===void 0?void 0:n.get(r.parentSpanId)}}function turnSubagent(e,t){let n=stringAttribute(e,`agent.subagent.name`);if(n!==void 0){let t=n??stringAttribute(e,`gen_ai.agent.name`);return{name:t===void 0?void 0:stripTerminalControls(t)}}let r=e.parentSpanId===void 0?void 0:t.get(e.parentSpanId);if(r===void 0)return;let i=stringAttribute(r,`agent.action.kind`);if(i!==`subagent-call`&&i!==`remote-agent-call`)return;let a=stringAttribute(r,`agent.turn.id`);if(a===void 0)return;let o=stringAttribute(r,`agent.action.name`);return{name:o===void 0?void 0:stripTerminalControls(o),parentCallId:traceStringAttribute(r,`gen_ai.tool.call.id`),parentTurnId:a}}function renderConversationItem(e,t,n,r,i,a){let{colors:o,glyph:s}=n,c=Math.max(8,t-8),l=conversationItemExpandable(e,t),u=n.color?a:void 0,d=u?.primaryText??o.white,f,p,m=[];if(e.kind===`tool`){let t=o.bold(d(e.name??`tool`));f=`${foldMarker(i,l,n)}${t}`,p=e.durationMs>0?o.dim(formatElapsed(e.durationMs)):``;let r=e.args===void 0?[]:formatPayloadContent(e.args,c),a=e.result===void 0?[]:formatPayloadContent(e.result,c),s=i?r:capLines(r,c),u=i?a:capLines(a,c);s.length>0&&m.push(``,o.dim(`Input:`),``,...s),u.length>0&&m.push(``,o.dim(`Output:`),``,...u)}else if(e.kind===`system`){f=`${foldMarker(i,l,n)}${o.bold(d(`system`))}`,p=o.dim(`~${formatCompactTokenCount(estimateTokens(e.text??``))} tokens`);let t=wrapPlainText(e.text??``,c);m.push(...i?t:capLines(t,c))}else if(e.kind===`assistant`){f=`${foldMarker(i,l,n)}${o.bold(d(`assistant`))}${e.model===void 0?``:o.dim(` · ${stripTerminalControls(e.model)}`)}`,p=assistantMetrics(e,s,o);let t=e.reasoning===void 0||e.reasoning.trim().length===0?[]:wrapPlainText(e.reasoning,c),r=e.text===void 0||e.text.trim().length===0?[]:wrapPlainText(e.text,c),a=(i?t:capLines(t,c)).map(e=>o.dim(e)),u=i?r:capLines(r,c);if(a.length>0&&(m.push(o.dim(`Thought:`),``,...a),u.length>0&&m.push(``)),m.push(...u),(e.text===void 0||e.text.trim().length===0)&&e.toolCallNames!==void 0&&e.toolCallNames.length>0){a.length>0&&m.push(``);for(let t of e.toolCallNames)m.push(o.dim(`→ ${t}`))}}else{let t=e.kind===`user`&&e.subagent!==void 0?`task`:e.kind;f=`${foldMarker(i,l,n)}${o.bold(d(t))}`,p=``;let r=e.text===void 0||e.text.trim().length===0?[]:wrapPlainText(e.text,c);m.push(...i?r:capLines(r,c))}if(e.subagent!==void 0){let t=e.subagent.name===void 0?`subagent`:`subagent:${e.subagent.name}`;f+=o.dim(` · ${t}`)}e.error&&(f+=` ${o.red(s.error)}`),!i&&l?m.push(`…`,``,o.dim(`Click to expand`)):i&&l&&m.push(``,o.dim(`Click to collapse`));let h=u===void 0?void 0:e.error?u.errorHeader:u.header,g=u===void 0?void 0:e.error?u.errorBody:u.body,_=railCell(n,r,e.error,u);return[cardRow(``,t,n,_,h),cardSplitRow(f,p,t,n,_,h),cardRow(``,t,n,_,h),cardRow(``,t,n,_,g),...m.map(e=>cardRow(e,t,n,_,g)),cardRow(``,t,n,_,g)]}function cardRow(e,t,n,r,i){let a=clipVisible(e,Math.max(1,t-8)),o=` `.repeat(Math.max(0,t-8-visibleLength(a)));return i===void 0||!n.color?` ${r} ${a}${o} `:` ${r}${i} ${a.replaceAll(`\x1B[0m`,`\x1b[0m${i}`)}\x1b[0m${i}${o} ${SURFACE_CLOSE} `}function railCell(e,t,n,r){let{colors:i,glyph:a}=e;if(t){let t=e.unicode?`▌`:a.rule;return r===void 0?i.white(t):r.primaryText(t)}return r===void 0?n?i.red(a.rule):i.dim(a.rule):` `}function cardSplitRow(e,t,n,r,i,a){if(visibleLength(t)===0)return cardRow(e,n,r,i,a);let o=Math.max(1,n-8),s=visibleLength(t),c=Math.max(1,o-s-2),l=clipVisible(e,c);return cardRow(`${l}${` `.repeat(Math.max(2,o-visibleLength(l)-s))}${t}`,n,r,i,a)}function assistantMetrics(e,t,n){let r=[];return e.durationMs>0&&r.push(formatElapsed(e.durationMs)),e.inputTokens!==void 0&&r.push(`${t.arrowUp}${formatCompactTokenCount(e.inputTokens)}`),e.outputTokens!==void 0&&r.push(`${t.arrowDown}${formatCompactTokenCount(e.outputTokens)}`),e.costUsd!==void 0&&r.push(formatCostUsd(e.costUsd)),r.length===0?``:n.dim(r.join(` · `))}function stepCostUsd(e,t){let n=e;for(;n.parentSpanId!==void 0;){if(n=t.get(n.parentSpanId),n===void 0)return;if(n.name===`agent.step`)return localTraceSpanCostUsd(n)}}function foldMarker(e,t,n){return e?`${n.colors.dim(`▾`)} `:t?`${n.colors.dim(`▸`)} `:``}function capLines(e,t){return e.length<=3?[...e]:[...e.slice(0,2),clipVisible(e[2],Math.max(1,t))]}function conversationItemLineCount(e,t,n,r){return renderConversationItem(e,t,n,!1,r).length}function conversationItemExpandable(e,t){let n=Math.max(8,t-8);if(e.kind===`tool`){let t=e.args===void 0?0:formatPayloadContent(e.args,n-2).length,r=e.result===void 0?0:formatPayloadContent(e.result,n-2).length;return t>3||r>3}if(e.kind===`system`)return wrapPlainText(e.text??``,n).length>3;if(e.kind===`user`)return(e.text===void 0||e.text.trim().length===0?0:wrapPlainText(e.text,n).length)>3;let r=e.reasoning===void 0||e.reasoning.trim().length===0?0:wrapPlainText(e.reasoning,n).length,i=e.text===void 0||e.text.trim().length===0?0:wrapPlainText(e.text,n).length;return r>3||i>3}function estimateTokens(e){return Math.ceil(e.length/4)}function deliveryText(e){if(e!==void 0)try{let t=JSON.parse(e);return isRecord(t)&&typeof t.message==`string`?t.message:void 0}catch{return e}}function unwrapJsonString(e){if(e!==void 0)try{let t=JSON.parse(e);return typeof t==`string`?t:e}catch{return e}}function isModelSpan(e){return e.name.startsWith(`ai.`)&&e.name.includes(`do`)||e.attributes[`gen_ai.operation.name`]===`chat`}function parseToolCallNames(e){if(e!==void 0)try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>isRecord(e)&&typeof e.toolName==`string`).map(e=>e.toolName):void 0}catch{return}}function parseProviderToolResults(e){if(e===void 0)return[];try{let t=JSON.parse(e);if(!Array.isArray(t))return[];let asText=e=>typeof e==`string`?e:e===void 0?void 0:JSON.stringify(e);return t.filter(isRecord).map(e=>{let t=`error`in e;return{args:asText(e.input),error:t,name:typeof e.toolName==`string`?e.toolName:`tool`,result:asText(t?e.error:e.output)}})}catch{return[]}}function stringAttribute(e,t){let n=e.attributes[t];return typeof n==`string`?n:void 0}function numberAttribute(e,t){let n=e.attributes[t];return typeof n==`number`?n:void 0}function spanDurationMs(e){return Math.max(0,Number(e.endTimeNs-e.startTimeNs)/1e6)}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{buildConversationItems,conversationItemExpandable,conversationItemLineCount,renderConversationItem};
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* files that appeared since the last poll. Listing stats directories instead
|
|
7
7
|
* of parsing spans, keeping a 1s poll cheap even with a large spool.
|
|
8
8
|
*/
|
|
9
|
-
import type { LocalTrace } from "#tracing/local
|
|
9
|
+
import type { LocalTrace } from "#tracing/local/trace-reader.js";
|
|
10
10
|
export interface TraceStoreEntry {
|
|
11
11
|
readonly traceId: string;
|
|
12
12
|
/** Mtime of the trace's segments directory — the instant it last received a span. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{assembleLocalTrace,listLocalTraceIds,listLocalTraceSegments,readLocalTraceActivityMs,readLocalTraceSegment}from"#tracing/local
|
|
1
|
+
import{assembleLocalTrace,listLocalTraceIds,listLocalTraceSegments,readLocalTraceActivityMs,readLocalTraceSegment}from"#tracing/local/trace-reader.js";function createTraceStore(e){let t=new Map;return{async list(){let t=[];for(let n of await listLocalTraceIds(e.appRoot)){let r=await readLocalTraceActivityMs(e.appRoot,n);r!==void 0&&t.push({traceId:n,lastActivityMs:r})}return t.sort((e,t)=>t.lastActivityMs===e.lastActivityMs?e.traceId.localeCompare(t.traceId):t.lastActivityMs-e.lastActivityMs)},async read(n){let r=await listLocalTraceSegments(e.appRoot,n);if(r===void 0){t.delete(n);return}let i=t.get(n);i===void 0&&(i={seen:new Set,spans:new Map},t.set(n,i));let a=!1;for(let t of r)if(!i.seen.has(t)){i.seen.add(t);for(let r of await readLocalTraceSegment(e.appRoot,n,t))i.spans.has(r.spanId)||(i.spans.set(r.spanId,r),a=!0)}if(i.spans.size!==0)return(a||i.assembled===void 0)&&(i.assembled=assembleLocalTrace(n,[...i.spans.values()])),i.assembled}}}export{createTraceStore};
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* footer (key hints + position/notice). Every row is clipped to the
|
|
6
6
|
* terminal width so the alt-screen painter can write rows verbatim.
|
|
7
7
|
*/
|
|
8
|
-
import type { LocalTraceSpan } from "#tracing/local
|
|
8
|
+
import type { LocalTraceSpan } from "#tracing/local/trace-reader.js";
|
|
9
9
|
import type { Theme } from "../theme.js";
|
|
10
10
|
import type { TraceViewerSurfaces } from "./trace-surfaces.js";
|
|
11
11
|
import type { TextSelectionRange, TraceViewerState } from "./trace-viewer-state.js";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{formatAttributeContent}from"./trace-content.js";import{renderConversationItem}from"./trace-conversation.js";import{orderedTextSelection,selectedTraceViewerSpan}from"./trace-viewer-state.js";import{formatElapsed}from"#cli/format-elapsed.js";import{clipVisible,sliceVisible,stripAnsi,stripTerminalControls,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";import{describeLocalTraceSpan}from"#tracing/local
|
|
1
|
+
import{formatAttributeContent}from"./trace-content.js";import{renderConversationItem}from"./trace-conversation.js";import{orderedTextSelection,selectedTraceViewerSpan}from"./trace-viewer-state.js";import{formatElapsed}from"#cli/format-elapsed.js";import{clipVisible,sliceVisible,stripAnsi,stripTerminalControls,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";import{describeLocalTraceSpan}from"#tracing/local/trace-reader.js";function renderTraceViewer(e,t){let{width:n,height:r,theme:i}=t,a=chromeStyles(i,t.surfaces),o=Math.max(1,r-3-3),s=e.panelOpen?panelWidthFor(n):0,c=Math.max(20,n-(s===0?0:s+1)),l=panelDetailLines(e,s,i,t.surfaces),u=o,d=[];if(d.push(...renderHeader(e,t)),e.traces.length===0)d.push(...renderEmptyState(t,i,o));else if(e.trace===void 0)d.push(...center(o,a.muted(`Loading trace…`)));else{let r=renderConversation(e,t,c,o);for(let t=0;t<o;t+=1){let i=r[t]??``;if(s===0){d.push(i);continue}let a=l[e.panelScroll+t]??``;e.textSelection!==void 0&&e.textSelection.region===`panel`&&(a=highlightSelection(a,e.panelScroll+t,e.textSelection,s)),d.push(joinPanels(i,c,a,n))}}return d.push(...renderFooter(e,n,i,t.surfaces)),t.toast!==void 0&&overlayToast(d,t.toast,n,i,t.surfaces),{rows:d,panelTotalRows:l.length,timelineViewportRows:o,panelViewportRows:u,contentWidth:c}}function chromeStyles(e,t){let n=e.color?t:void 0;return{muted:n?.mutedText??e.colors.dim,primary:n?.primaryText??(e=>e)}}function overlayToast(e,t,n,r,i){let a=` ${stripTerminalControls(t)} `,o=visibleLength(a),s=r.unicode?`▌`:r.glyph.rule,c=r.color?i:void 0,l=c===void 0?``:c.body,u=c?.primaryText??r.colors.white,d=r.color?`\x1B[0m`:``,f=[`${l}${u(s)}${` `.repeat(o)}${d}`,`${l}${u(s)}${u(a)}${d}`,`${l}${u(s)}${` `.repeat(o)}${d}`];for(let[t,r]of f.entries()){let i=2+t;if(i>=e.length)break;e[i]=overlayRight(e[i],r,n,1)}}function overlayRight(e,t,n,r){let i=Math.max(0,n-r-visibleLength(t)),a=visibleLength(e),o=a<i?e+` `.repeat(i-a):e;return`${sliceVisible(o,i)}\x1b[0m${t}`}const CONVERSATION_CONTENT_KEYS=new Set([`gen_ai.input.messages`,`gen_ai.system_instructions`,`ai.response.reasoning`,`ai.response.text`,`ai.response.tool_calls`,`ai.response.tool_results`,`gen_ai.tool.call.arguments`,`gen_ai.tool.call.result`]);function renderSpanDetail(e,t,n,r){let{colors:i}=n,{muted:a,primary:o}=chromeStyles(n,r?.surfaces),s=[],c=stripTerminalControls(e.name);s.push(...wrapVisibleLine(i.bold(o(c)),t));let l=describeLocalTraceSpan(e).map(stripTerminalControls);l.length>0&&s.push(a(l.join(`, `))),s.push(``);let fact=(e,t)=>`${a(e.padEnd(10))}${t}`,u=e.statusCode===2;s.push(fact(`status`,u?i.red(`ERROR`):i.green(`ok`))),s.push(fact(`duration`,formatElapsed(durationMs(e.startTimeNs,e.endTimeNs)))),s.push(fact(`started`,clockTime(e.startTimeNs))),s.push(fact(`span`,e.spanId)),e.parentSpanId!==void 0&&s.push(fact(`parent`,e.parentSpanId)),e.scope!==void 0&&s.push(fact(`scope`,stripTerminalControls(e.scope))),s.push(``);let d=Object.keys(e.attributes).filter(e=>r?.excludeKeys?.has(e)!==!0).sort();if(d.length===0)s.push(a(`no attributes`));else{s.push(a(`attributes (${d.length})`));for(let n of d){let r=formatAttributeContent(n,e.attributes[n],i.dim,t-2),o=stripTerminalControls(n);if(r.length===1)s.push(...wrapVisibleLine(`${a(o)} ${r[0]}`,t));else{s.push(a(o));for(let e of r)s.push(` ${e}`)}}}return s.map(e=>clipVisible(e,t))}function renderHeader(e,t){let{theme:n,width:r}=t,{colors:i,glyph:a}=n,{muted:o,primary:s}=chromeStyles(n,t.surfaces),c=[];if(e.trace?.agentName!==void 0&&c.push(stripTerminalControls(e.trace.agentName)),e.trace?.conversationId!==void 0&&c.push(`conversation ${stripTerminalControls(e.trace.conversationId)}`),e.trace!==void 0){let n=t.activeWindowEndNs!==void 0&&t.activeWindowEndNs>e.trace.endTimeNs?t.activeWindowEndNs:e.trace.endTimeNs;c.push(clockTime(e.trace.startTimeNs),`${e.trace.spans.length} span${e.trace.spans.length===1?``:`s`}`,formatElapsed(durationMs(e.trace.startTimeNs,n)))}let l=`${i.bold(s(`${a.brand} traces`))}${c.length===0?``:o(` · ${c.join(` · `)}`)}`,u=e.traces.length===0?``:o(`[${e.traceIndex+1}/${e.traces.length}]`),d=[t.activeWindowEndNs===void 0?``:i.green(`● live`),u].filter(e=>e.length>0).join(` `),f=joinRight(` ${clipVisible(l,Math.max(0,r-visibleLength(d)-2))}`,d,r);return[``,clipVisible(f,r),``]}function renderConversation(e,t,n,r){let{theme:i}=t;if(e.conversationItems.length===0)return[chromeStyles(i,t.surfaces).muted(` No conversation content in this trace; its export policy may have redacted it.`)];let a=conversationLines(e,n,i,t.surfaces).slice(e.scrollRow,e.scrollRow+r);return e.textSelection===void 0||e.textSelection.region!==`conversation`?a:a.map((t,r)=>highlightSelection(t,e.scrollRow+r,e.textSelection,n))}function conversationLines(e,t,n,r){let i=[];for(let a=0;a<e.conversationItems.length;a+=1)i.push(...renderConversationItem(e.conversationItems[a],t,n,a===e.selectedRow,e.expandedItems.has(a),r),``);return i}function panelDetailLines(e,t,n,r){let i=selectedTraceViewerSpan(e);return!e.panelOpen||t<=0||i===void 0?[]:[``,...renderSpanDetail(i,Math.max(16,t-3),n,{excludeKeys:CONVERSATION_CONTENT_KEYS,surfaces:r}).map(e=>` ${e}`)]}function conversationSelectionText(e,t,n,r,i){return selectionText(conversationLines(e,t,n,i),r)}function panelSelectionText(e,t,n,r){return selectionText(panelDetailLines(e,e.panelOpen?panelWidthFor(t):0,n),r)}function selectionText(e,t){let{start:n,end:r}=orderedTextSelection(t),i=[];for(let t=Math.max(0,n.line);t<=r.line&&t<e.length;t+=1){let a=stripAnsi(e[t]),o=t===n.line?n.column:0,s=t===r.line?r.column+1:1/0,c=s===1/0?a:sliceVisible(a,s),l=sliceVisible(a,o).length;i.push(c.slice(l).trimEnd())}return i.join(`
|
|
2
2
|
`)}function highlightSelection(e,t,n,r){let{start:i,end:a}=orderedTextSelection(n);if(t<i.line||t>a.line)return e;let o=t===i.line?i.column:0,s=t===a.line?a.column+1:r,c=visibleLength(e),l=c<s?e+` `.repeat(s-c):e,u=sliceVisible(l,o),d=sliceVisible(l,s),f=d.slice(u.length),p=l.slice(d.length);return f.length===0?e:`${u}\x1b[7m${f.replaceAll(`\x1B[0m`,`\x1B[0m\x1B[7m`)}\x1b[27m${p}`}function renderFooter(e,t,n,r){let{colors:i}=n,{muted:a}=chromeStyles(n,r),[o,s]=n.unicode?[`↑↓`,`←→`]:[`^/v`,`</>`],c=e.panelFocus?`${o} scroll · tab cards · esc back`:`${o} select · ${s} expand · enter attrs · tab focus · [ ] traces · q close`,l=e.conversationItems.length,u=l===0?``:a(`item ${e.selectedRow+1}/${l}`),d=[e.notice===void 0?``:i.yellow(e.notice),u].filter(e=>e.length>0).join(a(` · `));return[``,clipVisible(` ${a(c)}`,t),clipVisible(d.length===0?``:` ${d}`,t)]}function renderEmptyState(e,t,n){let{muted:r,primary:i}=chromeStyles(t,e.surfaces),[a,o]=e.tracingDisabled===!0?[`Tracing is disabled (EVE_TRACES=off).`,`Re-enable it and spans stream in live.`]:[`No local traces yet.`,`Chat with your agent — spans stream in live.`];return center(n,t.colors.bold(i(a)),r(o))}function center(e,...t){let n=Array.from({length:e},()=>``),r=Math.max(0,Math.floor(e/2)-1);return t.forEach((t,i)=>{r+i<e&&(n[r+i]=t)}),n}function joinPanels(e,t,n,r){let i=Math.max(0,r-t-1);return`${padTo(e,t)} ${clipVisible(n,i)}`}function joinRight(e,t,n){if(t.length===0)return e;let r=Math.max(1,n-visibleLength(e)-visibleLength(t));return`${e}${` `.repeat(r)}${t}`}function padTo(e,t){let n=visibleLength(e);return n>=t?clipVisible(e,t):e+` `.repeat(t-n)}function panelWidthFor(e){return e<42?0:Math.min(64,Math.max(20,Math.floor(e*.42)),e-20-1)}function durationMs(e,t){return Math.max(0,Number(t-e)/1e6)}function clockTime(e){let t=new Date(Number(e/1000000n)),pad=(e,t=2)=>String(e).padStart(t,`0`);return`${pad(t.getHours())}:${pad(t.getMinutes())}:${pad(t.getSeconds())}.${pad(t.getMilliseconds(),3)}`}export{conversationSelectionText,panelSelectionText,renderSpanDetail,renderTraceViewer};
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* {@link applyLoadedTrace} so a live trace can grow underneath an open
|
|
7
7
|
* viewer without losing the user's selection.
|
|
8
8
|
*/
|
|
9
|
-
import type { LocalTrace, LocalTraceSpan } from "#tracing/local
|
|
9
|
+
import type { LocalTrace, LocalTraceSpan } from "#tracing/local/trace-reader.js";
|
|
10
10
|
import type { ConversationItem } from "#cli/dev/tui/traces/trace-conversation.js";
|
|
11
11
|
import type { TraceStoreEntry } from "#cli/dev/tui/traces/trace-store.js";
|
|
12
12
|
import type { TerminalKey } from "#cli/dev/tui/stream-format.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function throwIfAborted(e){if(e===void 0)return;let t=e.throwIfAborted;if(typeof t==`function`){t.call(e);return}if(!e.aborted)return;if(e.reason!==void 0)throw e.reason;let n=Error(`The operation was aborted.`);throw n.name=`AbortError`,n}export{throwIfAborted};
|