@pluno/product-agent-web 0.1.265 → 0.1.266
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/web/backendTransport.d.ts +0 -2
- package/dist/core/features/contracts.d.ts +1 -0
- package/dist/product-agent-runtime.cjs +1 -1
- package/dist/product-agent-runtime.js +1 -1
- package/dist/product-agent-sdk.js +465 -474
- package/dist/product-agent-widget.js +121 -130
- package/package.json +1 -1
|
@@ -19,16 +19,16 @@ function Yt(t, e, s, n) {
|
|
|
19
19
|
if (!o) continue;
|
|
20
20
|
const c = o.sessionId ? e.sessions[o.sessionId] : void 0, l = c?.execution?.user_message_ids ?? [], d = ["queued", "thinking", "steering"].includes(c?.execution?.phase ?? "idle"), u = t.interactions.openings[a], p = u && (u.sessionId === o.sessionId || u.sessionId === null) ? { ...u, sessionId: o.sessionId } : { sessionId: o.sessionId, generation: ++r, openedAt: n, awaitingBaseline: o.sessionId !== null && !c?.execution, ignoredTurns: l, turns: {}, shown: {} };
|
|
21
21
|
if (p.awaitingBaseline && c?.execution) {
|
|
22
|
-
const m = l.filter((
|
|
23
|
-
const v = e.submissions[
|
|
22
|
+
const m = l.filter((f) => {
|
|
23
|
+
const v = e.submissions[f];
|
|
24
24
|
return v?.conversationScopeId === a && v.submittedAt >= p.openedAt;
|
|
25
25
|
});
|
|
26
|
-
p.awaitingBaseline = !1, p.ignoredTurns = l.filter((
|
|
26
|
+
p.awaitingBaseline = !1, p.ignoredTurns = l.filter((f) => !m.includes(f));
|
|
27
27
|
}
|
|
28
28
|
const g = {};
|
|
29
|
-
for (const [m,
|
|
30
|
-
const v = d && l.includes(m), I = v && !
|
|
31
|
-
g[m] = { ...
|
|
29
|
+
for (const [m, f] of Object.entries(p.turns)) {
|
|
30
|
+
const v = d && l.includes(m), I = v && !f.active ? n : f.startedAt;
|
|
31
|
+
g[m] = { ...f, startedAt: I, active: v, notifications: !f.notificationsSuppressed && (f.notifications || v && n - I >= 1e4) };
|
|
32
32
|
}
|
|
33
33
|
if (d)
|
|
34
34
|
for (const m of l) !p.ignoredTurns.includes(m) && !g[m] && (g[m] = { startedAt: n, active: !0, notifications: !1, tab_grouping: (t.interactions.crossTabTurns[o.sessionId] ?? []).includes(m) });
|
|
@@ -215,7 +215,7 @@ function xi(t, e, s = null, n = !0) {
|
|
|
215
215
|
}
|
|
216
216
|
return i("allowed", "none");
|
|
217
217
|
}
|
|
218
|
-
function
|
|
218
|
+
function le(t) {
|
|
219
219
|
return t?.execution_message_ids ?? t?.user_message_ids ?? [];
|
|
220
220
|
}
|
|
221
221
|
function he(t) {
|
|
@@ -335,14 +335,14 @@ function Ie(t, e, s) {
|
|
|
335
335
|
collapsed: !1
|
|
336
336
|
});
|
|
337
337
|
}
|
|
338
|
-
const u = r?.execution, p = a.filter((k) => !k.cancelled && k.delivery !== "failed"), g = p.filter((k) => k.delivery !== "accepted" && k.executionVersion === null), m = p.filter((k) => k.delivery === "accepted" && k.executionVersion === null),
|
|
338
|
+
const u = r?.execution, p = a.filter((k) => !k.cancelled && k.delivery !== "failed"), g = p.filter((k) => k.delivery !== "accepted" && k.executionVersion === null), m = p.filter((k) => k.delivery === "accepted" && k.executionVersion === null), f = p[p.length - 1], v = g.length > 0, I = f !== void 0 && m.includes(f);
|
|
339
339
|
let _ = v ? "submitting" : I ? "awaiting_execution" : u?.phase ?? "idle";
|
|
340
|
-
const S = Object.entries(t.stops).filter(([k]) => k === s || i !== null && e.selections[k]?.sessionId === i).map(([, k]) => k).find((k) => (!a.length || k.userMessageIds.includes(a[a.length - 1].userMessageId) || !v && !I &&
|
|
341
|
-
S &&
|
|
340
|
+
const S = Object.entries(t.stops).filter(([k]) => k === s || i !== null && e.selections[k]?.sessionId === i).map(([, k]) => k).find((k) => (!a.length || k.userMessageIds.includes(a[a.length - 1].userMessageId) || !v && !I && le(u).some((x) => k.userMessageIds.includes(x))) && (!u || u.version <= k.executionVersion || ["thinking", "steering", "queued", "stopping"].includes(u.phase) || a.some((x) => x.cancelled && x.executionVersion === null && k.userMessageIds.includes(x.userMessageId)))), h = u && ["thinking", "steering", "queued", "stopping"].includes(u.phase) || a.some((k) => k.delivery === "accepted" && k.executionVersion === null && S?.userMessageIds.includes(k.userMessageId));
|
|
341
|
+
S && h && !v && (!u || !["thinking", "steering", "queued", "stopping"].includes(u.phase) || le(u).every((k) => S.userMessageIds.includes(k))) && (_ = "stopping"), S && !h && !v && a.some((k) => k.cancelled && k.executionVersion === null && S.userMessageIds.includes(k.userMessageId)) && (_ = a.some((k) => S.userMessageIds.includes(k.userMessageId) && ["sending", "uncertain"].includes(k.delivery)) ? "stopping" : "stopped");
|
|
342
342
|
const b = ["thinking", "steering", "queued"].includes(_), y = t.stops[s] ?? S, w = y?.userMessageIds.filter((k) => !["completed", "failed"].includes(r?.executionByUserMessage[k]?.phase ?? "")) ?? [], R = w.some((k) => {
|
|
343
343
|
const x = a.find((H) => H.userMessageId === k);
|
|
344
|
-
return !Object.values(t.operations).some((H) => H.command.type === "run.stop" && H.command.payload.expectedUserMessageId === k && H.phase === "done") && (x?.executionVersion === null && ["sending", "uncertain", "accepted"].includes(x.delivery) || !!(u &&
|
|
345
|
-
}), T = u?.user_message_ids ?? [], C = v || I ?
|
|
344
|
+
return !Object.values(t.operations).some((H) => H.command.type === "run.stop" && H.command.payload.expectedUserMessageId === k && H.phase === "done") && (x?.executionVersion === null && ["sending", "uncertain", "accepted"].includes(x.delivery) || !!(u && le(u).includes(k) && ["thinking", "steering", "queued", "stopping"].includes(u.phase)));
|
|
345
|
+
}), T = u?.user_message_ids ?? [], C = v || I ? f?.userMessageId ?? null : T[T.length - 1] ?? null, E = d.find((k) => k.userMessageId === C), q = b ? [...E?.activityIds ?? []].reverse().find((k) => l[k] === "open") ?? null : null, O = i !== null && !!e.selections[s]?.provisionalId && o.length === 0 && a.length === 0 && // The first persisted idle snapshot already has a positive synchronization version.
|
|
346
346
|
(!r?.execution || r.execution.phase === "idle" && r.execution.user_message_ids.length === 0) && Object.values(t.operations).some((k) => k.conversationScopeId === s && k.phase === "done" && ["runtime.warmup", "attachment.prepare"].includes(k.command.type) && !k.command.payload.sessionId && k.result?.sessionId === i);
|
|
347
347
|
return G({
|
|
348
348
|
historyRefreshFailure: r?.historyRefreshFailure ?? null,
|
|
@@ -361,7 +361,7 @@ function Ie(t, e, s) {
|
|
|
361
361
|
preparation: r?.preparation ?? null,
|
|
362
362
|
stop: y ? { ...y, userMessageIds: w, pending: R } : null,
|
|
363
363
|
segments: d.map((k, x) => ({ ...k, collapsed: b ? k.userMessageId !== C : x < d.length - 1 || k.activityIds.length > 0 })),
|
|
364
|
-
activity: { phase: _, activeItemId: q, userMessageId: C, executionKey: JSON.stringify([...
|
|
364
|
+
activity: { phase: _, activeItemId: q, userMessageId: C, executionKey: JSON.stringify([...le(u)].sort()) },
|
|
365
365
|
// Staging transfers the immutable input to the core. Waiting for backend acceptance leaves
|
|
366
366
|
// the same submitted text in the optimistic transcript and composer during delivery.
|
|
367
367
|
receipts: n.filter((k) => !k.cancelled && e.clients[k.clientScopeId] === s).map((k) => ({ viewId: k.viewId, userMessageId: k.userMessageId, acceptedRendererRevision: k.rendererRevision }))
|
|
@@ -455,23 +455,23 @@ function Hr(t, e, s) {
|
|
|
455
455
|
if (!J(n.profile, l)) continue;
|
|
456
456
|
const d = s.conversationScopeId ? t.interactions.openings[s.conversationScopeId] : void 0;
|
|
457
457
|
if (!s.sessionId || !d || d.sessionId !== s.sessionId || !Ci(t, s.conversationScopeId, c) || t.features.refreshRequired && !d.shown[c] || n.profile === "main_web_chat" && !t.interactions.bridgeReady && !d.shown[c]) continue;
|
|
458
|
-
const u = Qe(t, c), p = t.interactions.preferencePrompts[c], g = t.interactions.deviceFacts[c], m = `preference:${c}`,
|
|
459
|
-
if (u === !1 || t.features.desiredPreferences[c] === !1 ||
|
|
458
|
+
const u = Qe(t, c), p = t.interactions.preferencePrompts[c], g = t.interactions.deviceFacts[c], m = `preference:${c}`, f = u === null;
|
|
459
|
+
if (u === !1 || t.features.desiredPreferences[c] === !1 || f && p.snoozedUntil && Date.parse(p.snoozedUntil) > a || !f && (g.permission !== "missing" || g.snoozedUntil && Date.parse(g.snoozedUntil) > a)) continue;
|
|
460
460
|
const v = Object.values(t.interactions.devicePending).some((S) => S.feature === c), I = o([m, `preferenceSnooze:${c}`, `preferenceAcknowledge:${c}`]), _ = I.error ?? t.interactions.deviceErrors[c] ?? (d.shown[c] && t.interactions.bridgeError ? { code: "connection_interrupted", message: t.interactions.bridgeError, retryable: !0 } : null);
|
|
461
461
|
r.push({
|
|
462
462
|
id: m,
|
|
463
|
-
category:
|
|
463
|
+
category: f ? "preference" : "permission",
|
|
464
464
|
placement: "bottom_overlay",
|
|
465
465
|
sourceId: null,
|
|
466
466
|
conversationId: null,
|
|
467
467
|
userMessageId: null,
|
|
468
468
|
sourceVersion: d.generation,
|
|
469
469
|
decisionRevision: p.revision,
|
|
470
|
-
actions:
|
|
470
|
+
actions: f ? ["enable", "not_now", "dont_enable"] : ["allow", "not_now"],
|
|
471
471
|
status: v ? "pending" : _ ? "error" : I.status,
|
|
472
472
|
error: _,
|
|
473
473
|
payload: { feature: c, openingGeneration: d.generation },
|
|
474
|
-
nextEligibleAt:
|
|
474
|
+
nextEligibleAt: f ? p.snoozedUntil : g.snoozedUntil
|
|
475
475
|
});
|
|
476
476
|
}
|
|
477
477
|
for (const c of Object.values(t.interactions.sources)) {
|
|
@@ -541,13 +541,13 @@ function Vr(t, e, s, n) {
|
|
|
541
541
|
if (e.type === "stage7.act") {
|
|
542
542
|
const d = i.interactions.actions[e.requestId];
|
|
543
543
|
if (d) {
|
|
544
|
-
const
|
|
544
|
+
const f = i.interactions.welcome[e.interactionId], v = f?.category === "morning_report" ? f.tasks[e.taskIndex ?? 0] : f?.text;
|
|
545
545
|
if (d.interactionId !== e.interactionId || d.action !== e.action || d.expectedRevision !== e.expectedRevision || d.sourceVersion !== (e.sourceVersion ?? null) || d.clientScopeId !== e.clientScopeId || d.taskIndex !== (e.taskIndex ?? null) || (d.operation.kind === "run" || d.operation.kind === "edit") && d.operation.text !== v) throw new Error("Action request changed.");
|
|
546
546
|
return { state: i, effects: r, command: null };
|
|
547
547
|
}
|
|
548
548
|
if (e.action === "feedback") {
|
|
549
|
-
const
|
|
550
|
-
if (!
|
|
549
|
+
const f = i.interactions.welcome[e.interactionId];
|
|
550
|
+
if (!f || f.category !== "proactive_suggestion" || !e.feedback || f.clientScopeId && f.clientScopeId !== e.clientScopeId) throw new Error("Missing proactive feedback.");
|
|
551
551
|
return { state: i, effects: r, command: {
|
|
552
552
|
type: "stage7.mutate",
|
|
553
553
|
authority: a,
|
|
@@ -555,27 +555,27 @@ function Vr(t, e, s, n) {
|
|
|
555
555
|
requestId: e.requestId,
|
|
556
556
|
mutation: {
|
|
557
557
|
kind: "proactiveFeedback",
|
|
558
|
-
suggestionId:
|
|
559
|
-
suggestedQuery:
|
|
558
|
+
suggestionId: f.sourceSuggestionId ?? f.id,
|
|
559
|
+
suggestedQuery: f.text,
|
|
560
560
|
message: e.feedback.message,
|
|
561
561
|
context: e.feedback.context
|
|
562
562
|
}
|
|
563
563
|
} };
|
|
564
564
|
}
|
|
565
|
-
const u = Bi(i, s, n, e.clientScopeId).find((
|
|
565
|
+
const u = Bi(i, s, n, e.clientScopeId).find((f) => f.id === e.interactionId);
|
|
566
566
|
if (!u || !u.actions.includes(e.action) || u.decisionRevision !== e.expectedRevision || u.sourceVersion !== e.sourceVersion || u.status === "pending") throw new Error("Interaction changed or action is unavailable.");
|
|
567
567
|
if (u.category === "preference" || u.category === "permission") {
|
|
568
|
-
const
|
|
569
|
-
if (
|
|
570
|
-
if (i = { ...i, interactions: { ...i.interactions, promptActions: { ...i.interactions.promptActions, [e.requestId]: { scope: n.clients[e.clientScopeId], openingGeneration: u.sourceVersion, expectedRevision: e.expectedRevision, feature:
|
|
571
|
-
const v = e.action === "not_now" ? { kind: "preferenceSnooze", feature:
|
|
568
|
+
const f = u.payload.feature;
|
|
569
|
+
if (f !== "notifications" && f !== "tab_grouping") throw new Error("Missing preference feature.");
|
|
570
|
+
if (i = { ...i, interactions: { ...i.interactions, promptActions: { ...i.interactions.promptActions, [e.requestId]: { scope: n.clients[e.clientScopeId], openingGeneration: u.sourceVersion, expectedRevision: e.expectedRevision, feature: f, action: e.action } } } }, u.category === "permission") return { state: i, effects: r, command: { type: "stage7.permission", authority: a, now: e.now, requestId: e.requestId, feature: f, action: e.action, settings: !1 } };
|
|
571
|
+
const v = e.action === "not_now" ? { kind: "preferenceSnooze", feature: f, expectedRevision: e.expectedRevision } : { kind: "preference", feature: f, enabled: e.action === "enable" };
|
|
572
572
|
return { state: i, effects: r, command: { type: "stage7.mutate", authority: a, now: e.now, requestId: e.requestId, mutation: v } };
|
|
573
573
|
}
|
|
574
574
|
if (["not_now", "never", "snooze"].includes(e.action)) {
|
|
575
|
-
const
|
|
576
|
-
return { state: i, effects: r, command: { type: "stage7.mutate", authority: a, now: e.now, requestId: e.requestId, mutation:
|
|
575
|
+
const f = u.category === "morning_report" ? { kind: "decision", category: "morning_report", action: "snooze", promptKey: u.id, expectedRevision: e.expectedRevision } : { kind: "decision", category: "proactive_suggestion", action: e.action, promptKey: i.interactions.welcome[u.id].sourceSuggestionId ?? u.id, expectedRevision: e.expectedRevision };
|
|
576
|
+
return { state: i, effects: r, command: { type: "stage7.mutate", authority: a, now: e.now, requestId: e.requestId, mutation: f } };
|
|
577
577
|
}
|
|
578
|
-
const p = Object.values(i.interactions.sources).find((
|
|
578
|
+
const p = Object.values(i.interactions.sources).find((f) => f.id === u.sourceId && f.conversation_id === u.conversationId);
|
|
579
579
|
let g;
|
|
580
580
|
if (u.category === "device_hint")
|
|
581
581
|
g = { kind: "saveHint", interactionId: u.id };
|
|
@@ -590,8 +590,8 @@ function Vr(t, e, s, n) {
|
|
|
590
590
|
g = { kind: "saveSharing", interactionId: u.id, expectedRevision: e.expectedRevision };
|
|
591
591
|
} else if (e.action === "copy" || e.action === "share") {
|
|
592
592
|
if (p?.payload.kind !== "sharing") throw new Error("Missing sharing source.");
|
|
593
|
-
const
|
|
594
|
-
if (
|
|
593
|
+
const f = Object.values(i.interactions.actions).find((v) => v.interactionId === u.id && v.step === "perform" && v.status === "error" && (v.operation.kind === "copy" || v.operation.kind === "share"));
|
|
594
|
+
if (f && f.error?.code !== "interaction_not_started") throw new Error("The previous sharing action has an uncertain outcome.");
|
|
595
595
|
g = { kind: e.action, interactionId: u.id, variant: p.payload.variant, ...e.sharePlatform ? { platform: e.sharePlatform } : {} };
|
|
596
596
|
} else if (e.action === "connect") {
|
|
597
597
|
if (p?.payload.kind !== "integration_auth") throw new Error("Missing integration request.");
|
|
@@ -600,8 +600,8 @@ function Vr(t, e, s, n) {
|
|
|
600
600
|
if (p?.payload.kind !== "personal_channel") throw new Error("Missing channel request.");
|
|
601
601
|
g = { kind: "pair", interactionId: u.id, requestId: p.payload.request_id, managementUrl: p.payload.management_url };
|
|
602
602
|
} else {
|
|
603
|
-
const
|
|
604
|
-
if (
|
|
603
|
+
const f = ji(i, u.id, { clientScopeId: e.clientScopeId, conversationScopeId: n.clients[e.clientScopeId] });
|
|
604
|
+
if (f?.status === "error" && f.error?.code !== "interaction_not_started") throw new Error("Reconcile the previous action before trying again.");
|
|
605
605
|
if (e.action !== "edit") {
|
|
606
606
|
if (a.profile.startsWith("extension_") && !e.origin) throw new Error("Task submission requires the current page origin.");
|
|
607
607
|
const _ = xi(i.account, "send_message", e.origin ?? null);
|
|
@@ -676,7 +676,7 @@ function Kr(t, e, s, n) {
|
|
|
676
676
|
};
|
|
677
677
|
if (s.type === "stage7.query" && s.query.kind === "appearance") {
|
|
678
678
|
const u = { ...s.query, kind: "appearance" }, p = n(u);
|
|
679
|
-
if (Object.values(i.pending).some((
|
|
679
|
+
if (Object.values(i.pending).some((f) => f.mode === "query" && f.key === p)) return { state: i, effects: r };
|
|
680
680
|
const g = o("query", s.requestId, i.appearanceEpochs[u.origin] ?? 0), m = i.pending[g];
|
|
681
681
|
if (m && m.fingerprint !== JSON.stringify(u)) throw new Error("Query request ID changed payload.");
|
|
682
682
|
a({
|
|
@@ -696,22 +696,22 @@ function Kr(t, e, s, n) {
|
|
|
696
696
|
} }
|
|
697
697
|
}), l(u.origin) || d(g);
|
|
698
698
|
} else if (s.type === "stage7.mutate" && (s.mutation.kind === "sampleStyle" || s.mutation.kind === "saveStyle" || s.mutation.kind === "scribble" || s.mutation.kind === "deleteStyle")) {
|
|
699
|
-
const u = s.mutation, p = u.origin, g = o("mutate", s.requestId), m = i.pending[g],
|
|
699
|
+
const u = s.mutation, p = u.origin, g = o("mutate", s.requestId), m = i.pending[g], f = JSON.stringify(u);
|
|
700
700
|
if (m) {
|
|
701
|
-
if (m.fingerprint !==
|
|
701
|
+
if (m.fingerprint !== f) throw new Error("Request ID was reused with a different payload.");
|
|
702
702
|
return { state: i, effects: r };
|
|
703
703
|
}
|
|
704
704
|
const v = l(p), I = (i.appearanceEpochs[p] ?? 0) + 1, _ = { ...i.pending };
|
|
705
|
-
for (const [S,
|
|
706
|
-
if (
|
|
705
|
+
for (const [S, h] of Object.entries(_)) {
|
|
706
|
+
if (h.mode !== "query" || !c(h.operation, p)) continue;
|
|
707
707
|
delete _[S];
|
|
708
|
-
const b = o("query",
|
|
709
|
-
_[b] = { ...
|
|
708
|
+
const b = o("query", h.requestId, I);
|
|
709
|
+
_[b] = { ...h, effectId: b, status: "queued" };
|
|
710
710
|
}
|
|
711
711
|
_[g] = {
|
|
712
712
|
requestId: s.requestId,
|
|
713
713
|
effectId: g,
|
|
714
|
-
fingerprint:
|
|
714
|
+
fingerprint: f,
|
|
715
715
|
key: `appearance:${p}`,
|
|
716
716
|
generation: e.generation,
|
|
717
717
|
operation: u,
|
|
@@ -728,18 +728,18 @@ function Kr(t, e, s, n) {
|
|
|
728
728
|
if (s.effectKind !== "stage7.query" && s.effectKind !== "stage7.mutate") return { state: i, effects: r };
|
|
729
729
|
const g = s.type === "effect.completed" ? s.output.data : null;
|
|
730
730
|
if (g && (g.kind !== "appearance" || g.origin !== p)) throw new Error("Appearance response does not match its origin.");
|
|
731
|
-
const m = { ...i.pending },
|
|
731
|
+
const m = { ...i.pending }, f = { ...i.queries };
|
|
732
732
|
if (u.mode === "query") {
|
|
733
733
|
delete m[s.effectId];
|
|
734
|
-
const v =
|
|
735
|
-
v?.requestId === u.requestId && (
|
|
734
|
+
const v = f[u.key];
|
|
735
|
+
v?.requestId === u.requestId && (f[u.key] = s.type === "effect.failed" ? { ...v, status: "error", error: s.error, requestId: null } : { ...v, status: "ready", data: g, error: null, requestId: null, updatedAt: s.output.completedAt });
|
|
736
736
|
} else if (m[s.effectId] = { ...u, status: g ? "done" : "error", result: g, error: s.type === "effect.failed" ? s.error : null }, g && s.type === "effect.completed") {
|
|
737
737
|
for (const [v, I] of Object.entries(i.appearanceQueries))
|
|
738
|
-
I.origin === p && (
|
|
738
|
+
I.origin === p && (f[v] = { ...f[v], status: "ready", data: g, requestId: null, error: null, updatedAt: s.output.completedAt });
|
|
739
739
|
for (const [v, I] of Object.entries(m)) I.mode === "query" && c(I.operation, p) && delete m[v];
|
|
740
740
|
} else if (s.type === "effect.failed")
|
|
741
741
|
for (const [v, I] of Object.entries(m)) I.mode === "mutation" && I.status === "queued" && c(I.operation, p) && (m[v] = { ...I, status: "error", error: { code: "appearance_write_cancelled", message: "Refresh appearance before saving again.", retryable: !1 } });
|
|
742
|
-
if (a({ pending: m, queries:
|
|
742
|
+
if (a({ pending: m, queries: f }), u.mode === "mutation") {
|
|
743
743
|
const v = Object.values(i.pending).find((I) => I.mode === "mutation" && I.status === "queued" && c(I.operation, p));
|
|
744
744
|
if (v && (v.operation.kind === "sampleStyle" || v.operation.kind === "saveStyle" || v.operation.kind === "scribble" || v.operation.kind === "deleteStyle"))
|
|
745
745
|
a({ pending: { ...i.pending, [v.effectId]: { ...v, status: "pending" } } }), r.push({ kind: "stage7.mutate", id: v.effectId, input: { authority: e, requestId: v.requestId, mutation: v.operation } });
|
|
@@ -783,9 +783,9 @@ function Us() {
|
|
|
783
783
|
};
|
|
784
784
|
}
|
|
785
785
|
function Ns(t = 0) {
|
|
786
|
-
return { localScribbleStyle: null, originContextQueries: {}, contextObservers: {}, contextReads: {}, contextRunOrigins: {}, appearanceEpochs: {}, appearanceQueries: {}, polls: {}, queries: {}, pending: {}, queuedPreferences: {}, desiredPreferences: {}, refreshBatch: null, refreshQueuedRequestId: null, refreshAt: null, failures: 0, now: t, timerId: null, timerDeadline: null, timerRevision: 0, refreshRequired: !1, schedulerError: null, deepFlows: {} };
|
|
786
|
+
return { suggestionReadFailures: 0, localScribbleStyle: null, originContextQueries: {}, contextObservers: {}, contextReads: {}, contextRunOrigins: {}, appearanceEpochs: {}, appearanceQueries: {}, polls: {}, queries: {}, pending: {}, queuedPreferences: {}, desiredPreferences: {}, refreshBatch: null, refreshQueuedRequestId: null, refreshAt: null, failures: 0, now: t, timerId: null, timerDeadline: null, timerRevision: 0, refreshRequired: !1, schedulerError: null, deepFlows: {} };
|
|
787
787
|
}
|
|
788
|
-
function
|
|
788
|
+
function ae(t, e) {
|
|
789
789
|
return e.kind === "originContext" ? JSON.stringify([t.authorityId, t.generation, t.communityId, e.kind, e.origin]) : JSON.stringify([
|
|
790
790
|
t.authorityId,
|
|
791
791
|
t.generation,
|
|
@@ -851,23 +851,23 @@ function Se(t, e, s) {
|
|
|
851
851
|
}
|
|
852
852
|
function js(t, e, s) {
|
|
853
853
|
let n = t;
|
|
854
|
-
const i = [], r = (
|
|
855
|
-
n = { ...n, features: { ...n.features, ...
|
|
856
|
-
}, a = (
|
|
857
|
-
n = { ...n, interactions: { ...n.interactions, ...
|
|
854
|
+
const i = [], r = (h) => {
|
|
855
|
+
n = { ...n, features: { ...n.features, ...h } };
|
|
856
|
+
}, a = (h) => {
|
|
857
|
+
n = { ...n, interactions: { ...n.interactions, ...h } };
|
|
858
858
|
};
|
|
859
859
|
if (e.type === "stage7.initialize") {
|
|
860
|
-
const
|
|
861
|
-
return
|
|
860
|
+
const h = n.account.authority;
|
|
861
|
+
return h && JSON.stringify(h) === JSON.stringify(e.authority) ? { state: n, effects: i } : { state: { account: Ds(e.authority), features: Ns(e.now), interactions: Us() }, effects: i };
|
|
862
862
|
}
|
|
863
863
|
const o = n.account.authority;
|
|
864
864
|
if (!o) return { state: n, effects: i };
|
|
865
865
|
if ("authority" in e && JSON.stringify(e.authority) !== JSON.stringify(o)) return { state: n, effects: i };
|
|
866
866
|
if (e.type === "stage7.retire") return { state: { account: Ds(), features: Ns(e.now), interactions: Us() }, effects: i };
|
|
867
867
|
"now" in e && r({ now: e.now });
|
|
868
|
-
const c = (
|
|
869
|
-
const y = { ...n.features.contextObservers }, w = y[
|
|
870
|
-
if (b === null ? delete y[
|
|
868
|
+
const c = (h, b) => {
|
|
869
|
+
const y = { ...n.features.contextObservers }, w = y[h];
|
|
870
|
+
if (b === null ? delete y[h] : y[h] = ae(o, { kind: "originContext", clientScopeId: h, origin: b, pageUrl: "" }), r({ contextObservers: y }), !w || Object.values(y).includes(w)) return;
|
|
871
871
|
const R = { ...n.features.queries }, T = { ...n.features.polls }, C = { ...n.features.contextReads }, E = { ...n.features.originContextQueries }, q = { ...n.features.pending }, O = E[w]?.origin, k = { ...n.features.contextRunOrigins };
|
|
872
872
|
for (const [x, U] of Object.entries(k)) U === O && delete k[x];
|
|
873
873
|
delete R[w], delete T[w], delete C[w], delete E[w];
|
|
@@ -881,83 +881,83 @@ function js(t, e, s) {
|
|
|
881
881
|
const l = e.type === "stage7.query" ? e.query : e.type === "stage7.mutate" ? e.mutation : e.type === "effect.completed" || e.type === "effect.failed" ? n.features.pending[e.effectId]?.operation : null;
|
|
882
882
|
if (l && Li(l)) {
|
|
883
883
|
et(o, l);
|
|
884
|
-
const
|
|
885
|
-
return { state: { ...n, features:
|
|
884
|
+
const h = Kr(n.features, o, e, (b) => ae(o, b));
|
|
885
|
+
return { state: { ...n, features: h.state }, effects: h.effects };
|
|
886
886
|
}
|
|
887
887
|
if (e.type === "stage7.act" || e.type === "stage7.retry_action" || (e.type === "effect.completed" || e.type === "effect.failed") && e.effectKind === "stage7.platform") {
|
|
888
|
-
const
|
|
889
|
-
if (!
|
|
890
|
-
const b = js(
|
|
891
|
-
return { state: b.state, effects: [...
|
|
892
|
-
}
|
|
893
|
-
const d = (
|
|
894
|
-
const w =
|
|
895
|
-
if (!J(o.profile, w) || Qe(n,
|
|
888
|
+
const h = Vr(n, e, s.conversation, s.directory);
|
|
889
|
+
if (!h.command) return { state: h.state, effects: h.effects };
|
|
890
|
+
const b = js(h.state, h.command, s);
|
|
891
|
+
return { state: b.state, effects: [...h.effects, ...b.effects] };
|
|
892
|
+
}
|
|
893
|
+
const d = (h, b, y) => {
|
|
894
|
+
const w = h === "notifications" ? "canRequestNotificationPermission" : "canGroupSessionTabs";
|
|
895
|
+
if (!J(o.profile, w) || Qe(n, h) !== !0 || n.features.desiredPreferences[h] === !1 || Object.values(n.interactions.devicePending).some((C) => C.feature === h && (b === "check" || C.action !== "check"))) return;
|
|
896
896
|
const R = Se(o, "device", y), T = { ...n.interactions.deviceErrors };
|
|
897
|
-
delete T[
|
|
898
|
-
}, u = (
|
|
897
|
+
delete T[h], a({ deviceErrors: T, devicePending: { ...n.interactions.devicePending, [R]: { feature: h, requestId: y, generation: o.generation, desired: !0, action: b } } }), i.push({ kind: "stage7.device", id: R, input: { authority: o, requestId: y, feature: h, action: b, now: n.features.now } });
|
|
898
|
+
}, u = (h, b) => {
|
|
899
899
|
const y = b ? n.interactions.promptActions[b.replace(/:ack$/, "")] : void 0, w = { ...n.interactions.openings };
|
|
900
900
|
for (const [R, T] of Object.entries(w)) {
|
|
901
901
|
if (y?.scope === R && y.openingGeneration === T.generation && ["enable", "allow"].includes(y.action)) continue;
|
|
902
902
|
const C = { ...T.shown };
|
|
903
|
-
delete C[
|
|
903
|
+
delete C[h], w[R] = {
|
|
904
904
|
...T,
|
|
905
905
|
shown: C,
|
|
906
|
-
turns: Object.fromEntries(Object.entries(T.turns).map(([E, q]) => [E, { ...q, [
|
|
906
|
+
turns: Object.fromEntries(Object.entries(T.turns).map(([E, q]) => [E, { ...q, [h]: !1, [`${h}Suppressed`]: !0 }]))
|
|
907
907
|
};
|
|
908
908
|
}
|
|
909
909
|
a({ openings: w });
|
|
910
|
-
}, p = (
|
|
911
|
-
if (
|
|
910
|
+
}, p = (h, b = null) => {
|
|
911
|
+
if (h.kind === "preferences" && n.account.preferences && h.value.preferencesVersion > n.account.preferences.preferencesVersion)
|
|
912
912
|
for (const y of ["notifications", "tab_grouping"]) {
|
|
913
913
|
const w = y === "notifications" ? "taskNotificationsEnabled" : "tabGroupingEnabled";
|
|
914
|
-
|
|
914
|
+
h.value[w] !== n.account.preferences[w] && u(y, b);
|
|
915
915
|
}
|
|
916
|
-
if (
|
|
916
|
+
if (h.kind === "preferencePrompts" || h.kind === "preferencePrompt")
|
|
917
917
|
for (const y of ["notifications", "tab_grouping"]) {
|
|
918
|
-
const w =
|
|
918
|
+
const w = h.kind === "preferencePrompts" ? h.value[y] : h.feature === y ? h.value : null;
|
|
919
919
|
w && w.revision > n.interactions.preferencePrompts[y].revision && u(y, w.requestId);
|
|
920
920
|
}
|
|
921
|
-
|
|
922
|
-
}, g = (
|
|
923
|
-
const y = n.interactions.deviceFacts[
|
|
924
|
-
b.revision <= y.revision || (Qe(n,
|
|
925
|
-
}, m = (
|
|
926
|
-
et(o,
|
|
927
|
-
const w =
|
|
928
|
-
if (
|
|
921
|
+
h.kind === "preferences" && (n = { ...n, account: Wr(n.account, h.value) }), h.kind === "preferencePrompts" && (n = { ...n, interactions: jn(n.interactions, h.value) }), h.kind === "preferencePrompt" && (n = { ...n, interactions: jn(n.interactions, { ...n.interactions.preferencePrompts, [h.feature]: h.value }) }), h.kind === "decisions" && (n = { ...n, interactions: es(n.interactions, h.decisions) }), h.kind === "decision" && (n = { ...n, interactions: es(n.interactions, [h.value]) });
|
|
922
|
+
}, g = (h, b) => {
|
|
923
|
+
const y = n.interactions.deviceFacts[h];
|
|
924
|
+
b.revision <= y.revision || (Qe(n, h) === !0 && (b.permission === "granted" && y.permission !== "granted" || b.snoozedUntil && b.snoozedUntil !== y.snoozedUntil) && u(h, null), a({ deviceFacts: { ...n.interactions.deviceFacts, [h]: b } }));
|
|
925
|
+
}, m = (h, b, y = !1) => {
|
|
926
|
+
et(o, h);
|
|
927
|
+
const w = ae(o, h), R = Se(o, "query", b);
|
|
928
|
+
if (h.kind === "originContext") {
|
|
929
929
|
const q = n.features.queries[w], O = n.features.contextReads[w];
|
|
930
|
-
if (r({ originContextQueries: { ...n.features.originContextQueries, [w]:
|
|
930
|
+
if (r({ originContextQueries: { ...n.features.originContextQueries, [w]: h } }), !y && (q?.status === "ready" || q?.status === "error") && O && (n.features.now - O.settledAt < 3e4 || q.error && !q.error.retryable && q.error.code !== "runtime_error")) return;
|
|
931
931
|
}
|
|
932
932
|
const T = n.features.pending[R];
|
|
933
|
-
if (T && T.fingerprint !== JSON.stringify(
|
|
933
|
+
if (T && T.fingerprint !== JSON.stringify(h)) throw new Error("Query request ID changed payload.");
|
|
934
934
|
if (T?.status === "pending" || Object.values(n.features.pending).some((q) => q.mode === "query" && q.key === w && q.status === "pending")) return;
|
|
935
935
|
const C = n.features.queries[w] ?? me(w), E = De(C, { key: w, requestId: re(b), mode: "replace" });
|
|
936
936
|
r({ queries: { ...n.features.queries, [w]: E }, pending: { ...n.features.pending, [R]: {
|
|
937
937
|
requestId: b,
|
|
938
938
|
effectId: R,
|
|
939
|
-
fingerprint: JSON.stringify(
|
|
939
|
+
fingerprint: JSON.stringify(h),
|
|
940
940
|
key: w,
|
|
941
941
|
generation: o.generation,
|
|
942
|
-
operation:
|
|
942
|
+
operation: h,
|
|
943
943
|
mode: "query",
|
|
944
944
|
status: "pending",
|
|
945
945
|
error: null,
|
|
946
946
|
result: null
|
|
947
|
-
} } }),
|
|
948
|
-
},
|
|
949
|
-
if (et(o,
|
|
950
|
-
const w = Se(o, "mutate", b), R = JSON.stringify(
|
|
947
|
+
} } }), h.kind === "account" && (n = { ...n, account: { ...n.account, query: De(n.account.query, { key: w, requestId: re(b), mode: "replace" }) } }), i.push({ kind: "stage7.query", id: R, input: { authority: o, requestId: b, query: h } });
|
|
948
|
+
}, f = (h, b, y = !1) => {
|
|
949
|
+
if (et(o, h), h.kind === "report" && !n.account.query.data?.user?.isSuperuser) throw new Error("Chat reporting requires superuser access.");
|
|
950
|
+
const w = Se(o, "mutate", b), R = JSON.stringify(h), T = n.features.pending[w];
|
|
951
951
|
if (T) {
|
|
952
952
|
if (T.fingerprint !== R) throw new Error("Request ID was reused with a different payload.");
|
|
953
953
|
if (!y || T.status !== "error") return;
|
|
954
|
-
if (!["decision", "preferenceSnooze", "preferenceAcknowledge"].includes(
|
|
954
|
+
if (!["decision", "preferenceSnooze", "preferenceAcknowledge"].includes(h.kind)) throw new Error("This operation cannot be replayed automatically.");
|
|
955
955
|
if (["conflict", "409"].includes(T.error?.code ?? "")) throw new Error("Refresh the conflicting decision before making another choice.");
|
|
956
956
|
}
|
|
957
|
-
if (
|
|
958
|
-
const C = n.features.queuedPreferences[
|
|
957
|
+
if (h.kind === "preference" && (r({ desiredPreferences: { ...n.features.desiredPreferences, [h.feature]: h.enabled } }), Object.values(n.features.pending).some((C) => C.status === "pending" && C.operation.kind === "preference" && C.operation.feature === h.feature))) {
|
|
958
|
+
const C = n.features.queuedPreferences[h.feature];
|
|
959
959
|
if (C && C.requestId !== b) {
|
|
960
|
-
const E = Se(o, "mutate", C.requestId), q = { kind: "preference", feature:
|
|
960
|
+
const E = Se(o, "mutate", C.requestId), q = { kind: "preference", feature: h.feature, enabled: C.enabled };
|
|
961
961
|
r({ pending: { ...n.features.pending, [E]: {
|
|
962
962
|
requestId: C.requestId,
|
|
963
963
|
effectId: E,
|
|
@@ -971,26 +971,26 @@ function js(t, e, s) {
|
|
|
971
971
|
error: { code: "preference_superseded", message: "A newer preference choice replaced this request.", retryable: !1 }
|
|
972
972
|
} } });
|
|
973
973
|
}
|
|
974
|
-
r({ queuedPreferences: { ...n.features.queuedPreferences, [
|
|
974
|
+
r({ queuedPreferences: { ...n.features.queuedPreferences, [h.feature]: { requestId: b, enabled: h.enabled } } });
|
|
975
975
|
return;
|
|
976
976
|
}
|
|
977
|
-
if (
|
|
978
|
-
const C = { kind: "starterPrompts", ...
|
|
977
|
+
if (h.kind === "generatePrompts") {
|
|
978
|
+
const C = { kind: "starterPrompts", ...h.page, includeUserSuggestions: h.includeUserSuggestions ?? !1 }, E = ae(o, C), q = n.features.queries[E] ?? me(E);
|
|
979
979
|
r({ queries: { ...n.features.queries, [E]: De(q, { key: E, requestId: re(b), mode: "replace" }) } });
|
|
980
980
|
}
|
|
981
|
-
r({ pending: { ...n.features.pending, [w]: { requestId: b, effectId: w, fingerprint: R, key: Ln(
|
|
982
|
-
}, v = (
|
|
981
|
+
r({ pending: { ...n.features.pending, [w]: { requestId: b, effectId: w, fingerprint: R, key: Ln(h), generation: o.generation, operation: h, mode: "mutation", status: "pending", error: null, result: null } } }), i.push({ kind: "stage7.mutate", id: w, input: { authority: o, requestId: b, mutation: h } });
|
|
982
|
+
}, v = (h) => {
|
|
983
983
|
if (!(!J(o.profile, "canManagePreferences") || n.features.refreshBatch)) {
|
|
984
984
|
for (const b of Object.values(n.features.pending))
|
|
985
|
-
b.mode === "mutation" && b.operation.kind === "preferenceAcknowledge" && b.status === "error" && !["conflict", "409"].includes(b.error?.code ?? "") &&
|
|
985
|
+
b.mode === "mutation" && b.operation.kind === "preferenceAcknowledge" && b.status === "error" && !["conflict", "409"].includes(b.error?.code ?? "") && f(b.operation, b.requestId, !0);
|
|
986
986
|
for (const b of ["account", "preferences", "preferencePrompts", "decisions"])
|
|
987
|
-
Object.values(n.features.pending).some((y) => y.mode === "query" && y.status === "pending" && y.operation.kind === b) || m({ kind: b }, `${
|
|
987
|
+
Object.values(n.features.pending).some((y) => y.mode === "query" && y.status === "pending" && y.operation.kind === b) || m({ kind: b }, `${h}:${b}`);
|
|
988
988
|
r({ refreshAt: null, refreshBatch: { pending: Object.values(n.features.pending).filter((b) => b.mode === "query" && b.status === "pending" && ["account", "preferences", "preferencePrompts", "decisions"].includes(b.operation.kind)).map((b) => b.effectId), failed: !1 } });
|
|
989
989
|
}
|
|
990
|
-
}, I = (
|
|
990
|
+
}, I = (h, b) => {
|
|
991
991
|
const y = n.features.refreshBatch;
|
|
992
|
-
if (y?.pending.includes(
|
|
993
|
-
const w = y.pending.filter((T) => T !==
|
|
992
|
+
if (y?.pending.includes(h)) {
|
|
993
|
+
const w = y.pending.filter((T) => T !== h), R = y.failed || b;
|
|
994
994
|
if (w.length) r({ refreshBatch: { pending: w, failed: R } });
|
|
995
995
|
else {
|
|
996
996
|
const T = R ? n.features.failures + 1 : 0;
|
|
@@ -1002,8 +1002,8 @@ function js(t, e, s) {
|
|
|
1002
1002
|
};
|
|
1003
1003
|
switch (e.type) {
|
|
1004
1004
|
case "stage7.account_refusal": {
|
|
1005
|
-
const
|
|
1006
|
-
if (
|
|
1005
|
+
const h = Ot(void 0, e.code);
|
|
1006
|
+
if (h.allowed) return { state: n, effects: i };
|
|
1007
1007
|
const b = { ...n.features.queries }, y = { ...n.features.pending }, w = [];
|
|
1008
1008
|
for (const [R, T] of Object.entries(y)) {
|
|
1009
1009
|
if (T.operation.kind !== "account" || T.status === "done" || T.status === "error") continue;
|
|
@@ -1014,7 +1014,7 @@ function js(t, e, s) {
|
|
|
1014
1014
|
}
|
|
1015
1015
|
n = { ...n, features: { ...n.features, pending: y, queries: b }, account: {
|
|
1016
1016
|
...n.account,
|
|
1017
|
-
refusal:
|
|
1017
|
+
refusal: h,
|
|
1018
1018
|
query: { ...n.account.query, requestId: null, status: n.account.query.data ? "ready" : "not_requested" }
|
|
1019
1019
|
} };
|
|
1020
1020
|
for (const R of w) I(R, !0);
|
|
@@ -1024,26 +1024,31 @@ function js(t, e, s) {
|
|
|
1024
1024
|
c(e.clientScopeId, e.origin);
|
|
1025
1025
|
break;
|
|
1026
1026
|
case "stage7.query":
|
|
1027
|
+
if (e.query.kind === "userSuggestedTasks") {
|
|
1028
|
+
const h = ae(o, e.query);
|
|
1029
|
+
if (!e.force && (n.features.polls[h] || n.features.queries[h]?.status === "error")) break;
|
|
1030
|
+
e.force && r({ suggestionReadFailures: 0 });
|
|
1031
|
+
}
|
|
1027
1032
|
if (e.query.kind === "originContext" && (c(e.query.clientScopeId, e.query.origin), e.force)) {
|
|
1028
|
-
const
|
|
1029
|
-
delete b[
|
|
1033
|
+
const h = ae(o, e.query), b = { ...n.features.contextReads };
|
|
1034
|
+
delete b[h], r({ contextReads: b });
|
|
1030
1035
|
}
|
|
1031
1036
|
m(e.query, e.requestId, e.force);
|
|
1032
1037
|
break;
|
|
1033
1038
|
case "stage7.mutate":
|
|
1034
|
-
|
|
1039
|
+
f(e.mutation, e.requestId);
|
|
1035
1040
|
break;
|
|
1036
1041
|
case "stage7.retry": {
|
|
1037
|
-
const
|
|
1038
|
-
if (!
|
|
1039
|
-
h
|
|
1042
|
+
const h = n.features.pending[Se(o, "mutate", e.requestId)];
|
|
1043
|
+
if (!h || h.mode !== "mutation") throw new Error("Unknown mutation request.");
|
|
1044
|
+
f(h.operation, e.requestId, !0);
|
|
1040
1045
|
break;
|
|
1041
1046
|
}
|
|
1042
1047
|
case "stage7.reconcile":
|
|
1043
1048
|
if (r({ schedulerError: null }), e.reason !== "periodic" || n.features.refreshAt === null || e.now >= n.features.refreshAt) {
|
|
1044
1049
|
if (e.reason === "startup" && r({ refreshRequired: !0 }), e.reason === "wake" || e.reason === "reconnect") {
|
|
1045
|
-
const
|
|
1046
|
-
r({ refreshRequired: !0, refreshQueuedRequestId:
|
|
1050
|
+
const h = Object.values(n.features.pending).some((b) => b.mode === "query" && b.status === "pending" && ["account", "preferences", "preferencePrompts", "decisions"].includes(b.operation.kind));
|
|
1051
|
+
r({ refreshRequired: !0, refreshQueuedRequestId: h ? `after:${e.requestId}` : n.features.refreshQueuedRequestId });
|
|
1047
1052
|
}
|
|
1048
1053
|
v(e.requestId);
|
|
1049
1054
|
}
|
|
@@ -1056,38 +1061,38 @@ function js(t, e, s) {
|
|
|
1056
1061
|
break;
|
|
1057
1062
|
case "stage7.restore_prompt_openings": {
|
|
1058
1063
|
if (!o.profile.startsWith("extension_")) throw new Error("Prompt restoration requires an extension opening checkpoint.");
|
|
1059
|
-
const
|
|
1064
|
+
const h = new Set(Object.values(s.directory.clients)), b = Object.fromEntries(Object.entries(e.checkpoint.openings).filter(([y, w]) => h.has(y) && s.directory.selections[y]?.sessionId === w.sessionId));
|
|
1060
1065
|
a({ ...e.checkpoint, openings: b, openingGeneration: Math.max(n.interactions.openingGeneration, e.checkpoint.openingGeneration) });
|
|
1061
1066
|
break;
|
|
1062
1067
|
}
|
|
1063
1068
|
case "stage7.prompt_view": {
|
|
1064
|
-
const
|
|
1065
|
-
if (!
|
|
1069
|
+
const h = s.directory.clients[e.clientScopeId];
|
|
1070
|
+
if (!h) break;
|
|
1066
1071
|
const b = { ...n.interactions.openings };
|
|
1067
|
-
e.open || delete b[
|
|
1072
|
+
e.open || delete b[h], a({ openings: b, closedScopes: { ...n.interactions.closedScopes, [h]: !e.open } }), n = Yt(n, s.conversation, s.directory, e.now);
|
|
1068
1073
|
break;
|
|
1069
1074
|
}
|
|
1070
1075
|
case "stage7.prompt_shown": {
|
|
1071
|
-
const
|
|
1076
|
+
const h = s.directory.clients[e.clientScopeId], b = n.interactions.openings[h];
|
|
1072
1077
|
if (!b || b.generation !== e.openingGeneration) break;
|
|
1073
|
-
const y = Ci(n,
|
|
1074
|
-
y && a({ openings: { ...n.interactions.openings, [
|
|
1078
|
+
const y = Ci(n, h, e.feature);
|
|
1079
|
+
y && a({ openings: { ...n.interactions.openings, [h]: { ...b, shown: { ...b.shown, [e.feature]: y } } } });
|
|
1075
1080
|
break;
|
|
1076
1081
|
}
|
|
1077
1082
|
case "stage7.cross_tab": {
|
|
1078
1083
|
a({ crossTabTurns: { ...n.interactions.crossTabTurns, [e.sessionId]: [.../* @__PURE__ */ new Set([...n.interactions.crossTabTurns[e.sessionId] ?? [], e.userMessageId])] } });
|
|
1079
|
-
const
|
|
1080
|
-
for (const [b, y] of Object.entries(
|
|
1084
|
+
const h = { ...n.interactions.openings };
|
|
1085
|
+
for (const [b, y] of Object.entries(h)) {
|
|
1081
1086
|
const w = y.turns[e.userMessageId];
|
|
1082
|
-
y.sessionId === e.sessionId && w && !w.tab_groupingSuppressed && (
|
|
1087
|
+
y.sessionId === e.sessionId && w && !w.tab_groupingSuppressed && (h[b] = { ...y, turns: { ...y.turns, [e.userMessageId]: { ...w, tab_grouping: !0 } } });
|
|
1083
1088
|
}
|
|
1084
|
-
a({ openings:
|
|
1089
|
+
a({ openings: h });
|
|
1085
1090
|
break;
|
|
1086
1091
|
}
|
|
1087
1092
|
case "stage7.permission": {
|
|
1088
1093
|
if (Qe(n, e.feature) !== !0) throw new Error("Permission setup requires a saved On preference.");
|
|
1089
|
-
const
|
|
1090
|
-
if (!e.settings &&
|
|
1094
|
+
const h = n.interactions.deviceFacts[e.feature].snoozedUntil;
|
|
1095
|
+
if (!e.settings && h && Date.parse(h) > e.now) break;
|
|
1091
1096
|
d(e.feature, e.action, e.requestId);
|
|
1092
1097
|
break;
|
|
1093
1098
|
}
|
|
@@ -1095,38 +1100,38 @@ function js(t, e, s) {
|
|
|
1095
1100
|
g(e.feature, e.fact);
|
|
1096
1101
|
break;
|
|
1097
1102
|
case "stage7.import_legacy_decisions":
|
|
1098
|
-
if (!o.profile.startsWith("extension_") || e.decisions.some((
|
|
1103
|
+
if (!o.profile.startsWith("extension_") || e.decisions.some((h) => h.revision !== 0)) throw new Error("Invalid legacy decision import.");
|
|
1099
1104
|
n = { ...n, interactions: es(n.interactions, e.decisions) };
|
|
1100
1105
|
break;
|
|
1101
1106
|
case "stage7.device_hints": {
|
|
1102
1107
|
if (o.profile !== "main_web_chat") throw new Error("Main-web hints unavailable.");
|
|
1103
|
-
const
|
|
1104
|
-
for (const [b, y] of Object.entries(e.hints))
|
|
1105
|
-
a({ deviceHints:
|
|
1108
|
+
const h = { ...n.interactions.deviceHints };
|
|
1109
|
+
for (const [b, y] of Object.entries(e.hints)) h[b] = h[b] === !0 || y;
|
|
1110
|
+
a({ deviceHints: h });
|
|
1106
1111
|
break;
|
|
1107
1112
|
}
|
|
1108
1113
|
case "stage7.local_sharing": {
|
|
1109
|
-
const
|
|
1114
|
+
const h = { ...n.interactions.localSharing };
|
|
1110
1115
|
for (const [b, y] of Object.entries(e.decisions))
|
|
1111
|
-
(!
|
|
1112
|
-
a({ localSharing:
|
|
1116
|
+
(!h[b] || y.revision > h[b].revision) && (h[b] = y);
|
|
1117
|
+
a({ localSharing: h, localSharingReady: !0 });
|
|
1113
1118
|
break;
|
|
1114
1119
|
}
|
|
1115
1120
|
case "stage7.sources": {
|
|
1116
|
-
const
|
|
1121
|
+
const h = { ...n.interactions.sources };
|
|
1117
1122
|
for (const b of e.sources) {
|
|
1118
1123
|
if (!Number.isSafeInteger(b.version) || b.version < 0) throw new Error("Invalid source version.");
|
|
1119
|
-
const y = JSON.stringify([b.conversation_id, b.id]), w =
|
|
1124
|
+
const y = JSON.stringify([b.conversation_id, b.id]), w = h[y];
|
|
1120
1125
|
if (!(w && w.version >= b.version)) {
|
|
1121
1126
|
if (w && w.payload.kind !== b.payload.kind) throw new Error("Interaction source changed category.");
|
|
1122
|
-
|
|
1127
|
+
h[y] = {
|
|
1123
1128
|
...b,
|
|
1124
1129
|
lifecycle: w?.lifecycle === "completed" ? "completed" : b.lifecycle,
|
|
1125
1130
|
payload: w?.payload.kind === "sharing" && b.payload.kind === "sharing" ? { ...b.payload, variant: w.payload.variant } : b.payload
|
|
1126
1131
|
};
|
|
1127
1132
|
}
|
|
1128
1133
|
}
|
|
1129
|
-
a({ sources:
|
|
1134
|
+
a({ sources: h });
|
|
1130
1135
|
break;
|
|
1131
1136
|
}
|
|
1132
1137
|
case "stage7.local_style":
|
|
@@ -1139,7 +1144,7 @@ function js(t, e, s) {
|
|
|
1139
1144
|
delete y[e.id], a({ welcome: y });
|
|
1140
1145
|
break;
|
|
1141
1146
|
}
|
|
1142
|
-
const
|
|
1147
|
+
const h = e.signupAgeDays, b = e.retained === !0 || e.localHour >= 5 && e.lastShownDate !== e.localDate && (h === 1 || h === 3 || h === 5 || h >= 7 && h % 7 === 0);
|
|
1143
1148
|
a({ welcome: { ...n.interactions.welcome, [e.id]: { id: e.id, text: e.text, tasks: e.tasks, category: "morning_report", eligible: b } } });
|
|
1144
1149
|
break;
|
|
1145
1150
|
}
|
|
@@ -1148,8 +1153,8 @@ function js(t, e, s) {
|
|
|
1148
1153
|
break;
|
|
1149
1154
|
case "stage7.deep_flow": {
|
|
1150
1155
|
if (!J(o.profile, "canStartDeepFlow")) throw new Error("Deep flow unavailable.");
|
|
1151
|
-
const
|
|
1152
|
-
if ((
|
|
1156
|
+
const h = n.features.deepFlows[e.clientScopeId];
|
|
1157
|
+
if ((h?.id ?? null) !== e.expectedId || h && e.flow && e.flow.id !== h.id || e.flow && h && h.status !== "running") break;
|
|
1153
1158
|
const b = { ...n.features.deepFlows };
|
|
1154
1159
|
e.flow ? b[e.clientScopeId] = e.flow : delete b[e.clientScopeId], r({ deepFlows: b });
|
|
1155
1160
|
break;
|
|
@@ -1177,7 +1182,7 @@ function js(t, e, s) {
|
|
|
1177
1182
|
if (delete w[e.effectId], a({ devicePending: w }), e.type === "effect.completed") {
|
|
1178
1183
|
if (y.action !== "check" && n.interactions.promptActions[y.requestId] && !n.features.pending[Se(o, "mutate", `${y.requestId}:ack`)]) {
|
|
1179
1184
|
const R = n.interactions.promptActions[y.requestId];
|
|
1180
|
-
u(R.feature, y.requestId),
|
|
1185
|
+
u(R.feature, y.requestId), f({
|
|
1181
1186
|
kind: "preferenceAcknowledge",
|
|
1182
1187
|
feature: R.feature,
|
|
1183
1188
|
action: R.action,
|
|
@@ -1188,54 +1193,54 @@ function js(t, e, s) {
|
|
|
1188
1193
|
} else Qe(n, y.feature) === !0 && n.features.desiredPreferences[y.feature] !== !1 && a({ deviceErrors: { ...n.interactions.deviceErrors, [y.feature]: e.error } });
|
|
1189
1194
|
break;
|
|
1190
1195
|
}
|
|
1191
|
-
const
|
|
1192
|
-
if (!
|
|
1196
|
+
const h = n.features.pending[e.effectId];
|
|
1197
|
+
if (!h || h.status !== "pending" || h.generation !== o.generation) break;
|
|
1193
1198
|
const b = e.type === "effect.failed";
|
|
1194
|
-
if (r({ pending: { ...n.features.pending, [e.effectId]: { ...
|
|
1199
|
+
if (r({ pending: { ...n.features.pending, [e.effectId]: { ...h, status: b ? "error" : "done", error: b ? e.error : null, result: b ? null : e.output.data } } }), h.mode === "query") {
|
|
1195
1200
|
const y = { ...n.features.pending };
|
|
1196
1201
|
delete y[e.effectId], r({ pending: y });
|
|
1197
|
-
const w = n.features.queries[
|
|
1198
|
-
if (!w || w.requestId !==
|
|
1199
|
-
if (["originContext", "userContext", "contextRun"].includes(
|
|
1202
|
+
const w = n.features.queries[h.key];
|
|
1203
|
+
if (!w || w.requestId !== h.requestId) break;
|
|
1204
|
+
if (["originContext", "userContext", "contextRun"].includes(h.operation.kind)) {
|
|
1200
1205
|
const R = { ...n.features.polls };
|
|
1201
|
-
delete R[
|
|
1206
|
+
delete R[h.key], r({ polls: R, contextReads: { ...n.features.contextReads, [h.key]: {
|
|
1202
1207
|
settledAt: b ? n.features.now : e.output.completedAt,
|
|
1203
|
-
failures: b ? (n.features.contextReads[
|
|
1208
|
+
failures: b ? (n.features.contextReads[h.key]?.failures ?? 0) + 1 : 0
|
|
1204
1209
|
} } });
|
|
1205
1210
|
}
|
|
1206
1211
|
if (b)
|
|
1207
|
-
r({ queries: { ...n.features.queries, [
|
|
1212
|
+
r({ queries: { ...n.features.queries, [h.key]: ct(w, { key: h.key, requestId: re(h.requestId), error: e.error }) } }), h.operation.kind === "account" && (n = { ...n, account: { ...n.account, query: ct(n.account.query, { key: h.key, requestId: re(h.requestId), error: e.error }) } });
|
|
1208
1213
|
else {
|
|
1209
|
-
if (e.output.data.kind !==
|
|
1210
|
-
r({ now: e.output.completedAt, queries: { ...n.features.queries, [
|
|
1214
|
+
if (e.output.data.kind !== h.operation.kind) throw new Error("Feature response kind does not match the query.");
|
|
1215
|
+
r({ now: e.output.completedAt, queries: { ...n.features.queries, [h.key]: Zt(w, { key: h.key, requestId: re(h.requestId), data: e.output.data, cursor: null, updatedAt: e.output.completedAt }) } }), p(e.output.data, h.requestId), e.output.data.kind === "account" && (n = { ...n, account: { ...n.account, refusal: null, query: Zt(n.account.query, { key: h.key, requestId: re(h.requestId), data: e.output.data.value, cursor: null, updatedAt: e.output.completedAt }) } });
|
|
1211
1216
|
}
|
|
1212
1217
|
} else if (!b)
|
|
1213
|
-
r({ now: e.output.completedAt }), p(e.output.data,
|
|
1218
|
+
r({ now: e.output.completedAt }), p(e.output.data, h.requestId);
|
|
1214
1219
|
else if (["conflict", "409"].includes(e.error.code)) {
|
|
1215
|
-
const y =
|
|
1216
|
-
m({ kind: y }, `conflict:${
|
|
1220
|
+
const y = h.operation.kind === "decision" ? "decisions" : h.operation.kind === "preferenceSnooze" || h.operation.kind === "preferenceAcknowledge" ? "preferencePrompts" : "preferences";
|
|
1221
|
+
m({ kind: y }, `conflict:${h.requestId}`);
|
|
1217
1222
|
}
|
|
1218
|
-
if (
|
|
1223
|
+
if (h.mode === "mutation" && h.operation.kind === "decision") {
|
|
1219
1224
|
const y = { ...n.interactions.actions };
|
|
1220
1225
|
for (const [w, R] of Object.entries(y))
|
|
1221
|
-
R.step === "persist" &&
|
|
1226
|
+
R.step === "persist" && h.requestId === `sharing:${w}` && (R.operation.kind === "copy" || R.operation.kind === "share") && (y[w] = { ...R, status: b ? "error" : "done", error: b ? e.error : null });
|
|
1222
1227
|
a({ actions: y });
|
|
1223
1228
|
}
|
|
1224
|
-
if (!b &&
|
|
1225
|
-
const y = n.interactions.promptActions[
|
|
1226
|
-
u(y.feature,
|
|
1229
|
+
if (!b && h.mode === "mutation" && h.operation.kind === "preference" && n.interactions.promptActions[h.requestId]) {
|
|
1230
|
+
const y = n.interactions.promptActions[h.requestId];
|
|
1231
|
+
u(y.feature, h.requestId), f({
|
|
1227
1232
|
kind: "preferenceAcknowledge",
|
|
1228
1233
|
feature: y.feature,
|
|
1229
1234
|
action: y.action,
|
|
1230
1235
|
expectedRevision: y.expectedRevision
|
|
1231
|
-
}, `${
|
|
1236
|
+
}, `${h.requestId}:ack`);
|
|
1232
1237
|
}
|
|
1233
|
-
if (I(e.effectId, b),
|
|
1234
|
-
const y = { kind: "starterPrompts", ...
|
|
1235
|
-
R?.requestId ===
|
|
1238
|
+
if (I(e.effectId, b), h.operation.kind === "generatePrompts") {
|
|
1239
|
+
const y = { kind: "starterPrompts", ...h.operation.page, includeUserSuggestions: h.operation.includeUserSuggestions ?? !1 }, w = ae(o, y), R = n.features.queries[w];
|
|
1240
|
+
R?.requestId === h.requestId && r({ queries: { ...n.features.queries, [w]: b ? ct(R, { key: w, requestId: re(h.requestId), error: e.error }) : Zt(R, { key: w, requestId: re(h.requestId), data: e.output.data, cursor: null, updatedAt: e.output.completedAt }) } });
|
|
1236
1241
|
}
|
|
1237
1242
|
if (!b && e.output.data.kind === "originContext") {
|
|
1238
|
-
const y = e.output.data, w =
|
|
1243
|
+
const y = e.output.data, w = h.operation.kind === "originContext" || h.operation.kind === "refreshContext" ? h.operation.origin : null;
|
|
1239
1244
|
if (w) {
|
|
1240
1245
|
if (y.value.runId && ["queued", "pending", "running", "in_progress", "stopping", "cancel_requested"].includes(y.value.status))
|
|
1241
1246
|
r({ contextRunOrigins: { ...n.features.contextRunOrigins, [y.value.runId]: w } });
|
|
@@ -1244,7 +1249,7 @@ function js(t, e, s) {
|
|
|
1244
1249
|
for (const [T, C] of Object.entries(R)) C === w && delete R[T];
|
|
1245
1250
|
r({ contextRunOrigins: R });
|
|
1246
1251
|
}
|
|
1247
|
-
if (
|
|
1252
|
+
if (h.mode === "mutation") {
|
|
1248
1253
|
const R = { ...n.features.queries }, T = { ...n.features.pending }, C = { ...n.features.contextReads }, E = { ...n.features.polls };
|
|
1249
1254
|
for (const [q, O] of Object.entries(n.features.originContextQueries))
|
|
1250
1255
|
if (O.origin === w) {
|
|
@@ -1265,66 +1270,70 @@ function js(t, e, s) {
|
|
|
1265
1270
|
if (C.origin !== w) continue;
|
|
1266
1271
|
const E = { ...n.features.pending };
|
|
1267
1272
|
for (const [q, O] of Object.entries(E)) O.mode === "query" && O.key === T && delete E[q];
|
|
1268
|
-
r({ pending: E }), m({ ...C, kind: "originContext" }, `context-final:${
|
|
1273
|
+
r({ pending: E }), m({ ...C, kind: "originContext" }, `context-final:${h.requestId}:${T}`, !0);
|
|
1269
1274
|
}
|
|
1270
1275
|
}
|
|
1271
1276
|
}
|
|
1272
1277
|
if (!b && ["originContext", "userContext", "contextRun"].includes(e.output.data.kind)) {
|
|
1273
1278
|
const y = e.output.data;
|
|
1274
1279
|
if (y.kind === "originContext" || y.kind === "userContext" || y.kind === "contextRun") {
|
|
1275
|
-
const w = y.kind === "originContext" ?
|
|
1280
|
+
const w = y.kind === "originContext" ? h.mode === "query" && h.operation.kind === "originContext" && Object.values(n.features.contextObservers).includes(h.key) ? h.operation : null : y.kind === "userContext" ? { kind: "userContext" } : y.value.runId ? { kind: "contextRun", runId: y.value.runId } : null;
|
|
1276
1281
|
if (w && ["queued", "pending", "running", "in_progress", "stopping", "cancel_requested"].includes(y.value.status)) {
|
|
1277
|
-
const R =
|
|
1282
|
+
const R = ae(o, w);
|
|
1278
1283
|
r({ polls: { ...n.features.polls, [R]: { query: w, deadline: n.features.now + 5e3 } } });
|
|
1279
1284
|
}
|
|
1280
1285
|
}
|
|
1281
1286
|
}
|
|
1282
|
-
if (!b &&
|
|
1287
|
+
if (!b && h.operation.kind === "stopContext")
|
|
1283
1288
|
for (const [y, w] of Object.entries(n.features.originContextQueries)) {
|
|
1284
1289
|
const R = n.features.queries[y]?.data;
|
|
1285
|
-
if (R?.kind === "originContext" && R.value.runId ===
|
|
1290
|
+
if (R?.kind === "originContext" && R.value.runId === h.operation.runId) {
|
|
1286
1291
|
const T = { ...n.features.pending };
|
|
1287
1292
|
for (const [C, E] of Object.entries(T)) E.mode === "query" && E.key === y && delete T[C];
|
|
1288
|
-
r({ pending: T }), m({ ...w, kind: "originContext" }, `context-stop:${
|
|
1293
|
+
r({ pending: T }), m({ ...w, kind: "originContext" }, `context-stop:${h.requestId}:${y}`, !0);
|
|
1289
1294
|
}
|
|
1290
1295
|
}
|
|
1291
|
-
if (b &&
|
|
1292
|
-
const y =
|
|
1293
|
-
r({ polls: { ...n.features.polls, [w]: { query: y, deadline: n.features.now + 5e3 * (n.features.contextReads[
|
|
1296
|
+
if (b && h.mode === "query" && ["originContext", "userContext", "contextRun"].includes(h.operation.kind) && e.error.retryable && (n.features.contextReads[h.key]?.failures ?? 0) <= 3) {
|
|
1297
|
+
const y = h.operation, w = ae(o, y);
|
|
1298
|
+
r({ polls: { ...n.features.polls, [w]: { query: y, deadline: n.features.now + 5e3 * (n.features.contextReads[h.key]?.failures ?? 1) } } });
|
|
1294
1299
|
}
|
|
1295
|
-
if (
|
|
1296
|
-
const y =
|
|
1300
|
+
if (h.mode === "query" && h.operation.kind === "userSuggestedTasks") {
|
|
1301
|
+
const y = b ? n.features.suggestionReadFailures + 1 : 0, w = { ...n.features.polls };
|
|
1302
|
+
delete w[h.key], b && y <= 3 && (e.error.retryable || ["connection_interrupted", "request_timed_out", "408", "425", "429", "500", "502", "503", "504"].includes(e.error.code)) && (w[h.key] = { query: h.operation, deadline: n.features.now + 1e3 * 2 ** (y - 1) }), r({ suggestionReadFailures: y, polls: w });
|
|
1303
|
+
}
|
|
1304
|
+
if (h.operation.kind === "preference") {
|
|
1305
|
+
const y = h.operation.feature, w = n.features.queuedPreferences[y];
|
|
1297
1306
|
if (w) {
|
|
1298
1307
|
const R = { ...n.features.queuedPreferences };
|
|
1299
|
-
delete R[y], r({ queuedPreferences: R }),
|
|
1308
|
+
delete R[y], r({ queuedPreferences: R }), f({ kind: "preference", feature: y, enabled: w.enabled }, w.requestId);
|
|
1300
1309
|
} else {
|
|
1301
1310
|
const R = { ...n.features.desiredPreferences };
|
|
1302
1311
|
delete R[y], r({ desiredPreferences: R });
|
|
1303
1312
|
}
|
|
1304
1313
|
}
|
|
1305
|
-
if (!b && e.output.data.kind === "preferences") for (const y of ["notifications", "tab_grouping"]) d(y, "check", `preference:${
|
|
1314
|
+
if (!b && e.output.data.kind === "preferences") for (const y of ["notifications", "tab_grouping"]) d(y, "check", `preference:${h.requestId}:${y}`);
|
|
1306
1315
|
n.features.refreshRequired && !n.features.refreshBatch && !n.features.refreshQueuedRequestId && ["account", "preferences", "preferencePrompts", "decisions"].every((y) => Object.values(n.features.queries).some((w) => w.data?.kind === y && w.status === "ready")) && r({ refreshRequired: !1 });
|
|
1307
1316
|
break;
|
|
1308
1317
|
}
|
|
1309
1318
|
}
|
|
1310
1319
|
const _ = [
|
|
1311
1320
|
n.features.refreshAt,
|
|
1312
|
-
...Object.values(n.interactions.openings).flatMap((
|
|
1313
|
-
...Object.values(n.interactions.welcome).map((
|
|
1314
|
-
...Object.values(n.interactions.sources).map((
|
|
1315
|
-
...Object.values(n.features.polls).map((
|
|
1316
|
-
...Object.values(n.interactions.decisions).map((
|
|
1317
|
-
...Object.values(n.interactions.preferencePrompts).map((
|
|
1318
|
-
...Object.values(n.interactions.deviceFacts).map((
|
|
1319
|
-
].filter((
|
|
1321
|
+
...Object.values(n.interactions.openings).flatMap((h) => Object.values(h.turns).filter((b) => b.active && !b.notifications && !b.notificationsSuppressed).map((b) => b.startedAt + 1e4)),
|
|
1322
|
+
...Object.values(n.interactions.welcome).map((h) => h.eligible ? h.expiresAt ?? null : null),
|
|
1323
|
+
...Object.values(n.interactions.sources).map((h) => h.lifecycle === "pending" && h.payload.kind === "integration_auth" ? Date.parse(h.payload.expires_at) : null),
|
|
1324
|
+
...Object.values(n.features.polls).map((h) => h.deadline),
|
|
1325
|
+
...Object.values(n.interactions.decisions).map((h) => h.nextEligibleAt ? Date.parse(h.nextEligibleAt) : null),
|
|
1326
|
+
...Object.values(n.interactions.preferencePrompts).map((h) => h.snoozedUntil ? Date.parse(h.snoozedUntil) : null),
|
|
1327
|
+
...Object.values(n.interactions.deviceFacts).map((h) => h.snoozedUntil ? Date.parse(h.snoozedUntil) : null)
|
|
1328
|
+
].filter((h) => h !== null && h > n.features.now), S = _.length ? Math.min(..._) : null;
|
|
1320
1329
|
if (S !== n.features.timerDeadline && !n.features.schedulerError) {
|
|
1321
|
-
const
|
|
1322
|
-
r({ timerId: b, timerDeadline: S, timerRevision:
|
|
1330
|
+
const h = n.features.timerRevision + 1, b = S === null ? null : Se(o, "wait", `${h}:${S}`);
|
|
1331
|
+
r({ timerId: b, timerDeadline: S, timerRevision: h }), S !== null && b && i.push({ kind: "stage7.wait", id: b, input: { authority: o, deadline: S } });
|
|
1323
1332
|
}
|
|
1324
1333
|
return { state: n, effects: i };
|
|
1325
1334
|
}
|
|
1326
1335
|
function Bs(t, e) {
|
|
1327
|
-
return t.account.authority ? t.features.queries[
|
|
1336
|
+
return t.account.authority ? t.features.queries[ae(t.account.authority, e)] ?? null : null;
|
|
1328
1337
|
}
|
|
1329
1338
|
function nt(t) {
|
|
1330
1339
|
if (!t || typeof t != "object") return !1;
|
|
@@ -1373,7 +1382,7 @@ function P(t) {
|
|
|
1373
1382
|
if (typeof t != "string") throw new Error("Invalid feature response string.");
|
|
1374
1383
|
return t;
|
|
1375
1384
|
}
|
|
1376
|
-
function
|
|
1385
|
+
function de(t) {
|
|
1377
1386
|
return t == null ? null : P(t);
|
|
1378
1387
|
}
|
|
1379
1388
|
function Oe(t) {
|
|
@@ -1392,7 +1401,7 @@ function bt(t) {
|
|
|
1392
1401
|
return t.map(P);
|
|
1393
1402
|
}
|
|
1394
1403
|
function Mt(t) {
|
|
1395
|
-
const e =
|
|
1404
|
+
const e = de(t);
|
|
1396
1405
|
if (e !== null && !Number.isFinite(Date.parse(e))) throw new Error("Invalid feature deadline.");
|
|
1397
1406
|
return e;
|
|
1398
1407
|
}
|
|
@@ -1404,13 +1413,13 @@ function ze(t) {
|
|
|
1404
1413
|
preferencesVersion: Oe(e.preferencesVersion),
|
|
1405
1414
|
scribbleStyleEnabled: ts(e.scribbleStyleEnabled),
|
|
1406
1415
|
blockedOrigins: bt(e.blockedServiceOrigins),
|
|
1407
|
-
personalInstructions:
|
|
1416
|
+
personalInstructions: de(e.personalInstructions),
|
|
1408
1417
|
securityPolicyVersion: Oe(e.securityPolicyVersion)
|
|
1409
1418
|
};
|
|
1410
1419
|
}
|
|
1411
1420
|
function Pt(t) {
|
|
1412
1421
|
const e = N(t);
|
|
1413
|
-
return { eligibleSince: Mt(e.eligibleSince), revision: Oe(e.revision), requestId:
|
|
1422
|
+
return { eligibleSince: Mt(e.eligibleSince), revision: Oe(e.revision), requestId: de(e.requestId), snoozedUntil: Mt(e.snoozedUntil) };
|
|
1414
1423
|
}
|
|
1415
1424
|
function Qr(t) {
|
|
1416
1425
|
const e = N(t);
|
|
@@ -1465,14 +1474,14 @@ function Xr(t) {
|
|
|
1465
1474
|
}
|
|
1466
1475
|
function He(t, e) {
|
|
1467
1476
|
const s = N(e);
|
|
1468
|
-
if (t === "contextRun") return { kind: t, value: { status: P(s.status), runId: P(s.id), updatedAt:
|
|
1469
|
-
const n = s.latestRun === null || s.latestRun === void 0 ? null : N(s.latestRun), i =
|
|
1477
|
+
if (t === "contextRun") return { kind: t, value: { status: P(s.status), runId: P(s.id), updatedAt: de(s.completedAt ?? s.createdAt), hasContext: null } };
|
|
1478
|
+
const n = s.latestRun === null || s.latestRun === void 0 ? null : N(s.latestRun), i = de(s.activeRefreshRunId);
|
|
1470
1479
|
return { kind: t, value: {
|
|
1471
1480
|
...s.origin === void 0 ? {} : { origin: P(s.origin) },
|
|
1472
|
-
...n?.createdAt === void 0 ? {} : { latestRun: { id: P(n.id), status: P(n.status), createdAt: P(n.createdAt), completedAt:
|
|
1481
|
+
...n?.createdAt === void 0 ? {} : { latestRun: { id: P(n.id), status: P(n.status), createdAt: P(n.createdAt), completedAt: de(n.completedAt), error: de(n.error) } },
|
|
1473
1482
|
status: i ? "running" : n ? P(n.status) : "idle",
|
|
1474
1483
|
runId: i ?? (n ? P(n.id) : null),
|
|
1475
|
-
updatedAt:
|
|
1484
|
+
updatedAt: de(s.latestSnapshotUpdatedAt),
|
|
1476
1485
|
hasContext: je(s.hasContext)
|
|
1477
1486
|
} };
|
|
1478
1487
|
}
|
|
@@ -1487,7 +1496,7 @@ function dt(t, e) {
|
|
|
1487
1496
|
}
|
|
1488
1497
|
function lt(t) {
|
|
1489
1498
|
const e = N(t);
|
|
1490
|
-
if (!je(e.success)) throw new Error(
|
|
1499
|
+
if (!je(e.success)) throw new Error(de(e.message) ?? "Failed to submit feedback");
|
|
1491
1500
|
return { kind: "ack", success: !0 };
|
|
1492
1501
|
}
|
|
1493
1502
|
function ns(t) {
|
|
@@ -1541,16 +1550,16 @@ function Yr(t) {
|
|
|
1541
1550
|
}
|
|
1542
1551
|
case "starterPrompts": {
|
|
1543
1552
|
const c = N(await a("/starter-prompts", r ? { page_url: n.pageUrl } : { origin: n.origin, page_url: n.pageUrl, include_user_suggestions: n.includeUserSuggestions }));
|
|
1544
|
-
o = { kind: "starterPrompts", origin: n.origin, prompts: bt(c.starterPrompts), ...c.runtimeHelpers === void 0 ? {} : { runtimeHelpersJavascript: c.runtimeHelpers === null ? null :
|
|
1553
|
+
o = { kind: "starterPrompts", origin: n.origin, prompts: bt(c.starterPrompts), ...c.runtimeHelpers === void 0 ? {} : { runtimeHelpersJavascript: c.runtimeHelpers === null ? null : de(N(c.runtimeHelpers).javascript) } };
|
|
1545
1554
|
break;
|
|
1546
1555
|
}
|
|
1547
1556
|
case "userSuggestedTasks": {
|
|
1548
|
-
const c = N(await
|
|
1557
|
+
const c = N(await t.http.request("/user-suggested-tasks", {}, void 0, "GET", "runtime", { skipAuthentication: !0 }));
|
|
1549
1558
|
if (!Array.isArray(c.proactiveSuggestions)) throw new Error("Invalid proactive suggestions.");
|
|
1550
1559
|
o = {
|
|
1551
1560
|
kind: "userSuggestedTasks",
|
|
1552
1561
|
prompts: bt(c.starterPrompts),
|
|
1553
|
-
morningReportOpening:
|
|
1562
|
+
morningReportOpening: de(c.morningReportOpening),
|
|
1554
1563
|
signupAt: P(c.signupAt),
|
|
1555
1564
|
proactiveSuggestions: c.proactiveSuggestions.map(Xr)
|
|
1556
1565
|
};
|
|
@@ -1712,8 +1721,8 @@ function Fi(t, e, s) {
|
|
|
1712
1721
|
let c = !1, l = !1, d = () => {
|
|
1713
1722
|
}, u = () => {
|
|
1714
1723
|
};
|
|
1715
|
-
const p = (m,
|
|
1716
|
-
l || (l = !0, d(), u(), m ? o(m) : a(
|
|
1724
|
+
const p = (m, f) => {
|
|
1725
|
+
l || (l = !0, d(), u(), m ? o(m) : a(f));
|
|
1717
1726
|
}, g = () => {
|
|
1718
1727
|
if (!c) return;
|
|
1719
1728
|
const m = t.engine.getState().slices;
|
|
@@ -1721,16 +1730,16 @@ function Fi(t, e, s) {
|
|
|
1721
1730
|
p(new Error("Feature authority retired."));
|
|
1722
1731
|
return;
|
|
1723
1732
|
}
|
|
1724
|
-
if (e.type === "stage7.query" && e.query.kind === "originContext" && m.features.contextObservers[e.query.clientScopeId] !==
|
|
1733
|
+
if (e.type === "stage7.query" && e.query.kind === "originContext" && m.features.contextObservers[e.query.clientScopeId] !== ae(n, e.query)) {
|
|
1725
1734
|
p(Object.assign(new Error("Context observation retired."), { code: "observation_released", retryable: !1 }));
|
|
1726
1735
|
return;
|
|
1727
1736
|
}
|
|
1728
|
-
const
|
|
1729
|
-
if (!
|
|
1737
|
+
const f = Object.values(m.features.pending).find((v) => v.requestId === r);
|
|
1738
|
+
if (!f && e.type === "stage7.query") {
|
|
1730
1739
|
const v = Bs(m, e.query);
|
|
1731
1740
|
v?.status === "error" ? p(v.error) : v?.status === "ready" && v.data && p(null, v.data);
|
|
1732
1741
|
}
|
|
1733
|
-
|
|
1742
|
+
f?.status === "error" ? p(f.error) : f?.status === "done" && p(null, f.result);
|
|
1734
1743
|
};
|
|
1735
1744
|
d = t.engine.subscribe(g), u = t.onDispose(() => p(new Error("Feature runtime disposed."))), t.engine.dispatch({ ...e, authority: n, requestId: r, now: Date.now() }).then(() => {
|
|
1736
1745
|
c = !0, g();
|
|
@@ -1745,25 +1754,25 @@ async function no(t, e, s = crypto.randomUUID()) {
|
|
|
1745
1754
|
let c = !1, l = !1, d = () => {
|
|
1746
1755
|
}, u = () => {
|
|
1747
1756
|
};
|
|
1748
|
-
const p = (
|
|
1749
|
-
l || (l = !0, d(), u(),
|
|
1757
|
+
const p = (f) => {
|
|
1758
|
+
l || (l = !0, d(), u(), f ? o(f) : a());
|
|
1750
1759
|
}, g = () => {
|
|
1751
1760
|
if (!c) return;
|
|
1752
|
-
const
|
|
1753
|
-
if (JSON.stringify(
|
|
1754
|
-
const v =
|
|
1761
|
+
const f = t.engine.getState().slices;
|
|
1762
|
+
if (JSON.stringify(f.account.authority) !== JSON.stringify(n)) return p(new Error("Feature authority retired."));
|
|
1763
|
+
const v = f.interactions.actions[r];
|
|
1755
1764
|
if (v) {
|
|
1756
1765
|
v.status === "error" ? p(v.error) : v.status === "done" && p();
|
|
1757
1766
|
return;
|
|
1758
1767
|
}
|
|
1759
|
-
const I = Object.values(
|
|
1768
|
+
const I = Object.values(f.features.pending).find((S) => S.requestId === r);
|
|
1760
1769
|
if (I) {
|
|
1761
1770
|
I.status === "error" ? p(I.error) : I.status === "done" && p();
|
|
1762
1771
|
return;
|
|
1763
1772
|
}
|
|
1764
|
-
if (Object.values(
|
|
1773
|
+
if (Object.values(f.interactions.devicePending).some((S) => S.requestId === r)) return;
|
|
1765
1774
|
const _ = e.interactionId === "preference:notifications" ? "notifications" : e.interactionId === "preference:tab_grouping" ? "tab_grouping" : null;
|
|
1766
|
-
p(_ ?
|
|
1775
|
+
p(_ ? f.interactions.deviceErrors[_] : void 0);
|
|
1767
1776
|
};
|
|
1768
1777
|
d = t.engine.subscribe(g), u = t.onDispose(() => p(new Error("Feature runtime disposed.")));
|
|
1769
1778
|
const m = i ? { type: "stage7.retry_action", authority: n, now: Date.now(), requestId: r } : { type: "stage7.act", authority: n, now: Date.now(), requestId: r, ...e, sourceVersion: e.expectedSourceVersion ?? null };
|
|
@@ -1836,7 +1845,7 @@ function oo(t, e = null) {
|
|
|
1836
1845
|
} : void 0);
|
|
1837
1846
|
return { ...n, ...o ? { auth: o } : {}, submissionGate: a, usingPaidCreditFallback: e ? t.paidFallbackBySession[e] ?? !1 : !1 };
|
|
1838
1847
|
}
|
|
1839
|
-
const ao = "0.1.
|
|
1848
|
+
const ao = "0.1.266", jt = {
|
|
1840
1849
|
version: ao
|
|
1841
1850
|
}, dn = (t) => t.selectedModel ?? t.historyModel ?? t.defaultModel, co = (t, e) => t.scopes[e];
|
|
1842
1851
|
function Bt(t) {
|
|
@@ -1870,7 +1879,7 @@ function Fs(t, e) {
|
|
|
1870
1879
|
if (e.conversation_id !== t.sessionId) throw new Error("Execution belongs to another conversation.");
|
|
1871
1880
|
if (Bt(e.version), t.execution && e.version <= t.execution.version) return t;
|
|
1872
1881
|
const s = { ...t.executionByUserMessage };
|
|
1873
|
-
for (const n of
|
|
1882
|
+
for (const n of le(e)) s[n] = {
|
|
1874
1883
|
version: e.version,
|
|
1875
1884
|
phase: e.phase,
|
|
1876
1885
|
responseMessageIds: e.response_message_groups?.find((i) => i.includes(n)) ?? [n]
|
|
@@ -1999,7 +2008,7 @@ function uo(t, e, s, n) {
|
|
|
1999
2008
|
else {
|
|
2000
2009
|
const m = X(e.output.snapshot);
|
|
2001
2010
|
o.lane === "current" && (c = { ...c, preparation: null });
|
|
2002
|
-
const
|
|
2011
|
+
const f = c.queries.history, v = o.lane === "current" && (f.status === "not_requested" || m.next_cursor !== null && !c.items[m.next_cursor]);
|
|
2003
2012
|
if (m.conversation_id !== o.sessionId) throw new Error("Snapshot belongs to another conversation.");
|
|
2004
2013
|
for (const I of m.removed_items) c = rs(c, I);
|
|
2005
2014
|
for (const I of m.items) c = Ls(c, I);
|
|
@@ -2029,7 +2038,7 @@ function uo(t, e, s, n) {
|
|
|
2029
2038
|
} } }, v) {
|
|
2030
2039
|
for (const [I, _] of Object.entries(p))
|
|
2031
2040
|
_.sessionId === o.sessionId && _.lane === "history" && delete p[I];
|
|
2032
|
-
c = { ...c, queries: { ...c.queries, history: { ...c.queries.current, key:
|
|
2041
|
+
c = { ...c, queries: { ...c.queries, history: { ...c.queries.current, key: f.key } } };
|
|
2033
2042
|
}
|
|
2034
2043
|
}
|
|
2035
2044
|
i = { ...t, requests: p, submissions: g, sessions: { ...t.sessions, [c.sessionId]: c } };
|
|
@@ -2059,16 +2068,16 @@ function uo(t, e, s, n) {
|
|
|
2059
2068
|
if (s.clients[e.clientScopeId] !== e.conversationScopeId) throw new Error("Submission selection has changed.");
|
|
2060
2069
|
const { type: o, authorityId: c, generation: l, prepareContext: d, waitForAuthentication: u, ...p } = e, g = t.submissions[e.userMessageId];
|
|
2061
2070
|
if (g) {
|
|
2062
|
-
const { contextPreparation: S, requestedModel:
|
|
2071
|
+
const { contextPreparation: S, requestedModel: h, sessionId: b, delivery: y, cancelled: w, cancellationReason: R, error: T, executionVersion: C, ...E } = g;
|
|
2063
2072
|
if (ut(E) !== ut(p)) throw new Error("User-message identity cannot be reused with different input.");
|
|
2064
2073
|
return { state: t, effects: r };
|
|
2065
2074
|
}
|
|
2066
|
-
const m = s.selections[e.conversationScopeId],
|
|
2075
|
+
const m = s.selections[e.conversationScopeId], f = Object.values(t.submissions).find((S) => S.conversationScopeId === e.conversationScopeId && !S.cancelled && S.sessionId !== null), v = n.scopes[e.clientScopeId], I = {
|
|
2067
2076
|
...X(p),
|
|
2068
2077
|
...d ? { contextPreparation: null } : {},
|
|
2069
2078
|
// Extension staging can await page context after the picker has already changed.
|
|
2070
2079
|
requestedModel: v?.submissions[e.userMessageId] ? v.submissions[e.userMessageId].requestedModel ?? null : v ? dn(v) ?? null : null,
|
|
2071
|
-
sessionId: m.sessionId ??
|
|
2080
|
+
sessionId: m.sessionId ?? f?.sessionId ?? null,
|
|
2072
2081
|
delivery: u ? "failed" : "staged",
|
|
2073
2082
|
cancelled: !1,
|
|
2074
2083
|
error: u ? { code: u, message: u === "unauthorized" ? "Open the Pluno login link, then return to Pluno." : "Pluno is reconnecting. Try again in a moment.", retryable: !1 } : null,
|
|
@@ -2091,11 +2100,11 @@ function uo(t, e, s, n) {
|
|
|
2091
2100
|
}
|
|
2092
2101
|
case "conversation.stop": {
|
|
2093
2102
|
if (s.clients[e.clientScopeId] !== e.conversationScopeId) return { state: t, effects: r };
|
|
2094
|
-
const o = s.selections[e.conversationScopeId].sessionId, c = o ? t.sessions[o]?.execution : null, l = Object.values(t.submissions).filter((
|
|
2103
|
+
const o = s.selections[e.conversationScopeId].sessionId, c = o ? t.sessions[o]?.execution : null, l = Object.values(t.submissions).filter((f) => (o ? f.sessionId === o : f.conversationScopeId === e.conversationScopeId) && (!e.userMessageIds || e.userMessageIds.includes(f.userMessageId))), d = l.filter((f) => !f.cancelled && (f.delivery !== "failed" || t.deliveries[f.userMessageId]?.phase === "paused" || e.userMessageIds?.includes(f.userMessageId) && t.deliveries[f.userMessageId]?.acceptance === "unissued") && (f.delivery !== "accepted" || f.executionVersion === null)), u = d.length > 0, p = c && ["queued", "thinking", "steering", "stopping"].includes(c.phase) && (!e.userMessageIds || le(c).some((f) => e.userMessageIds.includes(f)));
|
|
2095
2104
|
if (!u && !p && (c || !e.userMessageIds?.length)) return { state: t, effects: r };
|
|
2096
|
-
const g = Array.from(new Set(e.userMessageIds ?? [...d.map((
|
|
2097
|
-
for (const
|
|
2098
|
-
g.includes(
|
|
2105
|
+
const g = Array.from(new Set(e.userMessageIds ?? [...d.map((f) => f.userMessageId), ...p ? le(c) : []])), m = { ...t.submissions };
|
|
2106
|
+
for (const f of l)
|
|
2107
|
+
g.includes(f.userMessageId) && f.delivery !== "accepted" && (m[f.userMessageId] = { ...f, cancelled: !0, cancellationReason: e.reason ?? "user_requested" });
|
|
2099
2108
|
i = { ...t, submissions: m, stops: { ...t.stops, [e.conversationScopeId]: {
|
|
2100
2109
|
requestId: e.requestId,
|
|
2101
2110
|
userMessageIds: g,
|
|
@@ -2260,7 +2269,7 @@ function Ws(t) {
|
|
|
2260
2269
|
l = { ...l, uploads: [...l.uploads, g.uploaded] };
|
|
2261
2270
|
continue;
|
|
2262
2271
|
}
|
|
2263
|
-
const m = Object.values(e.operations).find((
|
|
2272
|
+
const m = Object.values(e.operations).find((f) => f.command.type === "attachment.prepare" && f.conversationScopeId === c.conversationScopeId && f.phase === "done" && f.command.payload.source.sourceId === g.sourceId && f.result?.sessionId === c.sessionId);
|
|
2264
2273
|
if (!m) break;
|
|
2265
2274
|
l = { ...l, uploads: [...l.uploads, m.result.attachment] };
|
|
2266
2275
|
}
|
|
@@ -2306,7 +2315,7 @@ function Ws(t) {
|
|
|
2306
2315
|
};
|
|
2307
2316
|
for (const [o, c] of Object.entries(e.stops))
|
|
2308
2317
|
for (const l of c.userMessageIds) {
|
|
2309
|
-
const d = e.submissions[l], u = d?.sessionId ?? Object.values(e.sessions).find((g) =>
|
|
2318
|
+
const d = e.submissions[l], u = d?.sessionId ?? Object.values(e.sessions).find((g) => le(g.execution).includes(l))?.sessionId, p = d?.delivery === "accepted" || u && le(e.sessions[u]?.execution).includes(l);
|
|
2310
2319
|
u && p && a(`stop:${o}:${c.requestId}:${l}`, u, l, c.reason);
|
|
2311
2320
|
}
|
|
2312
2321
|
for (const o of Object.values(e.submissions))
|
|
@@ -2350,8 +2359,8 @@ function ho(t, e, s, n) {
|
|
|
2350
2359
|
const p = t.deliveries[d], g = t.submissions[d];
|
|
2351
2360
|
let m = { ...p, phase: "waiting", effectId: null };
|
|
2352
2361
|
if (e.type === "effect.failed") {
|
|
2353
|
-
const
|
|
2354
|
-
m = { ...m, phase: _, acceptance:
|
|
2362
|
+
const f = e.error.details?.acceptance === "unissued" && p.acceptance !== "accepted" ? "unissued" : e.error.details?.acceptance === "rejected" ? "rejected" : p.acceptance, v = e.error.details?.allocation === "unissued" ? "unissued" : p.allocation, I = e.effectKind === "conversation.command" && p.step === "send" && f === "unissued" || e.effectKind === "conversation.upload" && e.error.details?.allocation === "unissued", _ = e.effectKind === "conversation.prepare" || I ? "failed" : f === "uncertain" || v === "uncertain" || e.error.retryable ? "uncertain" : "failed";
|
|
2363
|
+
m = { ...m, phase: _, acceptance: f, allocation: v }, !g.cancelled && g.delivery !== "accepted" && (i = { ...i, submissions: {
|
|
2355
2364
|
...i.submissions,
|
|
2356
2365
|
[d]: { ...g, delivery: _, error: e.error }
|
|
2357
2366
|
} });
|
|
@@ -2365,13 +2374,13 @@ function ho(t, e, s, n) {
|
|
|
2365
2374
|
error: { code: "message_delivery_failed", message: "Pluno could not send this message. Try it again.", retryable: !0 }
|
|
2366
2375
|
} } }));
|
|
2367
2376
|
else if (e.effectKind === "conversation.upload") {
|
|
2368
|
-
const
|
|
2369
|
-
if (
|
|
2377
|
+
const f = X(e.output), v = g.attachments[p.uploads.length];
|
|
2378
|
+
if (f.attachment.id !== v.sourceId || f.attachment.size_bytes !== v.sizeBytes || g.sessionId !== null && g.sessionId !== f.sessionId)
|
|
2370
2379
|
throw new Error("Upload does not match the captured attachment or conversation.");
|
|
2371
|
-
m = { ...m, allocation: "resolved", uploads: [...p.uploads,
|
|
2380
|
+
m = { ...m, allocation: "resolved", uploads: [...p.uploads, f.attachment] };
|
|
2372
2381
|
const I = Object.fromEntries(Object.entries(i.submissions).map(([_, S]) => [
|
|
2373
2382
|
_,
|
|
2374
|
-
S.conversationScopeId === g.conversationScopeId && (_ === d || !S.cancelled && !g.cancelled) ? { ...S, sessionId:
|
|
2383
|
+
S.conversationScopeId === g.conversationScopeId && (_ === d || !S.cancelled && !g.cancelled) ? { ...S, sessionId: f.sessionId } : S
|
|
2375
2384
|
]));
|
|
2376
2385
|
i = { ...i, submissions: I };
|
|
2377
2386
|
} else if (e.effectKind === "conversation.receipt")
|
|
@@ -2382,25 +2391,25 @@ function ho(t, e, s, n) {
|
|
|
2382
2391
|
error: { code: "message_acceptance_unconfirmed", message: "Pluno could not confirm whether this message was accepted. Try again.", retryable: !0 }
|
|
2383
2392
|
} } });
|
|
2384
2393
|
else {
|
|
2385
|
-
const
|
|
2394
|
+
const f = zn(e.output, d);
|
|
2386
2395
|
m = { ...m, phase: "done", acceptance: "accepted" }, r = {
|
|
2387
2396
|
type: "conversation.submission_accepted",
|
|
2388
2397
|
authorityId: t.authorityId,
|
|
2389
2398
|
generation: t.generation,
|
|
2390
2399
|
userMessageId: d,
|
|
2391
|
-
sessionId:
|
|
2400
|
+
sessionId: f.sessionId
|
|
2392
2401
|
};
|
|
2393
2402
|
}
|
|
2394
2403
|
else if (e.effectKind === "conversation.command" && p.step === "complete")
|
|
2395
2404
|
m = { ...m, completedUploads: p.completedUploads + 1, command: null };
|
|
2396
2405
|
else if (e.effectKind === "conversation.command" && p.step === "send") {
|
|
2397
|
-
const
|
|
2406
|
+
const f = zn(e.output, d);
|
|
2398
2407
|
m = { ...m, phase: "done", acceptance: "accepted" }, r = {
|
|
2399
2408
|
type: "conversation.submission_accepted",
|
|
2400
2409
|
authorityId: t.authorityId,
|
|
2401
2410
|
generation: t.generation,
|
|
2402
2411
|
userMessageId: d,
|
|
2403
|
-
sessionId:
|
|
2412
|
+
sessionId: f.sessionId
|
|
2404
2413
|
};
|
|
2405
2414
|
}
|
|
2406
2415
|
i = { ...i, deliveries: { ...i.deliveries, [d]: m } };
|
|
@@ -2437,36 +2446,36 @@ function ho(t, e, s, n) {
|
|
|
2437
2446
|
if (d.schema !== 1 || d.authorityId !== t.authorityId || !u || Object.keys(t.operations).length)
|
|
2438
2447
|
throw new Error("Delivery restoration requires an empty engine with the same authenticated authority.");
|
|
2439
2448
|
const p = { ...t.submissions, ...d.submissions };
|
|
2440
|
-
for (const [S,
|
|
2441
|
-
|
|
2449
|
+
for (const [S, h] of Object.entries(t.submissions))
|
|
2450
|
+
h.cancelled && (p[S] = { ...p[S], cancelled: !0, cancellationReason: h.cancellationReason });
|
|
2442
2451
|
const g = {
|
|
2443
2452
|
...d,
|
|
2444
2453
|
submissions: p,
|
|
2445
2454
|
stops: { ...d.stops, ...t.stops },
|
|
2446
2455
|
deliveries: { ...t.deliveries, ...d.deliveries },
|
|
2447
2456
|
submissionOrder: [.../* @__PURE__ */ new Set([...d.submissionOrder, ...t.submissionOrder])]
|
|
2448
|
-
}, { schema: m, authorityId:
|
|
2457
|
+
}, { schema: m, authorityId: f, ...v } = g, I = X(e.pendingRestoration ?? {}), _ = (S) => !s.clients[S.clientScopeId] && I[S.clientScopeId] === S.conversationScopeId;
|
|
2449
2458
|
i = {
|
|
2450
2459
|
...t,
|
|
2451
2460
|
...v,
|
|
2452
2461
|
pendingRestoration: I,
|
|
2453
2462
|
requestSequence: Math.max(t.requestSequence, g.requestSequence),
|
|
2454
2463
|
effectsEnabled: !0,
|
|
2455
|
-
submissions: Object.fromEntries(Object.entries(g.submissions).map(([S,
|
|
2456
|
-
...
|
|
2464
|
+
submissions: Object.fromEntries(Object.entries(g.submissions).map(([S, h]) => [S, {
|
|
2465
|
+
...h,
|
|
2457
2466
|
executionVersion: null,
|
|
2458
|
-
cancelled:
|
|
2459
|
-
...!
|
|
2460
|
-
delivery: (
|
|
2461
|
-
error:
|
|
2467
|
+
cancelled: h.cancelled || !_(h) && !zs(h, s),
|
|
2468
|
+
...!h.cancelled && !_(h) && !zs(h, s) ? { cancellationReason: "owner_lost" } : {},
|
|
2469
|
+
delivery: (h.contextPreparation === null || !g.deliveries[S]) && !h.cancelled && h.delivery !== "accepted" ? "failed" : h.delivery === "sending" ? "uncertain" : h.delivery,
|
|
2470
|
+
error: h.contextPreparation === null && !h.cancelled && !["unauthorized", "auth_reconnecting"].includes(h.error?.code ?? "") ? { code: "context_preparation_interrupted", message: "Page context preparation was interrupted. Please send this message again.", retryable: !1 } : !g.deliveries[S] && h.delivery !== "accepted" && !h.cancelled ? { code: "submission_interrupted", message: "Message preparation was interrupted. Retry this message.", retryable: !0 } : h.error
|
|
2462
2471
|
}])),
|
|
2463
|
-
deliveries: Object.fromEntries(Object.entries(g.submissions).map(([S,
|
|
2464
|
-
const y = g.deliveries[S], w =
|
|
2472
|
+
deliveries: Object.fromEntries(Object.entries(g.submissions).map(([S, h], b) => {
|
|
2473
|
+
const y = g.deliveries[S], w = h.contextPreparation === null, R = h.delivery === "accepted" ? "accepted" : y?.acceptance ?? (y && (y.step === "send" || y.step === "receipt") ? "uncertain" : "unissued");
|
|
2465
2474
|
return [S, {
|
|
2466
|
-
...$n(
|
|
2475
|
+
...$n(h, b),
|
|
2467
2476
|
...y,
|
|
2468
2477
|
acceptance: R,
|
|
2469
|
-
allocation:
|
|
2478
|
+
allocation: h.sessionId !== null ? "resolved" : y?.allocation ?? (y?.step === "upload" ? "uncertain" : "unissued"),
|
|
2470
2479
|
effectId: null,
|
|
2471
2480
|
// Readiness is authority-local and must be re-established after restart. Captured input stays immutable.
|
|
2472
2481
|
step: R === "uncertain" && y?.step === "send" && y.phase !== "done" ? "receipt" : y?.step ?? null,
|
|
@@ -2475,10 +2484,10 @@ function ho(t, e, s, n) {
|
|
|
2475
2484
|
phase: R === "accepted" ? "done" : w || !y ? "failed" : ["running", "waiting"].includes(y.phase) ? "uncertain" : y.phase
|
|
2476
2485
|
}];
|
|
2477
2486
|
})),
|
|
2478
|
-
operations: Object.fromEntries(Object.entries(g.operations).map(([S,
|
|
2479
|
-
...
|
|
2487
|
+
operations: Object.fromEntries(Object.entries(g.operations).map(([S, h]) => [S, {
|
|
2488
|
+
...h,
|
|
2480
2489
|
effectId: null,
|
|
2481
|
-
phase: ["running", "waiting"].includes(
|
|
2490
|
+
phase: ["running", "waiting"].includes(h.phase) ? "uncertain" : h.phase
|
|
2482
2491
|
}]))
|
|
2483
2492
|
};
|
|
2484
2493
|
}
|
|
@@ -2543,8 +2552,8 @@ function ho(t, e, s, n) {
|
|
|
2543
2552
|
if (!u) {
|
|
2544
2553
|
const p = d.type === "chat.retry_last_user_message" ? Object.fromEntries(Object.entries(t.stops).flatMap(([g, m]) => {
|
|
2545
2554
|
if (s.selections[g]?.sessionId !== d.payload.sessionId) return [[g, m]];
|
|
2546
|
-
const
|
|
2547
|
-
return
|
|
2555
|
+
const f = m.userMessageIds.filter((v) => v !== d.payload.clientMessageId);
|
|
2556
|
+
return f.length ? [[g, { ...m, userMessageIds: f }]] : [];
|
|
2548
2557
|
})) : t.stops;
|
|
2549
2558
|
i = { ...t, stops: p, effectsEnabled: !0, operations: {
|
|
2550
2559
|
...t.operations,
|
|
@@ -2719,21 +2728,21 @@ function bo(t) {
|
|
|
2719
2728
|
if (!o && s && a.requestSequence <= s.requestSequence) return;
|
|
2720
2729
|
const m = await i();
|
|
2721
2730
|
if (m && m.authorityId !== t.authorityId) throw new Error("Cancellation checkpoint authority mismatch.");
|
|
2722
|
-
const
|
|
2731
|
+
const f = { authorityId: t.authorityId, requestSequence: Math.max(a.requestSequence, m?.requestSequence ?? 0), cancelled: { ...m?.cancelled }, operations: { ...m?.operations }, stops: { ...m?.stops } };
|
|
2723
2732
|
if (o) {
|
|
2724
|
-
s = a, a.requestSequence >= (m?.requestSequence ?? 0) && (
|
|
2725
|
-
for (const [v] of l) delete
|
|
2726
|
-
for (const [v, I] of Object.entries(a.stops))
|
|
2733
|
+
s = a, a.requestSequence >= (m?.requestSequence ?? 0) && (f.cancelled = {}, f.operations = {}, f.stops = {});
|
|
2734
|
+
for (const [v] of l) delete f.cancelled[v];
|
|
2735
|
+
for (const [v, I] of Object.entries(a.stops)) f.stops[v]?.requestId === I.requestId && delete f.stops[v];
|
|
2727
2736
|
for (const [v, I] of c)
|
|
2728
|
-
JSON.stringify(
|
|
2737
|
+
JSON.stringify(f.operations[v]?.command) === JSON.stringify(I.command) && delete f.operations[v];
|
|
2729
2738
|
} else {
|
|
2730
|
-
for (const [v, I] of l) s?.submissions[v]?.cancelled || (
|
|
2731
|
-
for (const [v, I] of Object.entries(a.stops)) s?.stops[v]?.requestId !== I.requestId && (
|
|
2732
|
-
for (const [v, I] of c) I.phase !== "done" && I.phase !== "failed" && JSON.stringify(s?.operations[v]?.command) !== JSON.stringify(I.command) && (
|
|
2739
|
+
for (const [v, I] of l) s?.submissions[v]?.cancelled || (f.cancelled[v] = { ...I, context: {}, contextPreparation: { pageContent: "", sessionTabs: [] } });
|
|
2740
|
+
for (const [v, I] of Object.entries(a.stops)) s?.stops[v]?.requestId !== I.requestId && (f.stops[v] = I);
|
|
2741
|
+
for (const [v, I] of c) I.phase !== "done" && I.phase !== "failed" && JSON.stringify(s?.operations[v]?.command) !== JSON.stringify(I.command) && (f.operations[v] = { ...I, effectId: null, phase: "uncertain", result: null, error: null });
|
|
2733
2742
|
}
|
|
2734
|
-
if (!(!m && !Object.keys(
|
|
2743
|
+
if (!(!m && !Object.keys(f.cancelled).length && !Object.keys(f.operations).length && !Object.keys(f.stops).length) && !(JSON.stringify(m?.cancelled ?? {}) === JSON.stringify(f.cancelled) && JSON.stringify(m?.operations ?? {}) === JSON.stringify(f.operations) && JSON.stringify(m?.stops ?? {}) === JSON.stringify(f.stops))) {
|
|
2735
2744
|
if (!t.isCurrent()) throw new Error("Cancellation authority was retired.");
|
|
2736
|
-
await u.measure("cancellation_write", () => t.write(
|
|
2745
|
+
await u.measure("cancellation_write", () => t.write(f)), n = Promise.resolve(f);
|
|
2737
2746
|
}
|
|
2738
2747
|
};
|
|
2739
2748
|
return e = u.measure("cancellation_queue", () => p.then(() => {
|
|
@@ -3107,11 +3116,11 @@ function Mo(t) {
|
|
|
3107
3116
|
}, p = () => {
|
|
3108
3117
|
};
|
|
3109
3118
|
d.measure("warmup_wait", () => new Promise((g, m) => {
|
|
3110
|
-
const
|
|
3119
|
+
const f = () => {
|
|
3111
3120
|
const v = c.engine.getState().slices, I = v.conversation.submissions[o.submission.userMessageId], _ = v.conversation.operations[l.command.request_id];
|
|
3112
3121
|
!Q(t) || !I || I.cancelled || v.directory.clients[I.clientScopeId] !== I.conversationScopeId ? m(new Error("Warmup wait was retired.")) : (I.sessionId !== null || !_ || !["waiting", "running", "uncertain"].includes(_.phase)) && g();
|
|
3113
3122
|
};
|
|
3114
|
-
u = c.engine.subscribe(
|
|
3123
|
+
u = c.engine.subscribe(f), p = c.onDispose(() => m(new Error("Warmup wait was retired."))), f();
|
|
3115
3124
|
})).catch(() => {
|
|
3116
3125
|
}).finally(() => {
|
|
3117
3126
|
u(), p();
|
|
@@ -3218,8 +3227,8 @@ function Mo(t) {
|
|
|
3218
3227
|
}).measure("attachment_upload", () => Promise.resolve().then(async () => {
|
|
3219
3228
|
const l = () => {
|
|
3220
3229
|
if (Z(t, o), !o.preparationId) return r(o.submission.userMessageId);
|
|
3221
|
-
const
|
|
3222
|
-
if (!Object.values(
|
|
3230
|
+
const f = t.runtime().engine.getState().slices.directory;
|
|
3231
|
+
if (!Object.values(f.clients).includes(o.submission.conversationScopeId))
|
|
3223
3232
|
throw Object.assign(new Error("Attachment preparation was cancelled."), { code: "submission_cancelled", retryable: !1 });
|
|
3224
3233
|
};
|
|
3225
3234
|
l(), await s(), l();
|
|
@@ -3244,8 +3253,8 @@ function Mo(t) {
|
|
|
3244
3253
|
if (l(), !p.sessionId || o.submission.sessionId && p.sessionId !== o.submission.sessionId || p.attachment.id !== o.source.sourceId || p.attachment.mimeType !== o.source.mimeType || p.attachment.sizeBytes !== o.source.sizeBytes)
|
|
3245
3254
|
throw Object.assign(new Error("Attachment preparation identity mismatch."), { code: "attachment_identity_mismatch", retryable: !1 });
|
|
3246
3255
|
if ("uploadUrl" in p) {
|
|
3247
|
-
const
|
|
3248
|
-
if (!
|
|
3256
|
+
const f = await fetch(t.http.resolveUrl(p.uploadUrl), { method: p.uploadMethod, headers: p.uploadHeaders, body: d });
|
|
3257
|
+
if (!f.ok) throw Object.assign(new Error("Attachment transfer failed."), { code: String(f.status) });
|
|
3249
3258
|
}
|
|
3250
3259
|
l();
|
|
3251
3260
|
const g = p.attachment, m = {
|
|
@@ -3291,8 +3300,8 @@ function Mo(t) {
|
|
|
3291
3300
|
} }
|
|
3292
3301
|
).catch((S) => {
|
|
3293
3302
|
if (g.length === 0) throw S;
|
|
3294
|
-
const
|
|
3295
|
-
throw Object.assign(
|
|
3303
|
+
const h = ke(S);
|
|
3304
|
+
throw Object.assign(h, { details: { ...h.details, successfulRequests: g.length } });
|
|
3296
3305
|
});
|
|
3297
3306
|
if (Z(t, o), _.conversation_id !== o.sessionId) throw new Error("Snapshot conversation identity mismatch.");
|
|
3298
3307
|
if (g.push(_), !_.projection_ready) break;
|
|
@@ -3300,10 +3309,10 @@ function Mo(t) {
|
|
|
3300
3309
|
const m = g[0];
|
|
3301
3310
|
if (o.before !== null && m.next_cursor === o.before)
|
|
3302
3311
|
throw Object.assign(new Error("Conversation history cursor did not advance."), { code: "invalid_history_cursor" });
|
|
3303
|
-
const
|
|
3312
|
+
const f = g.reduce((I, _) => _.execution.version > I.version ? _.execution : I, m.execution), v = g.reduce((I, _) => _.follow_ups_version > I.follow_ups_version ? _ : I, m);
|
|
3304
3313
|
return { snapshot: {
|
|
3305
3314
|
...m,
|
|
3306
|
-
execution:
|
|
3315
|
+
execution: f,
|
|
3307
3316
|
items: g.flatMap((I) => I.items),
|
|
3308
3317
|
streams: g.flatMap((I) => I.streams),
|
|
3309
3318
|
removed_items: g.flatMap((I) => I.removed_items),
|
|
@@ -3560,7 +3569,7 @@ function as(t, e, s, n) {
|
|
|
3560
3569
|
createdAt: "",
|
|
3561
3570
|
loading: !1
|
|
3562
3571
|
});
|
|
3563
|
-
const c = t.activity.phase, l = t.submissions.filter((y) => !y.cancelled && !["accepted", "failed"].includes(y.delivery)), d = t.submissions[t.submissions.length - 1], u = [...t.items].reverse().find((y) => y.type === "user_message"), p = ["queued", "thinking", "steering", "awaiting_execution"].includes(c), g = d?.delivery === "failed" && (p && t.activity.userMessageId != null && t.activity.userMessageId !== d.userMessageId || u !== void 0 && u.id !== d.userMessageId && Date.parse(u.created_at) > d.submittedAt), m = new Map(t.submissions.filter((y) => (y !== d || g) && !y.cancelled && y.delivery === "failed" && y.error).map((y) => [y.userMessageId, y])),
|
|
3572
|
+
const c = t.activity.phase, l = t.submissions.filter((y) => !y.cancelled && !["accepted", "failed"].includes(y.delivery)), d = t.submissions[t.submissions.length - 1], u = [...t.items].reverse().find((y) => y.type === "user_message"), p = ["queued", "thinking", "steering", "awaiting_execution"].includes(c), g = d?.delivery === "failed" && (p && t.activity.userMessageId != null && t.activity.userMessageId !== d.userMessageId || u !== void 0 && u.id !== d.userMessageId && Date.parse(u.created_at) > d.submittedAt), m = new Map(t.submissions.filter((y) => (y !== d || g) && !y.cancelled && y.delivery === "failed" && y.error).map((y) => [y.userMessageId, y])), f = a.flatMap((y) => {
|
|
3564
3573
|
const w = y.role === "user" ? m.get(y.id) : void 0;
|
|
3565
3574
|
return w?.error ? [y, {
|
|
3566
3575
|
id: `submission-error:${w.userMessageId}`,
|
|
@@ -3590,7 +3599,7 @@ function as(t, e, s, n) {
|
|
|
3590
3599
|
selectionKey: t.selectionKey,
|
|
3591
3600
|
isDraftSession: t.isDraftSession,
|
|
3592
3601
|
sessionId: t.sessionId,
|
|
3593
|
-
messages:
|
|
3602
|
+
messages: f,
|
|
3594
3603
|
removedItems: o,
|
|
3595
3604
|
activeResponseUserMessageId: t.activity.userMessageId ?? t.segments[t.segments.length - 1]?.userMessageId ?? d?.userMessageId ?? null,
|
|
3596
3605
|
segments: t.segments,
|
|
@@ -3613,14 +3622,14 @@ function as(t, e, s, n) {
|
|
|
3613
3622
|
lastErrorCode: _?.code ?? null,
|
|
3614
3623
|
lastErrorSecuritySettingsUrl: typeof _?.details?.securitySettingsUrl == "string" ? _.details.securitySettingsUrl : null
|
|
3615
3624
|
};
|
|
3616
|
-
let
|
|
3625
|
+
let h = S;
|
|
3617
3626
|
for (const y of t.optimistic.filter((w) => w.cancelled && !t.stop?.userMessageIds.includes(w.userMessageId))) {
|
|
3618
|
-
const w = Gs(
|
|
3619
|
-
|
|
3627
|
+
const w = Gs(h, "", "stopped", [y.userMessageId], Gn(y.cancellationReason));
|
|
3628
|
+
h = { ...h, messages: w.messages, segments: w.segments };
|
|
3620
3629
|
}
|
|
3621
|
-
if (!t.stop) return
|
|
3630
|
+
if (!t.stop) return h;
|
|
3622
3631
|
const b = Gs(
|
|
3623
|
-
|
|
3632
|
+
h,
|
|
3624
3633
|
"",
|
|
3625
3634
|
t.stop.pending ? "stopping" : "stopped",
|
|
3626
3635
|
t.stop.userMessageIds,
|
|
@@ -5215,7 +5224,7 @@ const Pa = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
5215
5224
|
return M;
|
|
5216
5225
|
}
|
|
5217
5226
|
}, Symbol.toStringTag, { value: "Module" }));
|
|
5218
|
-
function
|
|
5227
|
+
function ce(t, e, s) {
|
|
5219
5228
|
return t.on(e, s), function() {
|
|
5220
5229
|
t.off(e, s);
|
|
5221
5230
|
};
|
|
@@ -5263,10 +5272,10 @@ class rr extends F {
|
|
|
5263
5272
|
return;
|
|
5264
5273
|
const e = this.io;
|
|
5265
5274
|
this.subs = [
|
|
5266
|
-
|
|
5267
|
-
|
|
5268
|
-
|
|
5269
|
-
|
|
5275
|
+
ce(e, "open", this.onopen.bind(this)),
|
|
5276
|
+
ce(e, "packet", this.onpacket.bind(this)),
|
|
5277
|
+
ce(e, "error", this.onerror.bind(this)),
|
|
5278
|
+
ce(e, "close", this.onclose.bind(this))
|
|
5270
5279
|
];
|
|
5271
5280
|
}
|
|
5272
5281
|
/**
|
|
@@ -5898,11 +5907,11 @@ class Zs extends F {
|
|
|
5898
5907
|
this.engine = new _a(this.uri, this.opts);
|
|
5899
5908
|
const s = this.engine, n = this;
|
|
5900
5909
|
this._readyState = "opening", this.skipReconnect = !1;
|
|
5901
|
-
const i =
|
|
5910
|
+
const i = ce(s, "open", function() {
|
|
5902
5911
|
n.onopen(), e && e();
|
|
5903
5912
|
}), r = (o) => {
|
|
5904
5913
|
this.cleanup(), this._readyState = "closed", this.emitReserved("error", o), e ? e(o) : this.maybeReconnectOnOpen();
|
|
5905
|
-
}, a =
|
|
5914
|
+
}, a = ce(s, "error", r);
|
|
5906
5915
|
if (this._timeout !== !1) {
|
|
5907
5916
|
const o = this._timeout, c = this.setTimeoutFn(() => {
|
|
5908
5917
|
i(), r(new Error("timeout")), s.close();
|
|
@@ -5931,12 +5940,12 @@ class Zs extends F {
|
|
|
5931
5940
|
this.cleanup(), this._readyState = "open", this.emitReserved("open");
|
|
5932
5941
|
const e = this.engine;
|
|
5933
5942
|
this.subs.push(
|
|
5934
|
-
|
|
5935
|
-
|
|
5936
|
-
|
|
5937
|
-
|
|
5943
|
+
ce(e, "ping", this.onping.bind(this)),
|
|
5944
|
+
ce(e, "data", this.ondata.bind(this)),
|
|
5945
|
+
ce(e, "error", this.onerror.bind(this)),
|
|
5946
|
+
ce(e, "close", this.onclose.bind(this)),
|
|
5938
5947
|
// @ts-ignore
|
|
5939
|
-
|
|
5948
|
+
ce(this.decoder, "decoded", this.ondecoded.bind(this))
|
|
5940
5949
|
);
|
|
5941
5950
|
}
|
|
5942
5951
|
/**
|
|
@@ -6471,21 +6480,21 @@ class or {
|
|
|
6471
6480
|
const g = this.auth.token;
|
|
6472
6481
|
let m = null;
|
|
6473
6482
|
try {
|
|
6474
|
-
let
|
|
6483
|
+
let f = n;
|
|
6475
6484
|
if (r === "conversations" && e === "/commands" && this.auth.role !== "session_surface" && this.options.executorConnection) {
|
|
6476
6485
|
if (m = this.options.executorConnection(), !m) throw new A("Reconnecting the browser before continuing.", "executor_not_ready");
|
|
6477
6486
|
const _ = n;
|
|
6478
|
-
|
|
6487
|
+
f = { ..._, context: { ..._.context, connection_id: m } };
|
|
6479
6488
|
}
|
|
6480
|
-
const v = () => this.requestOnce(e, s,
|
|
6489
|
+
const v = () => this.requestOnce(e, s, f, i, r, a.signal, a.diagnostic, ++d), I = await (a.timing ? a.timing.measure("http_request", v) : v());
|
|
6481
6490
|
return c(), I;
|
|
6482
|
-
} catch (
|
|
6483
|
-
if (c(!1), this.requests.signal.aborted || a.signal?.aborted) throw
|
|
6484
|
-
if (
|
|
6491
|
+
} catch (f) {
|
|
6492
|
+
if (c(!1), this.requests.signal.aborted || a.signal?.aborted) throw f;
|
|
6493
|
+
if (f instanceof A && f.code === "executor_not_ready" && m && u === 0 && this.options.restoreExecutor) {
|
|
6485
6494
|
await this.options.restoreExecutor(m), u++, c();
|
|
6486
6495
|
continue;
|
|
6487
6496
|
}
|
|
6488
|
-
if (!(
|
|
6497
|
+
if (!(f instanceof A) || !["unauthorized", "403"].includes(f.code) || !this.options.recoverAuthentication || !l || (await this.options.recoverAuthentication(g, f, l && u === 0), c(), !l || u !== 0)) throw f;
|
|
6489
6498
|
u++;
|
|
6490
6499
|
}
|
|
6491
6500
|
}
|
|
@@ -6497,16 +6506,16 @@ class or {
|
|
|
6497
6506
|
this.requests.signal.throwIfAborted(), a?.throwIfAborted();
|
|
6498
6507
|
const p = new AbortController(), g = { trigger: null }, m = (E) => {
|
|
6499
6508
|
p.signal.aborted || (g.trigger = E, p.abort());
|
|
6500
|
-
},
|
|
6501
|
-
this.requests.signal.addEventListener("abort",
|
|
6502
|
-
const I = r === "conversations" && /^\/[^/]+\/snapshot$/.test(e) && i === "POST", _ = /^\/conversations(?:\/[^/]+)?$/.test(e) && (i ?? (n === void 0 ? "GET" : "POST")) === "GET", S = setTimeout(() => m("deadline"), _ ? 6e4 : I ? 3e4 : 15e3),
|
|
6509
|
+
}, f = () => m("transport_disposed"), v = () => m(["owner_disposed", "authority_retired", "observation_released", "request_replaced"].includes(a?.reason) ? a.reason : "caller_cancelled");
|
|
6510
|
+
this.requests.signal.addEventListener("abort", f, { once: !0 }), a?.addEventListener("abort", v, { once: !0 });
|
|
6511
|
+
const I = r === "conversations" && /^\/[^/]+\/snapshot$/.test(e) && i === "POST", _ = /^\/conversations(?:\/[^/]+)?$/.test(e) && (i ?? (n === void 0 ? "GET" : "POST")) === "GET", S = setTimeout(() => m("deadline"), _ ? 6e4 : I ? 3e4 : 15e3), h = Ba(), b = Date.now();
|
|
6503
6512
|
let y = null, w = !1, R = null, T = null, C = null;
|
|
6504
6513
|
try {
|
|
6505
6514
|
const E = await Promise.resolve(fetch(d, {
|
|
6506
6515
|
method: i ?? (n === void 0 ? "GET" : "POST"),
|
|
6507
6516
|
cache: "no-store",
|
|
6508
6517
|
signal: p.signal,
|
|
6509
|
-
headers: { "x-product-agent-auth-request-id":
|
|
6518
|
+
headers: { "x-product-agent-auth-request-id": h, authorization: l || r === "conversations" ? `Bearer ${this.auth.token}` : this.auth.token, "content-type": "application/json", ...I ? { "x-request-id": h } : {} },
|
|
6510
6519
|
...n === void 0 ? {} : { body: JSON.stringify(n) }
|
|
6511
6520
|
})).catch((q) => {
|
|
6512
6521
|
throw w = !0, q;
|
|
@@ -6526,13 +6535,13 @@ class or {
|
|
|
6526
6535
|
...typeof O.blockedOrigin == "string" ? { blockedOrigin: O.blockedOrigin } : {},
|
|
6527
6536
|
...typeof O.securitySettingsUrl == "string" ? { securitySettingsUrl: O.securitySettingsUrl } : {}
|
|
6528
6537
|
}, r === "conversations" && e === "/commands");
|
|
6529
|
-
const k = O === "Token expired" ? "token_expired" : O === "Invalid token" ? "invalid_token" : O?.reason, x = E.status === 401 && ["missing_token", "token_expired", "invalid_token", "user_not_found"].includes(k) ? { requestId:
|
|
6538
|
+
const k = O === "Token expired" ? "token_expired" : O === "Invalid token" ? "invalid_token" : O?.reason, x = E.status === 401 && ["missing_token", "token_expired", "invalid_token", "user_not_found"].includes(k) ? { requestId: h, authTransport: "http", authEndpoint: `${r ?? (l ? "embed" : "runtime")}:${["snapshot", "me", "bootstrap", "commands", "activity", "session-history"].includes(e.split("/").pop()) ? e.split("/").pop() : "other"}`, reason: k, retryable: k === "token_expired" && (O === "Token expired" || O.retryable === !0) } : void 0;
|
|
6530
6539
|
throw new A(E.status === 401 ? "Your session expired or is invalid. Reconnect to continue." : E.status === 403 ? "You don't have access to this conversation. Check your access and reconnect." : `Product Agent request failed (${E.status})`, q, !1, x);
|
|
6531
6540
|
}
|
|
6532
6541
|
return await E.json();
|
|
6533
6542
|
} catch (E) {
|
|
6534
6543
|
const q = g.trigger ?? ((E instanceof Error || E instanceof DOMException) && E.name === "AbortError" ? "unexpected_abort" : null), O = {
|
|
6535
|
-
requestId:
|
|
6544
|
+
requestId: h,
|
|
6536
6545
|
method: i ?? (n === void 0 ? "GET" : "POST"),
|
|
6537
6546
|
route: I ? "/api/product-agent/conversations/:sessionId/snapshot" : e === "/commands" ? "/api/product-agent/:namespace/commands" : "/api/product-agent/:namespace/:operation",
|
|
6538
6547
|
status: R,
|
|
@@ -6570,7 +6579,7 @@ class or {
|
|
|
6570
6579
|
k
|
|
6571
6580
|
) : E;
|
|
6572
6581
|
} finally {
|
|
6573
|
-
clearTimeout(S), this.requests.signal.removeEventListener("abort",
|
|
6582
|
+
clearTimeout(S), this.requests.signal.removeEventListener("abort", f), a?.removeEventListener("abort", v);
|
|
6574
6583
|
}
|
|
6575
6584
|
}
|
|
6576
6585
|
}
|
|
@@ -7072,7 +7081,6 @@ class L extends EventTarget {
|
|
|
7072
7081
|
hydration = null;
|
|
7073
7082
|
hydrations = Promise.resolve();
|
|
7074
7083
|
bootstrapRequests = new AbortController();
|
|
7075
|
-
suggestionTimer = null;
|
|
7076
7084
|
diagnostics = [];
|
|
7077
7085
|
diagnosticTimer = null;
|
|
7078
7086
|
diagnosticFlush = !1;
|
|
@@ -7101,7 +7109,7 @@ class L extends EventTarget {
|
|
|
7101
7109
|
}, 12e4));
|
|
7102
7110
|
}
|
|
7103
7111
|
resetBootstrap() {
|
|
7104
|
-
this.bootstrapRequests.abort(), this.bootstrapRequests = new AbortController()
|
|
7112
|
+
this.bootstrapRequests.abort(), this.bootstrapRequests = new AbortController();
|
|
7105
7113
|
for (const [e, s] of this.contextRevisions) this.contextRevisions.set(e, s + 1);
|
|
7106
7114
|
}
|
|
7107
7115
|
queueDiagnostic(e, s = {}) {
|
|
@@ -7255,23 +7263,6 @@ class L extends EventTarget {
|
|
|
7255
7263
|
isRetryableRead(e) {
|
|
7256
7264
|
return e instanceof TypeError || e instanceof DOMException && e.name === "AbortError" || e instanceof A && ["request_timed_out", "408", "425", "429", "500", "502", "503", "504"].includes(e.code);
|
|
7257
7265
|
}
|
|
7258
|
-
async loadUserSuggestions(e, s = 0) {
|
|
7259
|
-
const n = this.promptRevision, i = this.options.pageUrl();
|
|
7260
|
-
this.receive({ type: "starterPrompts.updated", starterPromptsLoading: !0 });
|
|
7261
|
-
try {
|
|
7262
|
-
const r = await this.httpTransport.request("/user-suggested-tasks", {}, void 0, void 0, void 0, { signal: e });
|
|
7263
|
-
!e.aborted && n === this.promptRevision && i === this.options.pageUrl() && this.receive({ ...r, type: "starterPrompts.updated" });
|
|
7264
|
-
} catch (r) {
|
|
7265
|
-
if (e.aborted) return;
|
|
7266
|
-
if (!this.isRetryableRead(r)) {
|
|
7267
|
-
n === this.promptRevision && i === this.options.pageUrl() && this.receive({ type: "starterPrompts.updated", starterPromptsLoading: !1 }), r instanceof A && ["unauthorized", "update_required"].includes(r.code) ? this.fail(r) : console.error("Product Agent optional suggestions could not be loaded", r);
|
|
7268
|
-
return;
|
|
7269
|
-
}
|
|
7270
|
-
this.suggestionTimer = setTimeout(() => {
|
|
7271
|
-
this.suggestionTimer = null, this.loadUserSuggestions(e, s + 1);
|
|
7272
|
-
}, Math.min(3e4, 1e3 * 2 ** Math.min(s, 5)));
|
|
7273
|
-
}
|
|
7274
|
-
}
|
|
7275
7266
|
async dispatch(e, s) {
|
|
7276
7267
|
const { type: n, ...i } = e, r = this.options.auth.client_kind === "embed", a = e.pageUrl ?? e.page?.url ?? this.options.pageUrl(), o = { page_url: a, origin: new URL(a).origin };
|
|
7277
7268
|
if (n === "auth.session") {
|
|
@@ -7288,7 +7279,7 @@ class L extends EventTarget {
|
|
|
7288
7279
|
if (p.aborted || !this.isCurrent(s) || (this.credentialBootstrap = null, !this.options.auth.community_id && g.user?.runtimeCommunityId && (this.options.auth.community_id = g.user.runtimeCommunityId), this.receive({ type: "auth.ok", ...g }), p.aborted)) return;
|
|
7289
7280
|
this.options.auth.client_kind === "extension" && this.receive({ type: "executor.registered", userId: g.user.id }), this.bootstrapped = !0;
|
|
7290
7281
|
for (const m of this.beforeBootstrap.splice(0)) this.receive(m);
|
|
7291
|
-
this.synchronizeReferences()
|
|
7282
|
+
this.synchronizeReferences();
|
|
7292
7283
|
return;
|
|
7293
7284
|
}
|
|
7294
7285
|
if (n === "runtime.auth_ack") {
|
|
@@ -7664,16 +7655,16 @@ function qe(t, e, s) {
|
|
|
7664
7655
|
if (e.type === "effect.failed")
|
|
7665
7656
|
n = { ...n, queries: { ...n.queries, [o]: { ...c, status: "error", error: { ...e.error }, requestId: null, consecutiveFailures: c.consecutiveFailures + 1 } } };
|
|
7666
7657
|
else if (e.effectKind === "directory.query") {
|
|
7667
|
-
for (const
|
|
7668
|
-
const l = e.output.entries.map((
|
|
7669
|
-
for (const
|
|
7670
|
-
if (typeof
|
|
7671
|
-
d[
|
|
7672
|
-
const v = c.startedAtActivityRevisionBySessionId[
|
|
7673
|
-
v !== void 0 && p[
|
|
7658
|
+
for (const f of e.output.entries) n = ps(n, f, !0);
|
|
7659
|
+
const l = e.output.entries.map((f) => f.conversation_id), d = { ...n.durableActivityBySessionId }, u = { ...n.activityBySessionId }, p = { ...n.activityRevisionBySessionId };
|
|
7660
|
+
for (const f of e.output.entries) {
|
|
7661
|
+
if (typeof f.is_active != "boolean") continue;
|
|
7662
|
+
d[f.conversation_id] = f.is_active;
|
|
7663
|
+
const v = c.startedAtActivityRevisionBySessionId[f.conversation_id];
|
|
7664
|
+
v !== void 0 && p[f.conversation_id] === v && (delete u[f.conversation_id], delete p[f.conversation_id]);
|
|
7674
7665
|
}
|
|
7675
7666
|
n = { ...n, durableActivityBySessionId: d, activityBySessionId: u, activityRevisionBySessionId: p };
|
|
7676
|
-
const g = Object.fromEntries(Object.entries(n.optimisticEntries).filter(([,
|
|
7667
|
+
const g = Object.fromEntries(Object.entries(n.optimisticEntries).filter(([, f]) => f.sessionId === null || !l.includes(f.sessionId)));
|
|
7677
7668
|
n = { ...n, optimisticEntries: g };
|
|
7678
7669
|
const m = [.../* @__PURE__ */ new Set([...c.mode === "append" ? c.data ?? [] : [], ...l])];
|
|
7679
7670
|
n = { ...n, queries: { ...n.queries, [o]: {
|
|
@@ -8119,14 +8110,14 @@ class pc {
|
|
|
8119
8110
|
let d = r.slices.directory;
|
|
8120
8111
|
for (const [_, S] of Object.entries(l.state.operations)) {
|
|
8121
8112
|
if (!["runtime.warmup", "attachment.prepare"].includes(S.command.type) || !S.conversationScopeId || S.phase !== "done" || r.slices.conversation.operations[_]?.phase === "done") continue;
|
|
8122
|
-
const
|
|
8123
|
-
|
|
8113
|
+
const h = S.result, b = d.selections[S.conversationScopeId];
|
|
8114
|
+
h?.sessionId && b?.provisionalId && b.sessionId === null && Object.values(d.clients).includes(S.conversationScopeId) && (d = qe(d, {
|
|
8124
8115
|
authorityId: l.state.authorityId,
|
|
8125
8116
|
generation: l.state.generation,
|
|
8126
8117
|
type: "directory.accepted",
|
|
8127
8118
|
conversationScopeId: S.conversationScopeId,
|
|
8128
8119
|
provisionalId: b.provisionalId,
|
|
8129
|
-
sessionId:
|
|
8120
|
+
sessionId: h.sessionId
|
|
8130
8121
|
}).state);
|
|
8131
8122
|
}
|
|
8132
8123
|
const u = Object.values(l.state.submissions).find((_) => _.delivery === "accepted" && r.slices.conversation.submissions[_.userMessageId]?.delivery !== "accepted");
|
|
@@ -8144,15 +8135,15 @@ class pc {
|
|
|
8144
8135
|
d = pi(r.slices.conversation, l.state, d);
|
|
8145
8136
|
const p = Ws(Hs(l.state, d)), g = Vs(l.state, p.state, d);
|
|
8146
8137
|
let m = r.slices;
|
|
8147
|
-
const
|
|
8138
|
+
const f = [], v = l.interactionSources, I = m.account.authority;
|
|
8148
8139
|
if (v && I && I.authorityId === v.authorityId && I.generation === v.generation) {
|
|
8149
8140
|
const _ = js(m, { type: "stage7.sources", authority: I, now: m.features.now, sources: v.sources }, { conversation: g.state, directory: d });
|
|
8150
|
-
m = G(X({ account: _.state.account, features: _.state.features, interactions: _.state.interactions })),
|
|
8141
|
+
m = G(X({ account: _.state.account, features: _.state.features, interactions: _.state.interactions })), f.push(..._.effects);
|
|
8151
8142
|
}
|
|
8152
8143
|
return { state: g.state === r.slices.conversation && d === r.slices.directory && m === r.slices ? r : Object.freeze({
|
|
8153
8144
|
revision: r.revision + 1,
|
|
8154
8145
|
slices: Object.freeze({ ...r.slices, account: m.account, features: m.features, interactions: m.interactions, directory: d, conversation: g.state })
|
|
8155
|
-
}), effects: [...l.effects, ...
|
|
8146
|
+
}), effects: [...l.effects, ...f, ...g.effects, ...p.effects] };
|
|
8156
8147
|
}
|
|
8157
8148
|
const c = tc(r.slices.modelSelection, o);
|
|
8158
8149
|
return { state: c === r.slices.modelSelection ? r : Object.freeze({
|
|
@@ -9486,7 +9477,7 @@ function gi(t) {
|
|
|
9486
9477
|
};
|
|
9487
9478
|
}
|
|
9488
9479
|
const Wc = globalThis.fetch.bind(globalThis), mi = '.pluno-pa-widget-host[data-pluno-product-agent-ui="widget"]', Gc = '.pluno-pa-widget[data-pluno-product-agent-ui-root="widget"]', Jc = ".pluno-pa-widget__panel", Qc = ".pluno-pa-widget__timeline", Xc = "__plunoExtensionWidgetOwner";
|
|
9489
|
-
class
|
|
9480
|
+
class ue extends Error {
|
|
9490
9481
|
constructor(e, s, n, i) {
|
|
9491
9482
|
super(e), this.retryable = s, this.status = n, this.retryAfterMs = i, this.name = "ProductAgentTokenProviderError";
|
|
9492
9483
|
}
|
|
@@ -9605,7 +9596,7 @@ function md(t) {
|
|
|
9605
9596
|
}
|
|
9606
9597
|
}
|
|
9607
9598
|
function Rs(t) {
|
|
9608
|
-
if (t instanceof
|
|
9599
|
+
if (t instanceof ue)
|
|
9609
9600
|
return t.retryable;
|
|
9610
9601
|
if (t && typeof t == "object") {
|
|
9611
9602
|
const e = t instanceof A ? t.code : "", s = /^[45][0-9]{2}$/.test(e) ? Number(e) : t.status;
|
|
@@ -9848,8 +9839,8 @@ class Ht {
|
|
|
9848
9839
|
const e = ++this.conversationAdapterGeneration;
|
|
9849
9840
|
this.conversationObservation?.dispose(), this.conversationUnsubscribe?.();
|
|
9850
9841
|
const s = this.directoryAuthority, n = () => e === this.conversationAdapterGeneration;
|
|
9851
|
-
this.operationTimingReporter = vo((
|
|
9852
|
-
n() && !this.clientRuntime.isDisposed && this.reportHealthSignal("operation_timing", { timings:
|
|
9842
|
+
this.operationTimingReporter = vo((f) => {
|
|
9843
|
+
n() && !this.clientRuntime.isDisposed && this.reportHealthSignal("operation_timing", { timings: f.map((v) => ({ ...v, entrySurface: this.options.entrySurface })) });
|
|
9853
9844
|
});
|
|
9854
9845
|
const i = `pa.conversation.delivery:${this.modelClientScopeId}:${s.authorityId}`, r = `${i}:cancellations`;
|
|
9855
9846
|
this.authenticatedUserId && this.options.restorePersistedState === !1 && sessionStorage.removeItem(r);
|
|
@@ -9857,10 +9848,10 @@ class Ht {
|
|
|
9857
9848
|
authorityId: s.authorityId,
|
|
9858
9849
|
isCurrent: n,
|
|
9859
9850
|
read: async () => a ? JSON.parse(a) : null,
|
|
9860
|
-
write: async (
|
|
9861
|
-
this.authenticatedUserId && sessionStorage.setItem(r, JSON.stringify(
|
|
9851
|
+
write: async (f) => {
|
|
9852
|
+
this.authenticatedUserId && sessionStorage.setItem(r, JSON.stringify(f));
|
|
9862
9853
|
},
|
|
9863
|
-
onTiming: (
|
|
9854
|
+
onTiming: (f) => this.reportOperationTiming(f)
|
|
9864
9855
|
});
|
|
9865
9856
|
this.clientRuntime.installConversationPorts({
|
|
9866
9857
|
...Mo({
|
|
@@ -9869,29 +9860,29 @@ class Ht {
|
|
|
9869
9860
|
isCurrent: n,
|
|
9870
9861
|
http: this.directoryHttp,
|
|
9871
9862
|
now: () => Date.now(),
|
|
9872
|
-
prepareSubmission: async ({ submission:
|
|
9863
|
+
prepareSubmission: async ({ submission: f, sources: v }) => {
|
|
9873
9864
|
const I = te(this.operationTimingReporter, {
|
|
9874
9865
|
operation: "send",
|
|
9875
9866
|
layer: "sdk",
|
|
9876
|
-
requestId:
|
|
9877
|
-
clientMessageId:
|
|
9878
|
-
sessionId:
|
|
9867
|
+
requestId: f.requestId,
|
|
9868
|
+
clientMessageId: f.userMessageId,
|
|
9869
|
+
sessionId: f.sessionId
|
|
9879
9870
|
});
|
|
9880
|
-
let _ =
|
|
9881
|
-
if (
|
|
9882
|
-
await I.measure("first_frame", () => new Promise((
|
|
9871
|
+
let _ = f.contextPreparation ?? { pageContent: "", sessionTabs: [] };
|
|
9872
|
+
if (f.contextPreparation === null) {
|
|
9873
|
+
await I.measure("first_frame", () => new Promise((h) => {
|
|
9883
9874
|
if (document.visibilityState !== "visible") {
|
|
9884
|
-
setTimeout(
|
|
9875
|
+
setTimeout(h, 0);
|
|
9885
9876
|
return;
|
|
9886
9877
|
}
|
|
9887
9878
|
const b = () => {
|
|
9888
|
-
cancelAnimationFrame(w), document.removeEventListener("visibilitychange", y), setTimeout(
|
|
9879
|
+
cancelAnimationFrame(w), document.removeEventListener("visibilitychange", y), setTimeout(h, 0);
|
|
9889
9880
|
}, y = () => {
|
|
9890
9881
|
document.visibilityState !== "visible" && b();
|
|
9891
9882
|
}, w = requestAnimationFrame(b);
|
|
9892
9883
|
document.addEventListener("visibilitychange", y);
|
|
9893
9884
|
}));
|
|
9894
|
-
const S =
|
|
9885
|
+
const S = f.context.page;
|
|
9895
9886
|
if (oe().url !== S.url) throw Object.assign(new Error("The page changed before preparation completed. Send this message again."), { code: "context_preparation_interrupted", retryable: !1 });
|
|
9896
9887
|
_ = { pageContent: await I.measure("page_capture", async () => Rn()), sessionTabs: [] };
|
|
9897
9888
|
}
|
|
@@ -9904,49 +9895,49 @@ class Ht {
|
|
|
9904
9895
|
return I.mark("context_ready"), { ..._, now: Date.now() };
|
|
9905
9896
|
},
|
|
9906
9897
|
connectionId: () => this.socket instanceof L ? this.socket.connectionId : null,
|
|
9907
|
-
prepareUpload: this.options.prepareAttachmentUpload ?? (this.options.productVariant === "customer_embedded" ? (
|
|
9908
|
-
onUploaded: async (
|
|
9909
|
-
await ur(
|
|
9898
|
+
prepareUpload: this.options.prepareAttachmentUpload ?? (this.options.productVariant === "customer_embedded" ? (f) => this.prepareEmbedAttachmentUpload(f, n) : void 0),
|
|
9899
|
+
onUploaded: async (f, v, I) => {
|
|
9900
|
+
await ur(f, {
|
|
9910
9901
|
sessionId: v,
|
|
9911
9902
|
sandboxPath: I.sandbox_path ?? void 0,
|
|
9912
9903
|
storageKey: I.storage_key ?? void 0,
|
|
9913
9904
|
fileUrl: I.file_url ? new URL(I.file_url, this.options.backendUrl).toString() : void 0,
|
|
9914
9905
|
lastUsedAt: Date.now()
|
|
9915
9906
|
}).catch((_) => V("web-sdk.attachments", "Failed to update persisted Product Agent attachment", {
|
|
9916
|
-
attachmentId:
|
|
9907
|
+
attachmentId: f,
|
|
9917
9908
|
message: _ instanceof Error ? _.message : String(_)
|
|
9918
9909
|
}));
|
|
9919
9910
|
},
|
|
9920
9911
|
persistUpload: this.options.persistAttachmentUpload,
|
|
9921
|
-
readAttachment: async (
|
|
9922
|
-
const v = (await hi(
|
|
9912
|
+
readAttachment: async (f) => {
|
|
9913
|
+
const v = (await hi(f))?.blob;
|
|
9923
9914
|
if (!v) throw Object.assign(new Error("Attachment files are unavailable. Attach the files again and send a new message."), { code: "attachment_source_unavailable", retryable: !1 });
|
|
9924
9915
|
return v;
|
|
9925
9916
|
},
|
|
9926
|
-
saveCancellation: (
|
|
9927
|
-
saveDelivery: async (
|
|
9928
|
-
this.authenticatedUserId && (sessionStorage.setItem(i, JSON.stringify(
|
|
9917
|
+
saveCancellation: (f) => o.save(f),
|
|
9918
|
+
saveDelivery: async (f) => {
|
|
9919
|
+
this.authenticatedUserId && (sessionStorage.setItem(i, JSON.stringify(f)), await o.committed(f));
|
|
9929
9920
|
},
|
|
9930
9921
|
// HTTP now owns command delivery; keep opt-in operational traces at that actual handoff.
|
|
9931
|
-
onTiming: (
|
|
9932
|
-
n() && this.reportOperationTiming(
|
|
9922
|
+
onTiming: (f) => {
|
|
9923
|
+
n() && this.reportOperationTiming(f);
|
|
9933
9924
|
},
|
|
9934
|
-
onCommand: (
|
|
9935
|
-
onError: (
|
|
9936
|
-
if (this.options.productVariant === "customer_embedded" && v.operation === "conversation.snapshot" &&
|
|
9925
|
+
onCommand: (f) => xe("client_event", f.type, ws({ ...f.payload, type: f.type })),
|
|
9926
|
+
onError: (f, v) => {
|
|
9927
|
+
if (this.options.productVariant === "customer_embedded" && v.operation === "conversation.snapshot" && f instanceof A && f.code === "conversation_access_denied") {
|
|
9937
9928
|
v.sessionId === this.getState().sessionId && this.startNewSession({ notifyTransport: !1 });
|
|
9938
9929
|
return;
|
|
9939
9930
|
}
|
|
9940
|
-
V("web-sdk.conversation", "Conversation operation failed", { ...v, ...Ao(
|
|
9931
|
+
V("web-sdk.conversation", "Conversation operation failed", { ...v, ...Ao(f) }), f instanceof A && f.backendRefusal && v.operation.startsWith("chat.") ? this.applyAccountSubmissionError(f.code) : this.handleDirectoryTransportError(f);
|
|
9941
9932
|
}
|
|
9942
9933
|
})
|
|
9943
9934
|
});
|
|
9944
9935
|
const c = this.clientRuntime.engine.getState().slices.conversation, l = this.options.restorePersistedState === !1 || !this.authenticatedUserId ? null : os(i);
|
|
9945
9936
|
if (this.authenticatedUserId && !c.submissionOrder.length && !Object.keys(c.operations).length) {
|
|
9946
|
-
const
|
|
9947
|
-
const { type: S, ...
|
|
9937
|
+
const f = this.queuedClientEvents.filter((_) => _.type === "chat.user_message"), v = l ? JSON.parse(l) : f.length ? Oo(c, f.map((_) => {
|
|
9938
|
+
const { type: S, ...h } = _, b = this.clientRuntime.engine.getState().slices.directory, y = b.clients[this.modelClientScopeId];
|
|
9948
9939
|
return {
|
|
9949
|
-
command: { type: S, request_id: _.clientMessageId, payload: JSON.parse(JSON.stringify(
|
|
9940
|
+
command: { type: S, request_id: _.clientMessageId, payload: JSON.parse(JSON.stringify(h)) },
|
|
9950
9941
|
requestedModel: _.model ?? null,
|
|
9951
9942
|
clientScopeId: this.modelClientScopeId,
|
|
9952
9943
|
conversationScopeId: y,
|
|
@@ -9961,7 +9952,7 @@ class Ht {
|
|
|
9961
9952
|
if (!n()) return;
|
|
9962
9953
|
I && (v || Object.keys(I.operations).length || Object.keys(I.stops).length) && await this.clientRuntime.engine.dispatch({ ...s, type: "conversation.restore_delivery", checkpoint: I });
|
|
9963
9954
|
}
|
|
9964
|
-
if (this.authenticatedUserId && (this.queuedClientEvents = this.queuedClientEvents.filter((
|
|
9955
|
+
if (this.authenticatedUserId && (this.queuedClientEvents = this.queuedClientEvents.filter((f) => !["chat.user_message", "chat.retry_last_user_message", "run.stop", "runtime.warmup", "session.reset", "attachment.upload_completed"].includes(f.type))), Re(this.options.clientId, this.queuedClientEvents), !n()) return;
|
|
9965
9956
|
this.conversationObservation = new Po({
|
|
9966
9957
|
authority: s,
|
|
9967
9958
|
now: () => Date.now(),
|
|
@@ -9969,15 +9960,15 @@ class Ht {
|
|
|
9969
9960
|
isCurrent: n,
|
|
9970
9961
|
enabled: () => !!this.token && !this.authenticationFailure && !this.refreshingDefaultCredentials && this.state.status !== "closed",
|
|
9971
9962
|
socket: {
|
|
9972
|
-
retain: async (
|
|
9963
|
+
retain: async (f, v) => {
|
|
9973
9964
|
const I = this.socket;
|
|
9974
|
-
I instanceof L && await I.directoryRooms.retain(
|
|
9965
|
+
I instanceof L && await I.directoryRooms.retain(f, v).catch((_) => {
|
|
9975
9966
|
if (this.socket === I) throw _;
|
|
9976
9967
|
});
|
|
9977
9968
|
},
|
|
9978
|
-
release: async (
|
|
9969
|
+
release: async (f, v) => {
|
|
9979
9970
|
const I = this.socket;
|
|
9980
|
-
I instanceof L && await I.directoryRooms.release(
|
|
9971
|
+
I instanceof L && await I.directoryRooms.release(f, v).catch((_) => {
|
|
9981
9972
|
if (this.socket === I) throw _;
|
|
9982
9973
|
});
|
|
9983
9974
|
}
|
|
@@ -9986,13 +9977,13 @@ class Ht {
|
|
|
9986
9977
|
wakeup: { start: () => {
|
|
9987
9978
|
}, stop: () => {
|
|
9988
9979
|
} },
|
|
9989
|
-
onError: (
|
|
9980
|
+
onError: (f) => this.handleDirectoryTransportError(f)
|
|
9990
9981
|
});
|
|
9991
|
-
const d = (
|
|
9982
|
+
const d = (f, v) => {
|
|
9992
9983
|
if (this.firstResponseTimersByClientMessageId.size) {
|
|
9993
|
-
for (const I of
|
|
9984
|
+
for (const I of f)
|
|
9994
9985
|
(I.dataType === "run_status" || I.dataType === "run_error") && this.clearFirstResponseTimer(I.respondsToUserMessageId ?? null);
|
|
9995
|
-
for (const I of
|
|
9986
|
+
for (const I of f)
|
|
9996
9987
|
if (I.content.trim() && (I.role === "assistant" || I.dataType === "commentary_history" || I.dataType === "tool_summary")) {
|
|
9997
9988
|
const _ = v ? this.clientRuntime.engine.getState().slices.conversation.sessions[v] : void 0;
|
|
9998
9989
|
for (const S of I.respondsToUserMessageId ? $r(_, I.respondsToUserMessageId) : [])
|
|
@@ -10000,16 +9991,16 @@ class Ht {
|
|
|
10000
9991
|
}
|
|
10001
9992
|
}
|
|
10002
9993
|
};
|
|
10003
|
-
let u = new Map(this.getState().messages.map((
|
|
9994
|
+
let u = new Map(this.getState().messages.map((f) => [f.id, f])), p = this.clientRuntime.engine.getState().slices.conversation, g = this.clientRuntime.engine.getState().slices.directory.selections, m = this.clientRuntime.engine.getState().slices.directory.clients[this.modelClientScopeId];
|
|
10004
9995
|
this.conversationUnsubscribe = this.clientRuntime.engine.subscribe(() => {
|
|
10005
|
-
const
|
|
10006
|
-
p =
|
|
10007
|
-
const I = m !==
|
|
10008
|
-
m =
|
|
10009
|
-
for (const S of Object.values(
|
|
9996
|
+
const f = this.clientRuntime.engine.getState().slices, v = p;
|
|
9997
|
+
p = f.conversation, Io(v, f.conversation, this.operationTimingReporter, "sdk");
|
|
9998
|
+
const I = m !== f.directory.clients[this.modelClientScopeId];
|
|
9999
|
+
m = f.directory.clients[this.modelClientScopeId], g !== f.directory.selections && (g = f.directory.selections, this.directoryScope.persist());
|
|
10000
|
+
for (const S of Object.values(f.conversation.submissions)) {
|
|
10010
10001
|
if (S.delivery === "accepted" && v.submissions[S.userMessageId]?.delivery !== "accepted") {
|
|
10011
|
-
const
|
|
10012
|
-
|
|
10002
|
+
const h = this.firstResponseTimersByClientMessageId.get(S.userMessageId);
|
|
10003
|
+
h && (h.sessionId = S.sessionId), this.emit("ack", { clientMessageId: S.userMessageId, sessionId: S.sessionId });
|
|
10013
10004
|
const b = S.sessionId;
|
|
10014
10005
|
b && this.getState().sessionId === b && this.directoryHttp.request(`/sessions/${encodeURIComponent(b)}/history`, { limit: 200 }).then((y) => {
|
|
10015
10006
|
n() && this.getState().sessionId === b && this.state.status !== "closed" && vs(this.clientRuntime, this.modelClientScopeId, b, y.turns);
|
|
@@ -10019,19 +10010,19 @@ class Ht {
|
|
|
10019
10010
|
}
|
|
10020
10011
|
(S.cancelled || S.delivery === "failed") && this.clearFirstResponseTimer(S.userMessageId);
|
|
10021
10012
|
}
|
|
10022
|
-
for (const [S,
|
|
10013
|
+
for (const [S, h] of Object.entries(f.directory.clients)) {
|
|
10023
10014
|
if (!S.startsWith(`background:${this.modelClientScopeId}:`)) continue;
|
|
10024
|
-
const b = Ie(
|
|
10015
|
+
const b = Ie(f.conversation, f.directory, h), y = b.sessionId ? f.conversation.sessions[b.sessionId] : void 0;
|
|
10025
10016
|
if (this.firstResponseTimersByClientMessageId.size && (d(as(b, y?.queries.current, this.options.backendUrl).messages, b.sessionId), ["failed", "stopped"].includes(b.activity.phase)))
|
|
10026
|
-
for (const R of
|
|
10027
|
-
const w = b.activity.phase === "completed" &&
|
|
10017
|
+
for (const R of le(y?.execution)) this.clearFirstResponseTimer(R);
|
|
10018
|
+
const w = b.activity.phase === "completed" && le(y?.execution).some((R) => this.firstResponseTimersByClientMessageId.has(R));
|
|
10028
10019
|
(I && b.sessionId === this.getState().sessionId || !w && ["completed", "failed", "stopped"].includes(b.activity.phase)) && this.directoryScope.detach(S);
|
|
10029
10020
|
}
|
|
10030
10021
|
const _ = this.getState();
|
|
10031
10022
|
d(_.messages, _.sessionId);
|
|
10032
10023
|
for (const S of _.messages) {
|
|
10033
|
-
const
|
|
10034
|
-
(!
|
|
10024
|
+
const h = u.get(S.id);
|
|
10025
|
+
(!h || h.content !== S.content || h.loading !== S.loading) && this.emit("message", S), S.content.trim() && S.content !== h?.content && (S.role === "assistant" || S.dataType === "commentary_history") && S.content.startsWith(h?.content ?? "") && this.emit("delta", S.content.slice(h?.content.length ?? 0));
|
|
10035
10026
|
}
|
|
10036
10027
|
u = new Map(_.messages.map((S) => [S.id, S])), this.rebuildRuntimeInteractions(), this.emit("state", _);
|
|
10037
10028
|
}), this.conversationObservation.wake();
|
|
@@ -10093,7 +10084,7 @@ class Ht {
|
|
|
10093
10084
|
n.sessionId ? e.conversation.sessions[n.sessionId]?.queries.current : void 0,
|
|
10094
10085
|
this.options.backendUrl,
|
|
10095
10086
|
this.clientRuntime.engine.getDiagnostics({ clientScopeId: this.modelClientScopeId, scopeId: s, sessionId: n.sessionId })
|
|
10096
|
-
), r = { clientScopeId: this.modelClientScopeId, origin: location.origin, pageUrl: location.href }, a = Bs(e, { kind: "starterPrompts", ...r, includeUserSuggestions: !1 }), o = Bs(e, { kind: "appearance", ...r }), c = o?.data?.kind === "appearance" ? o.data.value : null;
|
|
10087
|
+
), r = { clientScopeId: this.modelClientScopeId, origin: location.origin, pageUrl: location.href }, a = Bs(e, this.options.productVariant === "personal" ? { kind: "userSuggestedTasks" } : { kind: "starterPrompts", ...r, includeUserSuggestions: !1 }), o = Bs(e, { kind: "appearance", ...r }), c = o?.data?.kind === "appearance" ? o.data.value : null;
|
|
10097
10088
|
return {
|
|
10098
10089
|
...this.platformState,
|
|
10099
10090
|
...i,
|
|
@@ -10105,7 +10096,7 @@ class Ht {
|
|
|
10105
10096
|
lastError: i.lastError ?? this.platformState.lastError,
|
|
10106
10097
|
lastErrorCode: i.lastErrorCode ?? this.platformState.lastErrorCode,
|
|
10107
10098
|
lastErrorSecuritySettingsUrl: !i.lastErrorCode || i.lastErrorCode === this.platformState.lastErrorCode ? this.platformState.lastErrorSecuritySettingsUrl : null,
|
|
10108
|
-
starterPrompts: a?.data
|
|
10099
|
+
starterPrompts: a?.data && (a.data.kind === "starterPrompts" || a.data.kind === "userSuggestedTasks") ? [...a.data.prompts] : Kd(this.options.initialStarterPrompts),
|
|
10109
10100
|
starterPromptsLoading: a?.status === "loading" || a?.status === "refreshing",
|
|
10110
10101
|
appearance: c ? { accentColor: c.accent, colorScheme: c.colorScheme, fontFamily: c.fontFamily, scribbleStyle: c.scribbleStyle } : null
|
|
10111
10102
|
};
|
|
@@ -10139,7 +10130,7 @@ class Ht {
|
|
|
10139
10130
|
let o = null;
|
|
10140
10131
|
const c = new Promise((l, d) => {
|
|
10141
10132
|
o = window.setTimeout(() => {
|
|
10142
|
-
r.abort(), d(new
|
|
10133
|
+
r.abort(), d(new ue("Pluno token provider timed out", !0));
|
|
10143
10134
|
}, sd);
|
|
10144
10135
|
});
|
|
10145
10136
|
try {
|
|
@@ -10148,9 +10139,9 @@ class Ht {
|
|
|
10148
10139
|
c
|
|
10149
10140
|
]);
|
|
10150
10141
|
if (r.signal.aborted || this.tokenAbortController !== r)
|
|
10151
|
-
throw new
|
|
10142
|
+
throw new ue("Pluno token request was cancelled", !0);
|
|
10152
10143
|
if (typeof l != "string" || !l.trim())
|
|
10153
|
-
throw new
|
|
10144
|
+
throw new ue("Chat setup did not return a session. Contact your app administrator, then try again.", !1);
|
|
10154
10145
|
return this.token = l, this.tokenExpiresAtMs = md(l), l;
|
|
10155
10146
|
} finally {
|
|
10156
10147
|
o !== null && window.clearTimeout(o);
|
|
@@ -10196,7 +10187,7 @@ class Ht {
|
|
|
10196
10187
|
if (this.lastRecoveryStage = "token_provider", this.token = await this.acquireToken("connect", { forceRefresh: e }), this.token && (this.directoryHttp.auth.token = this.token), n !== this.connectionAttemptId || this.state.status === "closed")
|
|
10197
10188
|
return;
|
|
10198
10189
|
if (this.lastRecoveryStage = "socket_admission", !this.token && !this.options.webSocketFactory)
|
|
10199
|
-
throw new
|
|
10190
|
+
throw new ue("Pluno requires a token or tokenProvider", !1);
|
|
10200
10191
|
if (!this.options.webSocketFactory && this.rejectedTransportToken !== null && this.rejectedTransportToken === this.token) {
|
|
10201
10192
|
this.clearEmbeddedRecoveryBudget(), this.setState({ status: "error", lastError: i });
|
|
10202
10193
|
return;
|
|
@@ -10292,7 +10283,7 @@ class Ht {
|
|
|
10292
10283
|
lastError: vi,
|
|
10293
10284
|
lastErrorCode: "connection_failed"
|
|
10294
10285
|
}), this.emit("error", a), this.scheduleReconnect(
|
|
10295
|
-
r instanceof
|
|
10286
|
+
r instanceof ue ? r.retryAfterMs : void 0
|
|
10296
10287
|
);
|
|
10297
10288
|
return;
|
|
10298
10289
|
}
|
|
@@ -10445,21 +10436,21 @@ class Ht {
|
|
|
10445
10436
|
entrySurface: this.options.entrySurface,
|
|
10446
10437
|
submittedAt: s.submittedAt ?? Date.now()
|
|
10447
10438
|
});
|
|
10448
|
-
const
|
|
10439
|
+
const f = this.directoryAuthority;
|
|
10449
10440
|
return this.clientRuntime.isDisposed ? null : new Promise((v, I) => {
|
|
10450
10441
|
let _ = null, S = null;
|
|
10451
|
-
const
|
|
10442
|
+
const h = () => {
|
|
10452
10443
|
const b = this.clientRuntime.engine.getState().slices.conversation.submissions[r];
|
|
10453
10444
|
if (!(b && !b.cancelled && b.delivery !== "accepted" && b.delivery !== "failed"))
|
|
10454
10445
|
if (_?.(), S?.(), b?.delivery === "failed" && !b.cancelled) I(new Error(b.error?.message ?? "Message delivery failed."));
|
|
10455
10446
|
else {
|
|
10456
10447
|
const y = b?.invocation === "user" && b.contextPreparation?.pageContent ? b.context.page?.url : null;
|
|
10457
|
-
b?.delivery === "accepted" && !b.cancelled && typeof y == "string" && c === this.submissionIntentRevision &&
|
|
10448
|
+
b?.delivery === "accepted" && !b.cancelled && typeof y == "string" && c === this.submissionIntentRevision && f === this.directoryAuthority && this.clientRuntime.engine.getState().slices.directory.clients[this.modelClientScopeId] === m && (this.lastUserMessagePageUrl = y), v(b?.delivery === "accepted" && !b.cancelled ? r : null);
|
|
10458
10449
|
}
|
|
10459
10450
|
};
|
|
10460
|
-
_ = this.clientRuntime.engine.subscribe(
|
|
10451
|
+
_ = this.clientRuntime.engine.subscribe(h), S = this.clientRuntime.onDispose(() => {
|
|
10461
10452
|
_?.(), v(null);
|
|
10462
|
-
}),
|
|
10453
|
+
}), h();
|
|
10463
10454
|
});
|
|
10464
10455
|
}
|
|
10465
10456
|
reportResponseVisibility(e) {
|
|
@@ -10558,13 +10549,13 @@ class Ht {
|
|
|
10558
10549
|
}), new Promise((l, d) => {
|
|
10559
10550
|
let u, p;
|
|
10560
10551
|
const g = () => {
|
|
10561
|
-
const m = this.clientRuntime.engine.getState().slices,
|
|
10562
|
-
if (!v &&
|
|
10563
|
-
if (u?.(), p?.(), v || !
|
|
10564
|
-
d(new Error(
|
|
10552
|
+
const m = this.clientRuntime.engine.getState().slices, f = m.conversation.operations[c], v = m.directory.authorityId !== a.authorityId || m.directory.clients[this.modelClientScopeId] !== o;
|
|
10553
|
+
if (!v && f && !["done", "failed"].includes(f.phase)) return;
|
|
10554
|
+
if (u?.(), p?.(), v || !f || f.phase === "failed") {
|
|
10555
|
+
d(new Error(f?.error?.message ?? "Attachment preparation was cancelled."));
|
|
10565
10556
|
return;
|
|
10566
10557
|
}
|
|
10567
|
-
const _ =
|
|
10558
|
+
const _ = f.result.attachment;
|
|
10568
10559
|
l(Ar({
|
|
10569
10560
|
id: _.id,
|
|
10570
10561
|
name: _.name,
|
|
@@ -10816,7 +10807,7 @@ class Ht {
|
|
|
10816
10807
|
if (!this.clientRuntime.engine.getState().slices.account.authority) {
|
|
10817
10808
|
const e = await this.acquireToken("connect", { preferCached: !0 });
|
|
10818
10809
|
if (this.clientRuntime.isDisposed || this.state.status === "closed") return;
|
|
10819
|
-
if (!e) throw new
|
|
10810
|
+
if (!e) throw new ue("Pluno requires a token or tokenProvider", !1);
|
|
10820
10811
|
this.directoryHttp.auth.token = e;
|
|
10821
10812
|
const s = this.connectionAttemptId, n = () => !this.clientRuntime.isDisposed && this.state.status !== "closed" && this.connectionAttemptId === s && this.directoryHttp.auth.token === e, i = await this.directoryHttp.request(
|
|
10822
10813
|
"/me",
|
|
@@ -10848,26 +10839,26 @@ class Ht {
|
|
|
10848
10839
|
s = !0;
|
|
10849
10840
|
const p = this.getState().sessionId, g = () => !this.clientRuntime.isDisposed && JSON.stringify(this.clientRuntime.engine.getState().slices.account.authority) === JSON.stringify(u) && this.getState().sessionId === p;
|
|
10850
10841
|
Promise.all(["notifications", "tab_grouping"].map(async (m) => {
|
|
10851
|
-
const
|
|
10842
|
+
const f = await d.getState(m, p);
|
|
10852
10843
|
if (g()) {
|
|
10853
|
-
if (!
|
|
10844
|
+
if (!f.bridgeReady) return f;
|
|
10854
10845
|
if (await this.clientRuntime.engine.dispatch({
|
|
10855
10846
|
type: "stage7.device_fact",
|
|
10856
10847
|
authority: u,
|
|
10857
10848
|
now: Date.now(),
|
|
10858
10849
|
feature: m,
|
|
10859
|
-
fact: { permission:
|
|
10860
|
-
}), m === "tab_grouping" &&
|
|
10850
|
+
fact: { permission: f.permissionGranted ? "granted" : f.permissionNeeded ? "missing" : "unknown", revision: Math.max(Date.now(), this.clientRuntime.engine.getState().slices.interactions.deviceFacts[m].revision + 1), snoozedUntil: f.snoozedUntil ?? null }
|
|
10851
|
+
}), m === "tab_grouping" && f.sessionId === p && p) for (const v of f.crossTabUserMessageIds ?? [])
|
|
10861
10852
|
await this.clientRuntime.engine.dispatch({ type: "stage7.cross_tab", authority: u, now: Date.now(), sessionId: p, userMessageId: v });
|
|
10862
|
-
return
|
|
10853
|
+
return f;
|
|
10863
10854
|
}
|
|
10864
10855
|
})).then(async (m) => {
|
|
10865
10856
|
g() && await this.clientRuntime.engine.dispatch({
|
|
10866
10857
|
type: "stage7.bridge_ready",
|
|
10867
10858
|
authority: u,
|
|
10868
10859
|
now: Date.now(),
|
|
10869
|
-
ready: m.every((
|
|
10870
|
-
error: m.find((
|
|
10860
|
+
ready: m.every((f) => f?.bridgeReady),
|
|
10861
|
+
error: m.find((f) => f?.error)?.error ?? null
|
|
10871
10862
|
});
|
|
10872
10863
|
}).catch(async () => {
|
|
10873
10864
|
g() && await this.clientRuntime.engine.dispatch({ type: "stage7.bridge_ready", authority: u, now: Date.now(), ready: !1, error: "The Pluno extension could not reconnect. Try again." });
|
|
@@ -10902,8 +10893,8 @@ class Ht {
|
|
|
10902
10893
|
"stage7.device": async ({ feature: d, action: u, requestId: p }) => {
|
|
10903
10894
|
const g = this.options.runtimeAdapters?.featurePermissions;
|
|
10904
10895
|
if (!g) return { fact: { permission: "unsupported", revision: Date.now(), snoozedUntil: null }, completedAt: Date.now() };
|
|
10905
|
-
const m = this.clientRuntime.engine.getState().slices.interactions,
|
|
10906
|
-
u === "allow" && await g.enable(d, { requestId: p, expectedRevision: v, action:
|
|
10896
|
+
const m = this.clientRuntime.engine.getState().slices.interactions, f = m.promptActions[p], v = f?.expectedRevision ?? m.preferencePrompts[d].revision;
|
|
10897
|
+
u === "allow" && await g.enable(d, { requestId: p, expectedRevision: v, action: f?.action === "enable" ? "enable" : "allow" }), u === "not_now" && await g.dismiss(d, { requestId: p, expectedRevision: v, action: "not_now" });
|
|
10907
10898
|
const I = await g.getState(d, this.getState().sessionId);
|
|
10908
10899
|
if (!I.bridgeReady) throw new Error("The Pluno extension is reconnecting. Try again.");
|
|
10909
10900
|
return { fact: {
|
|
@@ -10996,9 +10987,9 @@ class Ht {
|
|
|
10996
10987
|
reportHealthSignal(e, s = {}) {
|
|
10997
10988
|
let n = this.getState();
|
|
10998
10989
|
if (e === "first_response_slow" && s.sessionId && s.sessionId !== n.sessionId) {
|
|
10999
|
-
const { conversation: m, directory:
|
|
10990
|
+
const { conversation: m, directory: f } = this.clientRuntime.engine.getState().slices, v = Object.values(f.clients).find((I) => f.selections[I]?.sessionId === s.sessionId);
|
|
11000
10991
|
v && (n = { ...n, ...as(
|
|
11001
|
-
Ie(m,
|
|
10992
|
+
Ie(m, f, v),
|
|
11002
10993
|
m.sessions[s.sessionId]?.queries.current,
|
|
11003
10994
|
this.options.backendUrl
|
|
11004
10995
|
) });
|
|
@@ -11233,7 +11224,7 @@ class Ht {
|
|
|
11233
11224
|
const e = { clientScopeId: this.modelClientScopeId, origin: location.origin, pageUrl: location.href };
|
|
11234
11225
|
return Promise.all([
|
|
11235
11226
|
is(this.clientRuntime, { kind: "appearance", ...e }),
|
|
11236
|
-
is(this.clientRuntime, { kind: "starterPrompts", ...e, includeUserSuggestions: !1 }).then(async (s) => {
|
|
11227
|
+
is(this.clientRuntime, this.options.productVariant === "personal" ? { kind: "userSuggestedTasks" } : { kind: "starterPrompts", ...e, includeUserSuggestions: !1 }).then(async (s) => {
|
|
11237
11228
|
s.kind === "starterPrompts" && s.prompts.length === 0 && location.href === e.pageUrl && await this.requestTransientStarterPrompts();
|
|
11238
11229
|
})
|
|
11239
11230
|
]).then(() => {
|
|
@@ -11289,7 +11280,7 @@ class Ht {
|
|
|
11289
11280
|
if (p.type === "run.stop" && g.selections[m]?.sessionId === p.payload.sessionId) {
|
|
11290
11281
|
if (u) continue;
|
|
11291
11282
|
u = !0;
|
|
11292
|
-
const
|
|
11283
|
+
const f = o.filter((v) => v.type === "run.stop" && v.payload.sessionId === p.payload.sessionId).map((v) => String(v.payload.expectedUserMessageId));
|
|
11293
11284
|
await this.clientRuntime.engine.dispatch({
|
|
11294
11285
|
...d,
|
|
11295
11286
|
type: "conversation.stop",
|
|
@@ -11297,7 +11288,7 @@ class Ht {
|
|
|
11297
11288
|
conversationScopeId: m,
|
|
11298
11289
|
requestId: p.request_id,
|
|
11299
11290
|
reason: p.payload.reason,
|
|
11300
|
-
userMessageIds:
|
|
11291
|
+
userMessageIds: f
|
|
11301
11292
|
});
|
|
11302
11293
|
} else (p.type === "run.stop" || p.type === "session.reset") && await this.clientRuntime.engine.dispatch({ ...d, type: "conversation.operation", command: p });
|
|
11303
11294
|
}
|
|
@@ -11592,7 +11583,7 @@ class Ht {
|
|
|
11592
11583
|
this.embeddedRecoveryTimer !== null && window.clearTimeout(this.embeddedRecoveryTimer), this.embeddedRecoveryTimer = null;
|
|
11593
11584
|
}
|
|
11594
11585
|
connectionFailureDiagnostic(e, s) {
|
|
11595
|
-
const n = e instanceof
|
|
11586
|
+
const n = e instanceof ue ? e.status : e instanceof A && e.code === "unauthorized" ? 401 : e instanceof A && /^[45][0-9]{2}$/.test(e.code) ? Number(e.code) : void 0, i = n !== void 0 && Number.isInteger(n) && n >= 400 && n <= 599 ? n : void 0, a = !(e instanceof A && ["unauthorized", "403", "update_required", "executor_replaced"].includes(e.code)) && Rs(e) && i !== 401 && i !== 403;
|
|
11596
11587
|
return {
|
|
11597
11588
|
stage: s,
|
|
11598
11589
|
...i !== void 0 ? { httpStatus: i } : {},
|
|
@@ -11700,13 +11691,13 @@ class Ht {
|
|
|
11700
11691
|
const c = await this.acquireToken("connect", { forceRefresh: !0 });
|
|
11701
11692
|
if (this.socket !== e || this.state.status === "closed" || this.clientRuntime.isDisposed)
|
|
11702
11693
|
throw new A("Conversation authority was retired.", "authority_retired", !0);
|
|
11703
|
-
if (!c) throw new
|
|
11694
|
+
if (!c) throw new ue("Pluno token provider did not return a token", !1);
|
|
11704
11695
|
if (s && c === i) throw new A("Credential did not change.", "unauthorized", !1);
|
|
11705
11696
|
this.directoryHttp.auth.token = c, a = "bootstrap", this.lastRecoveryStage = a, await this.replaceDefaultTransportCredentials(e), this.reportTransportDiagnostic("auth_refresh_validated", r);
|
|
11706
11697
|
})().catch((c) => {
|
|
11707
11698
|
if (this.socket !== e || this.state.status === "closed") throw c;
|
|
11708
11699
|
if (this.reportTransportDiagnostic("auth_refresh_failed", { ...r, ...this.connectionFailureDiagnostic(c, a) }), this.credentialRecoveryFailure = Ge(c), c instanceof A && ["unauthorized", "403", "update_required"].includes(c.code) || !Rs(c)) {
|
|
11709
|
-
const l = c instanceof A ? c : new A(c instanceof
|
|
11700
|
+
const l = c instanceof A ? c : new A(c instanceof ue ? c.message : "Your session could not be refreshed. Try again.", this.options.productVariant === "customer_embedded" ? "connection_failed" : "unauthorized", !1);
|
|
11710
11701
|
throw this.stopAuthentication(l), l;
|
|
11711
11702
|
}
|
|
11712
11703
|
throw this.options.productVariant === "customer_embedded" && this.setState({ status: "reconnecting", lastError: vi, lastErrorCode: "connection_failed" }), this.scheduleReconnect(), c;
|
|
@@ -11779,7 +11770,7 @@ function vd() {
|
|
|
11779
11770
|
}
|
|
11780
11771
|
});
|
|
11781
11772
|
}, s = window.fetch, n = XMLHttpRequest.prototype.open, i = XMLHttpRequest.prototype.setRequestHeader, r = XMLHttpRequest.prototype.send, a = function(g, m) {
|
|
11782
|
-
const
|
|
11773
|
+
const f = Date.now();
|
|
11783
11774
|
let v;
|
|
11784
11775
|
try {
|
|
11785
11776
|
v = s.call(this, g, m);
|
|
@@ -11796,15 +11787,15 @@ function vd() {
|
|
|
11796
11787
|
requestHeaders: S,
|
|
11797
11788
|
requestBody: Ti(m?.body),
|
|
11798
11789
|
resourceType: "fetch",
|
|
11799
|
-
startedAt: new Date(
|
|
11790
|
+
startedAt: new Date(f).toISOString()
|
|
11800
11791
|
};
|
|
11801
11792
|
v.then(
|
|
11802
11793
|
(y) => {
|
|
11803
|
-
El(y, b,
|
|
11794
|
+
El(y, b, f, e).catch(() => {
|
|
11804
11795
|
e({
|
|
11805
11796
|
...b,
|
|
11806
11797
|
responseStatus: y.status,
|
|
11807
|
-
durationMs: Date.now() -
|
|
11798
|
+
durationMs: Date.now() - f
|
|
11808
11799
|
});
|
|
11809
11800
|
});
|
|
11810
11801
|
},
|
|
@@ -11812,7 +11803,7 @@ function vd() {
|
|
|
11812
11803
|
e({
|
|
11813
11804
|
...b,
|
|
11814
11805
|
errorText: fe(y instanceof Error ? y.message : String(y)),
|
|
11815
|
-
durationMs: Date.now() -
|
|
11806
|
+
durationMs: Date.now() - f
|
|
11816
11807
|
});
|
|
11817
11808
|
}
|
|
11818
11809
|
);
|
|
@@ -11820,8 +11811,8 @@ function vd() {
|
|
|
11820
11811
|
} catch {
|
|
11821
11812
|
}
|
|
11822
11813
|
return v;
|
|
11823
|
-
}, o = function(g, m,
|
|
11824
|
-
const _ = n.call(this, g, m,
|
|
11814
|
+
}, o = function(g, m, f, v, I) {
|
|
11815
|
+
const _ = n.call(this, g, m, f ?? !0, v ?? void 0, I ?? void 0), S = typeof m == "string" ? m : m.toString();
|
|
11825
11816
|
return Es.set(this, {
|
|
11826
11817
|
requestId: qs("xhr"),
|
|
11827
11818
|
method: String(g ?? "GET").toUpperCase(),
|
|
@@ -11832,8 +11823,8 @@ function vd() {
|
|
|
11832
11823
|
excluded: Me(S)
|
|
11833
11824
|
}), _;
|
|
11834
11825
|
}, c = function(g, m) {
|
|
11835
|
-
const
|
|
11836
|
-
return v && Object.keys(v.requestHeaders).length < kn && (v.requestHeaders[g] = Tn(g, m), v.excluded = v.excluded || Me(v.url, v.requestHeaders)),
|
|
11826
|
+
const f = i.call(this, g, m), v = Es.get(this);
|
|
11827
|
+
return v && Object.keys(v.requestHeaders).length < kn && (v.requestHeaders[g] = Tn(g, m), v.excluded = v.excluded || Me(v.url, v.requestHeaders)), f;
|
|
11837
11828
|
}, l = function(g) {
|
|
11838
11829
|
try {
|
|
11839
11830
|
const m = Es.get(this);
|
|
@@ -11842,7 +11833,7 @@ function vd() {
|
|
|
11842
11833
|
() => {
|
|
11843
11834
|
queueMicrotask(() => {
|
|
11844
11835
|
try {
|
|
11845
|
-
const
|
|
11836
|
+
const f = Ml(this.getAllResponseHeaders());
|
|
11846
11837
|
e({
|
|
11847
11838
|
requestId: m.requestId,
|
|
11848
11839
|
url: m.url,
|
|
@@ -11851,8 +11842,8 @@ function vd() {
|
|
|
11851
11842
|
requestBody: m.requestBody,
|
|
11852
11843
|
resourceType: "xhr",
|
|
11853
11844
|
responseStatus: this.status,
|
|
11854
|
-
responseHeaders:
|
|
11855
|
-
responseBody: ql(this,
|
|
11845
|
+
responseHeaders: f,
|
|
11846
|
+
responseBody: ql(this, f),
|
|
11856
11847
|
errorText: this.status === 0 ? "XHR request failed or was aborted" : void 0,
|
|
11857
11848
|
startedAt: m.startedAt,
|
|
11858
11849
|
durationMs: Date.now() - m.startedAtMs
|
|
@@ -11891,14 +11882,14 @@ function vd() {
|
|
|
11891
11882
|
const m = g;
|
|
11892
11883
|
if (m.initiatorType === "fetch" || m.initiatorType === "xmlhttprequest" || Me(m.name))
|
|
11893
11884
|
continue;
|
|
11894
|
-
const
|
|
11885
|
+
const f = performance.timeOrigin + m.startTime;
|
|
11895
11886
|
e({
|
|
11896
11887
|
requestId: qs("resource"),
|
|
11897
11888
|
url: fe(m.name, ks),
|
|
11898
11889
|
method: "GET",
|
|
11899
11890
|
resourceType: "resource",
|
|
11900
11891
|
responseStatus: m.responseStatus,
|
|
11901
|
-
startedAt: new Date(
|
|
11892
|
+
startedAt: new Date(f).toISOString(),
|
|
11902
11893
|
durationMs: m.duration
|
|
11903
11894
|
});
|
|
11904
11895
|
}
|
|
@@ -12199,19 +12190,19 @@ function jd() {
|
|
|
12199
12190
|
function Rn() {
|
|
12200
12191
|
if (!document.body)
|
|
12201
12192
|
return "";
|
|
12202
|
-
const t = [], e = [], s = (
|
|
12193
|
+
const t = [], e = [], s = (f, v) => {
|
|
12203
12194
|
const I = Be(v);
|
|
12204
|
-
!I || e.includes(I) || (t.push([
|
|
12195
|
+
!I || e.includes(I) || (t.push([f, I]), e.push(I));
|
|
12205
12196
|
};
|
|
12206
12197
|
s("Selected text", window.getSelection()?.toString() ?? "");
|
|
12207
12198
|
const n = "[role='dialog'], [role='alertdialog'], dialog[open], [aria-modal='true']", i = Array.from(document.querySelectorAll(n)).filter(
|
|
12208
|
-
(
|
|
12199
|
+
(f) => Ir(f) && !f.parentElement?.closest(n)
|
|
12209
12200
|
);
|
|
12210
|
-
for (const
|
|
12211
|
-
s("Active overlay", Ts(tt(
|
|
12201
|
+
for (const f of i.slice(0, 3))
|
|
12202
|
+
s("Active overlay", Ts(tt(f), e));
|
|
12212
12203
|
const r = Bd(), a = r ? Ts(tt(r), e) : "";
|
|
12213
12204
|
s("Main page content", a), s("Additional visible page text", Ts(tt(document.body), e));
|
|
12214
|
-
const o = t.map(([
|
|
12205
|
+
const o = t.map(([f, v]) => `${f}:
|
|
12215
12206
|
${v}`).join(`
|
|
12216
12207
|
|
|
12217
12208
|
`).trim().slice(0, 12e3), c = Ld(i, r).trim(), l = `Simplified DOM outline:
|
|
@@ -12329,12 +12320,12 @@ function Ld(t, e) {
|
|
|
12329
12320
|
e && p.add(e);
|
|
12330
12321
|
let g = 0;
|
|
12331
12322
|
const m = (S) => {
|
|
12332
|
-
const
|
|
12333
|
-
return
|
|
12334
|
-
},
|
|
12335
|
-
const
|
|
12336
|
-
return `${S.tagName.toLowerCase()}|${m(S)}|${
|
|
12337
|
-
}, v = (S,
|
|
12323
|
+
const h = S.getAttribute("role");
|
|
12324
|
+
return h && !a.has(h) ? h : "";
|
|
12325
|
+
}, f = (S) => {
|
|
12326
|
+
const h = S.getAttribute("data-testid") || S.getAttribute("data-test") || S.getAttribute("data-qa") || S.getAttribute("data-cy") || "";
|
|
12327
|
+
return `${S.tagName.toLowerCase()}|${m(S)}|${h}`;
|
|
12328
|
+
}, v = (S, h, b) => {
|
|
12338
12329
|
const y = (w, R) => {
|
|
12339
12330
|
const T = w.tagName.toLowerCase(), C = window.getComputedStyle(w), E = d.has(w);
|
|
12340
12331
|
if (g >= 1e3 && !E || b.has(w) || r.has(T) || w.matches(".pluno-pa-widget-host, [data-pluno-product-agent-widget]") || C.display === "none" || C.visibility === "hidden")
|
|
@@ -12342,17 +12333,17 @@ function Ld(t, e) {
|
|
|
12342
12333
|
g += 1;
|
|
12343
12334
|
const q = m(w), O = _r(w), k = o.has(q) || ["button", "input", "textarea", "select", "iframe", "canvas"].includes(T) || T === "a" && w.hasAttribute("href"), x = Array.from(w.children).filter((D) => D instanceof HTMLElement), U = /* @__PURE__ */ new Map();
|
|
12344
12335
|
for (const D of x) {
|
|
12345
|
-
const $ =
|
|
12336
|
+
const $ = f(D);
|
|
12346
12337
|
U.set($, (U.get($) ?? 0) + 1);
|
|
12347
12338
|
}
|
|
12348
12339
|
const H = /* @__PURE__ */ new Map(), Fe = /* @__PURE__ */ new Map();
|
|
12349
12340
|
for (const D of x) {
|
|
12350
|
-
const $ =
|
|
12341
|
+
const $ = f(D), ve = Fe.get($) ?? 0;
|
|
12351
12342
|
Fe.set($, ve + 1), (U.get($) ?? 0) > 8 && ve >= 6 && !d.has(D) && H.set($, (H.get($) ?? 0) + 1);
|
|
12352
12343
|
}
|
|
12353
12344
|
const ot = /* @__PURE__ */ new Map(), qn = /* @__PURE__ */ new Set(), Kt = [], Cn = [];
|
|
12354
12345
|
for (const D of x) {
|
|
12355
|
-
const $ =
|
|
12346
|
+
const $ = f(D), ve = U.get($) ?? 0, Mn = ot.get($) ?? 0;
|
|
12356
12347
|
if (ot.set($, Mn + 1), ve > 8 && Mn >= 6 && !d.has(D)) {
|
|
12357
12348
|
qn.has($) || (Kt.push([`… ${H.get($) ?? 0} similar siblings omitted`]), qn.add($));
|
|
12358
12349
|
continue;
|
|
@@ -12391,7 +12382,7 @@ function Ld(t, e) {
|
|
|
12391
12382
|
containsTextElement: n.has(T) || at.some((D) => D.containsTextElement)
|
|
12392
12383
|
};
|
|
12393
12384
|
};
|
|
12394
|
-
return [`--- ${
|
|
12385
|
+
return [`--- ${h} ---`, ...y(S, 0).lines].join(`
|
|
12395
12386
|
`);
|
|
12396
12387
|
}, I = [], _ = Be(window.getSelection()?.toString() ?? "");
|
|
12397
12388
|
_ && I.push(`--- selected text ---
|
|
@@ -13397,7 +13388,7 @@ export {
|
|
|
13397
13388
|
Ht as ProductAgentSessionEngine,
|
|
13398
13389
|
Yl as ProductAgentSessionHistoryManager,
|
|
13399
13390
|
tu as ProductAgentTaskPageTitleController,
|
|
13400
|
-
|
|
13391
|
+
ue as ProductAgentTokenProviderError,
|
|
13401
13392
|
gd as calculateReconnectDelay,
|
|
13402
13393
|
Jl as canSubmitPersonalProductAgentMessage,
|
|
13403
13394
|
eu as createLocalStorageInteractionDecisionStorage,
|