@pluno/product-agent-web 0.1.220 → 0.1.223

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +8 -0
  2. package/dist/activeUsersCounter.d.ts +0 -7
  3. package/dist/adapters/web/activeUsers.d.ts +4 -0
  4. package/dist/adapters/web/backendHttp.d.ts +12 -0
  5. package/dist/adapters/web/backendTransport.d.ts +55 -0
  6. package/dist/adapters/web/directoryAdapters.d.ts +85 -0
  7. package/dist/adapters/web/directoryScope.d.ts +42 -0
  8. package/dist/adapters/web/modelScope.d.ts +3 -0
  9. package/dist/adapters/web/socketIOTransport.d.ts +74 -0
  10. package/dist/chatPresentation.d.ts +2 -0
  11. package/dist/core/active-users/reducer.d.ts +47 -0
  12. package/dist/core/index.d.ts +5 -0
  13. package/dist/core/model-selection/commands.d.ts +22 -0
  14. package/dist/core/model-selection/contracts.d.ts +3 -1
  15. package/dist/core/model-selection/events.d.ts +15 -0
  16. package/dist/core/model-selection/reducer.d.ts +4 -0
  17. package/dist/core/model-selection/selectors.d.ts +10 -0
  18. package/dist/core/model-selection/state.d.ts +22 -0
  19. package/dist/core/protocol/modelRouting.d.ts +2 -0
  20. package/dist/core/session-directory/contracts.d.ts +202 -0
  21. package/dist/core/session-directory/membership.d.ts +4 -0
  22. package/dist/core/session-directory/reducer.d.ts +4 -0
  23. package/dist/core/session-directory/selectors.d.ts +2 -0
  24. package/dist/core/session-directory/state.d.ts +6 -0
  25. package/dist/index.d.ts +29 -16
  26. package/dist/interruptState.d.ts +2 -0
  27. package/dist/product-agent-runtime.cjs +1 -1
  28. package/dist/product-agent-runtime.js +384 -315
  29. package/dist/product-agent-sdk.js +7643 -3448
  30. package/dist/product-agent-widget.js +8818 -4752
  31. package/dist/public/operationRoutes.d.ts +1 -0
  32. package/dist/runtime/composition.d.ts +27 -7
  33. package/dist/runtime/modelSelection.d.ts +14 -0
  34. package/dist/runtimeClient.d.ts +10 -0
  35. package/dist/sessionRecoveryPolling.d.ts +3 -0
  36. package/dist/timelineReconciliation.d.ts +1 -0
  37. package/dist/uiInvariants.d.ts +6 -0
  38. package/dist/widget.d.ts +1 -0
  39. package/package.json +4 -1
@@ -0,0 +1,202 @@
1
+ import type { PAEffectHandlers } from "../kernel/effects";
2
+ import type { PAAuthorityId, PAClientScopeId, PAConversationScopeId, PAQueryState, PARequestId, PASessionId, PAViewId } from "../kernel/state";
3
+ import type { PATransportedError } from "../protocol/errors";
4
+ import type { PAJsonValue } from "../protocol/json";
5
+ export type PAConversationMetadata = Readonly<{
6
+ conversation_id: PASessionId;
7
+ version: number;
8
+ conversation: Readonly<{
9
+ id: PASessionId;
10
+ user_id: string;
11
+ community_id: string | null;
12
+ product_variant: "personal" | "customer_embedded";
13
+ created_at: string;
14
+ last_activity_at: string;
15
+ pinned: boolean;
16
+ title: string | null;
17
+ title_source: "generated" | "user";
18
+ }>;
19
+ automation_id: string | null;
20
+ automation_run_id: string | null;
21
+ first_user_message?: string | null;
22
+ current_page?: PAJsonValue;
23
+ is_active?: boolean | null;
24
+ }>;
25
+ export type PADirectoryOptimisticEntry = Readonly<{
26
+ id: string;
27
+ clientMessageId: string;
28
+ sessionId: PASessionId | null;
29
+ firstUserMessage: string;
30
+ currentPage: PAJsonValue;
31
+ createdAt: string;
32
+ isActive: boolean;
33
+ }>;
34
+ export type PAConversationDirectoryPage = Readonly<{
35
+ entries: readonly PAConversationMetadata[];
36
+ next_cursor: string | null;
37
+ }>;
38
+ export type PADirectoryAuthority = Readonly<{
39
+ authorityId: PAAuthorityId;
40
+ generation: number;
41
+ }>;
42
+ export type PADirectoryQuery = Readonly<{
43
+ kind: "recent" | "pinned";
44
+ origin: string | null;
45
+ limit: number;
46
+ }>;
47
+ export type PADirectoryQueryState = PAQueryState<string, readonly PASessionId[]> & Readonly<{
48
+ query: PADirectoryQuery;
49
+ requestSequence: number;
50
+ mode: "replace" | "append";
51
+ invalidated: boolean;
52
+ startedAtMetadataRevision: number;
53
+ startedAtActivityRevisionBySessionId: Readonly<Record<string, number>>;
54
+ pageData: readonly PASessionId[];
55
+ }>;
56
+ export type PADirectoryPatch = Readonly<{
57
+ title?: string;
58
+ pinned?: boolean;
59
+ }>;
60
+ export type PADirectoryMutation = Readonly<{
61
+ requestId: PARequestId;
62
+ value: string | boolean;
63
+ status: "pending" | "failed";
64
+ error: PATransportedError | null;
65
+ }>;
66
+ export type PAMembership = Readonly<{
67
+ members: readonly PAClientScopeId[];
68
+ mainClientScopeId: PAClientScopeId | null;
69
+ }>;
70
+ export type PAMainReplacement = Readonly<{
71
+ sessionId: PASessionId;
72
+ membershipRevision: number;
73
+ clientScopeId: PAClientScopeId;
74
+ }>;
75
+ export type PAConversationSelection = Readonly<{
76
+ sessionId: PASessionId | null;
77
+ provisionalId: string | null;
78
+ }>;
79
+ export type PADirectoryState = Readonly<{
80
+ authorityId: PAAuthorityId | null;
81
+ generation: number;
82
+ entities: Readonly<Record<string, PAConversationMetadata>>;
83
+ optimisticEntries: Readonly<Record<string, PADirectoryOptimisticEntry>>;
84
+ durableActivityBySessionId: Readonly<Record<string, boolean>>;
85
+ activityBySessionId: Readonly<Record<string, boolean>>;
86
+ activityRevisionBySessionId: Readonly<Record<string, number>>;
87
+ activityRevision: number;
88
+ queries: Readonly<Record<string, PADirectoryQueryState>>;
89
+ mutations: Readonly<Record<string, Readonly<Partial<Record<"title" | "pinned", PADirectoryMutation>>>>>;
90
+ metadataRevision: number;
91
+ membershipRevision: number;
92
+ clients: Readonly<Record<string, PAConversationScopeId>>;
93
+ selections: Readonly<Record<string, PAConversationSelection>>;
94
+ memberships: Readonly<Record<string, PAMembership>>;
95
+ views: Readonly<Record<string, PAClientScopeId>>;
96
+ requestSequence: number;
97
+ requests: Readonly<Record<string, PADirectoryRequest>>;
98
+ }>;
99
+ export type PADirectoryQueryRequest = PADirectoryAuthority & Readonly<{
100
+ requestId: PARequestId;
101
+ query: PADirectoryQuery;
102
+ cursor: string | null;
103
+ }>;
104
+ export type PADirectoryMutationRequest = PADirectoryAuthority & Readonly<{
105
+ requestId: PARequestId;
106
+ sessionId: PASessionId;
107
+ patch: PADirectoryPatch;
108
+ }>;
109
+ export type PADirectoryRequest = Readonly<{
110
+ kind: "directory.query";
111
+ input: PADirectoryQueryRequest;
112
+ }> | Readonly<{
113
+ kind: "directory.mutate";
114
+ input: PADirectoryMutationRequest;
115
+ }>;
116
+ export type PADirectoryEffects = {
117
+ "directory.query": {
118
+ input: PADirectoryQueryRequest;
119
+ output: PAConversationDirectoryPage & Readonly<{
120
+ updatedAt: number;
121
+ }>;
122
+ };
123
+ "directory.mutate": {
124
+ input: PADirectoryMutationRequest;
125
+ output: PAConversationMetadata;
126
+ };
127
+ };
128
+ export type PADirectoryPorts = PAEffectHandlers<PADirectoryEffects>;
129
+ export type PADirectoryCommand = PADirectoryAuthority & (Readonly<{
130
+ type: "directory.authority_replace";
131
+ expectedGeneration: number;
132
+ }> | Readonly<{
133
+ type: "directory.query";
134
+ query: PADirectoryQuery;
135
+ requestId: PARequestId;
136
+ mode: "replace" | "append";
137
+ cursor?: string | null;
138
+ }> | Readonly<{
139
+ type: "directory.invalidate";
140
+ }> | Readonly<{
141
+ type: "directory.optimistic_upsert";
142
+ entry: PADirectoryOptimisticEntry;
143
+ }> | Readonly<{
144
+ type: "directory.optimistic_accept";
145
+ clientMessageId: string;
146
+ sessionId: PASessionId;
147
+ }> | Readonly<{
148
+ type: "directory.optimistic_remove";
149
+ clientMessageId: string;
150
+ }> | Readonly<{
151
+ type: "directory.activity_set";
152
+ sessionId: PASessionId;
153
+ active: boolean;
154
+ }> | Readonly<{
155
+ type: "directory.mutate";
156
+ sessionId: PASessionId;
157
+ requestId: PARequestId;
158
+ patch: PADirectoryPatch;
159
+ }> | Readonly<{
160
+ type: "directory.bind";
161
+ clientScopeId: PAClientScopeId;
162
+ conversationScopeId: PAConversationScopeId;
163
+ sessionId: PASessionId;
164
+ reason: "user" | "tool";
165
+ replacement: PAMainReplacement | null;
166
+ }> | Readonly<{
167
+ type: "directory.provisional";
168
+ clientScopeId: PAClientScopeId;
169
+ conversationScopeId: PAConversationScopeId;
170
+ provisionalId: string;
171
+ replacement: PAMainReplacement | null;
172
+ }> | Readonly<{
173
+ type: "directory.accepted";
174
+ conversationScopeId: PAConversationScopeId;
175
+ provisionalId: string;
176
+ sessionId: PASessionId;
177
+ }> | Readonly<{
178
+ type: "directory.detach";
179
+ clientScopeId: PAClientScopeId;
180
+ replacement: PAMainReplacement | null;
181
+ }> | Readonly<{
182
+ type: "directory.view_attach";
183
+ viewId: PAViewId;
184
+ clientScopeId: PAClientScopeId;
185
+ }> | Readonly<{
186
+ type: "directory.view_detach";
187
+ viewId: PAViewId;
188
+ }>);
189
+ export type PADirectoryEvent = PADirectoryAuthority & Readonly<{
190
+ type: "directory.metadata_received";
191
+ metadata: PAConversationMetadata;
192
+ }>;
193
+ export type PADirectoryIntent = Readonly<{
194
+ observe: boolean;
195
+ titleClientScopeId: PAClientScopeId | null;
196
+ title: string | null;
197
+ groupClientScopeIds: readonly PAClientScopeId[];
198
+ }>;
199
+ export type PADirectoryProjection = Omit<PADirectoryState, "views" | "durableActivityBySessionId" | "activityRevisionBySessionId" | "activityRevision"> & Readonly<{
200
+ intents: Readonly<Record<string, PADirectoryIntent>>;
201
+ views: Readonly<Record<string, PAConversationSelection | null>>;
202
+ }>;
@@ -0,0 +1,4 @@
1
+ import type { PAClientScopeId, PASessionId } from "../kernel/state";
2
+ import type { PADirectoryCommand, PADirectoryState } from "./contracts";
3
+ export declare function reduceDirectoryMembership(state: PADirectoryState, input: PADirectoryCommand): PADirectoryState;
4
+ export declare function isDirectoryTabEligible(state: PADirectoryState, client: PAClientScopeId, sessionId: PASessionId): boolean;
@@ -0,0 +1,4 @@
1
+ import type { PAEffectResultEvent } from "../kernel/effects";
2
+ import type { PAReduction } from "../kernel/reducer";
3
+ import type { PADirectoryCommand, PADirectoryEffects, PADirectoryEvent, PADirectoryState } from "./contracts";
4
+ export declare function reduceDirectory(state: PADirectoryState, input: PADirectoryCommand | PADirectoryEvent | PAEffectResultEvent<PADirectoryEffects>): PAReduction<PADirectoryState, PADirectoryEffects>;
@@ -0,0 +1,2 @@
1
+ import type { PADirectoryProjection, PADirectoryState } from "./contracts";
2
+ export declare function selectDirectory(state: PADirectoryState): PADirectoryProjection;
@@ -0,0 +1,6 @@
1
+ import type { PADirectoryQuery, PADirectoryQueryState, PADirectoryState } from "./contracts";
2
+ export declare function freezeDirectoryValue<T>(value: T): T;
3
+ export declare function createDirectoryState(): PADirectoryState;
4
+ export declare function directoryQueryKey(query: PADirectoryQuery): string;
5
+ export declare function selectDirectoryPagesForOrigin(queries: Readonly<Record<string, PADirectoryQueryState>>, origin: string | null): readonly PADirectoryQueryState[];
6
+ export declare function selectCombinedDirectoryPage(pages: readonly PADirectoryQueryState[]): PADirectoryQueryState | undefined;
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { ActiveUsersCounterValue } from "./activeUsersCounter";
1
2
  import type { ProductAgentTaskStatus } from "./taskPageTitle";
2
3
  import type { ProductAgentEntityQueryData, ProductAgentAccountProjection, ProductAgentInteraction, ProductAgentInteractionAction, ProductAgentQueryState } from "./runtimeState";
3
4
  export type ProductAgentModel = "anthropic/claude-opus-5" | "anthropic/claude-sonnet-5" | "deepseek/deepseek-chat-v3.1" | "deepseek/deepseek-v4-flash" | "gpt-5.4-nano" | "gpt-5.4-mini" | "gpt-5.4" | "gpt-5.6-luna" | "gpt-5.6-terra" | "gpt-5.6-sol";
@@ -129,6 +130,7 @@ export type ProductAgentAppearance = {
129
130
  };
130
131
  export type ProductAgentTurnPhase = "sending" | "starting" | "thinking";
131
132
  export type ProductAgentState = {
133
+ activeUsersCount?: number | null;
132
134
  status: "idle" | "connecting" | "connected" | "reconnecting" | "closed" | "error";
133
135
  user: ProductAgentUser | null;
134
136
  sessionId: string | null;
@@ -164,6 +166,7 @@ export declare class ProductAgentTokenProviderError extends Error {
164
166
  constructor(message: string, retryable: boolean, status?: number | undefined, retryAfterMs?: number | undefined);
165
167
  }
166
168
  export type ProductAgentInitOptions = {
169
+ activeUsersLoader?: () => Promise<ActiveUsersCounterValue>;
167
170
  token?: string;
168
171
  tokenProvider?: (context?: ProductAgentTokenProviderContext) => Promise<string>;
169
172
  backendUrl?: string;
@@ -180,6 +183,7 @@ export type ProductAgentInitOptions = {
180
183
  restorePersistedState?: boolean;
181
184
  expectedPersistedSessionId?: string | null;
182
185
  runtimeCommunityId?: string;
186
+ localRuntimeClientId?: string | null;
183
187
  automationRunId?: string;
184
188
  keepRunsActiveOnSessionNavigation?: boolean;
185
189
  capturePageContent?: boolean;
@@ -283,6 +287,8 @@ export declare class ProductAgentSessionEngine {
283
287
  private connectionAttemptId;
284
288
  private connectionInProgress;
285
289
  private token;
290
+ private rejectedTransportToken;
291
+ private refreshingDefaultCredentials;
286
292
  private tokenExpiresAtMs;
287
293
  private tokenRequest;
288
294
  private tokenAbortController;
@@ -292,18 +298,20 @@ export declare class ProductAgentSessionEngine {
292
298
  private networkBatchTimer;
293
299
  private queuedNetworkEvents;
294
300
  private queuedClientEvents;
301
+ private readonly pendingRetainedCommandDeliveries;
295
302
  private pendingWidgetLifecycleEvents;
296
303
  private pendingPassiveWarmupEvent;
297
304
  private pendingComposerWarmup;
298
305
  private activeComposerWarmupId;
299
306
  private activeComposerWarmupScope;
300
307
  private pendingWarmupAckTimer;
301
- private pendingSessionHistoryRequests;
302
- private readonly sessionHistoryManager;
303
- private readonly sessionRecoveryPoller;
304
- private readonly sessionActivityRecovery;
305
- private readonly sessionActivityRecoveryPoller;
306
- private sessionRecoveryScope;
308
+ private directoryAuthority;
309
+ private readonly directoryHttp;
310
+ private directoryScope;
311
+ private directoryObservation;
312
+ private directoryConversationScopeId;
313
+ private directoryProvisionalId;
314
+ private readonly conversationRecoveries;
307
315
  private account;
308
316
  private usingPaidCreditFallback;
309
317
  private readonly accountListeners;
@@ -314,8 +322,6 @@ export declare class ProductAgentSessionEngine {
314
322
  private integrationAuthStatusByRequestId;
315
323
  private integrationAuthErrorByRequestId;
316
324
  private tabGroupsPermissionNeeded;
317
- private pendingSessionPinRequests;
318
- private pendingSessionRenameRequests;
319
325
  private sessionLoadRequestId;
320
326
  private sessionLoadRequestTimer;
321
327
  private pendingSessionSubscription;
@@ -348,7 +354,7 @@ export declare class ProductAgentSessionEngine {
348
354
  private pendingClientMessageId;
349
355
  private pendingUserMessageEvent;
350
356
  private failedUserMessageEvent;
351
- private personalModelSelectionOverride;
357
+ private readonly modelClientScopeId;
352
358
  private activeClientMessageId;
353
359
  private activeRunAckObserved;
354
360
  private activeResponseUserMessageId;
@@ -363,6 +369,7 @@ export declare class ProductAgentSessionEngine {
363
369
  private readonly attachmentFiles;
364
370
  private sessionBrowserApisCleanup;
365
371
  private readonly activeBrowserToolCalls;
372
+ private readonly cancelledSubmissions;
366
373
  private readonly stoppedTurns;
367
374
  private readonly pendingToolLoadingByCallId;
368
375
  private readonly terminalToolCallIds;
@@ -376,6 +383,12 @@ export declare class ProductAgentSessionEngine {
376
383
  private state;
377
384
  private constructor();
378
385
  static init(options: ProductAgentInitOptions): Promise<ProductAgentSessionEngine>;
386
+ private createConversationRecovery;
387
+ private createDirectoryAdapters;
388
+ private initializeDirectory;
389
+ private handleDirectoryTransportError;
390
+ private beginDirectoryProvisional;
391
+ private selectDirectorySession;
379
392
  on<T extends EventName>(eventName: T, listener: Listener<T>): () => void;
380
393
  getState(): ProductAgentState;
381
394
  stageProactiveSuggestionQuestion(question: string): void;
@@ -407,6 +420,7 @@ export declare class ProductAgentSessionEngine {
407
420
  private updateAttachmentInState;
408
421
  private prepareEmbedAttachmentUpload;
409
422
  private fetchEmbedAttachmentUpload;
423
+ private getStopClientMessageId;
410
424
  stop(): void;
411
425
  startNewSession(options?: {
412
426
  notifyTransport?: boolean;
@@ -422,6 +436,9 @@ export declare class ProductAgentSessionEngine {
422
436
  loadMoreSessionHistory(): Promise<void>;
423
437
  setSessionPinned(sessionId: string, pinned: boolean): Promise<void>;
424
438
  renameSession(sessionId: string, title: string): Promise<void>;
439
+ private getDirectoryQuery;
440
+ private toSessionHistoryEntry;
441
+ private refreshDirectoryQuery;
425
442
  getInteractions(): readonly ProductAgentInteraction[];
426
443
  subscribeInteractions(listener: (interactions: readonly ProductAgentInteraction[]) => void): () => void;
427
444
  actOnInteraction(interactionId: string, action: ProductAgentInteractionAction, expectedRevision: number, input?: {
@@ -460,6 +477,7 @@ export declare class ProductAgentSessionEngine {
460
477
  private clearStarterPromptUrlRefreshTimer;
461
478
  private flushQueuedClientEvents;
462
479
  private resetForAuthenticationScopeChange;
480
+ private applyAuthenticatedDirectoryIdentity;
463
481
  private rememberSessionTimeline;
464
482
  private getCachedSessionTimeline;
465
483
  private flushPendingWidgetLifecycleEvents;
@@ -484,12 +502,7 @@ export declare class ProductAgentSessionEngine {
484
502
  private handleRetryableRecoveryError;
485
503
  private clearRetryTimers;
486
504
  private rememberUserMessageClientMessageIds;
487
- private rejectPendingSessionHistoryRequests;
488
505
  private clearSessionLoadRequest;
489
- private sendSessionMutation;
490
- private resolvePendingSessionMutation;
491
- private rejectPendingSessionMutation;
492
- private rejectPendingSessionMutationRequests;
493
506
  private markThinkingProgress;
494
507
  private scheduleThinkingWatchdog;
495
508
  private clearThinkingWatchdog;
@@ -522,6 +535,8 @@ export declare class ProductAgentSessionEngine {
522
535
  private enableNetworkCapture;
523
536
  private enqueueNetworkEvent;
524
537
  private scheduleReconnect;
538
+ private replaceDefaultTransportCredentials;
539
+ private refreshDefaultTransportCredentials;
525
540
  private startHeartbeat;
526
541
  private stopHeartbeat;
527
542
  private clearHeartbeatAckTimer;
@@ -533,8 +548,6 @@ export declare class ProductAgentSessionEngine {
533
548
  private replaceTimedOutSocket;
534
549
  private setState;
535
550
  private setReconnectingState;
536
- private startSessionRecoveryPolling;
537
- private stopSessionRecoveryPolling;
538
551
  private applySessionRecoverySnapshot;
539
552
  private emit;
540
553
  }
@@ -0,0 +1,2 @@
1
+ import type { ProductAgentState } from "./index";
2
+ export declare function projectInterruptedState(state: ProductAgentState, stoppedAt: string): ProductAgentState;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function u(i){return{key:i,status:"not_requested",data:null,error:null,requestId:0,updatedAt:null}}class v{constructor(e,t,s=(n,r)=>r){this.loader=t,this.merge=s,this.state=u(e)}loader;merge;state;listeners=new Set;inFlight=null;trailingLoad=null;getState(){return this.state}subscribe(e){return this.listeners.add(e),e(this.state),()=>this.listeners.delete(e)}setKey(e){e!==this.state.key&&(this.state=u(e),this.trailingLoad=null,this.publish())}reset(){this.state=u(this.state.key),this.trailingLoad=null,this.publish()}invalidate(){this.state={...this.state,status:this.state.data===null?"not_requested":"ready",updatedAt:null},this.publish()}load(e="replace",t=null){return this.trailingLoad={mode:e,cursor:t},this.inFlight?this.inFlight:(this.inFlight=this.runLoads().finally(()=>{this.inFlight=null}),this.inFlight)}update(e){this.state={...this.state,data:e(this.state.data)},this.publish()}async runLoads(){for(;this.trailingLoad;){const e=this.trailingLoad;this.trailingLoad=null;const t=this.state.key,s=this.state.requestId+1;this.state={...this.state,status:e.mode==="append"?"loading_more":this.state.data===null?"loading":"refreshing",error:null,requestId:s},this.publish();try{const n=await this.loader({key:t,cursor:e.cursor});if(t!==this.state.key||s!==this.state.requestId)continue;this.state={...this.state,status:"ready",data:this.merge(this.state.data,n,e.mode),error:null,updatedAt:Date.now()},this.publish()}catch(n){if(t!==this.state.key||s!==this.state.requestId)continue;this.state={...this.state,status:"error",error:n instanceof Error?n.message:"The query failed."},this.publish()}}}publish(){for(const e of this.listeners)e(this.state)}}function h(i){const e={},t=[];for(const s of i.entities)e[s.id]||t.push(s.id),e[s.id]=s;return{entitiesById:e,ids:t,nextCursor:i.nextCursor}}function E(i,e,t){if(t==="replace"||i===null)return e;const s={...i.entitiesById,...e.entitiesById},n=[...i.ids];for(const r of e.ids)i.entitiesById[r]||n.push(r);return{entitiesById:s,ids:n,nextCursor:e.nextCursor}}function A(i){return i?i.ids.map(e=>i.entitiesById[e]).filter(e=>!!e):[]}function D(i){return i.visible?i.minimized?{state:"minimized"}:{state:i.open?"visible_open":"visible_closed"}:{state:"hidden"}}function O(i,e){return e==="limit_exceeded"?{allowed:!1,reason:"credits_exhausted",actions:["upgrade","earn_credits"]}:e==="subscription_required"||e==="subscription_inactive"||e==="payment_issue"||e==="subscription_invalid"||e==="payment_required"?{allowed:!1,reason:"payment_issue",actions:["upgrade"]}:i??{allowed:!0,reason:"allowed",actions:[]}}function k(i){if(!i||typeof i!="object")return!1;const e=i.paidCreditFallbackModel;return typeof e=="string"&&e.length>0}function R(i){return i?i.submissionGate?.allowed===!1?{state:"action_required",reason:i.submissionGate.reason}:i.usingPaidCreditFallback===!0?{state:"paid_credit_fallback"}:i.creditLimit!==null&&i.creditLimit>0&&i.creditsRemaining!==null&&i.creditsRemaining>0&&i.creditsRemaining/i.creditLimit<=.2?{state:"low_credits"}:i.creditsUsed!==null?{state:"usage"}:{state:"hidden"}:{state:"hidden"}}function C(i){const e=i.hasDraftMessage||i.hasPreSubmittedAttachment;return i.hasRunningAssistantTurn&&!e?{action:"stop",disabled:!i.canStopRunningTurn}:{action:"send",disabled:!e||!i.canSubmitMessage}}class x{constructor(e,t,s=20){this.loadPage=t,this.limit=s,this.recentQuery=new v(`${e}:recent`,async({cursor:n})=>h(await this.loadPage({cursor:n,limit:this.limit,pinned:!1}).then(r=>({entities:r.sessions,nextCursor:r.nextCursor}))),E),this.pinnedQuery=new v(`${e}:pinned`,async()=>h({entities:await this.loadAllPinned(),nextCursor:null})),this.recentQuery.subscribe(()=>this.publish()),this.pinnedQuery.subscribe(()=>this.publish())}loadPage;limit;recentQuery;pinnedQuery;listeners=new Set;optimisticEntities=new Map;activityOverrides=new Map;pinnedOverrides=new Map;titleOverrides=new Map;refreshSequence=0;completedRefreshSequence=0;activityReconciliationScheduled=!1;getState(){const e=this.recentQuery.getState(),t=this.pinnedQuery.getState(),s=[...p(t.data),...p(e.data)],n=new Map(s.map(o=>[o.id,o])),r=Array.from(n.values()).map(o=>this.applyOverrides(o,this.completedRefreshSequence)),a=Array.from(this.optimisticEntities.values()).filter(o=>!n.has(o.id)).reverse(),l=e.data||t.data||a.length>0?h({entities:[...a,...r],nextCursor:e.data?.nextCursor??null}):null;return{key:e.key.slice(0,-7),status:L(e,t),data:l,error:e.error??t.error,requestId:Math.max(e.requestId,t.requestId),updatedAt:Math.max(e.updatedAt??0,t.updatedAt??0)||null}}subscribe(e){return this.listeners.add(e),e(this.getState()),()=>this.listeners.delete(e)}getEntity(e){return this.getState().data?.entitiesById[e]??null}setKey(e){this.optimisticEntities.clear(),this.activityOverrides.clear(),this.pinnedOverrides.clear(),this.titleOverrides.clear(),this.refreshSequence=0,this.completedRefreshSequence=0,this.activityReconciliationScheduled=!1,this.recentQuery.setKey(`${e}:recent`),this.pinnedQuery.setKey(`${e}:pinned`)}refresh(){const e=++this.refreshSequence,t=Promise.all([this.recentQuery.load("replace"),this.pinnedQuery.load("replace")]).then(()=>{this.completedRefreshSequence=Math.max(this.completedRefreshSequence,e),this.reconcileDurableEntities()});return t.then(()=>{!this.hasUnconfirmedActivityOverride()||this.activityReconciliationScheduled||(this.activityReconciliationScheduled=!0,this.refresh().finally(()=>{this.activityReconciliationScheduled=!1}))}),t}loadMore(e){return this.recentQuery.load("append",e)}addOptimistic(e){this.optimisticEntities.set(e.id,e),this.updateProjection()}removeOptimistic(e){this.optimisticEntities.delete(e)&&this.updateProjection()}acknowledgeOptimistic(e,t){this.optimisticEntities.delete(e),this.optimisticEntities.set(t.id,t),this.updateProjection()}setActivity(e,t){this.activityOverrides.set(e,{isActive:t,confirmAfterRefresh:this.completedRefreshSequence+1,releaseAfterRefresh:this.completedRefreshSequence+2}),this.updateEntity(e,s=>({...s,isActive:t}))}setPinned(e,t){const s={pinned:t,confirmAfterRefresh:Number.POSITIVE_INFINITY};return this.pinnedOverrides.set(e,s),this.updateEntity(e,n=>({...n,isPinned:t})),s}confirmPinned(e,t){this.pinnedOverrides.get(e)===t&&(t.confirmAfterRefresh=this.completedRefreshSequence+1)}rollbackPinned(e,t,s){this.pinnedOverrides.get(e)===t&&(this.pinnedOverrides.delete(e),this.updateEntity(e,n=>({...n,isPinned:s})))}setTitle(e,t){this.titleOverrides.set(e,t),this.updateEntity(e,s=>({...s,customTitle:t}))}confirmTitle(e){this.titleOverrides.delete(e)}reconcileDurableEntities(){const e=[...p(this.pinnedQuery.getState().data),...p(this.recentQuery.getState().data)],t=new Set(e.map(s=>s.id));for(const s of this.optimisticEntities.keys())t.has(s)&&this.optimisticEntities.delete(s);for(const s of e)this.applyOverrides(s,this.completedRefreshSequence);this.publish()}async loadAllPinned(){const e=[];let t=null;do{const s=await this.loadPage({cursor:t,limit:this.limit,pinned:!0});e.push(...s.sessions),t=s.nextCursor}while(t);return e}applyOverrides(e,t){let s=e;const n=this.activityOverrides.get(e.id);n&&(t>=n.confirmAfterRefresh&&e.isActive===n.isActive?this.activityOverrides.delete(e.id):t>=n.releaseAfterRefresh?this.activityOverrides.delete(e.id):s={...s,isActive:n.isActive});const r=this.pinnedOverrides.get(e.id);return r&&(t>=r.confirmAfterRefresh&&e.isPinned===!0===r.pinned?this.pinnedOverrides.delete(e.id):s={...s,isPinned:r.pinned}),this.titleOverrides.has(e.id)&&(s={...s,customTitle:this.titleOverrides.get(e.id)??null}),s}updateProjection(){this.publish()}updateEntity(e,t){const s=this.optimisticEntities.get(e);s&&this.optimisticEntities.set(e,t(s)),this.publish()}hasUnconfirmedActivityOverride(){return Array.from(this.activityOverrides.values()).some(e=>this.completedRefreshSequence<e.releaseAfterRefresh)}publish(){for(const e of this.listeners)e(this.getState())}}function p(i){return i?i.ids.map(e=>i.entitiesById[e]).filter(e=>!!e):[]}function L(i,e){return i.status==="error"||e.status==="error"?"error":i.status==="loading"||e.status==="loading"?"loading":i.status==="refreshing"||e.status==="refreshing"?"refreshing":i.status==="loading_more"?"loading_more":i.status==="ready"||e.status==="ready"?"ready":"not_requested"}class q{constructor(e,t=null){this.storage=e,t&&(this.decisions=new Map(t.filter(b).map(s=>[this.getDecisionKey(s),s])),this.initialized=!0)}storage;decisions=new Map;scheduledEligibility=new Map;initialized=!1;actionQueue=Promise.resolve();async initialize(){if(this.initialized)return;const e=await this.storage.load();this.decisions=new Map(e.filter(b).map(t=>[this.getDecisionKey(t),t])),this.initialized=!0}isEligible(e,t=Date.now()){const s=this.scheduledEligibility.get(this.getExactKey(e));return s!==void 0&&s>t?!1:this.isDecisionEligible(this.decisions.get(this.getExactKey(e)),t)&&this.isDecisionEligible(this.decisions.get(this.getCategoryKey(e)),t)}getDecision(e){return this.decisions.get(this.getExactKey(e))??this.decisions.get(this.getCategoryKey(e))??null}getStatus(e,t=Date.now()){const s=this.scheduledEligibility.get(this.getExactKey(e));if(s!==void 0&&s>t)return"scheduled";const n=this.getDecision(e);return n?n.action==="never"||n.action==="dont_show_again"?"suppressed":n.action==="dismiss"?"resolved":n.nextEligibleAt&&Date.parse(n.nextEligibleAt)>t?"snoozed":"presentable":"presentable"}scheduleEligibility(e,t){const s=this.getExactKey(e),n=this.scheduledEligibility.get(s);return n!==void 0?n:(this.scheduledEligibility.set(s,t),t)}getNextEligibilityAt(e=Date.now()){const t=[...Array.from(this.scheduledEligibility.values()).filter(s=>s>e),...Array.from(this.decisions.values()).map(s=>s.nextEligibleAt?Date.parse(s.nextEligibleAt):Number.NaN).filter(s=>Number.isFinite(s)&&s>e)];return t.length>0?Math.min(...t):null}act(e,t,s={}){const n=this.actionQueue.then(()=>this.applyAction(e,t,s));return this.actionQueue=n.then(()=>{},()=>{}),n}async applyAction(e,t,s){if(!e.allowedActions.includes(t))throw new Error(`Interaction ${e.key} does not allow ${t}.`);if(!T(t))throw new Error(`Interaction action ${t} is not a persistence decision.`);const n=s.now??new Date,r={promptKey:e.key,category:e.category,action:t,scope:e.scope,decidedAt:n.toISOString(),nextEligibleAt:this.getNextEligibleAt(e,t,n,s.snoozeUntil)},a=t==="dont_show_again"?this.getCategoryKey(e):this.getExactKey(e),l=new Map(this.decisions);return l.set(a,r),await this.storage.save([...l.values()]),this.decisions=l,r}isDecisionEligible(e,t){return e?e.action==="dismiss"||e.action==="never"||e.action==="dont_show_again"?!1:!e.nextEligibleAt||Date.parse(e.nextEligibleAt)<=t:!0}getNextEligibleAt(e,t,s,n){if(t==="later")return new Date(s.getTime()+(e.laterDelayMs??3600*1e3)).toISOString();if(t==="snooze"){if(!n||n.getTime()<=s.getTime())throw new Error("Snooze requires a future next-eligible time.");return n.toISOString()}return null}getDecisionKey(e){const t=m(e.scope);return e.action==="dont_show_again"?`${t}:category:${e.category}`:`${t}:interaction:${e.promptKey}`}getExactKey(e){return`${m(e.scope)}:interaction:${e.key}`}getCategoryKey(e){return`${m(e.scope)}:category:${e.category}`}}function Q(i,e){return{load:async()=>_(i,e),save:async t=>i.setItem(e,JSON.stringify(t))}}function _(i,e){const t=i.getItem(e);if(!t)return[];const s=JSON.parse(t);return Array.isArray(s)?s.filter(b):[]}function m(i){return`${i.level}:${i.key}`}function T(i){return i==="dismiss"||i==="later"||i==="snooze"||i==="never"||i==="dont_show_again"}function b(i){if(!i||typeof i!="object")return!1;const e=i;return typeof e.promptKey=="string"&&typeof e.category=="string"&&typeof e.decidedAt=="string"&&(e.nextEligibleAt===null||typeof e.nextEligibleAt=="string")&&T(e.action)&&!!(e.scope&&typeof e.scope=="object"&&typeof e.scope.level=="string"&&typeof e.scope.key=="string")}const $={working:"⏳",completed:"✅",failed:"❗",stopped:"⏹️"},K=/^(?:⌛|⏳|✅|❗|⏹️) Pluno(?:: )?/;function M(i,e){if(!e)return g(i);const t=g(i),s=`${$[e]} Pluno`;return t?`${s}: ${t}`:s}class z{constructor(e){this.titleDocument=e}titleDocument;status=null;baseTitle="";lastAppliedTitle=null;stopObserving=null;liveStatusVersion=0;setStatus(e){this.liveStatusVersion+=1,this.applyStatus(e)}clear(){this.liveStatusVersion+=1,this.applyClear()}async syncStatus(e){const t=this.liveStatusVersion,s=await e();s===void 0||t!==this.liveStatusVersion||(s?this.applyStatus(s):this.applyClear())}applyStatus(e){const t=this.titleDocument.getTitle();t!==this.lastAppliedTitle&&(this.baseTitle=g(t)),this.status=e,this.stopObserving||(this.stopObserving=this.titleDocument.observeTitle(()=>this.handleTitleChanged())),this.applyTitle()}applyClear(){const e=this.titleDocument.getTitle(),t=this.lastAppliedTitle!==null&&e===this.lastAppliedTitle,s=this.lastAppliedTitle===null?g(e):e;this.status=null,this.lastAppliedTitle=null,this.stopObserving?.(),this.stopObserving=null,t?this.titleDocument.setTitle(this.baseTitle):s!==e&&this.titleDocument.setTitle(s)}handleTitleChanged(){!this.status||this.titleDocument.getTitle()===this.lastAppliedTitle||this.applyTitle()}applyTitle(){if(!this.status)return;const e=M(this.baseTitle,this.status);this.lastAppliedTitle=e,this.titleDocument.getTitle()!==e&&this.titleDocument.setTitle(e)}}function B(i){return{getTitle:()=>i.title,setTitle:e=>{i.title=e},observeTitle:e=>{const t=new MutationObserver(e);return t.observe(i.head,{childList:!0,subtree:!0,characterData:!0}),()=>t.disconnect()}}}function g(i){return i.replace(K,"")}const f=i=>i===null||typeof i=="string"&&/^[a-zA-Z0-9:_-]{1,160}$/.test(i);function F(i){if(!i||typeof i!="object")return!1;const e=i;return typeof e.observedAt=="string"&&e.observedAt.length<=40&&Number.isFinite(Date.parse(e.observedAt))&&f(e.sessionId)&&f(e.responseItemId)&&f(e.respondsToUserMessageId)&&typeof e.panelVisible=="boolean"&&typeof e.documentVisible=="boolean"&&typeof e.loading=="boolean"}const w=500;function U(i){const e=i.replace(/\n\s*at\s[\s\S]*$/,"").replace(/-----BEGIN [^-]*PRIVATE KEY-----[\s\S]*?(?:-----END [^-]*PRIVATE KEY-----|$)/g,"[REDACTED]").replace(/\b(?:set-cookie|cookie)\s*[:=]\s*[^\n]+/gi,"cookie=[REDACTED]").replace(/\bdata:[^\s<>"']+/gi,"[DATA]").replace(/\b(?:https?:\/\/|www\.)[^\s<>"']+/gi,"[URL]").replace(/\b(?:Bearer|Basic)\s+[^\s,;"']+/gi,"[REDACTED]").replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)?/g,"[REDACTED]").replace(/\b(?:sk|pk|ghp|gho|github_pat|xoxb|xoxp)[-_][A-Za-z0-9_-]{8,}/g,"[REDACTED]").replace(/\b((?:access|refresh|id|auth)[_-]?token|api[_-]?key|client[_-]?secret|password|passwd|pwd|secret|token|jwt|authorization|cookie|set-cookie)\b["']?\s*[:=]\s*(?:"[^"]*"|'[^']*'|[^\s,;}&]+)/gi,"$1=[REDACTED]").replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi,"[EMAIL]").replace(/(?:[A-Z]:[\\/]|\\\\|(?:~|\.\.?)?\/|[\w.-]+[\\/])[^\s<>"']+/gi,"[FILE]").replace(new RegExp("(?<![\\w.])(?:[\\w.-]+\\.[A-Z][A-Z0-9]{0,15}|\\.[A-Z][\\w.-]*)\\b","gi"),"[FILE]").replace(/\s+/g," ").trim();return e.length>w?`${e.slice(0,w-1)}…`:e}const N={"duplicate-message-item":"A canonical message rendered more than once.","duplicate-canonical-item":"A canonical session item rendered more than once.","duplicate-tool-call":"A tool call rendered more than once.","duplicate-attachment":"An attachment rendered more than once.","duplicate-terminal-outcome":"A response rendered more than one terminal outcome.","foreign-session-item-visible":"The visible transcript contains state owned by another session.","terminal-response-reactivated":"A terminal response became active again.","terminal-history-not-append-only":"An established terminal outcome disappeared or changed order.","runtime-transcript-not-rendered":"A nonempty runtime transcript is displaying starter prompts.","thinking-groups-without-user-message":"Multiple thinking groups appeared without a user message between them.","thinking-without-progress":"Thinking remained visible without progress for five minutes."};function H(i){return typeof i=="string"&&i.startsWith("ui_invariant:")&&Object.prototype.hasOwnProperty.call(N,i.slice(13))}function P(i){return{...i.id===void 0?{}:{id:i.id},name:i.name,mimeType:i.mimeType,sizeBytes:i.sizeBytes,...i.sandboxPath===void 0?{}:{sandboxPath:i.sandboxPath},...i.storageKey===void 0?{}:{storageKey:i.storageKey},...i.fileUrl===void 0?{}:{fileUrl:i.fileUrl}}}function j(i){if(!i||typeof i!="object"||!("type"in i))return!1;const e=i;switch(e.type){case"runtime.connect":case"session.new":case"run.stop":case"run.retry":return!0;case"runtime.report_response_visibility":return F(e.observation);case"runtime.warmup":return e.reason==="panel_open"||e.reason==="extension_install"||e.reason==="composer_input";case"runtime.report_displayed_error":return(e.reason==="conversation_error"||e.reason==="attachment_error"||e.reason==="history_error"||e.reason==="action_error")&&typeof e.errorFingerprint=="string"&&/^fnv1a-[0-9a-f]{8}$/.test(e.errorFingerprint)&&(e.displayedMessage===void 0||typeof e.displayedMessage=="string"&&e.displayedMessage.length<=500);case"runtime.report_invalid_state_transition":return(e.reason==="submitted_turn_returned_to_welcome_without_new_chat"||e.reason==="new_messages_button_without_user_scroll"||H(e.reason))&&(e.clientMessageId===void 0||typeof e.clientMessageId=="string");case"runtime.widget_lifecycle":return(e.action==="opened"||e.action==="closed"||e.action==="minimized")&&typeof e.trigger=="string";case"session.load":return typeof e.sessionId=="string"&&e.sessionId.length>0;case"session.list":return(e.cursor===void 0||e.cursor===null||typeof e.cursor=="string")&&(e.limit===void 0||typeof e.limit=="number")&&(e.pinned===void 0||typeof e.pinned=="boolean");case"session.set_model":return typeof e.model=="string";case"session.pin":return typeof e.sessionId=="string"&&typeof e.pinned=="boolean";case"session.rename":return typeof e.sessionId=="string"&&typeof e.title=="string";case"interaction.act":return typeof e.interactionId=="string"&&typeof e.action=="string"&&typeof e.expectedRevision=="number";case"conversation.stage_proactive_suggestion":return typeof e.question=="string"&&typeof e.clientMessageId=="string";case"conversation.stage":return typeof e.content=="string"&&typeof e.clientMessageId=="string"&&(e.submittedAt===void 0||typeof e.submittedAt=="number")&&(e.attachments===void 0||Array.isArray(e.attachments));case"conversation.fail_staged":return typeof e.clientMessageId=="string"&&typeof e.message=="string";case"conversation.send":return typeof e.content=="string"&&typeof e.clientMessageId=="string"&&(e.automationOnboarding===void 0||typeof e.automationOnboarding=="boolean")&&(e.attachments===void 0||Array.isArray(e.attachments));default:return!1}}class V{constructor(e,t,s){this.adapter=t,this.state=y(e),this.model=s}adapter;listeners={};attachmentFiles=new Map;sessionHistoryListeners=new Set;interactionListeners=new Set;accountListeners=new Set;state;sessionHistoryState=u("unavailable");model;interactions=[];account=null;stagedProactiveSuggestionClientMessageId=null;unacknowledgedSubmissions=new Map;operationQueue=Promise.resolve();destroyed=!1;on(e,t){const s=this.listeners[e]??new Set;return s.add(t),this.listeners[e]=s,()=>s.delete(t)}getState(){return y(this.state)}updateProjection(e,t,s,n,r){if(!this.destroyed){this.state=y(e);for(const[a,l]of this.unacknowledgedSubmissions){if(e.user?.id!==l.userId||l.sessionId!==null&&e.sessionId!==l.sessionId){this.unacknowledgedSubmissions.delete(a);continue}const o=this.state.messages.find(c=>c.clientMessageId===a);if(o){o.attachments=Z(l.message.attachments,o.attachments),this.unacknowledgedSubmissions.delete(a);continue}l.sessionId??=e.sessionId,this.state.messages.push(l.message),this.state.pendingMessageStatus="sending",this.state.turnPhase??="sending",this.state.taskStatus??="working"}if(t!==void 0&&(this.model=t),s){this.sessionHistoryState=I(s);for(const a of this.sessionHistoryListeners)a(this.getSessionHistoryState())}if(n){this.interactions=n.map(a=>({...a}));for(const a of this.interactionListeners)a(this.getInteractions())}if(r!==void 0){this.account=r?{...r}:null;for(const a of this.accountListeners)a(this.getAccount())}this.emit("state",this.getState())}}async connect(){await this.dispatch({type:"runtime.connect"})}destroy(){if(!this.destroyed){this.destroyed=!0,this.unacknowledgedSubmissions.clear(),this.attachmentFiles.clear(),this.sessionHistoryListeners.clear(),this.interactionListeners.clear(),this.accountListeners.clear();for(const e of Object.values(this.listeners))e?.clear();this.adapter.onDisconnect?.()}}warmup(e="panel_open"){return this.adapter.dispatch({type:"runtime.warmup",reason:e}).then(()=>{})}recordWidgetLifecycle(e,t){this.dispatch({type:"runtime.widget_lifecycle",action:e,trigger:t})}reportResponseVisibility(e){this.adapter.dispatch({type:"runtime.report_response_visibility",observation:e}).catch(()=>{})}reportInvalidStateTransition(e,t){this.adapter.dispatch({type:"runtime.report_invalid_state_transition",reason:e,clientMessageId:t}).catch(()=>{})}reportDisplayedError(e,t,s){this.adapter.dispatch({type:"runtime.report_displayed_error",reason:e,errorFingerprint:t,...s?{displayedMessage:U(s)}:{}}).catch(()=>{})}sendMessage(e,t={}){const s=e.trim(),n=t.attachments??[];if(!s&&n.length===0)return Promise.resolve(null);const r=t.clientMessageId??(t.proactiveSuggestionQuestion&&this.stagedProactiveSuggestionClientMessageId?this.stagedProactiveSuggestionClientMessageId:crypto.randomUUID()),a=t.submittedAt??Date.now(),l=this.state,o={id:`local-${r}`,role:"user",content:s,createdAt:new Date().toISOString(),...n.length>0?{attachments:n}:{},clientMessageId:r};return this.unacknowledgedSubmissions.set(r,{message:{...o,attachments:o.attachments?.map(c=>({...c}))},sessionId:l.sessionId,userId:l.user?.id}),this.state={...this.state,messages:[...this.state.messages,o],pendingMessageStatus:"sending",turnPhase:this.state.isThinking?this.state.turnPhase:"sending",taskStatus:"working",isRetrying:!1,lastError:null},this.emit("state",this.getState()),this.enqueueOperation(()=>this.sendMessageNow(s,{...t,clientMessageId:r,submittedAt:a},l))}async sendMessageNow(e,t,s){const n=e,r=t.clientMessageId;let a=t.attachments??[],l=!1;try{if(await this.adapter.dispatch({type:"conversation.stage",content:n,clientMessageId:r,proactiveSuggestionQuestion:t.proactiveSuggestionQuestion,attachments:a.length>0?a.map(P):void 0,submittedAt:t.submittedAt}),l=!0,a.length>0){if(!this.adapter.uploadAttachment)throw new Error("The runtime does not support attachments.");const c=[];for(const d of a){if(d.sandboxPath||d.storageKey){c.push(d);continue}const S=d.id?this.attachmentFiles.get(d.id):void 0;if(!S)throw new Error(`Attachment bytes are unavailable for ${d.name}`);c.push(await this.adapter.uploadAttachment(S,d,{clientMessageId:r}))}a=c}const o=await this.adapter.dispatch({type:"conversation.send",content:n,clientMessageId:r,initiatedBy:t.initiatedBy,invocation:t.invocation,proactiveSuggestionQuestion:t.proactiveSuggestionQuestion,...t.automationOnboarding?{automationOnboarding:!0}:{},attachments:a.length>0?a.map(P):void 0});for(const c of t.attachments??[])c.id&&this.attachmentFiles.delete(c.id);return r===this.stagedProactiveSuggestionClientMessageId&&(this.stagedProactiveSuggestionClientMessageId=null),o?.clientMessageId??r}catch(o){throw this.unacknowledgedSubmissions.delete(r),this.state={...this.state,messages:this.state.messages.filter(c=>c.id!==`local-${r}`&&c.id!==`optimistic-user-message:${r}`),pendingMessageStatus:s.pendingMessageStatus,turnPhase:s.turnPhase,isThinking:s.isThinking,taskStatus:s.taskStatus},this.emit("state",this.getState()),l&&await this.adapter.dispatch({type:"conversation.fail_staged",clientMessageId:r,message:o instanceof Error?o.message:String(o)}),o}}getModel(){return this.model}setModel(e){return this.dispatch({type:"session.set_model",model:e}).then(()=>{})}retryLastMessage(){return this.dispatch({type:"run.retry"}),!0}createLocalAttachment(e){const t=crypto.randomUUID();return this.attachmentFiles.set(t,e),{id:t,name:e.name||"attachment",mimeType:e.type||"application/octet-stream",sizeBytes:e.size}}stop(){return this.unacknowledgedSubmissions.clear(),this.dispatch({type:"run.stop"}).then(()=>{})}startNewSession(e={}){return this.unacknowledgedSubmissions.clear(),e.notifyTransport===!1?Promise.resolve():this.dispatch({type:"session.new"}).then(()=>{})}async listSessions(e={}){await this.dispatch({type:"session.list",...e});const t=this.sessionHistoryState.data;return{sessions:A(t),nextCursor:t?.nextCursor??null}}getSessionHistoryState(){return I(this.sessionHistoryState)}subscribeSessionHistory(e){return this.sessionHistoryListeners.add(e),e(this.getSessionHistoryState()),()=>this.sessionHistoryListeners.delete(e)}refreshSessionHistory(){return this.dispatch({type:"session.list",limit:20}).then(()=>{})}loadMoreSessionHistory(){const e=this.sessionHistoryState.data?.nextCursor??null;return e?this.dispatch({type:"session.list",cursor:e,limit:20}).then(()=>{}):Promise.resolve()}setSessionPinned(e,t){return this.dispatch({type:"session.pin",sessionId:e,pinned:t}).then(()=>{})}renameSession(e,t){return this.dispatch({type:"session.rename",sessionId:e,title:t}).then(()=>{})}getInteractions(){return this.interactions.map(e=>({...e}))}subscribeInteractions(e){return this.interactionListeners.add(e),e(this.getInteractions()),()=>this.interactionListeners.delete(e)}actOnInteraction(e,t,s,n={}){return this.dispatch({type:"interaction.act",interactionId:e,action:t,expectedRevision:s,...n}).then(()=>{})}getAccount(){return this.account?{...this.account}:null}subscribeAccount(e){return this.accountListeners.add(e),e(this.getAccount()),()=>this.accountListeners.delete(e)}refreshAccount(){return Promise.resolve()}loadSession(e){return this.unacknowledgedSubmissions.clear(),this.dispatch({type:"session.load",sessionId:e}).then(()=>{})}stageProactiveSuggestionQuestion(e){const t=e.trim();if(!t)return Promise.resolve();const s=this.stagedProactiveSuggestionClientMessageId??crypto.randomUUID();return this.stagedProactiveSuggestionClientMessageId=s,this.dispatch({type:"conversation.stage_proactive_suggestion",question:t,clientMessageId:s}).then(()=>{})}dispatch(e){return this.enqueueOperation(()=>this.adapter.dispatch(e))}enqueueOperation(e){const t=this.operationQueue.then(e);return this.operationQueue=t.then(()=>{},()=>{}),t}emit(e,t){const s=this.listeners[e];for(const n of s??[])n(t)}}function Z(i,e){if(!e||!i)return e;const t=new Map;for(const s of i){const n=s.previewUrl;s.id&&n&&t.set(s.id,n)}return e.map(s=>{const n=s.id?t.get(s.id):void 0;return n?{...s,previewUrl:n}:s})}function y(i){return{...i,starterPrompts:[...i.starterPrompts],appearance:i.appearance?{...i.appearance}:null,messages:i.messages.map(e=>{const t={...e,attachments:e.attachments?.map(a=>({...a}))},s=e.assistantDraftItemId,n=e.clientMessageId,r=e.proactiveSuggestionClientMessageId;return r&&Object.defineProperty(t,"proactiveSuggestionClientMessageId",{value:r,enumerable:!1}),s&&Object.defineProperty(t,"assistantDraftItemId",{value:s,enumerable:!1}),n&&Object.defineProperty(t,"clientMessageId",{value:n,enumerable:!1}),t}),activeScheduledFollowUps:i.activeScheduledFollowUps?.map(e=>({...e}))??null}}function I(i){return{...i,data:i.data?h({entities:A(i.data).map(e=>({...e})),nextCursor:i.data.nextCursor}):null}}exports.ProductAgentInteractionManager=q;exports.ProductAgentQueryController=v;exports.ProductAgentRemoteRuntimeClient=V;exports.ProductAgentSessionHistoryManager=x;exports.ProductAgentTaskPageTitleController=z;exports.createLocalStorageInteractionDecisionStorage=Q;exports.createProductAgentQueryState=u;exports.createProductAgentTaskPageTitleDocument=B;exports.formatProductAgentTaskPageTitle=M;exports.hasProductAgentPaidCreditFallback=k;exports.isProductAgentRuntimeCommand=j;exports.mergeProductAgentEntityPages=E;exports.normalizeProductAgentEntityPage=h;exports.readLocalStorageInteractionDecisions=_;exports.reconcileProductAgentSubmissionGate=O;exports.resolveProductAgentBillingPresentation=R;exports.resolveProductAgentComposerAction=C;exports.resolveProductAgentWidgetPresentation=D;exports.selectProductAgentQueryEntities=A;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function g(i){return{key:i,status:"not_requested",data:null,error:null,requestId:0,updatedAt:null}}class I{constructor(e,t,s=(n,o)=>o){this.loader=t,this.merge=s,this.state=g(e)}loader;merge;state;listeners=new Set;inFlight=null;trailingLoad=null;getState(){return this.state}subscribe(e){return this.listeners.add(e),e(this.state),()=>this.listeners.delete(e)}setKey(e){e!==this.state.key&&(this.state=g(e),this.trailingLoad=null,this.publish())}reset(){this.state=g(this.state.key),this.trailingLoad=null,this.publish()}invalidate(){this.state={...this.state,status:this.state.data===null?"not_requested":"ready",updatedAt:null},this.publish()}load(e="replace",t=null){return this.trailingLoad={mode:e,cursor:t},this.inFlight?this.inFlight:(this.inFlight=this.runLoads().finally(()=>{this.inFlight=null}),this.inFlight)}update(e){this.state={...this.state,data:e(this.state.data)},this.publish()}async runLoads(){for(;this.trailingLoad;){const e=this.trailingLoad;this.trailingLoad=null;const t=this.state.key,s=this.state.requestId+1;this.state={...this.state,status:e.mode==="append"?"loading_more":this.state.data===null?"loading":"refreshing",error:null,requestId:s},this.publish();try{const n=await this.loader({key:t,cursor:e.cursor});if(t!==this.state.key||s!==this.state.requestId)continue;this.state={...this.state,status:"ready",data:this.merge(this.state.data,n,e.mode),error:null,updatedAt:Date.now()},this.publish()}catch(n){if(t!==this.state.key||s!==this.state.requestId)continue;this.state={...this.state,status:"error",error:n instanceof Error?n.message:"The query failed."},this.publish()}}}publish(){for(const e of this.listeners)e(this.state)}}function m(i){const e={},t=[];for(const s of i.entities)e[s.id]||t.push(s.id),e[s.id]=s;return{entitiesById:e,ids:t,nextCursor:i.nextCursor}}function D(i,e,t){if(t==="replace"||i===null)return e;const s={...i.entitiesById,...e.entitiesById},n=[...i.ids];for(const o of e.ids)i.entitiesById[o]||n.push(o);return{entitiesById:s,ids:n,nextCursor:e.nextCursor}}function O(i){return i?i.ids.map(e=>i.entitiesById[e]).filter(e=>!!e):[]}function x(i){return i.visible?i.minimized?{state:"minimized"}:{state:i.open?"visible_open":"visible_closed"}:{state:"hidden"}}function L(i,e){return e==="limit_exceeded"?{allowed:!1,reason:"credits_exhausted",actions:["upgrade","earn_credits"]}:e==="subscription_required"||e==="subscription_inactive"||e==="payment_issue"||e==="subscription_invalid"||e==="payment_required"?{allowed:!1,reason:"payment_issue",actions:["upgrade"]}:i??{allowed:!0,reason:"allowed",actions:[]}}function q(i){if(!i||typeof i!="object")return!1;const e=i.paidCreditFallbackModel;return typeof e=="string"&&e.length>0}function Q(i){return i?i.submissionGate?.allowed===!1?{state:"action_required",reason:i.submissionGate.reason}:i.usingPaidCreditFallback===!0?{state:"paid_credit_fallback"}:i.creditLimit!==null&&i.creditLimit>0&&i.creditsRemaining!==null&&i.creditsRemaining>0&&i.creditsRemaining/i.creditLimit<=.2?{state:"low_credits"}:i.creditsUsed!==null?{state:"usage"}:{state:"hidden"}:{state:"hidden"}}function U(i){const e=i.hasDraftMessage||i.hasPreSubmittedAttachment;return i.hasRunningAssistantTurn&&!i.hasDraftMessage?{action:"stop",disabled:!i.canStopRunningTurn}:{action:"send",disabled:!e||!i.canSubmitMessage}}class ${constructor(e,t,s=20){this.loadPage=t,this.limit=s,this.recentQuery=new I(`${e}:recent`,async({cursor:n})=>m(await this.loadPage({cursor:n,limit:this.limit,pinned:!1}).then(o=>({entities:o.sessions,nextCursor:o.nextCursor}))),D),this.pinnedQuery=new I(`${e}:pinned`,async()=>m({entities:await this.loadAllPinned(),nextCursor:null})),this.recentQuery.subscribe(()=>this.publish()),this.pinnedQuery.subscribe(()=>this.publish())}loadPage;limit;recentQuery;pinnedQuery;listeners=new Set;optimisticEntities=new Map;activityOverrides=new Map;pinnedOverrides=new Map;titleOverrides=new Map;refreshSequence=0;completedRefreshSequence=0;activityReconciliationScheduled=!1;getState(){const e=this.recentQuery.getState(),t=this.pinnedQuery.getState(),s=[...f(t.data),...f(e.data)],n=new Map(s.map(a=>[a.id,a])),o=Array.from(n.values()).map(a=>this.applyOverrides(a,this.completedRefreshSequence)),l=Array.from(this.optimisticEntities.values()).filter(a=>!n.has(a.id)).reverse(),r=e.data||t.data||l.length>0?m({entities:[...l,...o],nextCursor:e.data?.nextCursor??null}):null;return{key:e.key.slice(0,-7),status:B(e,t),data:r,error:e.error??t.error,requestId:Math.max(e.requestId,t.requestId),updatedAt:Math.max(e.updatedAt??0,t.updatedAt??0)||null}}subscribe(e){return this.listeners.add(e),e(this.getState()),()=>this.listeners.delete(e)}getEntity(e){return this.getState().data?.entitiesById[e]??null}setKey(e){this.optimisticEntities.clear(),this.activityOverrides.clear(),this.pinnedOverrides.clear(),this.titleOverrides.clear(),this.refreshSequence=0,this.completedRefreshSequence=0,this.activityReconciliationScheduled=!1,this.recentQuery.setKey(`${e}:recent`),this.pinnedQuery.setKey(`${e}:pinned`)}refresh(){const e=++this.refreshSequence,t=Promise.all([this.recentQuery.load("replace"),this.pinnedQuery.load("replace")]).then(()=>{this.completedRefreshSequence=Math.max(this.completedRefreshSequence,e),this.reconcileDurableEntities()});return t.then(()=>{!this.hasUnconfirmedActivityOverride()||this.activityReconciliationScheduled||(this.activityReconciliationScheduled=!0,this.refresh().finally(()=>{this.activityReconciliationScheduled=!1}))}),t}loadMore(e){return this.recentQuery.load("append",e)}addOptimistic(e){this.optimisticEntities.set(e.id,e),this.updateProjection()}removeOptimistic(e){this.optimisticEntities.delete(e)&&this.updateProjection()}acknowledgeOptimistic(e,t){this.optimisticEntities.delete(e),this.optimisticEntities.set(t.id,t),this.updateProjection()}setActivity(e,t){this.activityOverrides.set(e,{isActive:t,confirmAfterRefresh:this.completedRefreshSequence+1,releaseAfterRefresh:this.completedRefreshSequence+2}),this.updateEntity(e,s=>({...s,isActive:t}))}setPinned(e,t){const s={pinned:t,confirmAfterRefresh:Number.POSITIVE_INFINITY};return this.pinnedOverrides.set(e,s),this.updateEntity(e,n=>({...n,isPinned:t})),s}confirmPinned(e,t){this.pinnedOverrides.get(e)===t&&(t.confirmAfterRefresh=this.completedRefreshSequence+1)}rollbackPinned(e,t,s){this.pinnedOverrides.get(e)===t&&(this.pinnedOverrides.delete(e),this.updateEntity(e,n=>({...n,isPinned:s})))}setTitle(e,t){this.titleOverrides.set(e,t),this.updateEntity(e,s=>({...s,customTitle:t}))}confirmTitle(e){this.titleOverrides.delete(e)}reconcileDurableEntities(){const e=[...f(this.pinnedQuery.getState().data),...f(this.recentQuery.getState().data)],t=new Set(e.map(s=>s.id));for(const s of this.optimisticEntities.keys())t.has(s)&&this.optimisticEntities.delete(s);for(const s of e)this.applyOverrides(s,this.completedRefreshSequence);this.publish()}async loadAllPinned(){const e=[];let t=null;do{const s=await this.loadPage({cursor:t,limit:this.limit,pinned:!0});e.push(...s.sessions),t=s.nextCursor}while(t);return e}applyOverrides(e,t){let s=e;const n=this.activityOverrides.get(e.id);n&&(t>=n.confirmAfterRefresh&&e.isActive===n.isActive?this.activityOverrides.delete(e.id):t>=n.releaseAfterRefresh?this.activityOverrides.delete(e.id):s={...s,isActive:n.isActive});const o=this.pinnedOverrides.get(e.id);return o&&(t>=o.confirmAfterRefresh&&e.isPinned===!0===o.pinned?this.pinnedOverrides.delete(e.id):s={...s,isPinned:o.pinned}),this.titleOverrides.has(e.id)&&(s={...s,customTitle:this.titleOverrides.get(e.id)??null}),s}updateProjection(){this.publish()}updateEntity(e,t){const s=this.optimisticEntities.get(e);s&&this.optimisticEntities.set(e,t(s)),this.publish()}hasUnconfirmedActivityOverride(){return Array.from(this.activityOverrides.values()).some(e=>this.completedRefreshSequence<e.releaseAfterRefresh)}publish(){for(const e of this.listeners)e(this.getState())}}function f(i){return i?i.ids.map(e=>i.entitiesById[e]).filter(e=>!!e):[]}function B(i,e){return i.status==="error"||e.status==="error"?"error":i.status==="loading"||e.status==="loading"?"loading":i.status==="refreshing"||e.status==="refreshing"?"refreshing":i.status==="loading_more"?"loading_more":i.status==="ready"||e.status==="ready"?"ready":"not_requested"}class K{constructor(e,t=null){this.storage=e,t&&(this.decisions=new Map(t.filter(w).map(s=>[this.getDecisionKey(s),s])),this.initialized=!0)}storage;decisions=new Map;scheduledEligibility=new Map;initialized=!1;actionQueue=Promise.resolve();async initialize(){if(this.initialized)return;const e=await this.storage.load();this.decisions=new Map(e.filter(w).map(t=>[this.getDecisionKey(t),t])),this.initialized=!0}isEligible(e,t=Date.now()){const s=this.scheduledEligibility.get(this.getExactKey(e));return s!==void 0&&s>t?!1:this.isDecisionEligible(this.decisions.get(this.getExactKey(e)),t)&&this.isDecisionEligible(this.decisions.get(this.getCategoryKey(e)),t)}getDecision(e){return this.decisions.get(this.getExactKey(e))??this.decisions.get(this.getCategoryKey(e))??null}getStatus(e,t=Date.now()){const s=this.scheduledEligibility.get(this.getExactKey(e));if(s!==void 0&&s>t)return"scheduled";const n=this.getDecision(e);return n?n.action==="never"||n.action==="dont_show_again"?"suppressed":n.action==="dismiss"?"resolved":n.nextEligibleAt&&Date.parse(n.nextEligibleAt)>t?"snoozed":"presentable":"presentable"}scheduleEligibility(e,t){const s=this.getExactKey(e),n=this.scheduledEligibility.get(s);return n!==void 0?n:(this.scheduledEligibility.set(s,t),t)}getNextEligibilityAt(e=Date.now()){const t=[...Array.from(this.scheduledEligibility.values()).filter(s=>s>e),...Array.from(this.decisions.values()).map(s=>s.nextEligibleAt?Date.parse(s.nextEligibleAt):Number.NaN).filter(s=>Number.isFinite(s)&&s>e)];return t.length>0?Math.min(...t):null}act(e,t,s={}){const n=this.actionQueue.then(()=>this.applyAction(e,t,s));return this.actionQueue=n.then(()=>{},()=>{}),n}async applyAction(e,t,s){if(!e.allowedActions.includes(t))throw new Error(`Interaction ${e.key} does not allow ${t}.`);if(!R(t))throw new Error(`Interaction action ${t} is not a persistence decision.`);const n=s.now??new Date,o={promptKey:e.key,category:e.category,action:t,scope:e.scope,decidedAt:n.toISOString(),nextEligibleAt:this.getNextEligibleAt(e,t,n,s.snoozeUntil)},l=t==="dont_show_again"?this.getCategoryKey(e):this.getExactKey(e),r=new Map(this.decisions);return r.set(l,o),await this.storage.save([...r.values()]),this.decisions=r,o}isDecisionEligible(e,t){return e?e.action==="dismiss"||e.action==="never"||e.action==="dont_show_again"?!1:!e.nextEligibleAt||Date.parse(e.nextEligibleAt)<=t:!0}getNextEligibleAt(e,t,s,n){if(t==="later")return new Date(s.getTime()+(e.laterDelayMs??3600*1e3)).toISOString();if(t==="snooze"){if(!n||n.getTime()<=s.getTime())throw new Error("Snooze requires a future next-eligible time.");return n.toISOString()}return null}getDecisionKey(e){const t=b(e.scope);return e.action==="dont_show_again"?`${t}:category:${e.category}`:`${t}:interaction:${e.promptKey}`}getExactKey(e){return`${b(e.scope)}:interaction:${e.key}`}getCategoryKey(e){return`${b(e.scope)}:category:${e.category}`}}function N(i,e){return{load:async()=>k(i,e),save:async t=>i.setItem(e,JSON.stringify(t))}}function k(i,e){const t=i.getItem(e);if(!t)return[];const s=JSON.parse(t);return Array.isArray(s)?s.filter(w):[]}function b(i){return`${i.level}:${i.key}`}function R(i){return i==="dismiss"||i==="later"||i==="snooze"||i==="never"||i==="dont_show_again"}function w(i){if(!i||typeof i!="object")return!1;const e=i;return typeof e.promptKey=="string"&&typeof e.category=="string"&&typeof e.decidedAt=="string"&&(e.nextEligibleAt===null||typeof e.nextEligibleAt=="string")&&R(e.action)&&!!(e.scope&&typeof e.scope=="object"&&typeof e.scope.level=="string"&&typeof e.scope.key=="string")}const j={working:"⏳",completed:"✅",failed:"❗",stopped:"⏹️"},F=/^(?:⌛|⏳|✅|❗|⏹️) Pluno(?:: )?/;function C(i,e){if(!e)return y(i);const t=y(i),s=`${j[e]} Pluno`;return t?`${s}: ${t}`:s}class z{constructor(e){this.titleDocument=e}titleDocument;status=null;baseTitle="";lastAppliedTitle=null;stopObserving=null;liveStatusVersion=0;setStatus(e){this.liveStatusVersion+=1,this.applyStatus(e)}clear(){this.liveStatusVersion+=1,this.applyClear()}async syncStatus(e){const t=this.liveStatusVersion,s=await e();s===void 0||t!==this.liveStatusVersion||(s?this.applyStatus(s):this.applyClear())}applyStatus(e){const t=this.titleDocument.getTitle();t!==this.lastAppliedTitle&&(this.baseTitle=y(t)),this.status=e,this.stopObserving||(this.stopObserving=this.titleDocument.observeTitle(()=>this.handleTitleChanged())),this.applyTitle()}applyClear(){const e=this.titleDocument.getTitle(),t=this.lastAppliedTitle!==null&&e===this.lastAppliedTitle,s=this.lastAppliedTitle===null?y(e):e;this.status=null,this.lastAppliedTitle=null,this.stopObserving?.(),this.stopObserving=null,t?this.titleDocument.setTitle(this.baseTitle):s!==e&&this.titleDocument.setTitle(s)}handleTitleChanged(){!this.status||this.titleDocument.getTitle()===this.lastAppliedTitle||this.applyTitle()}applyTitle(){if(!this.status)return;const e=C(this.baseTitle,this.status);this.lastAppliedTitle=e,this.titleDocument.getTitle()!==e&&this.titleDocument.setTitle(e)}}function H(i){return{getTitle:()=>i.title,setTitle:e=>{i.title=e},observeTitle:e=>{const t=new MutationObserver(e);return t.observe(i.head,{childList:!0,subtree:!0,characterData:!0}),()=>t.disconnect()}}}function y(i){return i.replace(F,"")}function P(i,e){const t=new Set([i.assistantDraftRespondsToUserMessageId,i.activeResponseUserMessageId,i.messages.filter(n=>n.role==="user").slice(-1)[0]?.id].filter(n=>!!n)),s=i.messages.filter(n=>!(n.dataType==="run_status"&&n.loading&&t.has(n.respondsToUserMessageId??""))).map(n=>t.has(n.respondsToUserMessageId??"")?{...n,loading:!1}:n);for(const n of t)s.some(o=>o.respondsToUserMessageId===n&&(o.dataType==="run_status"||o.dataType==="run_error"||o.role==="assistant"&&o.phase!=="commentary"))||s.push({id:`local-interrupted:${n}`,role:"system",dataType:"run_status",content:"Run stopped by user.",createdAt:e,respondsToUserMessageId:n});return{...i,messages:s,isThinking:!1,isRetrying:!1,pendingMessageStatus:null,turnPhase:null,taskStatus:"stopped",lastError:null,lastErrorCode:null}}const S=i=>i===null||typeof i=="string"&&/^[a-zA-Z0-9:_-]{1,160}$/.test(i);function G(i){if(!i||typeof i!="object")return!1;const e=i;return typeof e.observedAt=="string"&&e.observedAt.length<=40&&Number.isFinite(Date.parse(e.observedAt))&&S(e.sessionId)&&S(e.responseItemId)&&S(e.respondsToUserMessageId)&&typeof e.panelVisible=="boolean"&&typeof e.documentVisible=="boolean"&&typeof e.loading=="boolean"}const M=500;function V(i){const e=i.replace(/\n\s*at\s[\s\S]*$/,"").replace(/-----BEGIN [^-]*PRIVATE KEY-----[\s\S]*?(?:-----END [^-]*PRIVATE KEY-----|$)/g,"[REDACTED]").replace(/\b(?:set-cookie|cookie)\s*[:=]\s*[^\n]+/gi,"cookie=[REDACTED]").replace(/\bdata:[^\s<>"']+/gi,"[DATA]").replace(/\b(?:https?:\/\/|www\.)[^\s<>"']+/gi,"[URL]").replace(/\b(?:Bearer|Basic)\s+[^\s,;"']+/gi,"[REDACTED]").replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)?/g,"[REDACTED]").replace(/\b(?:sk|pk|ghp|gho|github_pat|xoxb|xoxp)[-_][A-Za-z0-9_-]{8,}/g,"[REDACTED]").replace(/\b((?:access|refresh|id|auth)[_-]?token|api[_-]?key|client[_-]?secret|password|passwd|pwd|secret|token|jwt|authorization|cookie|set-cookie)\b["']?\s*[:=]\s*(?:"[^"]*"|'[^']*'|[^\s,;}&]+)/gi,"$1=[REDACTED]").replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi,"[EMAIL]").replace(/(?:[A-Z]:[\\/]|\\\\|(?:~|\.\.?)?\/|[\w.-]+[\\/])[^\s<>"']+/gi,"[FILE]").replace(new RegExp("(?<![\\w.])(?:[\\w.-]+\\.[A-Z][A-Z0-9]{0,15}|\\.[A-Z][\\w.-]*)\\b","gi"),"[FILE]").replace(/\s+/g," ").trim();return e.length>M?`${e.slice(0,M-1)}…`:e}const Z={"in-progress-stop-unavailable":"An in-progress response has no visible enabled interrupt control.","stop-did-not-interrupt":"The stopped response remained in progress after an interrupt click.","duplicate-message-item":"A canonical message rendered more than once.","duplicate-canonical-item":"A canonical session item rendered more than once.","duplicate-tool-call":"A tool call rendered more than once.","duplicate-attachment":"An attachment rendered more than once.","duplicate-terminal-outcome":"A response rendered more than one terminal outcome.","foreign-session-item-visible":"The visible transcript contains state owned by another session.","terminal-response-reactivated":"A terminal response became active again.","terminal-history-not-append-only":"An established terminal outcome disappeared or changed order.","runtime-transcript-not-rendered":"A nonempty runtime transcript is displaying starter prompts.","thinking-groups-without-user-message":"Multiple thinking groups appeared without a user message between them.","thinking-without-progress":"Thinking remained visible without progress for five minutes."};function J(i){return typeof i=="string"&&i.startsWith("ui_invariant:")&&Object.prototype.hasOwnProperty.call(Z,i.slice(13))}function T(i){return{...i.id===void 0?{}:{id:i.id},name:i.name,mimeType:i.mimeType,sizeBytes:i.sizeBytes,...i.sandboxPath===void 0?{}:{sandboxPath:i.sandboxPath},...i.storageKey===void 0?{}:{storageKey:i.storageKey},...i.fileUrl===void 0?{}:{fileUrl:i.fileUrl}}}function W(i){if(!i||typeof i!="object"||!("type"in i))return!1;const e=i;switch(e.type){case"runtime.connect":case"session.new":case"run.retry":return!0;case"run.stop":return e.clientMessageIds===void 0||Array.isArray(e.clientMessageIds)&&e.clientMessageIds.length<=100&&e.clientMessageIds.every(t=>typeof t=="string"&&t.length>0&&t.length<=160);case"runtime.report_response_visibility":return G(e.observation);case"runtime.warmup":return e.reason==="panel_open"||e.reason==="extension_install"||e.reason==="composer_input";case"runtime.report_displayed_error":return(e.reason==="conversation_error"||e.reason==="attachment_error"||e.reason==="history_error"||e.reason==="action_error")&&typeof e.errorFingerprint=="string"&&/^fnv1a-[0-9a-f]{8}$/.test(e.errorFingerprint)&&(e.displayedMessage===void 0||typeof e.displayedMessage=="string"&&e.displayedMessage.length<=500);case"runtime.report_invalid_state_transition":return(e.reason==="submitted_turn_returned_to_welcome_without_new_chat"||e.reason==="new_messages_button_without_user_scroll"||J(e.reason))&&(e.clientMessageId===void 0||typeof e.clientMessageId=="string");case"runtime.widget_lifecycle":return(e.action==="opened"||e.action==="closed"||e.action==="minimized")&&typeof e.trigger=="string";case"session.load":return typeof e.sessionId=="string"&&e.sessionId.length>0;case"session.list":return(e.cursor===void 0||e.cursor===null||typeof e.cursor=="string")&&(e.limit===void 0||typeof e.limit=="number")&&(e.pinned===void 0||typeof e.pinned=="boolean");case"composer.select_model":case"session.set_model":return typeof e.model=="string";case"session.pin":return typeof e.sessionId=="string"&&typeof e.pinned=="boolean";case"session.rename":return typeof e.sessionId=="string"&&typeof e.title=="string";case"interaction.act":return typeof e.interactionId=="string"&&typeof e.action=="string"&&typeof e.expectedRevision=="number";case"conversation.stage_proactive_suggestion":return typeof e.question=="string"&&typeof e.clientMessageId=="string";case"conversation.stage":return typeof e.content=="string"&&typeof e.clientMessageId=="string"&&(e.submittedAt===void 0||typeof e.submittedAt=="number")&&(e.requestedModel===void 0||typeof e.requestedModel=="string")&&(e.attachments===void 0||Array.isArray(e.attachments));case"conversation.fail_staged":return typeof e.clientMessageId=="string"&&typeof e.message=="string";case"conversation.send":return typeof e.content=="string"&&typeof e.clientMessageId=="string"&&(e.requestedModel===void 0||typeof e.requestedModel=="string")&&(e.automationOnboarding===void 0||typeof e.automationOnboarding=="boolean")&&(e.attachments===void 0||Array.isArray(e.attachments));default:return!1}}class Y{constructor(e,t,s){this.adapter=t,this.state=A(e),this.model=s}adapter;listeners={};attachmentFiles=new Map;sessionHistoryListeners=new Set;interactionListeners=new Set;accountListeners=new Set;state;sessionHistoryState=g("unavailable");model;interactions=[];account=null;stagedProactiveSuggestionClientMessageId=null;unacknowledgedSubmissions=new Map;submissionGeneration=0;stoppedProjection=null;operationQueue=Promise.resolve();destroyed=!1;on(e,t){const s=this.listeners[e]??new Set;return s.add(t),this.listeners[e]=s,()=>s.delete(t)}getState(){return A(this.state)}updateProjection(e,t,s,n,o){if(this.destroyed)return;const l=this.state;if(this.state=A(e),l.user?.id===e.user?.id)for(const r of this.state.messages){if(r.role!=="user"||!r.attachments?.length)continue;const a=r.clientMessageId,d=l.messages.find(u=>u.role==="user"&&(u.id===r.id||a&&u.clientMessageId===a));l.sessionId!==e.sessionId&&!(l.sessionId===null&&a&&d?.clientMessageId===a)||(r.attachments=_(d?.attachments,r.attachments))}if(this.stoppedProjection){const r=this.stoppedProjection,a=new Set(r.messages.filter(c=>c.role==="user").map(c=>c.id)),d=e.sessionId===r.sessionId&&e.user?.id===r.user?.id,u=e.messages.some(c=>c.role==="user"&&!a.has(c.id)&&!r.messages.some(h=>h.clientMessageId&&h.clientMessageId===c.clientMessageId));if(!d||u)this.stoppedProjection=null;else{const c=[r.activeResponseUserMessageId,r.assistantDraftRespondsToUserMessageId,r.messages.filter(v=>v.role==="user").slice(-1)[0]?.id].filter(Boolean),h=c.length>0&&c.every(v=>e.messages.some(p=>p.respondsToUserMessageId===v&&!p.loading&&(p.dataType==="run_status"||p.dataType==="run_error"||p.role==="assistant"&&p.phase!=="commentary")));this.state=P(h?this.state:{...this.state,messages:r.messages,assistantDraft:r.assistantDraft},new Date().toISOString()),this.stoppedProjection=this.getState()}}for(const[r,a]of this.unacknowledgedSubmissions){if(e.user?.id!==a.userId||a.sessionId!==null&&e.sessionId!==a.sessionId){this.unacknowledgedSubmissions.delete(r);continue}const d=this.state.messages.find(u=>u.clientMessageId===r);if(d){d.attachments=_(a.message.attachments,d.attachments),this.unacknowledgedSubmissions.delete(r);continue}a.sessionId??=e.sessionId,this.state.messages.push(a.message),this.state.pendingMessageStatus="sending",this.state.turnPhase??="sending",this.state.taskStatus??="working"}if(t!==void 0&&(this.model=t),s&&JSON.stringify(s)!==JSON.stringify(this.sessionHistoryState)){this.sessionHistoryState=E(s);for(const r of this.sessionHistoryListeners)r(this.getSessionHistoryState())}if(n&&JSON.stringify(n)!==JSON.stringify(this.interactions)){this.interactions=n.map(r=>({...r}));for(const r of this.interactionListeners)r(this.getInteractions())}if(o!==void 0&&JSON.stringify(o)!==JSON.stringify(this.account)){this.account=o?{...o}:null;for(const r of this.accountListeners)r(this.getAccount())}this.emit("state",this.getState())}async connect(){await this.dispatch({type:"runtime.connect"})}destroy(){if(!this.destroyed){this.destroyed=!0,this.unacknowledgedSubmissions.clear(),this.attachmentFiles.clear(),this.sessionHistoryListeners.clear(),this.interactionListeners.clear(),this.accountListeners.clear();for(const e of Object.values(this.listeners))e?.clear();this.adapter.onDisconnect?.()}}warmup(e="panel_open"){return this.adapter.dispatch({type:"runtime.warmup",reason:e}).then(()=>{})}recordWidgetLifecycle(e,t){this.dispatch({type:"runtime.widget_lifecycle",action:e,trigger:t})}reportResponseVisibility(e){this.adapter.dispatch({type:"runtime.report_response_visibility",observation:e}).catch(()=>{})}reportInvalidStateTransition(e,t){this.adapter.dispatch({type:"runtime.report_invalid_state_transition",reason:e,clientMessageId:t}).catch(()=>{})}reportDisplayedError(e,t,s){this.adapter.dispatch({type:"runtime.report_displayed_error",reason:e,errorFingerprint:t,...s?{displayedMessage:V(s)}:{}}).catch(()=>{})}sendMessage(e,t={}){const s=e.trim(),n=t.attachments??[];if(!s&&n.length===0)return Promise.resolve(null);const o=t.clientMessageId??(t.proactiveSuggestionQuestion&&this.stagedProactiveSuggestionClientMessageId?this.stagedProactiveSuggestionClientMessageId:crypto.randomUUID()),l=t.submittedAt??Date.now(),r=this.state,a=this.submissionGeneration,d={id:`local-${o}`,role:"user",content:s,createdAt:new Date().toISOString(),...n.length>0?{attachments:n}:{},clientMessageId:o};this.unacknowledgedSubmissions.set(o,{message:{...d,attachments:d.attachments?.map(c=>({...c}))},sessionId:r.sessionId,userId:r.user?.id}),this.state={...this.state,messages:[...this.state.messages,d],pendingMessageStatus:"sending",turnPhase:this.state.isThinking?this.state.turnPhase:"sending",taskStatus:"working",isRetrying:!1,lastError:null};const u=this.enqueueOperation(()=>this.sendMessageNow(s,{...t,clientMessageId:o,submittedAt:l},r,a));return this.emit("state",this.getState()),u}async sendMessageNow(e,t,s,n){const o=e,l=t.clientMessageId;let r=t.attachments??[],a=!1;if(n!==this.submissionGeneration)return null;try{if(await this.adapter.dispatch({type:"conversation.stage",content:o,clientMessageId:l,proactiveSuggestionQuestion:t.proactiveSuggestionQuestion,attachments:r.length>0?r.map(T):void 0,submittedAt:t.submittedAt}),n!==this.submissionGeneration)return null;if(a=!0,r.length>0){if(!this.adapter.uploadAttachment)throw new Error("The runtime does not support attachments.");const u=[];for(const c of r){if(c.sandboxPath||c.storageKey){u.push(c);continue}const h=c.id?this.attachmentFiles.get(c.id):void 0;if(!h)throw new Error(`Attachment bytes are unavailable for ${c.name}`);if(u.push(await this.adapter.uploadAttachment(h,c,{clientMessageId:l})),n!==this.submissionGeneration)return null}r=u}const d=await this.adapter.dispatch({type:"conversation.send",content:o,clientMessageId:l,initiatedBy:t.initiatedBy,invocation:t.invocation,proactiveSuggestionQuestion:t.proactiveSuggestionQuestion,...t.automationOnboarding?{automationOnboarding:!0}:{},attachments:r.length>0?r.map(T):void 0});if(n!==this.submissionGeneration)return null;for(const u of t.attachments??[])u.id&&this.attachmentFiles.delete(u.id);return l===this.stagedProactiveSuggestionClientMessageId&&(this.stagedProactiveSuggestionClientMessageId=null),d?.clientMessageId??l}catch(d){if(n!==this.submissionGeneration)return null;throw this.unacknowledgedSubmissions.delete(l),this.state={...this.state,messages:this.state.messages.filter(u=>u.id!==`local-${l}`&&u.id!==`optimistic-user-message:${l}`),pendingMessageStatus:s.pendingMessageStatus,turnPhase:s.turnPhase,isThinking:s.isThinking,taskStatus:s.taskStatus},this.emit("state",this.getState()),a&&await this.adapter.dispatch({type:"conversation.fail_staged",clientMessageId:l,message:d instanceof Error?d.message:String(d)}),d}}getModel(){return this.model}setModel(e){return this.dispatch({type:"session.set_model",model:e}).then(()=>{})}retryLastMessage(){return this.stoppedProjection=null,this.dispatch({type:"run.retry"}),!0}createLocalAttachment(e){const t=crypto.randomUUID();return this.attachmentFiles.set(t,e),{id:t,name:e.name||"attachment",mimeType:e.type||"application/octet-stream",sizeBytes:e.size}}stop(){const e=this.cancelPendingSubmissions();this.state=P(this.state,new Date().toISOString()),this.stoppedProjection=this.getState(),this.emit("state",this.getState());const t=this.adapter.dispatch({type:"run.stop",...e.length?{clientMessageIds:e}:{}});return this.operationQueue=t.then(()=>{},()=>{}),t.then(()=>{})}cancelPendingSubmissions(){const e=[...this.unacknowledgedSubmissions.keys()];this.submissionGeneration++;for(const t of this.unacknowledgedSubmissions.values())for(const s of t.message.attachments??[])s.id&&this.attachmentFiles.delete(s.id);return this.unacknowledgedSubmissions.clear(),this.operationQueue=Promise.resolve(),e}startNewSession(e={}){return this.cancelPendingSubmissions(),this.stoppedProjection=null,e.notifyTransport===!1?Promise.resolve():this.dispatch({type:"session.new"}).then(()=>{})}async listSessions(e={}){const t=await this.dispatch({type:"session.list",...e});if(t===void 0){const s=this.getSessionHistoryState().data;return{sessions:s?s.ids.map(n=>s.entitiesById[n]):[],nextCursor:s?.nextCursor??null}}if(!t?.sessionHistoryPage)throw new Error("Session list command did not return a page.");return t.sessionHistoryPage}getSessionHistoryState(){return E(this.sessionHistoryState)}subscribeSessionHistory(e){return this.sessionHistoryListeners.add(e),e(this.getSessionHistoryState()),()=>this.sessionHistoryListeners.delete(e)}refreshSessionHistory(){return this.dispatch({type:"session.list",limit:20}).then(()=>{})}loadMoreSessionHistory(){const e=this.sessionHistoryState.data?.nextCursor??null;return e?this.dispatch({type:"session.list",cursor:e}).then(()=>{}):Promise.resolve()}setSessionPinned(e,t){return this.dispatch({type:"session.pin",sessionId:e,pinned:t}).then(()=>{})}renameSession(e,t){return this.dispatch({type:"session.rename",sessionId:e,title:t}).then(()=>{})}getInteractions(){return this.interactions.map(e=>({...e}))}subscribeInteractions(e){return this.interactionListeners.add(e),e(this.getInteractions()),()=>this.interactionListeners.delete(e)}actOnInteraction(e,t,s,n={}){return this.dispatch({type:"interaction.act",interactionId:e,action:t,expectedRevision:s,...n}).then(()=>{})}getAccount(){return this.account?{...this.account}:null}subscribeAccount(e){return this.accountListeners.add(e),e(this.getAccount()),()=>this.accountListeners.delete(e)}refreshAccount(){return Promise.resolve()}loadSession(e){return this.unacknowledgedSubmissions.clear(),this.dispatch({type:"session.load",sessionId:e}).then(()=>{})}stageProactiveSuggestionQuestion(e){const t=e.trim();if(!t)return Promise.resolve();const s=this.stagedProactiveSuggestionClientMessageId??crypto.randomUUID();return this.stagedProactiveSuggestionClientMessageId=s,this.dispatch({type:"conversation.stage_proactive_suggestion",question:t,clientMessageId:s}).then(()=>{})}dispatch(e){return this.enqueueOperation(()=>this.adapter.dispatch(e))}enqueueOperation(e){const t=this.operationQueue.then(e);return this.operationQueue=t.then(()=>{},()=>{}),t}emit(e,t){const s=this.listeners[e];for(const n of s??[])n(t)}}function _(i,e){if(!e||!i)return e;const t=new Map;for(const s of i){const n=s.previewUrl;s.id&&n&&t.set(s.id,n)}return e.map(s=>{const n=s.id?t.get(s.id):void 0;return n?{...s,previewUrl:n}:s})}function A(i){return{...i,starterPrompts:[...i.starterPrompts],appearance:i.appearance?{...i.appearance}:null,messages:i.messages.map(e=>{const t={...e,attachments:e.attachments?.map(l=>({...l}))},s=e.assistantDraftItemId,n=e.clientMessageId,o=e.proactiveSuggestionClientMessageId;return o&&Object.defineProperty(t,"proactiveSuggestionClientMessageId",{value:o,enumerable:!1}),s&&Object.defineProperty(t,"assistantDraftItemId",{value:s,enumerable:!1}),n&&Object.defineProperty(t,"clientMessageId",{value:n,enumerable:!1}),t}),activeScheduledFollowUps:i.activeScheduledFollowUps?.map(e=>({...e}))??null}}function E(i){return{...i,data:i.data?m({entities:O(i.data).map(e=>({...e})),nextCursor:i.data.nextCursor}):null}}exports.ProductAgentInteractionManager=K;exports.ProductAgentQueryController=I;exports.ProductAgentRemoteRuntimeClient=Y;exports.ProductAgentSessionHistoryManager=$;exports.ProductAgentTaskPageTitleController=z;exports.createLocalStorageInteractionDecisionStorage=N;exports.createProductAgentQueryState=g;exports.createProductAgentTaskPageTitleDocument=H;exports.formatProductAgentTaskPageTitle=C;exports.hasProductAgentPaidCreditFallback=q;exports.isProductAgentRuntimeCommand=W;exports.mergeProductAgentEntityPages=D;exports.normalizeProductAgentEntityPage=m;exports.readLocalStorageInteractionDecisions=k;exports.reconcileProductAgentSubmissionGate=L;exports.resolveProductAgentBillingPresentation=Q;exports.resolveProductAgentComposerAction=U;exports.resolveProductAgentWidgetPresentation=x;exports.selectProductAgentQueryEntities=O;