@percena/weft 0.4.0-next.7 → 0.4.0-next.9

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/dist/index.d.cts CHANGED
@@ -3124,13 +3124,13 @@ interface TimelineStream {
3124
3124
  }
3125
3125
 
3126
3126
  /**
3127
- * FlitroHttpClient
3127
+ * WeftHttpClient
3128
3128
  *
3129
- * Typed HTTP client for the Flitro Go Agent Server REST API.
3130
- * All methods map 1-to-1 with Flitro's HTTP endpoints.
3129
+ * Typed HTTP client for the Weft Server REST API.
3130
+ * All methods map 1-to-1 with the server's HTTP endpoints.
3131
3131
  */
3132
- interface FlitroClientOptions {
3133
- /** Base URL of the Flitro server, e.g. http://localhost:8080 */
3132
+ interface WeftHttpClientOptions {
3133
+ /** Base URL of the Weft server, e.g. http://localhost:8080 */
3134
3134
  baseUrl: string;
3135
3135
  /** Optional bearer token for API-key auth */
3136
3136
  apiKey?: string;
@@ -3139,7 +3139,7 @@ interface FlitroClientOptions {
3139
3139
  /** Optional timeout in milliseconds (default: 30000) */
3140
3140
  timeout?: number;
3141
3141
  /**
3142
- * Scoped embed session token minted by the host backend via Flitro's
3142
+ * Scoped embed session token minted by the host backend via
3143
3143
  * `POST /v1/embed/sessions`. Sent as the Authorization bearer; the token
3144
3144
  * already carries tenant and session scope, so apiKey/tenantId are not
3145
3145
  * needed (and are ignored) when it is set.
@@ -3152,7 +3152,7 @@ interface FlitroClientOptions {
3152
3152
  */
3153
3153
  onTokenExpired?: () => Promise<string | undefined> | string | undefined;
3154
3154
  }
3155
- interface FlitroSession {
3155
+ interface WeftSession {
3156
3156
  session_id: string;
3157
3157
  tenant_id: string;
3158
3158
  app_id?: string;
@@ -3172,7 +3172,7 @@ interface FlitroSession {
3172
3172
  created_at: string;
3173
3173
  updated_at: string;
3174
3174
  }
3175
- interface FlitroRun {
3175
+ interface WeftRun {
3176
3176
  run_id: string;
3177
3177
  session_id: string;
3178
3178
  tenant_id?: string;
@@ -3198,7 +3198,7 @@ interface FlitroRun {
3198
3198
  created_at: string;
3199
3199
  updated_at: string;
3200
3200
  }
3201
- interface FlitroCapabilityReport {
3201
+ interface WeftCapabilityReport {
3202
3202
  provider: string;
3203
3203
  runtimeKind: string;
3204
3204
  selected: string;
@@ -3219,25 +3219,25 @@ interface FlitroCapabilityReport {
3219
3219
  automationCapabilities: Record<string, unknown>;
3220
3220
  hostToolCapabilities: Record<string, unknown>;
3221
3221
  }
3222
- interface FlitroPatchSessionOptions {
3222
+ interface WeftPatchSessionOptions {
3223
3223
  title?: string;
3224
3224
  status?: string;
3225
3225
  labels?: string[];
3226
3226
  flagged?: boolean;
3227
3227
  topic?: string;
3228
3228
  }
3229
- interface FlitroModelInfo {
3229
+ interface WeftModelInfo {
3230
3230
  id: string;
3231
3231
  provider: string;
3232
3232
  display_name?: string;
3233
3233
  aliases?: string[];
3234
3234
  capabilities: Record<string, unknown>;
3235
3235
  }
3236
- interface FlitroModelListResult {
3237
- models: FlitroModelInfo[];
3236
+ interface WeftModelListResult {
3237
+ models: WeftModelInfo[];
3238
3238
  default?: string;
3239
3239
  }
3240
- interface FlitroTimelineItem {
3240
+ interface WeftTimelineItem {
3241
3241
  sessionId: string;
3242
3242
  provider: string;
3243
3243
  seq: number;
@@ -3245,28 +3245,30 @@ interface FlitroTimelineItem {
3245
3245
  timestamp: number;
3246
3246
  item: Record<string, unknown>;
3247
3247
  }
3248
- interface FlitroTimelineFetchResult {
3249
- items: FlitroTimelineItem[];
3248
+ interface WeftTimelineFetchResult {
3249
+ items: WeftTimelineItem[];
3250
3250
  nextCursor: {
3251
3251
  epoch: string;
3252
3252
  afterSeq: number;
3253
3253
  };
3254
3254
  hasGap: boolean;
3255
3255
  }
3256
- declare class FlitroHttpClient {
3256
+ declare class WeftHttpClient {
3257
3257
  private readonly baseUrl;
3258
3258
  private readonly timeout;
3259
3259
  private readonly apiKey;
3260
3260
  private readonly tenantId;
3261
3261
  private readonly onTokenExpired?;
3262
3262
  private token;
3263
- constructor(options: FlitroClientOptions);
3263
+ private readonly embedMode;
3264
+ constructor(options: WeftHttpClientOptions);
3265
+ private sessionPath;
3264
3266
  /** Current Authorization bearer (scoped token wins over apiKey). */
3265
3267
  getBearerToken(): string;
3266
3268
  /** Replace the scoped token (e.g. after a host-backend refresh). */
3267
3269
  setToken(token: string): void;
3268
3270
  private buildHeaders;
3269
- preflight(): Promise<FlitroCapabilityReport>;
3271
+ preflight(): Promise<WeftCapabilityReport>;
3270
3272
  health(): Promise<{
3271
3273
  status: string;
3272
3274
  }>;
@@ -3275,8 +3277,8 @@ declare class FlitroHttpClient {
3275
3277
  model?: string;
3276
3278
  skillNames?: string[];
3277
3279
  mcpServerNames?: string[];
3278
- }): Promise<FlitroSession>;
3279
- getSession(sessionId: string): Promise<FlitroSession>;
3280
+ }): Promise<WeftSession>;
3281
+ getSession(sessionId: string): Promise<WeftSession>;
3280
3282
  sendMessage(sessionId: string, message: string, options?: {
3281
3283
  model?: string;
3282
3284
  skillNames?: string[];
@@ -3290,7 +3292,7 @@ declare class FlitroHttpClient {
3290
3292
  maxTokens?: number;
3291
3293
  maxWallTimeSec?: number;
3292
3294
  };
3293
- }): Promise<FlitroRun>;
3295
+ }): Promise<WeftRun>;
3294
3296
  cancelRun(runId: string): Promise<{
3295
3297
  status: string;
3296
3298
  }>;
@@ -3306,9 +3308,9 @@ declare class FlitroHttpClient {
3306
3308
  type: string;
3307
3309
  requestId: string;
3308
3310
  }>;
3309
- patchSession(sessionId: string, patch: FlitroPatchSessionOptions): Promise<FlitroSession>;
3310
- listModels(): Promise<FlitroModelListResult>;
3311
- fetchTimeline(sessionId: string, afterSeq?: number, limit?: number): Promise<FlitroTimelineFetchResult>;
3311
+ patchSession(sessionId: string, patch: WeftPatchSessionOptions): Promise<WeftSession>;
3312
+ listModels(): Promise<WeftModelListResult>;
3313
+ fetchTimeline(sessionId: string, afterSeq?: number, limit?: number): Promise<WeftTimelineFetchResult>;
3312
3314
  /** Returns the SSE stream URL for a session's canonical timeline. */
3313
3315
  sessionTimelineUrl(sessionId: string): string;
3314
3316
  private get;
@@ -3318,13 +3320,13 @@ declare class FlitroHttpClient {
3318
3320
  }
3319
3321
 
3320
3322
  /**
3321
- * FlitroSseTimelineStream
3323
+ * WeftSseTimelineStream
3322
3324
  *
3323
- * Consumes Flitro's session-scoped SSE timeline endpoint and exposes it as
3324
- * a Weft TimelineStream. Handles reconnection with cursor tracking.
3325
+ * Consumes the session-scoped SSE timeline endpoint and exposes it as
3326
+ * a Weft TimelineStream. Handles reconnection with cursor tracking.
3325
3327
  */
3326
3328
 
3327
- interface FlitroSseTimelineStreamOptions {
3329
+ interface WeftSseTimelineStreamOptions {
3328
3330
  /** Full URL to the session timeline SSE endpoint */
3329
3331
  url: string;
3330
3332
  /** Optional bearer token */
@@ -3349,7 +3351,7 @@ interface FlitroSseTimelineStreamOptions {
3349
3351
  */
3350
3352
  onTokenExpired?: () => Promise<string | undefined> | string | undefined;
3351
3353
  }
3352
- declare class FlitroSseTimelineStream implements TimelineStream {
3354
+ declare class WeftSseTimelineStream implements TimelineStream {
3353
3355
  private listeners;
3354
3356
  private eventSource;
3355
3357
  private disposed;
@@ -3357,7 +3359,7 @@ declare class FlitroSseTimelineStream implements TimelineStream {
3357
3359
  private afterSeq;
3358
3360
  private readonly getBearerToken?;
3359
3361
  private readonly options;
3360
- constructor(options: FlitroSseTimelineStreamOptions);
3362
+ constructor(options: WeftSseTimelineStreamOptions);
3361
3363
  connect(onEvent: (event: TimelineEnvelope) => void, onError?: (error: Error) => void, onClose?: () => void): void;
3362
3364
  disconnect(): void;
3363
3365
  isConnected(): boolean;
@@ -3370,7 +3372,7 @@ declare class FlitroSseTimelineStream implements TimelineStream {
3370
3372
  * In Node.js environments (Node 18+) EventSource may not be available globally.
3371
3373
  * This minimal polyfill wraps the fetch API for SSE consumption.
3372
3374
  */
3373
- declare class FlitroFetchSseTimelineStream implements TimelineStream {
3375
+ declare class WeftFetchSseTimelineStream implements TimelineStream {
3374
3376
  private listeners;
3375
3377
  private abortController;
3376
3378
  private connected;
@@ -3381,7 +3383,7 @@ declare class FlitroFetchSseTimelineStream implements TimelineStream {
3381
3383
  private readonly getBearerToken?;
3382
3384
  private readonly onTokenExpired?;
3383
3385
  private readonly options;
3384
- constructor(options: FlitroSseTimelineStreamOptions);
3386
+ constructor(options: WeftSseTimelineStreamOptions);
3385
3387
  connect(onEvent: (event: TimelineEnvelope) => void, onError?: (error: Error) => void, onClose?: () => void): void;
3386
3388
  disconnect(): void;
3387
3389
  isConnected(): boolean;
@@ -3392,16 +3394,16 @@ declare class FlitroFetchSseTimelineStream implements TimelineStream {
3392
3394
  private emitError;
3393
3395
  }
3394
3396
  /**
3395
- * Create an SSE stream for the Flitro timeline endpoint.
3397
+ * Create an SSE stream for the timeline endpoint.
3396
3398
  * Always uses the fetch-based implementation so credentials are sent via
3397
3399
  * Authorization header rather than URL query parameters.
3398
3400
  */
3399
- declare function createFlitroTimelineStream(options: FlitroSseTimelineStreamOptions): TimelineStream;
3401
+ declare function createTimelineStream(options: WeftSseTimelineStreamOptions): TimelineStream;
3400
3402
 
3401
3403
  /**
3402
3404
  * WeftClient — the public L2 ("headless") contract.
3403
3405
  *
3404
- * A thin namespaced facade over FlitroHttpClient + the SSE timeline stream:
3406
+ * A thin namespaced facade over WeftHttpClient + the SSE timeline stream:
3405
3407
  *
3406
3408
  * ```ts
3407
3409
  * const client = new WeftClient({ server, token })
@@ -3429,21 +3431,21 @@ interface WeftClientOptions {
3429
3431
  * Called on HTTP 401 with a scoped token. Return a fresh token (e.g. by
3430
3432
  * re-asking your backend) to retry once; return undefined to surface the 401.
3431
3433
  */
3432
- onTokenExpired?: FlitroClientOptions['onTokenExpired'];
3434
+ onTokenExpired?: WeftHttpClientOptions['onTokenExpired'];
3433
3435
  }
3434
3436
  interface TimelineSubscription extends TimelineStream, AsyncIterable<TimelineEnvelope> {
3435
3437
  }
3436
3438
  declare class WeftClient {
3437
3439
  /** The underlying 1:1 HTTP client, for endpoints not wrapped below. */
3438
- readonly http: FlitroHttpClient;
3440
+ readonly http: WeftHttpClient;
3439
3441
  private readonly options;
3440
3442
  constructor(options: WeftClientOptions);
3441
3443
  /** Replace the scoped token (e.g. after a backend-driven refresh). */
3442
3444
  setToken(token: string): void;
3443
3445
  readonly sessions: {
3444
- create: (options?: Parameters<FlitroHttpClient["createSession"]>[0]) => Promise<FlitroSession>;
3445
- get: (sessionId: string) => Promise<FlitroSession>;
3446
- patch: (sessionId: string, patch: FlitroPatchSessionOptions) => Promise<FlitroSession>;
3446
+ create: (options?: Parameters<WeftHttpClient["createSession"]>[0]) => Promise<WeftSession>;
3447
+ get: (sessionId: string) => Promise<WeftSession>;
3448
+ patch: (sessionId: string, patch: WeftPatchSessionOptions) => Promise<WeftSession>;
3447
3449
  respondToPermission: (sessionId: string, requestId: string, allowed: boolean, options?: {
3448
3450
  remember?: boolean;
3449
3451
  text?: string;
@@ -3457,7 +3459,7 @@ declare class WeftClient {
3457
3459
  readonly runs: {
3458
3460
  create: (sessionId: string, options: {
3459
3461
  message: string;
3460
- } & NonNullable<Parameters<FlitroHttpClient["sendMessage"]>[2]>) => Promise<FlitroRun>;
3462
+ } & NonNullable<Parameters<WeftHttpClient["sendMessage"]>[2]>) => Promise<WeftRun>;
3461
3463
  cancel: (runId: string) => Promise<{
3462
3464
  status: string;
3463
3465
  }>;
@@ -3466,17 +3468,17 @@ declare class WeftClient {
3466
3468
  }>;
3467
3469
  };
3468
3470
  readonly timeline: {
3469
- fetch: (sessionId: string, afterSeq?: number, limit?: number) => Promise<FlitroTimelineFetchResult>;
3471
+ fetch: (sessionId: string, afterSeq?: number, limit?: number) => Promise<WeftTimelineFetchResult>;
3470
3472
  /**
3471
3473
  * Subscribe to the session's SSE timeline. Reconnects automatically with
3472
3474
  * cursor tracking; usable both callback-style (`connect`) and as an
3473
3475
  * async iterable (`for await`).
3474
3476
  */
3475
- subscribe: (sessionId: string, options?: Partial<Omit<FlitroSseTimelineStreamOptions, "url">>) => TimelineSubscription;
3477
+ subscribe: (sessionId: string, options?: Partial<Omit<WeftSseTimelineStreamOptions, "url">>) => TimelineSubscription;
3476
3478
  };
3477
3479
  }
3478
3480
 
3479
- export { type FlitroCapabilityReport, type FlitroClientOptions, FlitroFetchSseTimelineStream, FlitroHttpClient, type FlitroModelInfo, type FlitroModelListResult, type FlitroPatchSessionOptions, type FlitroRun, type FlitroSession, FlitroSseTimelineStream, type FlitroSseTimelineStreamOptions, type FlitroTimelineFetchResult, type FlitroTimelineItem, type TimelineEnvelope, type TimelineStream, type TimelineSubscription, WeftClient, type WeftClientOptions, createFlitroTimelineStream };
3481
+ export { type TimelineEnvelope, type TimelineStream, type TimelineSubscription, type WeftCapabilityReport, WeftClient, type WeftClientOptions, WeftFetchSseTimelineStream, WeftHttpClient, type WeftHttpClientOptions, type WeftModelInfo, type WeftModelListResult, type WeftPatchSessionOptions, type WeftRun, type WeftSession, WeftSseTimelineStream, type WeftSseTimelineStreamOptions, type WeftTimelineFetchResult, type WeftTimelineItem, createTimelineStream };
3480
3482
 
3481
3483
  // ── inlined from @weft/provider-flitro ──
3482
3484
  // -- @weft/provider-flitro/index.d.ts --
@@ -3501,7 +3503,7 @@ interface FlitroProviderRuntimeDriver {
3501
3503
  dispose?(): Promise<void>;
3502
3504
  }
3503
3505
  interface CreateFlitroDriverOptions {
3504
- client: FlitroHttpClient;
3506
+ client: WeftHttpClient;
3505
3507
  sessionId: string;
3506
3508
  /** LLM model override sent to Flitro */
3507
3509
  model?: string;
@@ -3542,7 +3544,7 @@ interface FlitroCapabilityProbeResult {
3542
3544
  * process (the Go agentd binary) that the TypeScript provider communicates
3543
3545
  * with over HTTP.
3544
3546
  */
3545
- declare function probeFlitroCapabilities(client: FlitroHttpClient): Promise<FlitroCapabilityProbeResult>;
3547
+ declare function probeFlitroCapabilities(client: WeftHttpClient): Promise<FlitroCapabilityProbeResult>;
3546
3548
 
3547
3549
  /**
3548
3550
  * @weft/provider-flitro
@@ -3575,7 +3577,7 @@ interface CreateFlitroRuntimeCapabilityReportOptions {
3575
3577
  declare function createFlitroRuntimeCapabilityReport(options: CreateFlitroRuntimeCapabilityReportOptions): RuntimeCapabilityReport;
3576
3578
  interface CreateFlitroProviderRuntimeOptions extends CreateFlitroRuntimeCapabilityReportOptions {
3577
3579
  /** Flitro server connection options */
3578
- server: FlitroClientOptions;
3580
+ server: WeftHttpClientOptions;
3579
3581
  /** Session ID — if omitted a new session is created on first sendMessage */
3580
3582
  sessionId?: string;
3581
3583
  /** Epoch string for the timeline (default: derived from sessionId) */
@@ -3635,7 +3637,7 @@ interface CreateFlitroEmbedRuntimeOptions {
3635
3637
  declare function createFlitroEmbedRuntime(options: CreateFlitroEmbedRuntimeOptions): AgentRuntime;
3636
3638
  interface CreateFlitroRuntimeOptions {
3637
3639
  /** Flitro server connection options */
3638
- server: FlitroClientOptions;
3640
+ server: WeftHttpClientOptions;
3639
3641
  sessionId?: string;
3640
3642
  epoch?: string;
3641
3643
  now?: () => number;
@@ -3654,1728 +3656,3 @@ interface CreateFlitroRuntimeOptions {
3654
3656
  declare function createFlitroRuntime(options: CreateFlitroRuntimeOptions): Promise<AgentRuntime>;
3655
3657
 
3656
3658
  export { type CreateFlitroDriverOptions, type CreateFlitroEmbedRuntimeOptions, type CreateFlitroProviderRuntimeOptions, type CreateFlitroRuntimeCandidatesOptions, type CreateFlitroRuntimeCapabilityReportOptions, type CreateFlitroRuntimeOptions, type FlitroCapabilityProbeResult, type FlitroProviderRuntimeDriver, createFlitroDriver, createFlitroEmbedRuntime, createFlitroProviderRuntime, createFlitroRuntime, createFlitroRuntimeCandidates, createFlitroRuntimeCapabilityReport, probeFlitroCapabilities };
3657
-
3658
- // ── inlined from @weft/ui ──
3659
- // -- @weft/ui/index.d.ts --
3660
- import * as react_jsx_runtime from 'react/jsx-runtime';
3661
- import * as React$1 from 'react';
3662
- import React__default, { ReactNode } from 'react';
3663
-
3664
- type ActivityStatus = 'pending' | 'running' | 'completed' | 'error' | 'backgrounded';
3665
- type ActivityType = 'tool' | 'thinking' | 'intermediate' | 'status' | 'plan';
3666
- type AnnotationInteractionMode = 'interactive' | 'tooltip-only';
3667
- type TodoStatus = 'pending' | 'in_progress' | 'completed' | 'interrupted';
3668
- interface TodoItem {
3669
- /** Task content/description */
3670
- content: string;
3671
- /** Current status */
3672
- status: TodoStatus;
3673
- /** Present continuous form shown when in_progress (e.g., "Running tests") */
3674
- activeForm?: string;
3675
- }
3676
- interface ActivityItem {
3677
- id: string;
3678
- type: ActivityType;
3679
- status: ActivityStatus;
3680
- toolName?: string;
3681
- toolUseId?: string;
3682
- toolInput?: Record<string, unknown>;
3683
- content?: string;
3684
- intent?: string;
3685
- /** Optional backing message id (used by plan activities for branching/annotations) */
3686
- messageId?: string;
3687
- /** Optional persisted annotations (used by plan activities) */
3688
- annotations?: AnnotationV1[];
3689
- displayName?: string;
3690
- toolDisplayMeta?: ToolDisplayMeta;
3691
- timestamp: number;
3692
- error?: string;
3693
- parentId?: string;
3694
- depth?: number;
3695
- statusType?: string;
3696
- taskId?: string;
3697
- shellId?: string;
3698
- elapsedSeconds?: number;
3699
- isBackground?: boolean;
3700
- }
3701
- interface ResponseContent {
3702
- text: string;
3703
- isStreaming: boolean;
3704
- streamStartTime?: number;
3705
- /** Whether this response is a plan (renders with plan variant) */
3706
- isPlan?: boolean;
3707
- /** ID of the underlying message (for branching + annotations) */
3708
- messageId?: string;
3709
- /** Persisted annotations attached to the response message */
3710
- annotations?: AnnotationV1[];
3711
- }
3712
- /** Represents one complete assistant turn */
3713
- interface AssistantTurn {
3714
- type: 'assistant';
3715
- turnId: string;
3716
- activities: ActivityItem[];
3717
- response?: ResponseContent;
3718
- intent?: string;
3719
- isStreaming: boolean;
3720
- isComplete: boolean;
3721
- timestamp: number;
3722
- /** Extracted from TodoWrite tool - latest todo state in this turn */
3723
- todos?: TodoItem[];
3724
- }
3725
- /** Represents a user message */
3726
- interface UserTurn {
3727
- type: 'user';
3728
- message: Message;
3729
- timestamp: number;
3730
- }
3731
- /** Represents a system/info/error message that stands alone */
3732
- interface SystemTurn {
3733
- type: 'system';
3734
- message: Message;
3735
- timestamp: number;
3736
- }
3737
- /** Represents an auth request (credential input, OAuth flow) */
3738
- interface AuthRequestTurn {
3739
- type: 'auth-request';
3740
- message: Message;
3741
- timestamp: number;
3742
- }
3743
- type Turn = AssistantTurn | UserTurn | SystemTurn | AuthRequestTurn;
3744
- type OpenAnnotationRequest = {
3745
- messageId: string;
3746
- annotationId: string;
3747
- mode: 'view' | 'edit';
3748
- anchorX?: number;
3749
- anchorY?: number;
3750
- nonce: number;
3751
- };
3752
-
3753
- /**
3754
- * turn-phase.ts
3755
- *
3756
- * Turn lifecycle phase detection for assistant turns.
3757
- */
3758
-
3759
- /**
3760
- * Build a stable UI identity key for an assistant turn card.
3761
- *
3762
- * Why this exists:
3763
- * - Backend turnId can be reused across visually split assistant cards
3764
- * (e.g., steer/interruption boundaries).
3765
- * - Expansion state must be keyed by UI-card identity, not raw backend turnId.
3766
- */
3767
- declare function getAssistantTurnUiKey(turn: AssistantTurn, index: number): string;
3768
-
3769
- /**
3770
- * turn-grouping.ts
3771
- *
3772
- * Core groupMessagesByTurn function plus internal helpers for converting
3773
- * a flat Message[] array into grouped Turn[] for TurnCard rendering.
3774
- */
3775
-
3776
- /**
3777
- * Groups messages into turns for TurnCard rendering
3778
- *
3779
- * Rules:
3780
- * - User messages flush and start fresh context
3781
- * - Tool messages + intermediate assistant messages belong to current turn
3782
- * - Final assistant message (non-streaming, non-intermediate) flushes the turn
3783
- * - Error/status/info messages are standalone system turns
3784
- *
3785
- * Note: We intentionally ignore turnId for grouping. The SDK generates a new
3786
- * turnId for each API message, but from a user perspective, all work between
3787
- * a user message and the final response should be ONE turn. We use isIntermediate
3788
- * as the signal: isIntermediate=true means more work coming, isIntermediate=false
3789
- * means final response.
3790
- */
3791
- declare function groupMessagesByTurn(messages: Message[]): Turn[];
3792
-
3793
- /**
3794
- * Global size configuration for TurnCard components.
3795
- * Adjust these values to scale the entire component uniformly.
3796
- */
3797
- /** Shared size configuration for activity UI - exported for reuse in inline execution */
3798
- declare const SIZE_CONFIG: {
3799
- /** Base font size class for all text */
3800
- readonly fontSize: "text-[13px]";
3801
- /** Icon size class (width and height) */
3802
- readonly iconSize: "w-3 h-3";
3803
- /** Spinner text size class */
3804
- readonly spinnerSize: "text-[10px]";
3805
- /** Small spinner for header */
3806
- readonly spinnerSizeSmall: "text-[8px]";
3807
- /** Activity row height in pixels (approx for calculation) */
3808
- readonly activityRowHeight: 24;
3809
- /** Max visible activities before scrolling (show ~15 items) */
3810
- readonly maxVisibleActivities: 15;
3811
- /** Number of items before which we apply staggered animation */
3812
- readonly staggeredAnimationLimit: 10;
3813
- };
3814
- type BufferReason = 'complete' | 'min_time' | 'timeout' | 'code_block' | 'list' | 'header' | 'question' | 'threshold_met' | 'high_word_count' | 'buffering';
3815
-
3816
- /**
3817
- * tool-display.ts
3818
- *
3819
- * Tool display formatting functions extracted from TurnCard.tsx.
3820
- * No JSX — pure string/object formatting logic.
3821
- */
3822
-
3823
- /**
3824
- * Determine if buffered content should be shown.
3825
- * This is the core buffering decision function.
3826
- *
3827
- * @param text - The accumulated response text
3828
- * @param isStreaming - Whether the response is still streaming
3829
- * @param streamStartTime - When streaming started (for timeout calculation)
3830
- * @returns Decision with reason for debugging
3831
- */
3832
- declare function shouldShowStreamingContent(text: string, isStreaming: boolean, streamStartTime?: number): {
3833
- shouldShow: boolean;
3834
- reason: BufferReason;
3835
- wordCount: number;
3836
- };
3837
-
3838
- interface ResponseCardProps {
3839
- /** The content to display (markdown) */
3840
- text: string;
3841
- /** Whether the content is still streaming */
3842
- isStreaming: boolean;
3843
- /** When streaming started - used for buffering timeout calculation */
3844
- streamStartTime?: number;
3845
- /** Callback to open file in editor */
3846
- onOpenFile?: (path: string) => void;
3847
- /** Callback to open URL */
3848
- onOpenUrl?: (url: string) => void;
3849
- /** Callback to open response in Monaco editor */
3850
- onPopOut?: () => void;
3851
- /** Card variant - 'response' for AI messages, 'plan' for plan messages */
3852
- variant?: 'response' | 'plan';
3853
- /** Parent session ID (used to reset local annotation/island UI state on session switches) */
3854
- sessionId?: string;
3855
- /** Underlying message ID for annotation actions */
3856
- messageId?: string;
3857
- /** Persisted annotations for this response */
3858
- annotations?: AnnotationV1[];
3859
- /** Callback when user accepts the plan (plan variant only) */
3860
- onAccept?: () => void;
3861
- /** Callback when user accepts the plan with compaction (compact first, then execute) */
3862
- onAcceptWithCompact?: () => void;
3863
- /** Whether this is the last response in the session (shows Accept Plan button only for last response) */
3864
- isLastResponse?: boolean;
3865
- /** Whether to show the Accept Plan button (default: true) */
3866
- showAcceptPlan?: boolean;
3867
- /** Hide footer for compact embedding (EditPopover) */
3868
- compactMode?: boolean;
3869
- /** Callback to branch the session from this response */
3870
- onBranch?: (options?: {
3871
- newPanel?: boolean;
3872
- }) => void;
3873
- /** Callback to add annotation from selected text */
3874
- onAddAnnotation?: (messageId: string, annotation: AnnotationV1) => void;
3875
- /** Callback to remove persisted annotation */
3876
- onRemoveAnnotation?: (messageId: string, annotationId: string) => void;
3877
- /** Callback to update persisted annotation */
3878
- onUpdateAnnotation?: (messageId: string, annotationId: string, patch: Partial<AnnotationV1>) => void;
3879
- /** Input send key behavior used by follow-up editor */
3880
- sendMessageKey?: 'enter' | 'cmd-enter';
3881
- /** Callback when follow-up is saved via "Save & Send" action */
3882
- onSaveAndSendFollowUp?: (target: {
3883
- messageId: string;
3884
- annotationId: string;
3885
- note: string;
3886
- selectedText: string;
3887
- }) => void;
3888
- /** Whether there are active pending follow-up annotations in the session */
3889
- hasActiveFollowUpAnnotations?: boolean;
3890
- /** External request to open a specific annotation in this response */
3891
- openAnnotationRequest?: OpenAnnotationRequest | null;
3892
- /** Annotation interaction mode (viewer uses tooltip-only to suppress the island) */
3893
- annotationInteractionMode?: AnnotationInteractionMode;
3894
- }
3895
- /**
3896
- * ResponseCard - Unified card component for AI responses and plans
3897
- *
3898
- * Variants:
3899
- * - 'response': Buffered streaming response with smart content gating
3900
- * - 'plan': Plan message with header and Accept Plan button
3901
- *
3902
- * Response variant implements smart buffering:
3903
- * - Waits for 40+ words with structure OR
3904
- * - High-confidence patterns (code blocks, headers, lists) with lower threshold OR
3905
- * - Timeout after 2.5 seconds
3906
- *
3907
- * Performance optimization: Uses throttled static snapshots instead of re-rendering
3908
- * on every character. Content updates every 300ms during streaming, avoiding
3909
- * expensive markdown parsing on every delta.
3910
- */
3911
- declare function ResponseCard({ text, isStreaming, streamStartTime, onOpenFile, onOpenUrl, onPopOut, variant, sessionId, messageId, annotations, onAccept, onAcceptWithCompact, isLastResponse, showAcceptPlan, compactMode, onBranch, onAddAnnotation, onRemoveAnnotation, onUpdateAnnotation, sendMessageKey, onSaveAndSendFollowUp, hasActiveFollowUpAnnotations, openAnnotationRequest, annotationInteractionMode, }: ResponseCardProps): react_jsx_runtime.JSX.Element | null;
3912
-
3913
- interface TurnCardProps {
3914
- /** Session ID for state persistence (optional in shared context) */
3915
- sessionId?: string;
3916
- /** Turn ID for state persistence */
3917
- turnId: string;
3918
- /** All activities in this turn (tools, thinking, intermediate text) */
3919
- activities: ActivityItem[];
3920
- /** Final response content (may be streaming) */
3921
- response?: ResponseContent;
3922
- /** Primary intent/goal for this turn (shown in collapsed preview) */
3923
- intent?: string;
3924
- /** Whether content is still being received */
3925
- isStreaming: boolean;
3926
- /** Whether this turn is fully complete */
3927
- isComplete: boolean;
3928
- /** Start in expanded state */
3929
- defaultExpanded?: boolean;
3930
- /** Controlled expansion state (overrides internal state) */
3931
- isExpanded?: boolean;
3932
- /** Callback when expansion state changes */
3933
- onExpandedChange?: (expanded: boolean) => void;
3934
- /** Controlled expansion state for activity groups */
3935
- expandedActivityGroups?: Set<string>;
3936
- /** Callback when activity group expansion changes */
3937
- onExpandedActivityGroupsChange?: (groups: Set<string>) => void;
3938
- /** Callback when file path is clicked */
3939
- onOpenFile?: (path: string) => void;
3940
- /** Callback when URL is clicked */
3941
- onOpenUrl?: (url: string) => void;
3942
- /** Callback to open response in Monaco editor */
3943
- onPopOut?: (text: string) => void;
3944
- /** Callback to open turn details in a new window */
3945
- onOpenDetails?: () => void;
3946
- /** Callback to open individual activity details in Monaco */
3947
- onOpenActivityDetails?: (activity: ActivityItem) => void;
3948
- /** Callback to open all edits/writes in multi-file diff view */
3949
- onOpenMultiFileDiff?: () => void;
3950
- /** Whether this turn has any Edit or Write activities */
3951
- hasEditOrWriteActivities?: boolean;
3952
- /** TodoWrite tool state - shown at bottom of turn */
3953
- todos?: TodoItem[];
3954
- /** Optional render prop for actions menu (Electron provides dropdown) */
3955
- renderActionsMenu?: () => React$1.ReactNode;
3956
- /** Callback when user accepts the plan (plan responses only) */
3957
- onAcceptPlan?: () => void;
3958
- /** Callback when user accepts the plan with compaction (compact conversation first, then execute) */
3959
- onAcceptPlanWithCompact?: () => void;
3960
- /** Whether this is the last response in the session (shows Accept Plan button only for last response) */
3961
- isLastResponse?: boolean;
3962
- /** Session folder path for stripping from file paths in tool display */
3963
- sessionFolderPath?: string;
3964
- /** Display mode: 'detailed' shows all info, 'informative' hides MCP/API names and params */
3965
- displayMode?: 'informative' | 'detailed';
3966
- /** Animate response appearance (for playground demos) */
3967
- animateResponse?: boolean;
3968
- /** Hide footers for compact embedding (EditPopover) */
3969
- compactMode?: boolean;
3970
- /** Callback to branch the session from a specific message */
3971
- onBranch?: (messageId: string, options?: {
3972
- newPanel?: boolean;
3973
- }) => void;
3974
- /** Callback to add an annotation to a response message */
3975
- onAddAnnotation?: (messageId: string, annotation: AnnotationV1) => void;
3976
- /** Callback to remove a persisted annotation from a response message */
3977
- onRemoveAnnotation?: (messageId: string, annotationId: string) => void;
3978
- /** Callback to update a persisted annotation */
3979
- onUpdateAnnotation?: (messageId: string, annotationId: string, patch: Partial<AnnotationV1>) => void;
3980
- /** Input send key behavior used by follow-up editor */
3981
- sendMessageKey?: 'enter' | 'cmd-enter';
3982
- /** Callback when follow-up is saved via "Save & Send" action */
3983
- onSaveAndSendFollowUp?: (target: {
3984
- messageId: string;
3985
- annotationId: string;
3986
- note: string;
3987
- selectedText: string;
3988
- }) => void;
3989
- /** Whether there are active pending follow-up annotations in the session */
3990
- hasActiveFollowUpAnnotations?: boolean;
3991
- /** External request to open a specific annotation in the follow-up island */
3992
- openAnnotationRequest?: OpenAnnotationRequest | null;
3993
- /** Annotation interaction mode (viewer uses tooltip-only to suppress the island) */
3994
- annotationInteractionMode?: AnnotationInteractionMode;
3995
- }
3996
- /**
3997
- * TurnCard - Email-like display for one assistant turn
3998
- *
3999
- * Batches all activities (tools, thinking) into a collapsible section
4000
- * with the final response displayed separately below.
4001
- *
4002
- * Memoized to prevent re-renders of completed turns during session switches.
4003
- * Only complete, non-streaming turns are memoized - active turns always re-render.
4004
- */
4005
- declare const TurnCard: React$1.MemoExoticComponent<({ sessionId, turnId, activities, response, intent, isStreaming, isComplete, defaultExpanded, isExpanded: externalIsExpanded, onExpandedChange, expandedActivityGroups: externalExpandedActivityGroups, onExpandedActivityGroupsChange, onOpenFile, onOpenUrl, onPopOut, onOpenDetails, onOpenActivityDetails, onOpenMultiFileDiff, hasEditOrWriteActivities, todos, renderActionsMenu, onAcceptPlan, onAcceptPlanWithCompact, isLastResponse, sessionFolderPath, displayMode, animateResponse, compactMode, onBranch, onAddAnnotation, onRemoveAnnotation, onUpdateAnnotation, sendMessageKey, onSaveAndSendFollowUp, hasActiveFollowUpAnnotations, openAnnotationRequest, annotationInteractionMode, }: TurnCardProps) => react_jsx_runtime.JSX.Element | null>;
4006
-
4007
- type InlineExecutionStatus = 'executing' | 'success' | 'error';
4008
- interface InlineActivityItem {
4009
- id: string;
4010
- name: string;
4011
- status: ActivityStatus;
4012
- description?: string;
4013
- }
4014
- interface InlineExecutionProps {
4015
- /** Current execution status */
4016
- status: InlineExecutionStatus;
4017
- /** Activities to display (simplified from full ActivityItem) */
4018
- activities: InlineActivityItem[];
4019
- /** Result message on success */
4020
- result?: string;
4021
- /** Error message on failure */
4022
- error?: string;
4023
- /** Callback to cancel execution */
4024
- onCancel?: () => void;
4025
- /** Callback to dismiss (on success/error) */
4026
- onDismiss?: () => void;
4027
- /** Callback to retry (on error) */
4028
- onRetry?: () => void;
4029
- /** Optional className */
4030
- className?: string;
4031
- }
4032
- declare function InlineExecution({ status, activities, result, error, onCancel, onDismiss, onRetry, className, }: InlineExecutionProps): react_jsx_runtime.JSX.Element;
4033
-
4034
- /**
4035
- * Platform-specific actions for UI components.
4036
- * Consumers provide these via PlatformProvider.
4037
- */
4038
- interface PlatformActions {
4039
- /** Open a file in the system editor/Finder */
4040
- onOpenFile?: (path: string) => void;
4041
- /** Open a URL in the system browser */
4042
- onOpenUrl?: (url: string) => void;
4043
- /** Open a markdown preview popover */
4044
- onOpenMarkdownPreview?: (sessionId: string, markdown: string) => void;
4045
- /** Open turn details in a new window/panel */
4046
- onOpenTurnDetails?: (sessionId: string, turnId: string) => void;
4047
- /** Open activity details */
4048
- onOpenActivityDetails?: (sessionId: string, activityId: string) => void;
4049
- /** Open multi-file diff view for a turn */
4050
- onOpenMultiFileDiff?: (sessionId: string, turnId: string) => void;
4051
- /** Respond to a permission or auth request */
4052
- onPermissionAllow?: (requestId: string, allowed: boolean, remember?: boolean) => void;
4053
- }
4054
- /**
4055
- * Provider that injects platform-specific actions into the component tree.
4056
- */
4057
- declare function PlatformProvider({ actions, children, }: {
4058
- actions: PlatformActions;
4059
- children: React__default.ReactNode;
4060
- }): react_jsx_runtime.JSX.Element;
4061
-
4062
- interface ChatTranscriptProps {
4063
- messages: Message[];
4064
- platformActions?: PlatformActions;
4065
- className?: string;
4066
- onTurnClick?: (turnId: string) => void;
4067
- onActivityClick?: (activity: ActivityItem) => void;
4068
- defaultExpanded?: boolean;
4069
- displayMode?: 'informative' | 'detailed';
4070
- animateResponse?: boolean;
4071
- annotationInteractionMode?: AnnotationInteractionMode;
4072
- sessionId?: string;
4073
- sessionFolderPath?: string;
4074
- children?: ReactNode;
4075
- }
4076
- declare function ChatTranscript({ messages, platformActions, className, onTurnClick, onActivityClick, defaultExpanded, displayMode, animateResponse, annotationInteractionMode, sessionId, sessionFolderPath, children, }: ChatTranscriptProps): react_jsx_runtime.JSX.Element;
4077
-
4078
- type SessionViewerMode = 'interactive' | 'readonly';
4079
- interface SessionViewerProps {
4080
- session: StoredSession;
4081
- mode?: SessionViewerMode;
4082
- platformActions?: PlatformActions;
4083
- className?: string;
4084
- onTurnClick?: (turnId: string) => void;
4085
- onActivityClick?: (activity: ActivityItem) => void;
4086
- defaultExpanded?: boolean;
4087
- header?: ReactNode;
4088
- footer?: ReactNode;
4089
- sessionFolderPath?: string;
4090
- }
4091
- declare function SessionViewer({ session, mode, platformActions, className, onTurnClick, onActivityClick, defaultExpanded, header, footer, sessionFolderPath, }: SessionViewerProps): react_jsx_runtime.JSX.Element;
4092
-
4093
- interface PendingIndicatorProps {
4094
- isReconnecting?: boolean;
4095
- }
4096
- declare function PendingIndicator({ isReconnecting, }: PendingIndicatorProps): react_jsx_runtime.JSX.Element;
4097
-
4098
- interface UserMessageBubbleProps {
4099
- /** Message content (markdown supported) */
4100
- content: string;
4101
- /** Additional className for the outer container */
4102
- className?: string;
4103
- /** Callback when a URL is clicked */
4104
- onUrlClick?: (url: string) => void;
4105
- /** Callback when a file path is clicked */
4106
- onFileClick?: (path: string) => void;
4107
- /** Stored attachments (images, documents) */
4108
- attachments?: StoredAttachment[];
4109
- /** Content badges for inline display (sources, skills) */
4110
- badges?: ContentBadge[];
4111
- /** Whether the message is awaiting backend confirmation. User bubbles stay visually stable. */
4112
- isPending?: boolean;
4113
- /** Whether the message is queued (badge shown) */
4114
- isQueued?: boolean;
4115
- /** Compact mode - reduces padding for popover embedding */
4116
- compactMode?: boolean;
4117
- }
4118
- declare function UserMessageBubble({ content, className, onUrlClick, onFileClick, attachments, badges, isQueued, compactMode, }: UserMessageBubbleProps): react_jsx_runtime.JSX.Element;
4119
-
4120
- /**
4121
- * SystemMessage - Displays system/info/error/warning messages
4122
- *
4123
- * Used for displaying non-conversational messages like errors, warnings,
4124
- * info notices, and general system messages. Supports different visual
4125
- * styles based on the message type.
4126
- *
4127
- * Error and warning types use shadow-tinted for a softer, more polished appearance.
4128
- * System and info types use a simple bordered style.
4129
- */
4130
- type SystemMessageType = 'error' | 'info' | 'warning' | 'system';
4131
- interface SystemMessageProps {
4132
- /** Message content (markdown supported) */
4133
- content: string;
4134
- /** Message type determining visual style */
4135
- type: SystemMessageType;
4136
- /** Additional className for the outer container */
4137
- className?: string;
4138
- }
4139
- /**
4140
- * SystemMessage - Renders a styled message bubble based on type
4141
- */
4142
- declare function SystemMessage({ content, type, className, }: SystemMessageProps): react_jsx_runtime.JSX.Element;
4143
-
4144
- /**
4145
- * PermissionRequestCard - Inline permission prompt for agent tool approval
4146
- *
4147
- * Renders when the agent is paused awaiting user approval for a tool
4148
- * invocation (e.g. bash command, file write, MCP mutation). Displays
4149
- * the tool name, input preview, and reason, with Allow/Deny/Remember
4150
- * action buttons.
4151
- *
4152
- * Styling follows the Weft design system:
4153
- * - Rounded-[8px] card with shadow-minimal
4154
- * - Accent-coloured header strip for tool identity
4155
- * - Truncated input preview in a subtle code block
4156
- * - Two or three action buttons (Allow, Deny, Remember)
4157
- */
4158
- interface PermissionRequestCardProps {
4159
- /** Unique request ID matching the runtime permission request */
4160
- requestId: string;
4161
- /** Tool name requesting approval (e.g. "Bash", "Write", "Edit") */
4162
- toolName: string;
4163
- /** Optional scope descriptor (session, workspace, source, skill, tool-call) */
4164
- scope?: {
4165
- type: string;
4166
- label?: string;
4167
- };
4168
- /** Optional input preview (command, file path, MCP payload) */
4169
- input?: Record<string, unknown>;
4170
- /** Optional reason text explaining why permission is needed */
4171
- reason?: string;
4172
- /** Whether this request is currently active (not yet resolved) */
4173
- isActive?: boolean;
4174
- /** Previous resolution if re-shown for context (allowed/denied) */
4175
- previousResolution?: {
4176
- allowed: boolean;
4177
- remember?: boolean;
4178
- reason?: string;
4179
- };
4180
- /** Callback when user approves the request */
4181
- onAllow?: (requestId: string, remember?: boolean) => void;
4182
- /** Callback when user denies the request */
4183
- onDeny?: (requestId: string) => void;
4184
- /** Additional className */
4185
- className?: string;
4186
- }
4187
- declare function PermissionRequestCard({ requestId, toolName, scope, input, reason, isActive, previousResolution, onAllow, onDeny, className, }: PermissionRequestCardProps): react_jsx_runtime.JSX.Element;
4188
-
4189
- /**
4190
- * Standard assistant-turn presentation: a TurnCard with local expand state that
4191
- * stays open while the turn streams, the detailed display mode, and a click
4192
- * handler that surfaces a step for inspection. Shared so the web app and the
4193
- * embeddable chat panel render thinking steps identically.
4194
- */
4195
- declare function AssistantTurnCard({ sessionId, turn, isLast, onInspectActivity, }: {
4196
- sessionId: string;
4197
- turn: Extract<Turn, {
4198
- type: 'assistant';
4199
- }>;
4200
- isLast: boolean;
4201
- onInspectActivity: (activity: ActivityItem) => void;
4202
- }): react_jsx_runtime.JSX.Element;
4203
-
4204
- /**
4205
- * Renders a single activity's input / output / error for inspection. Shared by
4206
- * the web app's side panel and the embeddable chat panel's detail popup so the
4207
- * step-detail view stays identical across hosts.
4208
- */
4209
- declare function ActivityInspector({ activity, onClose, }: {
4210
- activity: ActivityItem | null;
4211
- onClose?: () => void;
4212
- }): react_jsx_runtime.JSX.Element;
4213
-
4214
- /**
4215
- * Modal popup wrapping ActivityInspector: centered, dismissable via backdrop
4216
- * click or Escape. Open it from a TurnCard's onOpenActivityDetails callback.
4217
- */
4218
- declare function ActivityDetailsPanel({ activity, onClose, }: {
4219
- activity: ActivityItem | null;
4220
- onClose: () => void;
4221
- }): react_jsx_runtime.JSX.Element | null;
4222
-
4223
- declare function PermissionModeMenu({ value, onChange, onClose, isOpen, onToggle, }: {
4224
- value: PermissionMode;
4225
- onChange: (mode: PermissionMode) => void;
4226
- onClose?: () => void;
4227
- isOpen: boolean;
4228
- onToggle: () => void;
4229
- }): react_jsx_runtime.JSX.Element;
4230
-
4231
- interface CodeBlockProps {
4232
- code: string;
4233
- language?: string;
4234
- className?: string;
4235
- /**
4236
- * Render mode affects code block styling:
4237
- * - 'terminal': Minimal, keeps control chars visible
4238
- * - 'minimal': Clean code, basic styling
4239
- * - 'full': Rich styling with background, copy button, etc.
4240
- */
4241
- mode?: 'terminal' | 'minimal' | 'full';
4242
- /**
4243
- * Force a specific theme. If not provided, detects from document.documentElement.classList
4244
- */
4245
- forcedTheme?: 'light' | 'dark';
4246
- }
4247
- /**
4248
- * CodeBlock - Syntax highlighted code block using Shiki
4249
- *
4250
- * Uses VS Code's syntax highlighting engine for accurate highlighting.
4251
- * Lazy-loads highlighting and caches results for performance.
4252
- */
4253
- declare function CodeBlock({ code, language, className, mode, forcedTheme }: CodeBlockProps): react_jsx_runtime.JSX.Element;
4254
- /**
4255
- * InlineCode - Styled inline code span
4256
- * Features: subtle background (3%), no border, 75% opacity text
4257
- */
4258
- declare function InlineCode({ children, className }: {
4259
- children: React$1.ReactNode;
4260
- className?: string;
4261
- }): react_jsx_runtime.JSX.Element;
4262
-
4263
- declare function CollapsibleMarkdownProvider({ children, }: {
4264
- children: React.ReactNode;
4265
- }): react_jsx_runtime.JSX.Element;
4266
-
4267
- /**
4268
- * Render modes for markdown content:
4269
- *
4270
- * - 'terminal': Raw output with minimal formatting, control chars visible
4271
- * Best for: Debug output, raw logs, when you want to see exactly what's there
4272
- *
4273
- * - 'minimal': Clean rendering with syntax highlighting but no extra chrome
4274
- * Best for: Chat messages, inline content, when you want readability without clutter
4275
- *
4276
- * - 'full': Rich rendering with beautiful tables, styled code blocks, proper typography
4277
- * Best for: Documentation, long-form content, when presentation matters
4278
- */
4279
- type RenderMode = 'terminal' | 'minimal' | 'full';
4280
- interface MarkdownProps {
4281
- children: string;
4282
- /**
4283
- * Render mode controlling formatting level
4284
- * @default 'minimal'
4285
- */
4286
- mode?: RenderMode;
4287
- className?: string;
4288
- /**
4289
- * Message ID for memoization (optional)
4290
- * When provided, memoizes parsed blocks to avoid re-parsing during streaming
4291
- */
4292
- id?: string;
4293
- /**
4294
- * Callback when a URL is clicked
4295
- */
4296
- onUrlClick?: (url: string) => void;
4297
- /**
4298
- * Callback when a file path is clicked
4299
- */
4300
- onFileClick?: (path: string) => void;
4301
- /**
4302
- * Enable collapsible headings
4303
- * Requires wrapping in CollapsibleMarkdownProvider
4304
- * @default false
4305
- */
4306
- collapsible?: boolean;
4307
- /**
4308
- * Hide expand button on first mermaid block (when message starts with mermaid)
4309
- * Used in chat to avoid overlap with TurnCard's fullscreen button
4310
- * @default true
4311
- */
4312
- hideFirstMermaidExpand?: boolean;
4313
- }
4314
- /**
4315
- * Markdown - Customizable markdown renderer with multiple render modes
4316
- *
4317
- * Features:
4318
- * - Three render modes: terminal, minimal, full
4319
- * - Syntax highlighting via Shiki
4320
- * - GFM support (tables, task lists, strikethrough)
4321
- * - Clickable links and file paths
4322
- * - Memoization for streaming performance
4323
- */
4324
- declare function Markdown({ children, mode, className, id, onUrlClick, onFileClick, collapsible, hideFirstMermaidExpand, }: MarkdownProps): react_jsx_runtime.JSX.Element;
4325
- /**
4326
- * MemoizedMarkdown - Optimized for streaming scenarios
4327
- *
4328
- * Splits content into blocks and memoizes each block separately,
4329
- * so only new/changed blocks re-render during streaming.
4330
- */
4331
- declare const MemoizedMarkdown: React$1.MemoExoticComponent<typeof Markdown>;
4332
-
4333
- interface AnchoredSelection {
4334
- anchorX: number;
4335
- anchorY: number;
4336
- start: number;
4337
- end: number;
4338
- exact: string;
4339
- selectedText?: string;
4340
- prefix?: string;
4341
- suffix?: string;
4342
- }
4343
-
4344
- /**
4345
- * annotation-core — stub for annotation overlay core utilities.
4346
- *
4347
- * Provides type definitions and utility functions for annotation rendering.
4348
- * Full implementation will be ported from the upstream source project.
4349
- */
4350
-
4351
- interface AnnotationOverlayRect {
4352
- id: string;
4353
- left: number;
4354
- top: number;
4355
- width: number;
4356
- height: number;
4357
- color: string;
4358
- }
4359
- type AnnotationOverlayChip = {
4360
- id: string;
4361
- index: number;
4362
- left: number;
4363
- top: number;
4364
- sentFollowUp: boolean;
4365
- };
4366
- declare function hasExistingTextRangeAnnotation(annotations: AnnotationV1[], start: number, end: number): boolean;
4367
- declare function createSelectionPreviewAnnotation(messageId: string, sessionIdOrSelection: string | AnchoredSelection, startOrSessionId?: number | string, end?: number, exact?: string): AnnotationV1;
4368
- declare function createTextSelectionAnnotation(messageId: string, sessionId: string, start: number, end: number, exact: string, note: string): AnnotationV1;
4369
- interface TextSegment {
4370
- start: number;
4371
- end: number;
4372
- node: Text;
4373
- }
4374
- declare function collectTextSegments(_content: string | HTMLElement, _annotations: AnnotationV1[]): TextSegment[];
4375
- /** Stub — full implementation will compute canonical text from DOM */
4376
- declare function getCanonicalText(_content: string | HTMLElement): string;
4377
- /**
4378
- * Stub — resolves character offset within a DOM node.
4379
- * Full implementation will walk the DOM tree to compute text offset.
4380
- */
4381
- declare function resolveNodeOffset(_root: string | HTMLElement, _node?: Node, _offset?: number): number | null;
4382
-
4383
- /**
4384
- * annotation-overlay-geometry — stub for annotation overlay geometry computation.
4385
- */
4386
-
4387
- interface AnnotationOverlayGeometryResult {
4388
- rects: AnnotationOverlayRect[];
4389
- chips: AnnotationOverlayChip[];
4390
- unresolved: Array<{
4391
- annotation: AnnotationV1;
4392
- reason: string;
4393
- }>;
4394
- }
4395
- declare function computeAnnotationOverlayGeometry(_containerOrOpts: HTMLElement | {
4396
- root: HTMLElement;
4397
- renderedAnnotations: AnnotationV1[];
4398
- persistedAnnotations?: AnnotationV1[];
4399
- }, _annotations?: AnnotationV1[], _content?: string): AnnotationOverlayGeometryResult;
4400
-
4401
- interface AnnotationOverlayLayerProps {
4402
- rects: AnnotationOverlayRect[];
4403
- chips: AnnotationOverlayChip[];
4404
- annotations?: AnnotationV1[];
4405
- getTooltipText?: (annotation: AnnotationV1, index: number) => string;
4406
- /** Whether clicking a chip should open the annotation island/details view. */
4407
- allowChipOpen?: boolean;
4408
- onChipOpen: (params: {
4409
- annotationId: string;
4410
- index: number;
4411
- anchorX: number;
4412
- anchorY: number;
4413
- mode: 'view' | 'edit';
4414
- }) => void;
4415
- }
4416
- declare function AnnotationOverlayLayer({ rects, chips, annotations, getTooltipText, allowChipOpen, onChipOpen, }: AnnotationOverlayLayerProps): react_jsx_runtime.JSX.Element | null;
4417
-
4418
- /**
4419
- * IslandTransitionConfig — type stub for annotation island transition animations.
4420
- */
4421
- interface IslandTransitionConfig {
4422
- duration?: number;
4423
- easing?: string;
4424
- }
4425
-
4426
- /**
4427
- * AnnotationIslandMenu — stub for annotation island menu component.
4428
- * Accepts all props used by TurnCard but renders nothing.
4429
- */
4430
-
4431
- interface AnnotationIslandMenuProps {
4432
- anchor?: {
4433
- x: number;
4434
- y: number;
4435
- } | null;
4436
- sourceKey?: string;
4437
- replayNonce?: number;
4438
- isVisible?: boolean;
4439
- activeView?: string | null;
4440
- mode?: string;
4441
- draft?: string;
4442
- onDraftChange?: (draft: string) => void;
4443
- onOpenFollowUp?: () => void;
4444
- onCancel?: () => void;
4445
- onRequestBack?: () => boolean;
4446
- onRequestEdit?: () => void;
4447
- onSubmit?: (note: string) => void;
4448
- onSubmitAndSend?: (...args: any[]) => void;
4449
- onDelete?: () => void;
4450
- sendMessageKey?: string;
4451
- transitionConfig?: Record<string, unknown> | IslandTransitionConfig;
4452
- onExitComplete?: () => void;
4453
- usePortal?: boolean;
4454
- className?: string;
4455
- }
4456
- declare function AnnotationIslandMenu(_props: AnnotationIslandMenuProps): React$1.ReactNode;
4457
-
4458
- /**
4459
- * island-motion — stub for annotation island motion/animation utilities.
4460
- */
4461
- interface PointerSnapshot {
4462
- x: number;
4463
- y: number;
4464
- timestamp: number;
4465
- }
4466
- declare function buildAnnotationChipEntryTransition(_snapshot?: PointerSnapshot | null): Record<string, unknown>;
4467
- declare function buildSelectionEntryTransition(_primary?: PointerSnapshot | null, _secondary?: PointerSnapshot | null): Record<string, unknown>;
4468
-
4469
- /**
4470
- * Event Processor Types
4471
- *
4472
- * Defines the state and event types for the centralized event processor.
4473
- * All agent events flow through a single pure function for consistent state transitions.
4474
- */
4475
-
4476
- /**
4477
- * Runtime Session type — extends core Session with messages and processing state.
4478
- * Aliased from ProtocolSession which includes all runtime fields needed by the processor.
4479
- */
4480
- type Session = ProtocolSession;
4481
-
4482
- /**
4483
- * Streaming state for a session - replaces streamingTextRef
4484
- */
4485
- interface StreamingState {
4486
- content: string;
4487
- turnId?: string;
4488
- parentToolUseId?: string;
4489
- }
4490
- /**
4491
- * Complete state for a session - combines session + streaming
4492
- */
4493
- interface SessionState {
4494
- session: Session;
4495
- streaming: StreamingState | null;
4496
- }
4497
- /**
4498
- * Text delta event - streaming text content
4499
- */
4500
- interface TextDeltaEvent {
4501
- type: 'text_delta';
4502
- sessionId: string;
4503
- delta: string;
4504
- turnId?: string;
4505
- /** Timestamp from canonical timeline for stable ordering */
4506
- timestamp?: number;
4507
- /** When true, this delta belongs to a reasoning/thinking block (intermediate content). */
4508
- isIntermediate?: boolean;
4509
- }
4510
- /**
4511
- * Text complete event - finalizes streaming text
4512
- */
4513
- interface TextCompleteEvent {
4514
- type: 'text_complete';
4515
- sessionId: string;
4516
- text: string;
4517
- turnId?: string;
4518
- isIntermediate?: boolean;
4519
- parentToolUseId?: string;
4520
- /** Timestamp from main process for consistent ordering with session.jsonl */
4521
- timestamp?: number;
4522
- /** Authoritative message ID from main process for persistence/branching parity */
4523
- messageId?: string;
4524
- }
4525
- /**
4526
- * Tool start event - begins tool execution
4527
- * Field names match SessionEvent from @weft/protocol
4528
- */
4529
- interface ToolStartEvent {
4530
- type: 'tool_start';
4531
- sessionId: string;
4532
- toolUseId: string;
4533
- toolName: string;
4534
- toolInput?: Record<string, unknown>;
4535
- /** Timestamp from main process for consistent ordering */
4536
- timestamp?: number;
4537
- turnId?: string;
4538
- parentToolUseId?: string;
4539
- toolIntent?: string;
4540
- toolDisplayName?: string;
4541
- /** Tool display metadata with base64-encoded icon for viewer compatibility */
4542
- toolDisplayMeta?: ToolDisplayMeta;
4543
- }
4544
- /**
4545
- * Tool result event - completes tool execution
4546
- */
4547
- interface ToolResultEvent {
4548
- type: 'tool_result';
4549
- sessionId: string;
4550
- toolUseId: string;
4551
- toolName?: string;
4552
- result: string;
4553
- isError?: boolean;
4554
- turnId?: string;
4555
- parentToolUseId?: string;
4556
- /** Timestamp from main process for consistent ordering */
4557
- timestamp?: number;
4558
- }
4559
- /**
4560
- * Tool delta event - appends streaming output to an executing tool.
4561
- */
4562
- interface ToolDeltaEvent {
4563
- type: 'tool_delta';
4564
- sessionId: string;
4565
- toolUseId: string;
4566
- delta: string;
4567
- stream?: string;
4568
- turnId?: string;
4569
- /** Timestamp from main process for consistent ordering */
4570
- timestamp?: number;
4571
- }
4572
- /**
4573
- * Complete event - agent loop finished
4574
- */
4575
- interface CompleteEvent {
4576
- type: 'complete';
4577
- sessionId: string;
4578
- tokenUsage?: Session['tokenUsage'];
4579
- /** Explicit unread flag - set by main process based on viewing state */
4580
- hasUnread?: boolean;
4581
- }
4582
- /**
4583
- * Error event - agent error occurred
4584
- */
4585
- interface ErrorEvent {
4586
- type: 'error';
4587
- sessionId: string;
4588
- error: string;
4589
- code?: string;
4590
- title?: string;
4591
- details?: string;
4592
- original?: string;
4593
- /** Timestamp from main process for consistent ordering */
4594
- timestamp?: number;
4595
- }
4596
- /**
4597
- * Permission request event
4598
- * Matches SessionEvent shape from @weft/protocol
4599
- */
4600
- interface PermissionRequestEvent {
4601
- type: 'permission_request';
4602
- sessionId: string;
4603
- request: PermissionRequest;
4604
- }
4605
- /**
4606
- * Sources changed event
4607
- */
4608
- interface SourcesChangedEvent {
4609
- type: 'sources_changed';
4610
- sessionId: string;
4611
- enabledSourceSlugs: string[];
4612
- }
4613
- /**
4614
- * Labels changed event
4615
- */
4616
- interface LabelsChangedEvent {
4617
- type: 'labels_changed';
4618
- sessionId: string;
4619
- labels: string[];
4620
- }
4621
- /**
4622
- * Todo state changed event (external metadata change or agent tool)
4623
- */
4624
- interface SessionStatusChangedEvent {
4625
- type: 'session_status_changed';
4626
- sessionId: string;
4627
- sessionStatus?: string;
4628
- }
4629
- /**
4630
- * Session flagged/unflagged events (external metadata change)
4631
- */
4632
- interface SessionFlaggedEvent {
4633
- type: 'session_flagged';
4634
- sessionId: string;
4635
- }
4636
- interface SessionUnflaggedEvent {
4637
- type: 'session_unflagged';
4638
- sessionId: string;
4639
- }
4640
- /**
4641
- * Session archived/unarchived events (external metadata change)
4642
- */
4643
- interface SessionArchivedEvent {
4644
- type: 'session_archived';
4645
- sessionId: string;
4646
- }
4647
- interface SessionUnarchivedEvent {
4648
- type: 'session_unarchived';
4649
- sessionId: string;
4650
- }
4651
- /**
4652
- * Session name changed event (external metadata change)
4653
- */
4654
- interface NameChangedEvent {
4655
- type: 'name_changed';
4656
- sessionId: string;
4657
- name?: string;
4658
- }
4659
- /**
4660
- * Plan submitted event
4661
- */
4662
- interface PlanSubmittedEvent {
4663
- type: 'plan_submitted';
4664
- sessionId: string;
4665
- message: Message;
4666
- }
4667
- /**
4668
- * Typed error event
4669
- */
4670
- interface TypedErrorEvent {
4671
- type: 'typed_error';
4672
- sessionId: string;
4673
- error: TypedError;
4674
- /** Timestamp from main process for consistent ordering */
4675
- timestamp?: number;
4676
- }
4677
- /**
4678
- * Status event
4679
- */
4680
- interface StatusEvent {
4681
- type: 'status';
4682
- sessionId: string;
4683
- message: string;
4684
- statusType?: 'compacting';
4685
- /** Timestamp from main process for consistent ordering */
4686
- timestamp?: number;
4687
- }
4688
- /**
4689
- * Info event
4690
- */
4691
- interface InfoEvent {
4692
- type: 'info';
4693
- sessionId: string;
4694
- message: string;
4695
- statusType?: 'compaction_complete';
4696
- level?: 'info' | 'warning' | 'error' | 'success';
4697
- /** Timestamp from main process for consistent ordering */
4698
- timestamp?: number;
4699
- }
4700
- /**
4701
- * Interrupted event
4702
- */
4703
- interface InterruptedEvent {
4704
- type: 'interrupted';
4705
- sessionId: string;
4706
- message?: Message;
4707
- /** Messages that were queued but not processed — should be restored to input field */
4708
- queuedMessages?: string[];
4709
- }
4710
- /**
4711
- * Title generated event
4712
- */
4713
- interface TitleGeneratedEvent {
4714
- type: 'title_generated';
4715
- sessionId: string;
4716
- title: string;
4717
- preview?: string;
4718
- }
4719
- /**
4720
- * Title regenerating event - indicates title regeneration has started/finished
4721
- * Used to show shimmer effect on title during regeneration
4722
- * @deprecated Use AsyncOperationEvent instead
4723
- */
4724
- interface TitleRegeneratingEvent {
4725
- type: 'title_regenerating';
4726
- sessionId: string;
4727
- isRegenerating: boolean;
4728
- }
4729
- /**
4730
- * Generic async operation state event
4731
- * Used to show shimmer effect during any async operation (sharing, updating, revoking, title regeneration)
4732
- */
4733
- interface AsyncOperationEvent {
4734
- type: 'async_operation';
4735
- sessionId: string;
4736
- isOngoing: boolean;
4737
- }
4738
- /**
4739
- * Working directory changed event (user-initiated via UI)
4740
- */
4741
- interface WorkingDirectoryChangedEvent {
4742
- type: 'working_directory_changed';
4743
- sessionId: string;
4744
- workingDirectory: string;
4745
- }
4746
- /**
4747
- * Working directory error event - server rejected the path (cross-platform, not found, etc.)
4748
- */
4749
- interface WorkingDirectoryErrorEvent {
4750
- type: 'working_directory_error';
4751
- sessionId: string;
4752
- error: string;
4753
- }
4754
- /**
4755
- * Permission mode changed event
4756
- */
4757
- interface PermissionModeChangedEvent {
4758
- type: 'permission_mode_changed';
4759
- sessionId: string;
4760
- permissionMode: PermissionMode;
4761
- previousPermissionMode?: PermissionMode;
4762
- transitionDisplay?: string;
4763
- modeVersion?: number;
4764
- changedAt?: string;
4765
- changedBy?: 'user' | 'system' | 'restore' | 'automation' | 'unknown';
4766
- }
4767
- /**
4768
- * Session model changed event
4769
- */
4770
- interface SessionModelChangedEvent {
4771
- type: 'session_model_changed';
4772
- sessionId: string;
4773
- model: string | null;
4774
- }
4775
- /**
4776
- * LLM connection changed event - syncs session.llmConnection to renderer
4777
- */
4778
- interface LLMConnectionChangedEvent {
4779
- type: 'connection_changed';
4780
- sessionId: string;
4781
- connectionSlug: string;
4782
- supportsBranching?: boolean;
4783
- }
4784
- /**
4785
- * Credential request event - prompts user for credentials
4786
- */
4787
- interface CredentialRequestEvent {
4788
- type: 'credential_request';
4789
- sessionId: string;
4790
- request: CredentialRequest;
4791
- }
4792
- /**
4793
- * Task backgrounded event - background agent started
4794
- */
4795
- interface TaskBackgroundedEvent {
4796
- type: 'task_backgrounded';
4797
- sessionId: string;
4798
- toolUseId: string;
4799
- taskId: string;
4800
- intent?: string;
4801
- turnId?: string;
4802
- }
4803
- /**
4804
- * Shell backgrounded event - background bash shell started
4805
- */
4806
- interface ShellBackgroundedEvent {
4807
- type: 'shell_backgrounded';
4808
- sessionId: string;
4809
- toolUseId: string;
4810
- shellId: string;
4811
- intent?: string;
4812
- turnId?: string;
4813
- }
4814
- /**
4815
- * Task progress event - live progress updates for background tasks
4816
- */
4817
- interface TaskProgressEvent {
4818
- type: 'task_progress';
4819
- sessionId: string;
4820
- toolUseId: string;
4821
- elapsedSeconds: number;
4822
- turnId?: string;
4823
- }
4824
- /**
4825
- * Task completed event - background task finished execution
4826
- * Updates the tool message status and result when a background task completes.
4827
- */
4828
- interface TaskCompletedEvent {
4829
- type: 'task_completed';
4830
- sessionId: string;
4831
- taskId: string;
4832
- status: 'completed' | 'failed' | 'stopped';
4833
- outputFile?: string;
4834
- summary?: string;
4835
- turnId?: string;
4836
- }
4837
- /**
4838
- * User message event - backend confirmation of optimistic user message
4839
- * Used for optimistic UI: frontend shows message immediately,
4840
- * backend confirms/updates status via this event
4841
- */
4842
- interface UserMessageEvent {
4843
- type: 'user_message';
4844
- sessionId: string;
4845
- message: Message;
4846
- status: 'accepted' | 'queued' | 'processing';
4847
- /** Frontend's optimistic message ID for reliable matching */
4848
- optimisticMessageId?: string;
4849
- }
4850
- /**
4851
- * Message annotation update event
4852
- */
4853
- interface MessageAnnotationsUpdatedEvent {
4854
- type: 'message_annotations_updated';
4855
- sessionId: string;
4856
- messageId: string;
4857
- annotations: NonNullable<Message['annotations']>;
4858
- }
4859
- /**
4860
- * Session shared event - session was shared to viewer
4861
- */
4862
- interface SessionSharedEvent {
4863
- type: 'session_shared';
4864
- sessionId: string;
4865
- sharedUrl: string;
4866
- }
4867
- /**
4868
- * Session unshared event - session share was revoked
4869
- */
4870
- interface SessionUnsharedEvent {
4871
- type: 'session_unshared';
4872
- sessionId: string;
4873
- }
4874
- /**
4875
- * Auth request event - unified auth flow (credential or OAuth)
4876
- * Adds auth-request message to session and displays inline auth UI
4877
- */
4878
- interface AuthRequestEvent {
4879
- type: 'auth_request';
4880
- sessionId: string;
4881
- message: Message;
4882
- request: AuthRequest;
4883
- }
4884
- /**
4885
- * Auth completed event - auth request was completed (success, failure, or cancelled)
4886
- * Updates the auth-request message status
4887
- */
4888
- interface AuthCompletedEvent {
4889
- type: 'auth_completed';
4890
- sessionId: string;
4891
- requestId: string;
4892
- success: boolean;
4893
- cancelled?: boolean;
4894
- error?: string;
4895
- }
4896
- /**
4897
- * Source activated event - a source was auto-activated mid-turn
4898
- * Caller should re-send the original message to retry with the now-active source
4899
- */
4900
- interface SourceActivatedEvent {
4901
- type: 'source_activated';
4902
- sessionId: string;
4903
- sourceSlug: string;
4904
- originalMessage: string;
4905
- }
4906
- /**
4907
- * Usage update event - real-time context usage during processing
4908
- * Allows UI to show growing context as agent processes, not just on complete
4909
- */
4910
- interface UsageUpdateEvent {
4911
- type: 'usage_update';
4912
- sessionId: string;
4913
- tokenUsage: {
4914
- inputTokens: number;
4915
- contextWindow?: number;
4916
- };
4917
- }
4918
- /**
4919
- * Union of all agent events
4920
- */
4921
- type ChatEvent = TextDeltaEvent | TextCompleteEvent | ToolStartEvent | ToolDeltaEvent | ToolResultEvent | CompleteEvent | ErrorEvent | TypedErrorEvent | PermissionRequestEvent | CredentialRequestEvent | SourcesChangedEvent | LabelsChangedEvent | SessionStatusChangedEvent | SessionFlaggedEvent | SessionUnflaggedEvent | SessionArchivedEvent | SessionUnarchivedEvent | NameChangedEvent | PlanSubmittedEvent | StatusEvent | InfoEvent | InterruptedEvent | TitleGeneratedEvent | TitleRegeneratingEvent | AsyncOperationEvent | WorkingDirectoryChangedEvent | WorkingDirectoryErrorEvent | PermissionModeChangedEvent | SessionModelChangedEvent | LLMConnectionChangedEvent | TaskBackgroundedEvent | ShellBackgroundedEvent | TaskProgressEvent | TaskCompletedEvent | UserMessageEvent | MessageAnnotationsUpdatedEvent | SessionSharedEvent | SessionUnsharedEvent | AuthRequestEvent | AuthCompletedEvent | SourceActivatedEvent | UsageUpdateEvent;
4922
- /**
4923
- * Side effects that need to be handled outside the pure processor
4924
- */
4925
- type Effect = {
4926
- type: 'permission_request';
4927
- request: PermissionRequest;
4928
- } | {
4929
- type: 'credential_request';
4930
- request: CredentialRequest;
4931
- } | {
4932
- type: 'generate_title';
4933
- sessionId: string;
4934
- userMessage: string;
4935
- } | {
4936
- type: 'permission_mode_changed';
4937
- sessionId: string;
4938
- permissionMode: PermissionMode;
4939
- previousPermissionMode?: PermissionMode;
4940
- transitionDisplay?: string;
4941
- modeVersion?: number;
4942
- changedAt?: string;
4943
- changedBy?: 'user' | 'system' | 'restore' | 'automation' | 'unknown';
4944
- } | {
4945
- type: 'auto_retry';
4946
- sessionId: string;
4947
- originalMessage: string;
4948
- sourceSlug: string;
4949
- } | {
4950
- type: 'restore_input';
4951
- text: string;
4952
- } | {
4953
- type: 'toast_error';
4954
- message: string;
4955
- };
4956
- /**
4957
- * Result of processing an event
4958
- */
4959
- interface ProcessResult {
4960
- state: SessionState;
4961
- /** Side effects to execute (permissions, etc.) */
4962
- effects: Effect[];
4963
- }
4964
-
4965
- /**
4966
- * Event Processor
4967
- *
4968
- * Central pure function that processes all agent events.
4969
- * Guarantees consistent state transitions and always returns new references.
4970
- *
4971
- * Benefits:
4972
- * - Single source of truth for event handling
4973
- * - Pure functions - easy to test
4974
- * - No race conditions - single update path
4975
- * - Always new references - atom sync always works
4976
- * - Message lookup by ID - never position-based
4977
- */
4978
-
4979
- /**
4980
- * Process an agent event, returning new state and any side effects
4981
- *
4982
- * This is a PURE FUNCTION - no side effects, always returns new state.
4983
- * Guaranteed to return a new session reference (no referential equality issues).
4984
- *
4985
- * @param state - Current session state (session + streaming)
4986
- * @param event - Agent event to process
4987
- * @returns New state and any side effects to execute
4988
- */
4989
- declare function processEvent(state: SessionState, event: ChatEvent): ProcessResult;
4990
-
4991
- /**
4992
- * Map a core AgentEvent to the processor's session-scoped event format.
4993
- *
4994
- * Core AgentEvent is the raw SDK/runtime format. The processor expects
4995
- * session-scoped events with its own field names. Keeping this as a pure
4996
- * function makes local-runtime, tests, and React hooks share one mapping.
4997
- */
4998
- declare function mapCoreEventToProcessorEvent(coreEvent: AgentEvent, sessionId: string): ChatEvent;
4999
- declare function mapTimelineEnvelopeToProcessorEvent(envelope: TimelineEnvelope): ChatEvent;
5000
-
5001
- /**
5002
- * Message Operation Helpers
5003
- *
5004
- * Pure utility functions for finding and updating messages.
5005
- * All lookups are by ID (turnId, toolUseId) - NEVER by position.
5006
- */
5007
-
5008
- /**
5009
- * Generate a unique message ID
5010
- * Delegates to core's generateMessageId for uniqueness
5011
- */
5012
- declare function generateMessageId(): string;
5013
- /**
5014
- * Find streaming assistant message by turnId
5015
- * Falls back to last streaming assistant if no turnId
5016
- */
5017
- declare function findStreamingMessage(messages: Message[], turnId?: string): number;
5018
- /**
5019
- * Find assistant message by turnId (streaming or not)
5020
- */
5021
- declare function findAssistantMessage(messages: Message[], turnId?: string): number;
5022
- /**
5023
- * Find tool message by toolUseId
5024
- */
5025
- declare function findToolMessage(messages: Message[], toolUseId: string): number;
5026
- /**
5027
- * Update message at index, returning new session
5028
- * Always creates new references (immutable update)
5029
- * @param updateTimestamp - If true, also update lastMessageAt
5030
- */
5031
- declare function updateMessageAt(session: Session, index: number, updates: Partial<Message>, updateTimestamp?: boolean): Session;
5032
- /**
5033
- * Append message to session, returning new session
5034
- * @param updateTimestamp - If false, don't update lastMessageAt (for intermediate/tool messages)
5035
- */
5036
- declare function appendMessage(session: Session, message: Message, updateTimestamp?: boolean): Session;
5037
-
5038
- /**
5039
- * Event Source Interface
5040
- *
5041
- * Generic abstraction for receiving SessionEvent streams.
5042
- * Replaces Electron IPC (window.electronAPI.onSessionEvent) with
5043
- * a provider-agnostic interface that works in any runtime:
5044
- * - WebSocket (browser/server)
5045
- * - HTTP SSE (server)
5046
- * - stdin/stdout (CLI)
5047
- * - In-process (testing)
5048
- */
5049
-
5050
- /**
5051
- * Event source callback — receives events from the source.
5052
- */
5053
- type EventSourceCallback = (event: AgentEvent) => void;
5054
- /**
5055
- * Error callback — receives errors from the source.
5056
- */
5057
- type EventSourceErrorCallback = (error: Error) => void;
5058
- /**
5059
- * Close callback — called when the source is disconnected.
5060
- */
5061
- type EventSourceCloseCallback = () => void;
5062
- /**
5063
- * Generic event source interface.
5064
- * Implementations provide events from different transports.
5065
- */
5066
- interface EventSource {
5067
- /**
5068
- * Start receiving events.
5069
- * @param onEvent - Callback for each AgentEvent
5070
- * @param onError - Callback for transport errors
5071
- * @param onClose - Callback when source disconnects
5072
- */
5073
- connect(onEvent: EventSourceCallback, onError?: EventSourceErrorCallback, onClose?: EventSourceCloseCallback): void;
5074
- /**
5075
- * Stop receiving events and clean up resources.
5076
- */
5077
- disconnect(): void;
5078
- /**
5079
- * Check if the source is currently connected.
5080
- */
5081
- isConnected(): boolean;
5082
- }
5083
- /**
5084
- * WebSocket-based EventSource implementation.
5085
- * Receives SessionEvent messages over a WebSocket connection.
5086
- */
5087
- declare class WebSocketEventSource implements EventSource {
5088
- private ws;
5089
- private connected;
5090
- private url;
5091
- private protocols?;
5092
- constructor(url: string, protocols?: string | string[]);
5093
- connect(onEvent: EventSourceCallback, onError?: EventSourceErrorCallback, onClose?: EventSourceCloseCallback): void;
5094
- disconnect(): void;
5095
- isConnected(): boolean;
5096
- }
5097
- /**
5098
- * SSE (Server-Sent Events) EventSource implementation.
5099
- * Receives SessionEvent messages over an HTTP SSE connection.
5100
- */
5101
- declare class SSEEventSource implements EventSource {
5102
- private source;
5103
- private connected;
5104
- private url;
5105
- constructor(url: string);
5106
- connect(onEvent: EventSourceCallback, onError?: EventSourceErrorCallback, onClose?: EventSourceCloseCallback): void;
5107
- disconnect(): void;
5108
- isConnected(): boolean;
5109
- }
5110
- /**
5111
- * In-process EventSource for testing.
5112
- * Events are pushed directly via enqueue().
5113
- */
5114
- declare class InProcessEventSource implements EventSource {
5115
- private listeners;
5116
- private connected;
5117
- connect(onEvent: EventSourceCallback, onError?: EventSourceErrorCallback, onClose?: EventSourceCloseCallback): void;
5118
- disconnect(): void;
5119
- isConnected(): boolean;
5120
- /**
5121
- * Push an event directly to the connected listener.
5122
- * Useful for testing and in-process scenarios.
5123
- */
5124
- enqueue(event: AgentEvent): void;
5125
- /**
5126
- * Simulate an error.
5127
- */
5128
- simulateError(error: Error): void;
5129
- /**
5130
- * Simulate a disconnect.
5131
- */
5132
- simulateClose(): void;
5133
- }
5134
-
5135
- /**
5136
- * Event Processor Hook
5137
- *
5138
- * Provides the event processor for use in React apps.
5139
- * Manages streaming state per session and returns processed events.
5140
- *
5141
- * Accepts an EventSource (WebSocket, SSE, in-process) instead of
5142
- * Electron IPC (window.electronAPI). Uses React useState/useRef
5143
- * instead of Jotai atoms for state management.
5144
- */
5145
-
5146
- interface UseEventProcessorOptions {
5147
- /** EventSource to receive agent events from */
5148
- eventSource: EventSource;
5149
- /** Session ID to associate with incoming events */
5150
- sessionId: string;
5151
- /** Workspace ID for creating new sessions */
5152
- workspaceId: string;
5153
- /** Workspace name for creating new sessions */
5154
- workspaceName?: string;
5155
- /** Callback for side effects (permissions, toasts, etc.) */
5156
- onEffect?: (effect: Effect) => void;
5157
- /** Callback for errors from the event source */
5158
- onError?: (error: Error) => void;
5159
- /** Callback when event source disconnects */
5160
- onClose?: () => void;
5161
- }
5162
- interface UseEventProcessorResult {
5163
- /** Current session state (messages, processing status, etc.) */
5164
- session: Session | null;
5165
- /** Current streaming state for the session */
5166
- streamingState: StreamingState | null;
5167
- /**
5168
- * Process an agent event and return the updated session + any side effects
5169
- *
5170
- * @param event - The core AgentEvent to process
5171
- * @returns Updated session and any side effects to execute
5172
- */
5173
- processAgentEvent: (event: AgentEvent) => {
5174
- session: Session;
5175
- effects: Effect[];
5176
- };
5177
- /**
5178
- * Clear streaming state for the session (e.g., on error or complete)
5179
- */
5180
- clearStreamingState: () => void;
5181
- /**
5182
- * Get current streaming state (for debugging/testing)
5183
- */
5184
- getStreamingState: () => StreamingState | null;
5185
- /**
5186
- * Whether the event source is currently connected
5187
- */
5188
- isConnected: boolean;
5189
- }
5190
- /**
5191
- * Hook that provides the event processor connected to an EventSource.
5192
- *
5193
- * Manages streaming state per session using React useRef (not Jotai atoms).
5194
- * All event processing goes through pure functions.
5195
- *
5196
- * Connects to the EventSource on mount and disconnects on unmount.
5197
- */
5198
- declare function useEventProcessor(options: UseEventProcessorOptions): UseEventProcessorResult;
5199
-
5200
- export { ActivityDetailsPanel, ActivityInspector, type ActivityItem, type ActivityStatus, AnnotationIslandMenu, type AnnotationIslandMenuProps, type AnnotationOverlayChip, type AnnotationOverlayGeometryResult, AnnotationOverlayLayer, type AnnotationOverlayLayerProps, type AnnotationOverlayRect, type AssistantTurn, AssistantTurnCard, type AuthRequestTurn, type ChatEvent, ChatTranscript, type ChatTranscriptProps, CodeBlock, CollapsibleMarkdownProvider, type Effect, type EventSource, type EventSourceCallback, type EventSourceCloseCallback, type EventSourceErrorCallback, InProcessEventSource, type InlineActivityItem, InlineCode, InlineExecution, type InlineExecutionProps, type InlineExecutionStatus, type IslandTransitionConfig, Markdown, type MarkdownProps, MemoizedMarkdown, PendingIndicator, type PendingIndicatorProps, PermissionModeMenu, PermissionRequestCard, type PermissionRequestCardProps, type PlatformActions, PlatformProvider, type PointerSnapshot, type ProcessResult, type RenderMode, ResponseCard, type ResponseCardProps, type ResponseContent, SIZE_CONFIG, SSEEventSource, type Session, type SessionState, SessionViewer, type SessionViewerMode, type SessionViewerProps, type StreamingState, SystemMessage, type SystemMessageProps, type SystemMessageType, type SystemTurn, type TextSegment, type TodoItem, type Turn, TurnCard, type TurnCardProps, UserMessageBubble, type UserMessageBubbleProps, type UserTurn, WebSocketEventSource, appendMessage, buildAnnotationChipEntryTransition, buildSelectionEntryTransition, collectTextSegments, computeAnnotationOverlayGeometry, createSelectionPreviewAnnotation, createTextSelectionAnnotation, findAssistantMessage, findStreamingMessage, findToolMessage, generateMessageId, getAssistantTurnUiKey, getCanonicalText, groupMessagesByTurn, hasExistingTextRangeAnnotation, mapCoreEventToProcessorEvent, mapTimelineEnvelopeToProcessorEvent, processEvent, resolveNodeOffset, shouldShowStreamingContent, updateMessageAt, useEventProcessor };
5201
-
5202
- // -- @weft/ui/lib/en-fallback.d.ts --
5203
- /**
5204
- * English fallback translations for UI components.
5205
- *
5206
- * Used by:
5207
- * - `TurnCard.tsx` `t()` wrapper — when i18next is uninitialized or has no resource for a key
5208
- * - `apps/demo/src/i18n-init.ts` — as the primary `en` resource bundle
5209
- *
5210
- * Single source of truth — add new keys here, both consumers stay synchronized.
5211
- */
5212
- declare const EN_FALLBACK: Record<string, string>;
5213
-
5214
- export { EN_FALLBACK };
5215
-
5216
- // ── inlined from @weft/local-chat ──
5217
- // -- @weft/local-chat/index.d.ts --
5218
- import * as react_jsx_runtime from 'react/jsx-runtime';
5219
-
5220
- interface LocalChatAuthDetection {
5221
- provider: string;
5222
- configured: boolean;
5223
- source?: string;
5224
- error?: string;
5225
- }
5226
- interface LocalChatRuntimeState {
5227
- status: 'idle' | 'preflighting' | 'running' | 'ready' | 'failed' | string;
5228
- }
5229
- interface LocalChatEventSource {
5230
- connect(onEvent: (event: AgentEvent) => void, onError?: (error: Error) => void, onClose?: () => void): void;
5231
- disconnect(): void;
5232
- isConnected(): boolean;
5233
- }
5234
- interface LocalChatCommandSink {
5235
- sendMessage(message: string): Promise<void>;
5236
- abort(reason?: string): Promise<void>;
5237
- respondToPermission(requestId: string, allowed: boolean, remember?: boolean): Promise<void>;
5238
- }
5239
- interface LocalChatSessionRuntime {
5240
- sessionId: string;
5241
- provider: string;
5242
- events: LocalChatEventSource;
5243
- commands: LocalChatCommandSink;
5244
- preflight(): Promise<LocalChatAuthDetection>;
5245
- getState(): LocalChatRuntimeState;
5246
- }
5247
- interface AgentChatSessionModel {
5248
- session: Session | null;
5249
- turns: Turn[];
5250
- isRunning: boolean;
5251
- auth: LocalChatAuthDetection | null;
5252
- error: Error | null;
5253
- sendMessage(message: string): Promise<void>;
5254
- abort(): Promise<void>;
5255
- respondToPermission(requestId: string, allowed: boolean, remember?: boolean): Promise<void>;
5256
- }
5257
- interface UseAgentChatSessionOptions {
5258
- runtime: LocalChatSessionRuntime;
5259
- workspaceId?: string;
5260
- workspaceName?: string;
5261
- }
5262
- interface TimelineChatPanelModel {
5263
- session: Session;
5264
- turns: Turn[];
5265
- }
5266
- type TimelineDetailKind = 'permission' | 'runtime' | 'source' | 'skill' | 'automation' | 'host' | 'tool';
5267
- interface TimelineDetailItem {
5268
- id: string;
5269
- kind: TimelineDetailKind;
5270
- title: string;
5271
- summary?: string;
5272
- status?: string;
5273
- timestamp: number;
5274
- detail: unknown;
5275
- envelope: TimelineEnvelope;
5276
- }
5277
- interface TimelineAgentChatSessionModel extends TimelineChatPanelModel {
5278
- timeline: TimelineEnvelope[];
5279
- isRunning: boolean;
5280
- isConnected: boolean;
5281
- isReconnecting: boolean;
5282
- hasGap: boolean;
5283
- capabilityReport: RuntimeCapabilityReport | null;
5284
- error: Error | null;
5285
- sendMessage(message: string, options?: SendMessageOptions): Promise<void>;
5286
- abort(): Promise<void>;
5287
- respondToPermission(requestId: string, allowed: boolean, remember?: boolean): Promise<void>;
5288
- }
5289
- interface UseTimelineAgentChatSessionOptions {
5290
- runtime: AgentRuntime;
5291
- workspaceId?: string;
5292
- workspaceName?: string;
5293
- }
5294
- declare function createAgentChatPanelModel(args: {
5295
- session: Session | null;
5296
- runtime: LocalChatSessionRuntime;
5297
- auth?: LocalChatAuthDetection | null;
5298
- error?: Error | null;
5299
- }): Pick<AgentChatSessionModel, 'turns' | 'isRunning' | 'auth' | 'error'>;
5300
- declare function createAgentChatPanelModelFromTimeline(args: {
5301
- timeline: TimelineEnvelope[];
5302
- sessionId: string;
5303
- workspaceId: string;
5304
- workspaceName?: string;
5305
- }): TimelineChatPanelModel;
5306
- declare function createTimelineAgentChatPanelModel(args: {
5307
- timeline: TimelineEnvelope[];
5308
- sessionId: string;
5309
- workspaceId: string;
5310
- workspaceName?: string;
5311
- runtimeState: AgentRuntimeState;
5312
- capabilityReport: RuntimeCapabilityReport | null;
5313
- error: Error | null;
5314
- }): Pick<TimelineAgentChatSessionModel, 'session' | 'turns' | 'isRunning' | 'capabilityReport' | 'error'>;
5315
- declare function createTimelineDetailItems(timeline: TimelineEnvelope[]): TimelineDetailItem[];
5316
- declare function useAgentChatSession(options: UseAgentChatSessionOptions): AgentChatSessionModel;
5317
- declare function useTimelineAgentChatSession(options: UseTimelineAgentChatSessionOptions): TimelineAgentChatSessionModel;
5318
-
5319
- interface AgentChatPanelProps {
5320
- runtime: LocalChatSessionRuntime;
5321
- workspaceId?: string;
5322
- workspaceName?: string;
5323
- platformActions?: PlatformActions;
5324
- placeholder?: string;
5325
- className?: string;
5326
- }
5327
- declare function AgentChatPanel({ runtime, workspaceId, workspaceName, platformActions, placeholder, className, }: AgentChatPanelProps): react_jsx_runtime.JSX.Element;
5328
-
5329
- interface TimelineAgentChatPanelProps {
5330
- /** Agent runtime instance from runtime-core */
5331
- runtime: AgentRuntime;
5332
- /** Workspace identifier */
5333
- workspaceId?: string;
5334
- /** Workspace display name */
5335
- workspaceName?: string;
5336
- /** Platform actions for file/URL handling */
5337
- platformActions?: PlatformActions;
5338
- /** Placeholder text for the input area */
5339
- placeholder?: string;
5340
- /** Whether to show the runtime status bar */
5341
- showStatusBar?: boolean;
5342
- /** Whether to show the runtime detail sidebar panel */
5343
- showDetailPanel?: boolean;
5344
- /** Additional className */
5345
- className?: string;
5346
- }
5347
- declare function TimelineAgentChatPanel({ runtime, workspaceId, workspaceName, platformActions, placeholder, showStatusBar, showDetailPanel, className, }: TimelineAgentChatPanelProps): react_jsx_runtime.JSX.Element;
5348
-
5349
- /**
5350
- * Find the active (unresolved) permission request from timeline envelopes.
5351
- *
5352
- * Walks the timeline backwards to find the most recent permission_requested
5353
- * envelope that has not been resolved by a matching permission_resolved.
5354
- */
5355
- declare function findActivePermissionRequest(timeline: TimelineEnvelope[]): {
5356
- requestId: string;
5357
- toolName: string;
5358
- input?: Record<string, unknown>;
5359
- reason?: string;
5360
- scope?: {
5361
- type: string;
5362
- label?: string;
5363
- };
5364
- } | null;
5365
-
5366
- /**
5367
- * Convert a processor Session (returned by useAgentChatSession) into a
5368
- * StoredSession that SessionViewer can render.
5369
- *
5370
- * Consumers embedding AgentChatPanel don't need this — it's called internally.
5371
- * This utility is exported for consumers who use useAgentChatSession directly
5372
- * and build their own panel around SessionViewer.
5373
- */
5374
- declare function toStoredSession(session: Session, fallbackWorkspaceId?: string): StoredSession;
5375
- /**
5376
- * Build an empty StoredSession placeholder for the initial state
5377
- * before the event processor has received any events.
5378
- */
5379
- declare function createEmptyStoredSession(sessionId: string, workspaceId?: string, workspaceName?: string): StoredSession;
5380
-
5381
- export { AgentChatPanel, type AgentChatPanelProps, type AgentChatSessionModel, type LocalChatAuthDetection, type LocalChatCommandSink, type LocalChatEventSource, type LocalChatRuntimeState, type LocalChatSessionRuntime, TimelineAgentChatPanel, type TimelineAgentChatPanelProps, type TimelineAgentChatSessionModel, type TimelineChatPanelModel, type TimelineDetailItem, type TimelineDetailKind, type UseAgentChatSessionOptions, type UseTimelineAgentChatSessionOptions, createAgentChatPanelModel, createAgentChatPanelModelFromTimeline, createEmptyStoredSession, createTimelineAgentChatPanelModel, createTimelineDetailItems, findActivePermissionRequest, toStoredSession, useAgentChatSession, useTimelineAgentChatSession };