@pluno/product-agent-web 0.1.213 → 0.1.215

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.
@@ -1,6 +1,6 @@
1
- function h(i) {
1
+ function h(s) {
2
2
  return {
3
- key: i,
3
+ key: s,
4
4
  status: "not_requested",
5
5
  data: null,
6
6
  error: null,
@@ -9,8 +9,8 @@ function h(i) {
9
9
  };
10
10
  }
11
11
  class b {
12
- constructor(e, t, s = (n, r) => r) {
13
- this.loader = t, this.merge = s, this.state = h(e);
12
+ constructor(e, t, i = (n, r) => r) {
13
+ this.loader = t, this.merge = i, this.state = h(e);
14
14
  }
15
15
  loader;
16
16
  merge;
@@ -52,16 +52,16 @@ class b {
52
52
  for (; this.trailingLoad; ) {
53
53
  const e = this.trailingLoad;
54
54
  this.trailingLoad = null;
55
- const t = this.state.key, s = this.state.requestId + 1;
55
+ const t = this.state.key, i = this.state.requestId + 1;
56
56
  this.state = {
57
57
  ...this.state,
58
58
  status: e.mode === "append" ? "loading_more" : this.state.data === null ? "loading" : "refreshing",
59
59
  error: null,
60
- requestId: s
60
+ requestId: i
61
61
  }, this.publish();
62
62
  try {
63
63
  const n = await this.loader({ key: t, cursor: e.cursor });
64
- if (t !== this.state.key || s !== this.state.requestId) continue;
64
+ if (t !== this.state.key || i !== this.state.requestId) continue;
65
65
  this.state = {
66
66
  ...this.state,
67
67
  status: "ready",
@@ -70,7 +70,7 @@ class b {
70
70
  updatedAt: Date.now()
71
71
  }, this.publish();
72
72
  } catch (n) {
73
- if (t !== this.state.key || s !== this.state.requestId) continue;
73
+ if (t !== this.state.key || i !== this.state.requestId) continue;
74
74
  this.state = {
75
75
  ...this.state,
76
76
  status: "error",
@@ -83,53 +83,53 @@ class b {
83
83
  for (const e of this.listeners) e(this.state);
84
84
  }
85
85
  }
86
- function p(i) {
86
+ function p(s) {
87
87
  const e = {}, t = [];
88
- for (const s of i.entities)
89
- e[s.id] || t.push(s.id), e[s.id] = s;
88
+ for (const i of s.entities)
89
+ e[i.id] || t.push(i.id), e[i.id] = i;
90
90
  return {
91
91
  entitiesById: e,
92
92
  ids: t,
93
- nextCursor: i.nextCursor
93
+ nextCursor: s.nextCursor
94
94
  };
95
95
  }
96
- function E(i, e, t) {
97
- if (t === "replace" || i === null) return e;
98
- const s = { ...i.entitiesById, ...e.entitiesById }, n = [...i.ids];
96
+ function _(s, e, t) {
97
+ if (t === "replace" || s === null) return e;
98
+ const i = { ...s.entitiesById, ...e.entitiesById }, n = [...s.ids];
99
99
  for (const r of e.ids)
100
- i.entitiesById[r] || n.push(r);
101
- return { entitiesById: s, ids: n, nextCursor: e.nextCursor };
100
+ s.entitiesById[r] || n.push(r);
101
+ return { entitiesById: i, ids: n, nextCursor: e.nextCursor };
102
102
  }
103
- function w(i) {
104
- return i ? i.ids.map((e) => i.entitiesById[e]).filter((e) => !!e) : [];
103
+ function I(s) {
104
+ return s ? s.ids.map((e) => s.entitiesById[e]).filter((e) => !!e) : [];
105
105
  }
106
- function R(i) {
107
- return i.visible ? i.minimized ? { state: "minimized" } : { state: i.open ? "visible_open" : "visible_closed" } : { state: "hidden" };
106
+ function L(s) {
107
+ return s.visible ? s.minimized ? { state: "minimized" } : { state: s.open ? "visible_open" : "visible_closed" } : { state: "hidden" };
108
108
  }
109
- function C(i, e) {
110
- 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: [] };
109
+ function q(s, e) {
110
+ 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"] } : s ?? { allowed: !0, reason: "allowed", actions: [] };
111
111
  }
112
- function L(i) {
113
- if (!i || typeof i != "object") return !1;
114
- const e = i.paidCreditFallbackModel;
112
+ function Q(s) {
113
+ if (!s || typeof s != "object") return !1;
114
+ const e = s.paidCreditFallbackModel;
115
115
  return typeof e == "string" && e.length > 0;
116
116
  }
117
- function q(i) {
118
- 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 <= 0.2 ? { state: "low_credits" } : i.creditsUsed !== null ? { state: "usage" } : { state: "hidden" } : { state: "hidden" };
117
+ function $(s) {
118
+ return s ? s.submissionGate?.allowed === !1 ? { state: "action_required", reason: s.submissionGate.reason } : s.usingPaidCreditFallback === !0 ? { state: "paid_credit_fallback" } : s.creditLimit !== null && s.creditLimit > 0 && s.creditsRemaining !== null && s.creditsRemaining > 0 && s.creditsRemaining / s.creditLimit <= 0.2 ? { state: "low_credits" } : s.creditsUsed !== null ? { state: "usage" } : { state: "hidden" } : { state: "hidden" };
119
119
  }
120
- function Q(i) {
121
- const e = i.hasDraftMessage || i.hasPreSubmittedAttachment;
122
- return i.hasRunningAssistantTurn && !e ? {
120
+ function K(s) {
121
+ const e = s.hasDraftMessage || s.hasPreSubmittedAttachment;
122
+ return s.hasRunningAssistantTurn && !e ? {
123
123
  action: "stop",
124
- disabled: !i.canStopRunningTurn
124
+ disabled: !s.canStopRunningTurn
125
125
  } : {
126
126
  action: "send",
127
- disabled: !e || !i.canSubmitMessage
127
+ disabled: !e || !s.canSubmitMessage
128
128
  };
129
129
  }
130
- class $ {
131
- constructor(e, t, s = 20) {
132
- this.loadPage = t, this.limit = s, this.recentQuery = new b(
130
+ class B {
131
+ constructor(e, t, i = 20) {
132
+ this.loadPage = t, this.limit = i, this.recentQuery = new b(
133
133
  `${e}:recent`,
134
134
  async ({ cursor: n }) => p(
135
135
  await this.loadPage({ cursor: n, limit: this.limit, pinned: !1 }).then((r) => ({
@@ -137,7 +137,7 @@ class $ {
137
137
  nextCursor: r.nextCursor
138
138
  }))
139
139
  ),
140
- E
140
+ _
141
141
  ), this.pinnedQuery = new b(
142
142
  `${e}:pinned`,
143
143
  async () => p({
@@ -159,10 +159,10 @@ class $ {
159
159
  completedRefreshSequence = 0;
160
160
  activityReconciliationScheduled = !1;
161
161
  getState() {
162
- const e = this.recentQuery.getState(), t = this.pinnedQuery.getState(), s = [
162
+ const e = this.recentQuery.getState(), t = this.pinnedQuery.getState(), i = [
163
163
  ...u(t.data),
164
164
  ...u(e.data)
165
- ], n = new Map(s.map((o) => [o.id, o])), r = Array.from(n.values()).map(
165
+ ], n = new Map(i.map((o) => [o.id, o])), r = Array.from(n.values()).map(
166
166
  (o) => this.applyOverrides(o, this.completedRefreshSequence)
167
167
  ), a = Array.from(this.optimisticEntities.values()).filter((o) => !n.has(o.id)).reverse(), l = e.data || t.data || a.length > 0 ? p({
168
168
  entities: [...a, ...r],
@@ -170,7 +170,7 @@ class $ {
170
170
  }) : null;
171
171
  return {
172
172
  key: e.key.slice(0, -7),
173
- status: _(e, t),
173
+ status: P(e, t),
174
174
  data: l,
175
175
  error: e.error ?? t.error,
176
176
  requestId: Math.max(e.requestId, t.requestId),
@@ -216,20 +216,20 @@ class $ {
216
216
  isActive: t,
217
217
  confirmAfterRefresh: this.completedRefreshSequence + 1,
218
218
  releaseAfterRefresh: this.completedRefreshSequence + 2
219
- }), this.updateEntity(e, (s) => ({ ...s, isActive: t }));
219
+ }), this.updateEntity(e, (i) => ({ ...i, isActive: t }));
220
220
  }
221
221
  setPinned(e, t) {
222
- const s = { pinned: t, confirmAfterRefresh: Number.POSITIVE_INFINITY };
223
- return this.pinnedOverrides.set(e, s), this.updateEntity(e, (n) => ({ ...n, isPinned: t })), s;
222
+ const i = { pinned: t, confirmAfterRefresh: Number.POSITIVE_INFINITY };
223
+ return this.pinnedOverrides.set(e, i), this.updateEntity(e, (n) => ({ ...n, isPinned: t })), i;
224
224
  }
225
225
  confirmPinned(e, t) {
226
226
  this.pinnedOverrides.get(e) === t && (t.confirmAfterRefresh = this.completedRefreshSequence + 1);
227
227
  }
228
- rollbackPinned(e, t, s) {
229
- this.pinnedOverrides.get(e) === t && (this.pinnedOverrides.delete(e), this.updateEntity(e, (n) => ({ ...n, isPinned: s })));
228
+ rollbackPinned(e, t, i) {
229
+ this.pinnedOverrides.get(e) === t && (this.pinnedOverrides.delete(e), this.updateEntity(e, (n) => ({ ...n, isPinned: i })));
230
230
  }
231
231
  setTitle(e, t) {
232
- this.titleOverrides.set(e, t), this.updateEntity(e, (s) => ({ ...s, customTitle: t }));
232
+ this.titleOverrides.set(e, t), this.updateEntity(e, (i) => ({ ...i, customTitle: t }));
233
233
  }
234
234
  confirmTitle(e) {
235
235
  this.titleOverrides.delete(e);
@@ -238,34 +238,34 @@ class $ {
238
238
  const e = [
239
239
  ...u(this.pinnedQuery.getState().data),
240
240
  ...u(this.recentQuery.getState().data)
241
- ], t = new Set(e.map((s) => s.id));
242
- for (const s of this.optimisticEntities.keys())
243
- t.has(s) && this.optimisticEntities.delete(s);
244
- for (const s of e) this.applyOverrides(s, this.completedRefreshSequence);
241
+ ], t = new Set(e.map((i) => i.id));
242
+ for (const i of this.optimisticEntities.keys())
243
+ t.has(i) && this.optimisticEntities.delete(i);
244
+ for (const i of e) this.applyOverrides(i, this.completedRefreshSequence);
245
245
  this.publish();
246
246
  }
247
247
  async loadAllPinned() {
248
248
  const e = [];
249
249
  let t = null;
250
250
  do {
251
- const s = await this.loadPage({ cursor: t, limit: this.limit, pinned: !0 });
252
- e.push(...s.sessions), t = s.nextCursor;
251
+ const i = await this.loadPage({ cursor: t, limit: this.limit, pinned: !0 });
252
+ e.push(...i.sessions), t = i.nextCursor;
253
253
  } while (t);
254
254
  return e;
255
255
  }
256
256
  applyOverrides(e, t) {
257
- let s = e;
257
+ let i = e;
258
258
  const n = this.activityOverrides.get(e.id);
259
- 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 });
259
+ n && (t >= n.confirmAfterRefresh && e.isActive === n.isActive ? this.activityOverrides.delete(e.id) : t >= n.releaseAfterRefresh ? this.activityOverrides.delete(e.id) : i = { ...i, isActive: n.isActive });
260
260
  const r = this.pinnedOverrides.get(e.id);
261
- 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;
261
+ return r && (t >= r.confirmAfterRefresh && e.isPinned === !0 === r.pinned ? this.pinnedOverrides.delete(e.id) : i = { ...i, isPinned: r.pinned }), this.titleOverrides.has(e.id) && (i = { ...i, customTitle: this.titleOverrides.get(e.id) ?? null }), i;
262
262
  }
263
263
  updateProjection() {
264
264
  this.publish();
265
265
  }
266
266
  updateEntity(e, t) {
267
- const s = this.optimisticEntities.get(e);
268
- s && this.optimisticEntities.set(e, t(s)), this.publish();
267
+ const i = this.optimisticEntities.get(e);
268
+ i && this.optimisticEntities.set(e, t(i)), this.publish();
269
269
  }
270
270
  hasUnconfirmedActivityOverride() {
271
271
  return Array.from(this.activityOverrides.values()).some(
@@ -276,16 +276,16 @@ class $ {
276
276
  for (const e of this.listeners) e(this.getState());
277
277
  }
278
278
  }
279
- function u(i) {
280
- return i ? i.ids.map((e) => i.entitiesById[e]).filter((e) => !!e) : [];
279
+ function u(s) {
280
+ return s ? s.ids.map((e) => s.entitiesById[e]).filter((e) => !!e) : [];
281
281
  }
282
- function _(i, e) {
283
- 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";
282
+ function P(s, e) {
283
+ return s.status === "error" || e.status === "error" ? "error" : s.status === "loading" || e.status === "loading" ? "loading" : s.status === "refreshing" || e.status === "refreshing" ? "refreshing" : s.status === "loading_more" ? "loading_more" : s.status === "ready" || e.status === "ready" ? "ready" : "not_requested";
284
284
  }
285
- class K {
285
+ class z {
286
286
  constructor(e, t = null) {
287
287
  this.storage = e, t && (this.decisions = new Map(
288
- t.filter(y).map((s) => [this.getDecisionKey(s), s])
288
+ t.filter(y).map((i) => [this.getDecisionKey(i), i])
289
289
  ), this.initialized = !0);
290
290
  }
291
291
  storage;
@@ -301,60 +301,60 @@ class K {
301
301
  ), this.initialized = !0;
302
302
  }
303
303
  isEligible(e, t = Date.now()) {
304
- const s = this.scheduledEligibility.get(this.getExactKey(e));
305
- 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);
304
+ const i = this.scheduledEligibility.get(this.getExactKey(e));
305
+ return i !== void 0 && i > t ? !1 : this.isDecisionEligible(this.decisions.get(this.getExactKey(e)), t) && this.isDecisionEligible(this.decisions.get(this.getCategoryKey(e)), t);
306
306
  }
307
307
  getDecision(e) {
308
308
  return this.decisions.get(this.getExactKey(e)) ?? this.decisions.get(this.getCategoryKey(e)) ?? null;
309
309
  }
310
310
  getStatus(e, t = Date.now()) {
311
- const s = this.scheduledEligibility.get(this.getExactKey(e));
312
- if (s !== void 0 && s > t) return "scheduled";
311
+ const i = this.scheduledEligibility.get(this.getExactKey(e));
312
+ if (i !== void 0 && i > t) return "scheduled";
313
313
  const n = this.getDecision(e);
314
314
  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";
315
315
  }
316
316
  scheduleEligibility(e, t) {
317
- const s = this.getExactKey(e), n = this.scheduledEligibility.get(s);
318
- return n !== void 0 ? n : (this.scheduledEligibility.set(s, t), t);
317
+ const i = this.getExactKey(e), n = this.scheduledEligibility.get(i);
318
+ return n !== void 0 ? n : (this.scheduledEligibility.set(i, t), t);
319
319
  }
320
320
  getNextEligibilityAt(e = Date.now()) {
321
- for (const [s, n] of this.scheduledEligibility)
322
- n <= e && this.scheduledEligibility.delete(s);
321
+ for (const [i, n] of this.scheduledEligibility)
322
+ n <= e && this.scheduledEligibility.delete(i);
323
323
  const t = [
324
324
  ...this.scheduledEligibility.values(),
325
- ...Array.from(this.decisions.values()).map((s) => s.nextEligibleAt ? Date.parse(s.nextEligibleAt) : Number.NaN).filter((s) => Number.isFinite(s) && s > e)
325
+ ...Array.from(this.decisions.values()).map((i) => i.nextEligibleAt ? Date.parse(i.nextEligibleAt) : Number.NaN).filter((i) => Number.isFinite(i) && i > e)
326
326
  ];
327
327
  return t.length > 0 ? Math.min(...t) : null;
328
328
  }
329
- act(e, t, s = {}) {
330
- const n = this.actionQueue.then(() => this.applyAction(e, t, s));
329
+ act(e, t, i = {}) {
330
+ const n = this.actionQueue.then(() => this.applyAction(e, t, i));
331
331
  return this.actionQueue = n.then(() => {
332
332
  }, () => {
333
333
  }), n;
334
334
  }
335
- async applyAction(e, t, s) {
335
+ async applyAction(e, t, i) {
336
336
  if (!e.allowedActions.includes(t))
337
337
  throw new Error(`Interaction ${e.key} does not allow ${t}.`);
338
- if (!I(t))
338
+ if (!E(t))
339
339
  throw new Error(`Interaction action ${t} is not a persistence decision.`);
340
- const n = s.now ?? /* @__PURE__ */ new Date(), r = {
340
+ const n = i.now ?? /* @__PURE__ */ new Date(), r = {
341
341
  promptKey: e.key,
342
342
  category: e.category,
343
343
  action: t,
344
344
  scope: e.scope,
345
345
  decidedAt: n.toISOString(),
346
- nextEligibleAt: this.getNextEligibleAt(e, t, n, s.snoozeUntil)
346
+ nextEligibleAt: this.getNextEligibleAt(e, t, n, i.snoozeUntil)
347
347
  }, a = t === "dont_show_again" ? this.getCategoryKey(e) : this.getExactKey(e), l = new Map(this.decisions);
348
348
  return l.set(a, r), await this.storage.save([...l.values()]), this.decisions = l, r;
349
349
  }
350
350
  isDecisionEligible(e, t) {
351
351
  return e ? e.action === "dismiss" || e.action === "never" || e.action === "dont_show_again" ? !1 : !e.nextEligibleAt || Date.parse(e.nextEligibleAt) <= t : !0;
352
352
  }
353
- getNextEligibleAt(e, t, s, n) {
353
+ getNextEligibleAt(e, t, i, n) {
354
354
  if (t === "later")
355
- return new Date(s.getTime() + (e.laterDelayMs ?? 3600 * 1e3)).toISOString();
355
+ return new Date(i.getTime() + (e.laterDelayMs ?? 3600 * 1e3)).toISOString();
356
356
  if (t === "snooze") {
357
- if (!n || n.getTime() <= s.getTime())
357
+ if (!n || n.getTime() <= i.getTime())
358
358
  throw new Error("Snooze requires a future next-eligible time.");
359
359
  return n.toISOString();
360
360
  }
@@ -371,41 +371,41 @@ class K {
371
371
  return `${m(e.scope)}:category:${e.category}`;
372
372
  }
373
373
  }
374
- function F(i, e) {
374
+ function F(s, e) {
375
375
  return {
376
- load: async () => P(i, e),
377
- save: async (t) => i.setItem(e, JSON.stringify(t))
376
+ load: async () => T(s, e),
377
+ save: async (t) => s.setItem(e, JSON.stringify(t))
378
378
  };
379
379
  }
380
- function P(i, e) {
381
- const t = i.getItem(e);
380
+ function T(s, e) {
381
+ const t = s.getItem(e);
382
382
  if (!t) return [];
383
- const s = JSON.parse(t);
384
- return Array.isArray(s) ? s.filter(y) : [];
383
+ const i = JSON.parse(t);
384
+ return Array.isArray(i) ? i.filter(y) : [];
385
385
  }
386
- function m(i) {
387
- return `${i.level}:${i.key}`;
386
+ function m(s) {
387
+ return `${s.level}:${s.key}`;
388
388
  }
389
- function I(i) {
390
- return i === "dismiss" || i === "later" || i === "snooze" || i === "never" || i === "dont_show_again";
389
+ function E(s) {
390
+ return s === "dismiss" || s === "later" || s === "snooze" || s === "never" || s === "dont_show_again";
391
391
  }
392
- function y(i) {
393
- if (!i || typeof i != "object") return !1;
394
- const e = i;
395
- return typeof e.promptKey == "string" && typeof e.category == "string" && typeof e.decidedAt == "string" && (e.nextEligibleAt === null || typeof e.nextEligibleAt == "string") && I(e.action) && !!(e.scope && typeof e.scope == "object" && typeof e.scope.level == "string" && typeof e.scope.key == "string");
392
+ function y(s) {
393
+ if (!s || typeof s != "object") return !1;
394
+ const e = s;
395
+ return typeof e.promptKey == "string" && typeof e.category == "string" && typeof e.decidedAt == "string" && (e.nextEligibleAt === null || typeof e.nextEligibleAt == "string") && E(e.action) && !!(e.scope && typeof e.scope == "object" && typeof e.scope.level == "string" && typeof e.scope.key == "string");
396
396
  }
397
- const T = {
397
+ const M = {
398
398
  working: "⏳",
399
399
  completed: "✅",
400
400
  failed: "❗",
401
401
  stopped: "⏹️"
402
- }, M = /^(?:⌛|⏳|✅|❗|⏹️) Pluno(?:: )?/;
403
- function D(i, e) {
404
- if (!e) return g(i);
405
- const t = g(i), s = `${T[e]} Pluno`;
406
- return t ? `${s}: ${t}` : s;
402
+ }, D = /^(?:⌛|⏳|✅|❗|⏹️) Pluno(?:: )?/;
403
+ function O(s, e) {
404
+ if (!e) return g(s);
405
+ const t = g(s), i = `${M[e]} Pluno`;
406
+ return t ? `${i}: ${t}` : i;
407
407
  }
408
- class z {
408
+ class U {
409
409
  constructor(e) {
410
410
  this.titleDocument = e;
411
411
  }
@@ -422,16 +422,16 @@ class z {
422
422
  this.liveStatusVersion += 1, this.applyClear();
423
423
  }
424
424
  async syncStatus(e) {
425
- const t = this.liveStatusVersion, s = await e();
426
- s === void 0 || t !== this.liveStatusVersion || (s ? this.applyStatus(s) : this.applyClear());
425
+ const t = this.liveStatusVersion, i = await e();
426
+ i === void 0 || t !== this.liveStatusVersion || (i ? this.applyStatus(i) : this.applyClear());
427
427
  }
428
428
  applyStatus(e) {
429
429
  const t = this.titleDocument.getTitle();
430
430
  t !== this.lastAppliedTitle && (this.baseTitle = g(t)), this.status = e, this.stopObserving || (this.stopObserving = this.titleDocument.observeTitle(() => this.handleTitleChanged())), this.applyTitle();
431
431
  }
432
432
  applyClear() {
433
- const e = this.titleDocument.getTitle(), t = this.lastAppliedTitle !== null && e === this.lastAppliedTitle, s = this.lastAppliedTitle === null ? g(e) : e;
434
- this.status = null, this.lastAppliedTitle = null, this.stopObserving?.(), this.stopObserving = null, t ? this.titleDocument.setTitle(this.baseTitle) : s !== e && this.titleDocument.setTitle(s);
433
+ const e = this.titleDocument.getTitle(), t = this.lastAppliedTitle !== null && e === this.lastAppliedTitle, i = this.lastAppliedTitle === null ? g(e) : e;
434
+ this.status = null, this.lastAppliedTitle = null, this.stopObserving?.(), this.stopObserving = null, t ? this.titleDocument.setTitle(this.baseTitle) : i !== e && this.titleDocument.setTitle(i);
435
435
  }
436
436
  handleTitleChanged() {
437
437
  !this.status || this.titleDocument.getTitle() === this.lastAppliedTitle || this.applyTitle();
@@ -439,19 +439,19 @@ class z {
439
439
  applyTitle() {
440
440
  if (!this.status)
441
441
  return;
442
- const e = D(this.baseTitle, this.status);
442
+ const e = O(this.baseTitle, this.status);
443
443
  this.lastAppliedTitle = e, this.titleDocument.getTitle() !== e && this.titleDocument.setTitle(e);
444
444
  }
445
445
  }
446
- function B(i) {
446
+ function N(s) {
447
447
  return {
448
- getTitle: () => i.title,
448
+ getTitle: () => s.title,
449
449
  setTitle: (e) => {
450
- i.title = e;
450
+ s.title = e;
451
451
  },
452
452
  observeTitle: (e) => {
453
453
  const t = new MutationObserver(e);
454
- return t.observe(i.head, {
454
+ return t.observe(s.head, {
455
455
  childList: !0,
456
456
  subtree: !0,
457
457
  characterData: !0
@@ -459,15 +459,15 @@ function B(i) {
459
459
  }
460
460
  };
461
461
  }
462
- function g(i) {
463
- return i.replace(M, "");
462
+ function g(s) {
463
+ return s.replace(D, "");
464
464
  }
465
465
  const S = 500;
466
- function k(i) {
467
- 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();
466
+ function k(s) {
467
+ const e = s.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();
468
468
  return e.length > S ? `${e.slice(0, S - 1)}…` : e;
469
469
  }
470
- const O = {
470
+ const x = {
471
471
  "duplicate-message-item": "A canonical message rendered more than once.",
472
472
  "duplicate-canonical-item": "A canonical session item rendered more than once.",
473
473
  "duplicate-tool-call": "A tool call rendered more than once.",
@@ -480,12 +480,23 @@ const O = {
480
480
  "thinking-groups-without-user-message": "Multiple thinking groups appeared without a user message between them.",
481
481
  "thinking-without-progress": "Thinking remained visible without progress for five minutes."
482
482
  };
483
- function x(i) {
484
- return typeof i == "string" && i.startsWith("ui_invariant:") && Object.prototype.hasOwnProperty.call(O, i.slice(13));
483
+ function R(s) {
484
+ return typeof s == "string" && s.startsWith("ui_invariant:") && Object.prototype.hasOwnProperty.call(x, s.slice(13));
485
+ }
486
+ function A(s) {
487
+ return {
488
+ ...s.id === void 0 ? {} : { id: s.id },
489
+ name: s.name,
490
+ mimeType: s.mimeType,
491
+ sizeBytes: s.sizeBytes,
492
+ ...s.sandboxPath === void 0 ? {} : { sandboxPath: s.sandboxPath },
493
+ ...s.storageKey === void 0 ? {} : { storageKey: s.storageKey },
494
+ ...s.fileUrl === void 0 ? {} : { fileUrl: s.fileUrl }
495
+ };
485
496
  }
486
- function N(i) {
487
- if (!i || typeof i != "object" || !("type" in i)) return !1;
488
- const e = i;
497
+ function H(s) {
498
+ if (!s || typeof s != "object" || !("type" in s)) return !1;
499
+ const e = s;
489
500
  switch (e.type) {
490
501
  case "runtime.connect":
491
502
  case "session.new":
@@ -497,7 +508,7 @@ function N(i) {
497
508
  case "runtime.report_displayed_error":
498
509
  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);
499
510
  case "runtime.report_invalid_state_transition":
500
- return (e.reason === "submitted_turn_returned_to_welcome_without_new_chat" || e.reason === "new_messages_button_without_user_scroll" || x(e.reason)) && (e.clientMessageId === void 0 || typeof e.clientMessageId == "string");
511
+ return (e.reason === "submitted_turn_returned_to_welcome_without_new_chat" || e.reason === "new_messages_button_without_user_scroll" || R(e.reason)) && (e.clientMessageId === void 0 || typeof e.clientMessageId == "string");
501
512
  case "runtime.widget_lifecycle":
502
513
  return (e.action === "opened" || e.action === "closed" || e.action === "minimized") && typeof e.trigger == "string";
503
514
  case "session.load":
@@ -519,14 +530,14 @@ function N(i) {
519
530
  case "conversation.fail_staged":
520
531
  return typeof e.clientMessageId == "string" && typeof e.message == "string";
521
532
  case "conversation.send":
522
- return typeof e.content == "string" && typeof e.clientMessageId == "string" && (e.attachments === void 0 || Array.isArray(e.attachments));
533
+ 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));
523
534
  default:
524
535
  return !1;
525
536
  }
526
537
  }
527
- class H {
528
- constructor(e, t, s) {
529
- this.adapter = t, this.state = f(e), this.model = s;
538
+ class j {
539
+ constructor(e, t, i) {
540
+ this.adapter = t, this.state = f(e), this.model = i;
530
541
  }
531
542
  adapter;
532
543
  listeners = {};
@@ -544,26 +555,34 @@ class H {
544
555
  operationQueue = Promise.resolve();
545
556
  destroyed = !1;
546
557
  on(e, t) {
547
- const s = this.listeners[e] ?? /* @__PURE__ */ new Set();
548
- return s.add(t), this.listeners[e] = s, () => s.delete(t);
558
+ const i = this.listeners[e] ?? /* @__PURE__ */ new Set();
559
+ return i.add(t), this.listeners[e] = i, () => i.delete(t);
549
560
  }
550
561
  getState() {
551
562
  return f(this.state);
552
563
  }
553
- updateProjection(e, t, s, n, r) {
564
+ updateProjection(e, t, i, n, r) {
554
565
  if (!this.destroyed) {
555
566
  this.state = f(e);
556
567
  for (const [a, l] of this.unacknowledgedSubmissions) {
557
- if (e.user?.id !== l.userId || l.sessionId !== null && e.sessionId !== l.sessionId || e.messages.some(
558
- (o) => o.clientMessageId === a
559
- )) {
568
+ if (e.user?.id !== l.userId || l.sessionId !== null && e.sessionId !== l.sessionId) {
560
569
  this.unacknowledgedSubmissions.delete(a);
561
570
  continue;
562
571
  }
572
+ const o = this.state.messages.find(
573
+ (c) => c.clientMessageId === a
574
+ );
575
+ if (o) {
576
+ o.attachments = C(
577
+ l.message.attachments,
578
+ o.attachments
579
+ ), this.unacknowledgedSubmissions.delete(a);
580
+ continue;
581
+ }
563
582
  l.sessionId ??= e.sessionId, this.state.messages.push(l.message), this.state.pendingMessageStatus = "sending", this.state.turnPhase ??= "sending", this.state.taskStatus ??= "working";
564
583
  }
565
- if (t !== void 0 && (this.model = t), s) {
566
- this.sessionHistoryState = A(s);
584
+ if (t !== void 0 && (this.model = t), i) {
585
+ this.sessionHistoryState = w(i);
567
586
  for (const a of this.sessionHistoryListeners)
568
587
  a(this.getSessionHistoryState());
569
588
  }
@@ -603,22 +622,22 @@ class H {
603
622
  }).catch(() => {
604
623
  });
605
624
  }
606
- reportDisplayedError(e, t, s) {
625
+ reportDisplayedError(e, t, i) {
607
626
  this.adapter.dispatch({
608
627
  type: "runtime.report_displayed_error",
609
628
  reason: e,
610
629
  errorFingerprint: t,
611
- ...s ? { displayedMessage: k(s) } : {}
630
+ ...i ? { displayedMessage: k(i) } : {}
612
631
  }).catch(() => {
613
632
  });
614
633
  }
615
634
  sendMessage(e, t = {}) {
616
- const s = e.trim(), n = t.attachments ?? [];
617
- if (!s && n.length === 0) return Promise.resolve(null);
635
+ const i = e.trim(), n = t.attachments ?? [];
636
+ if (!i && n.length === 0) return Promise.resolve(null);
618
637
  const r = t.clientMessageId ?? (t.proactiveSuggestionQuestion && this.stagedProactiveSuggestionClientMessageId ? this.stagedProactiveSuggestionClientMessageId : crypto.randomUUID()), a = t.submittedAt ?? Date.now(), l = this.state, o = {
619
638
  id: `local-${r}`,
620
639
  role: "user",
621
- content: s,
640
+ content: i,
622
641
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
623
642
  ...n.length > 0 ? { attachments: n } : {},
624
643
  clientMessageId: r
@@ -636,12 +655,12 @@ class H {
636
655
  isRetrying: !1,
637
656
  lastError: null
638
657
  }, this.emit("state", this.getState()), this.enqueueOperation(() => this.sendMessageNow(
639
- s,
658
+ i,
640
659
  { ...t, clientMessageId: r, submittedAt: a },
641
660
  l
642
661
  ));
643
662
  }
644
- async sendMessageNow(e, t, s) {
663
+ async sendMessageNow(e, t, i) {
645
664
  const n = e, r = t.clientMessageId;
646
665
  let a = t.attachments ?? [], l = !1;
647
666
  try {
@@ -650,7 +669,8 @@ class H {
650
669
  content: n,
651
670
  clientMessageId: r,
652
671
  proactiveSuggestionQuestion: t.proactiveSuggestionQuestion,
653
- attachments: a.length > 0 ? a : void 0,
672
+ // Preview URLs belong to the renderer's optimistic snapshot and are not valid runtime-command metadata.
673
+ attachments: a.length > 0 ? a.map(A) : void 0,
654
674
  submittedAt: t.submittedAt
655
675
  }), l = !0, a.length > 0) {
656
676
  if (!this.adapter.uploadAttachment)
@@ -674,7 +694,8 @@ class H {
674
694
  initiatedBy: t.initiatedBy,
675
695
  invocation: t.invocation,
676
696
  proactiveSuggestionQuestion: t.proactiveSuggestionQuestion,
677
- attachments: a.length > 0 ? a : void 0
697
+ ...t.automationOnboarding ? { automationOnboarding: !0 } : {},
698
+ attachments: a.length > 0 ? a.map(A) : void 0
678
699
  });
679
700
  for (const c of t.attachments ?? [])
680
701
  c.id && this.attachmentFiles.delete(c.id);
@@ -685,10 +706,10 @@ class H {
685
706
  messages: this.state.messages.filter(
686
707
  (c) => c.id !== `local-${r}` && c.id !== `optimistic-user-message:${r}`
687
708
  ),
688
- pendingMessageStatus: s.pendingMessageStatus,
689
- turnPhase: s.turnPhase,
690
- isThinking: s.isThinking,
691
- taskStatus: s.taskStatus
709
+ pendingMessageStatus: i.pendingMessageStatus,
710
+ turnPhase: i.turnPhase,
711
+ isThinking: i.isThinking,
712
+ taskStatus: i.taskStatus
692
713
  }, this.emit("state", this.getState()), l && await this.adapter.dispatch({
693
714
  type: "conversation.fail_staged",
694
715
  clientMessageId: r,
@@ -727,12 +748,12 @@ class H {
727
748
  await this.dispatch({ type: "session.list", ...e });
728
749
  const t = this.sessionHistoryState.data;
729
750
  return {
730
- sessions: w(t),
751
+ sessions: I(t),
731
752
  nextCursor: t?.nextCursor ?? null
732
753
  };
733
754
  }
734
755
  getSessionHistoryState() {
735
- return A(this.sessionHistoryState);
756
+ return w(this.sessionHistoryState);
736
757
  }
737
758
  subscribeSessionHistory(e) {
738
759
  return this.sessionHistoryListeners.add(e), e(this.getSessionHistoryState()), () => this.sessionHistoryListeners.delete(e);
@@ -760,12 +781,12 @@ class H {
760
781
  subscribeInteractions(e) {
761
782
  return this.interactionListeners.add(e), e(this.getInteractions()), () => this.interactionListeners.delete(e);
762
783
  }
763
- actOnInteraction(e, t, s, n = {}) {
784
+ actOnInteraction(e, t, i, n = {}) {
764
785
  return this.dispatch({
765
786
  type: "interaction.act",
766
787
  interactionId: e,
767
788
  action: t,
768
- expectedRevision: s,
789
+ expectedRevision: i,
769
790
  ...n
770
791
  }).then(() => {
771
792
  });
@@ -786,11 +807,11 @@ class H {
786
807
  stageProactiveSuggestionQuestion(e) {
787
808
  const t = e.trim();
788
809
  if (!t) return Promise.resolve();
789
- const s = this.stagedProactiveSuggestionClientMessageId ?? crypto.randomUUID();
790
- return this.stagedProactiveSuggestionClientMessageId = s, this.dispatch({
810
+ const i = this.stagedProactiveSuggestionClientMessageId ?? crypto.randomUUID();
811
+ return this.stagedProactiveSuggestionClientMessageId = i, this.dispatch({
791
812
  type: "conversation.stage_proactive_suggestion",
792
813
  question: t,
793
- clientMessageId: s
814
+ clientMessageId: i
794
815
  }).then(() => {
795
816
  });
796
817
  }
@@ -807,61 +828,73 @@ class H {
807
828
  ), t;
808
829
  }
809
830
  emit(e, t) {
810
- const s = this.listeners[e];
811
- for (const n of s ?? []) n(t);
831
+ const i = this.listeners[e];
832
+ for (const n of i ?? []) n(t);
812
833
  }
813
834
  }
814
- function f(i) {
835
+ function C(s, e) {
836
+ if (!e || !s) return e;
837
+ const t = /* @__PURE__ */ new Map();
838
+ for (const i of s) {
839
+ const n = i.previewUrl;
840
+ i.id && n && t.set(i.id, n);
841
+ }
842
+ return e.map((i) => {
843
+ const n = i.id ? t.get(i.id) : void 0;
844
+ return n ? { ...i, previewUrl: n } : i;
845
+ });
846
+ }
847
+ function f(s) {
815
848
  return {
816
- ...i,
817
- starterPrompts: [...i.starterPrompts],
818
- appearance: i.appearance ? { ...i.appearance } : null,
819
- messages: i.messages.map((e) => {
849
+ ...s,
850
+ starterPrompts: [...s.starterPrompts],
851
+ appearance: s.appearance ? { ...s.appearance } : null,
852
+ messages: s.messages.map((e) => {
820
853
  const t = {
821
854
  ...e,
822
855
  attachments: e.attachments?.map((a) => ({ ...a }))
823
- }, s = e.assistantDraftItemId, n = e.clientMessageId, r = e.proactiveSuggestionClientMessageId;
856
+ }, i = e.assistantDraftItemId, n = e.clientMessageId, r = e.proactiveSuggestionClientMessageId;
824
857
  return r && Object.defineProperty(t, "proactiveSuggestionClientMessageId", {
825
858
  value: r,
826
859
  enumerable: !1
827
- }), s && Object.defineProperty(t, "assistantDraftItemId", {
828
- value: s,
860
+ }), i && Object.defineProperty(t, "assistantDraftItemId", {
861
+ value: i,
829
862
  enumerable: !1
830
863
  }), n && Object.defineProperty(t, "clientMessageId", {
831
864
  value: n,
832
865
  enumerable: !1
833
866
  }), t;
834
867
  }),
835
- activeScheduledFollowUps: i.activeScheduledFollowUps?.map((e) => ({ ...e })) ?? null
868
+ activeScheduledFollowUps: s.activeScheduledFollowUps?.map((e) => ({ ...e })) ?? null
836
869
  };
837
870
  }
838
- function A(i) {
871
+ function w(s) {
839
872
  return {
840
- ...i,
841
- data: i.data ? p({
842
- entities: w(i.data).map((e) => ({ ...e })),
843
- nextCursor: i.data.nextCursor
873
+ ...s,
874
+ data: s.data ? p({
875
+ entities: I(s.data).map((e) => ({ ...e })),
876
+ nextCursor: s.data.nextCursor
844
877
  }) : null
845
878
  };
846
879
  }
847
880
  export {
848
- K as ProductAgentInteractionManager,
881
+ z as ProductAgentInteractionManager,
849
882
  b as ProductAgentQueryController,
850
- H as ProductAgentRemoteRuntimeClient,
851
- $ as ProductAgentSessionHistoryManager,
852
- z as ProductAgentTaskPageTitleController,
883
+ j as ProductAgentRemoteRuntimeClient,
884
+ B as ProductAgentSessionHistoryManager,
885
+ U as ProductAgentTaskPageTitleController,
853
886
  F as createLocalStorageInteractionDecisionStorage,
854
887
  h as createProductAgentQueryState,
855
- B as createProductAgentTaskPageTitleDocument,
856
- D as formatProductAgentTaskPageTitle,
857
- L as hasProductAgentPaidCreditFallback,
858
- N as isProductAgentRuntimeCommand,
859
- E as mergeProductAgentEntityPages,
888
+ N as createProductAgentTaskPageTitleDocument,
889
+ O as formatProductAgentTaskPageTitle,
890
+ Q as hasProductAgentPaidCreditFallback,
891
+ H as isProductAgentRuntimeCommand,
892
+ _ as mergeProductAgentEntityPages,
860
893
  p as normalizeProductAgentEntityPage,
861
- P as readLocalStorageInteractionDecisions,
862
- C as reconcileProductAgentSubmissionGate,
863
- q as resolveProductAgentBillingPresentation,
864
- Q as resolveProductAgentComposerAction,
865
- R as resolveProductAgentWidgetPresentation,
866
- w as selectProductAgentQueryEntities
894
+ T as readLocalStorageInteractionDecisions,
895
+ q as reconcileProductAgentSubmissionGate,
896
+ $ as resolveProductAgentBillingPresentation,
897
+ K as resolveProductAgentComposerAction,
898
+ L as resolveProductAgentWidgetPresentation,
899
+ I as selectProductAgentQueryEntities
867
900
  };