@stigmer/react 3.2.0 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -4
- package/session/useNewSessionFlow.d.ts +4 -0
- package/session/useNewSessionFlow.d.ts.map +1 -1
- package/session/useNewSessionFlow.js +33 -4
- package/session/useNewSessionFlow.js.map +1 -1
- package/session/usePersistedModel.d.ts +11 -0
- package/session/usePersistedModel.d.ts.map +1 -1
- package/session/usePersistedModel.js +14 -3
- package/session/usePersistedModel.js.map +1 -1
- package/session/useSessionPageFlow.d.ts.map +1 -1
- package/session/useSessionPageFlow.js +12 -1
- package/session/useSessionPageFlow.js.map +1 -1
- package/src/session/__tests__/useNewSessionFlow.test.tsx +64 -0
- package/src/session/__tests__/usePersistedModel.test.tsx +36 -0
- package/src/session/__tests__/useSessionPageFlow.guest.test.tsx +48 -1
- package/src/session/useNewSessionFlow.ts +35 -4
- package/src/session/usePersistedModel.ts +25 -3
- package/src/session/useSessionPageFlow.ts +13 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stigmer/react",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.1",
|
|
4
4
|
"description": "React provider and client hook for the Stigmer platform SDK",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@bufbuild/protovalidate": "^1.1.1",
|
|
39
39
|
"@dagrejs/dagre": "^1.1.4",
|
|
40
|
-
"@stigmer/theme": "3.2.
|
|
40
|
+
"@stigmer/theme": "3.2.1",
|
|
41
41
|
"diff": "^8.0.3",
|
|
42
42
|
"fflate": "^0.8.2",
|
|
43
43
|
"hast-util-to-jsx-runtime": "^2.3.6",
|
|
@@ -60,8 +60,8 @@
|
|
|
60
60
|
"@codemirror/state": "^6.0.0",
|
|
61
61
|
"@codemirror/view": "^6.0.0",
|
|
62
62
|
"@lezer/highlight": "^1.0.0",
|
|
63
|
-
"@stigmer/protos": "3.2.
|
|
64
|
-
"@stigmer/sdk": "3.2.
|
|
63
|
+
"@stigmer/protos": "3.2.1",
|
|
64
|
+
"@stigmer/sdk": "3.2.1",
|
|
65
65
|
"@tanstack/react-table": "^8.20.0",
|
|
66
66
|
"@xyflow/react": "^12.0.0",
|
|
67
67
|
"elkjs": "^0.9.0",
|
|
@@ -56,6 +56,10 @@ export interface UseNewSessionFlowOptions {
|
|
|
56
56
|
* localStorage on explicit change — always takes precedence on
|
|
57
57
|
* subsequent visits.
|
|
58
58
|
*
|
|
59
|
+
* Ignored for the `"guest"` audience: guest sessions always run the
|
|
60
|
+
* platform's share-surface policy (cursor harness, Auto model), never an
|
|
61
|
+
* embedder preference or a stored Console choice.
|
|
62
|
+
*
|
|
59
63
|
* @default DEFAULT_HARNESS ("native")
|
|
60
64
|
*/
|
|
61
65
|
readonly defaultHarness?: HarnessOption;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNewSessionFlow.d.ts","sourceRoot":"","sources":["../../src/session/useNewSessionFlow.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,mBAAmB,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIzD,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAC1G,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAIzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGnE,OAAO,EAA8B,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"useNewSessionFlow.d.ts","sourceRoot":"","sources":["../../src/session/useNewSessionFlow.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,20 @@ import { useRunnerAdapter } from "../runner-adapter.js";
|
|
|
15
15
|
import { resolveExecutionRuntimeEnv } from "./runtime-env.js";
|
|
16
16
|
const DEFAULT_AGENT_TIMEOUT_MS = 10_000;
|
|
17
17
|
const STORAGE_KEY_HARNESS = "stigmer:session:harness";
|
|
18
|
+
/**
|
|
19
|
+
* Platform policy for guest (share/embed) sessions: the cursor harness with
|
|
20
|
+
* the Auto model (an omitted modelName resolves to cursor's "default"/Auto in
|
|
21
|
+
* the runner).
|
|
22
|
+
*
|
|
23
|
+
* This lives CLIENT-side deliberately — it is the only layer that can. The
|
|
24
|
+
* SDK's guest audience covers both public visitors (guest tokens) and org
|
|
25
|
+
* members chatting via an org-audience share (their own member tokens, which
|
|
26
|
+
* carry no share linkage in Phase A) — the server cannot distinguish the
|
|
27
|
+
* latter from ordinary Console traffic, so share-surface policy must be
|
|
28
|
+
* applied where the surface is known. Server-side guest-token gates own the
|
|
29
|
+
* abuse controls (rate limits, bounded execution profile).
|
|
30
|
+
*/
|
|
31
|
+
const GUEST_HARNESS = "cursor";
|
|
18
32
|
function modelStorageKey(harness) {
|
|
19
33
|
return harness === "cursor"
|
|
20
34
|
? "stigmer:session:model:cursor"
|
|
@@ -68,6 +82,11 @@ export function useNewSessionFlow(options) {
|
|
|
68
82
|
const executionTarget = options.executionTarget ?? contextTarget;
|
|
69
83
|
const adapter = useRunnerAdapter();
|
|
70
84
|
const [harness, setHarnessRaw] = useState(() => {
|
|
85
|
+
// Guests get the fixed platform policy (see GUEST_HARNESS) and never
|
|
86
|
+
// touch localStorage: a browser previously used in the Console must not
|
|
87
|
+
// leak its stored harness into a share/embed session.
|
|
88
|
+
if (isGuest)
|
|
89
|
+
return GUEST_HARNESS;
|
|
71
90
|
if (typeof window === "undefined")
|
|
72
91
|
return defaultHarness ?? DEFAULT_HARNESS;
|
|
73
92
|
// Only explicit user choices are persisted (see setHarness), so a
|
|
@@ -96,17 +115,24 @@ export function useNewSessionFlow(options) {
|
|
|
96
115
|
const validModelId = modelId && getModel(modelId) ? modelId : undefined;
|
|
97
116
|
const setHarness = useCallback((h) => {
|
|
98
117
|
setHarnessRaw(h);
|
|
118
|
+
// Guests have no harness picker; if a caller invokes this anyway, the
|
|
119
|
+
// guest surface must never write into the Console's preference keys.
|
|
120
|
+
if (isGuest)
|
|
121
|
+
return;
|
|
99
122
|
// Persist only explicit choices — never the seeded value — so the
|
|
100
123
|
// embedder's defaultHarness keeps applying until the user decides.
|
|
101
124
|
localStorage.setItem(STORAGE_KEY_HARNESS, h);
|
|
102
125
|
const storedModel = localStorage.getItem(modelStorageKey(h));
|
|
103
126
|
const plain = storedModel ? (parseModelKey(storedModel)?.modelId ?? storedModel) : undefined;
|
|
104
127
|
setModelId(plain);
|
|
105
|
-
}, []);
|
|
128
|
+
}, [isGuest]);
|
|
106
129
|
// Restore persisted model — only after the registry has loaded so
|
|
107
130
|
// getModel can actually validate the stored ID against live data.
|
|
131
|
+
// Guests skip the restore: modelId stays undefined, the create omits
|
|
132
|
+
// modelName, and the cursor harness resolves it to Auto — a Console-used
|
|
133
|
+
// browser must not leak its stored model into a share/embed session.
|
|
108
134
|
useEffect(() => {
|
|
109
|
-
if (isModelsLoading)
|
|
135
|
+
if (isGuest || isModelsLoading)
|
|
110
136
|
return;
|
|
111
137
|
const stored = localStorage.getItem(modelStorageKey(harness));
|
|
112
138
|
if (stored) {
|
|
@@ -115,15 +141,18 @@ export function useNewSessionFlow(options) {
|
|
|
115
141
|
setModelId(plain);
|
|
116
142
|
}
|
|
117
143
|
}
|
|
118
|
-
}, [getModel, harness, isModelsLoading]);
|
|
144
|
+
}, [getModel, harness, isGuest, isModelsLoading]);
|
|
119
145
|
// Persist model on change (using current harness key).
|
|
120
146
|
// Strip compound keys (e.g. "cursor/default") to plain modelId before storing.
|
|
147
|
+
// Guests never persist — the symmetric half of the isolation above.
|
|
121
148
|
useEffect(() => {
|
|
149
|
+
if (isGuest)
|
|
150
|
+
return;
|
|
122
151
|
if (modelId) {
|
|
123
152
|
const plain = parseModelKey(modelId)?.modelId ?? modelId;
|
|
124
153
|
localStorage.setItem(modelStorageKey(harness), plain);
|
|
125
154
|
}
|
|
126
|
-
}, [modelId, harness]);
|
|
155
|
+
}, [modelId, harness, isGuest]);
|
|
127
156
|
const submit = useCallback(async (message, selectedModel, context) => {
|
|
128
157
|
if (isSubmitting)
|
|
129
158
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNewSessionFlow.js","sourceRoot":"","sources":["../../src/session/useNewSessionFlow.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,cAAc,EAA8C,MAAM,cAAc,CAAC;AAE1F,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAsB,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAkC,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAkC,MAAM,qCAAqC,CAAC;AAE1G,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAElF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAA2B,MAAM,kBAAkB,CAAC;AAGvF,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAExC,MAAM,mBAAmB,GAAG,yBAAyB,CAAC;AAEtD,SAAS,eAAe,CAAC,OAAsB;IAC7C,OAAO,OAAO,KAAK,QAAQ;QACzB,CAAC,CAAC,8BAA8B;QAChC,CAAC,CAAC,uBAAuB,CAAC;AAC9B,CAAC;
|
|
1
|
+
{"version":3,"file":"useNewSessionFlow.js","sourceRoot":"","sources":["../../src/session/useNewSessionFlow.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,17 @@ export interface UsePersistedModelOptions {
|
|
|
9
9
|
* When `"native"` or omitted, the default key and registry apply.
|
|
10
10
|
*/
|
|
11
11
|
readonly harness?: HarnessOption;
|
|
12
|
+
/**
|
|
13
|
+
* When `false`, the hook is a stable no-op: it never reads or writes
|
|
14
|
+
* localStorage and always returns `undefined` with a no-op setter.
|
|
15
|
+
*
|
|
16
|
+
* Guest (share/embed) surfaces disable persistence so a browser previously
|
|
17
|
+
* used in the Console cannot leak its stored model into a guest session,
|
|
18
|
+
* and a guest session never pollutes the Console's preference keys.
|
|
19
|
+
*
|
|
20
|
+
* @default true
|
|
21
|
+
*/
|
|
22
|
+
readonly enabled?: boolean;
|
|
12
23
|
}
|
|
13
24
|
/** Return value of {@link usePersistedModel}. */
|
|
14
25
|
export type UsePersistedModelReturn = readonly [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePersistedModel.d.ts","sourceRoot":"","sources":["../../src/session/usePersistedModel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"usePersistedModel.d.ts","sourceRoot":"","sources":["../../src/session/usePersistedModel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC;;;;;;;;;OASG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,iDAAiD;AACjD,MAAM,MAAM,uBAAuB,GAAG,SAAS;IAC7C,OAAO,EAAE,MAAM,GAAG,SAAS;IAC3B,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI;CACjC,CAAC;AAkBF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,CAAC,EAAE,wBAAwB,GACjC,uBAAuB,CAuCzB"}
|
|
@@ -35,17 +35,20 @@ function extractPlainModelId(value) {
|
|
|
35
35
|
*/
|
|
36
36
|
export function usePersistedModel(options) {
|
|
37
37
|
const harness = options?.harness;
|
|
38
|
+
const enabled = options?.enabled ?? true;
|
|
38
39
|
const { getModel } = useModelRegistry({ harness });
|
|
39
40
|
const key = storageKey(harness);
|
|
40
41
|
const prevKeyRef = useRef(key);
|
|
41
42
|
const [modelId, setModelId] = useState(() => {
|
|
42
|
-
if (typeof window === "undefined")
|
|
43
|
+
if (!enabled || typeof window === "undefined")
|
|
43
44
|
return undefined;
|
|
44
45
|
const raw = localStorage.getItem(key);
|
|
45
46
|
return raw ? extractPlainModelId(raw) : undefined;
|
|
46
47
|
});
|
|
47
48
|
// Re-read from localStorage when the storage key changes (harness transition).
|
|
48
49
|
useEffect(() => {
|
|
50
|
+
if (!enabled)
|
|
51
|
+
return;
|
|
49
52
|
if (prevKeyRef.current === key)
|
|
50
53
|
return;
|
|
51
54
|
prevKeyRef.current = key;
|
|
@@ -53,13 +56,21 @@ export function usePersistedModel(options) {
|
|
|
53
56
|
return;
|
|
54
57
|
const raw = localStorage.getItem(key);
|
|
55
58
|
setModelId(raw ? extractPlainModelId(raw) : undefined);
|
|
56
|
-
}, [key]);
|
|
59
|
+
}, [enabled, key]);
|
|
57
60
|
useEffect(() => {
|
|
61
|
+
if (!enabled)
|
|
62
|
+
return;
|
|
58
63
|
if (modelId) {
|
|
59
64
|
localStorage.setItem(key, modelId);
|
|
60
65
|
}
|
|
61
|
-
}, [modelId, key]);
|
|
66
|
+
}, [enabled, modelId, key]);
|
|
67
|
+
if (!enabled) {
|
|
68
|
+
// Stable no-op shape: undefined model, inert setter. Returned after the
|
|
69
|
+
// hooks above so the hook order is identical whether enabled or not.
|
|
70
|
+
return [undefined, NOOP_SET_MODEL];
|
|
71
|
+
}
|
|
62
72
|
const validModelId = modelId && getModel(modelId) ? modelId : undefined;
|
|
63
73
|
return [validModelId, setModelId];
|
|
64
74
|
}
|
|
75
|
+
const NOOP_SET_MODEL = () => { };
|
|
65
76
|
//# sourceMappingURL=usePersistedModel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePersistedModel.js","sourceRoot":"","sources":["../../src/session/usePersistedModel.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"usePersistedModel.js","sourceRoot":"","sources":["../../src/session/usePersistedModel.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAgCtD,SAAS,UAAU,CAAC,OAAuB;IACzC,OAAO,OAAO,KAAK,QAAQ;QACzB,CAAC,CAAC,8BAA8B;QAChC,CAAC,CAAC,uBAAuB,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAkC;IAElC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC;IACjC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;IACzC,MAAM,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAE/B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAqB,GAAG,EAAE;QAC9D,IAAI,CAAC,OAAO,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,SAAS,CAAC;QAChE,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,OAAO,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,UAAU,CAAC,OAAO,KAAK,GAAG;YAAE,OAAO;QACvC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC;QAEzB,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAEnB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAE5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,wEAAwE;QACxE,qEAAqE;QACrE,OAAO,CAAC,SAAS,EAAE,cAAc,CAAU,CAAC;IAC9C,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,OAAO,CAAC,YAAY,EAAE,UAAU,CAAU,CAAC;AAC7C,CAAC;AAED,MAAM,cAAc,GAAyB,GAAG,EAAE,GAAE,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSessionPageFlow.d.ts","sourceRoot":"","sources":["../../src/session/useSessionPageFlow.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"useSessionPageFlow.d.ts","sourceRoot":"","sources":["../../src/session/useSessionPageFlow.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,7 +67,18 @@ export function useSessionPageFlow(options) {
|
|
|
67
67
|
const conv = useSessionConversation(sessionId, org);
|
|
68
68
|
const harness = fromProtoHarness(conv.session?.spec?.harness ?? Harness.UNSPECIFIED);
|
|
69
69
|
const executionTarget = fromProtoExecutionTarget(conv.session?.spec?.executionTarget ?? ExecutionTarget.UNSPECIFIED);
|
|
70
|
-
|
|
70
|
+
// Guests never read or write the Console's persisted model preference —
|
|
71
|
+
// their follow-ups carry no modelName, and the session's harness (cursor
|
|
72
|
+
// for share surfaces) resolves the model server-side.
|
|
73
|
+
const [persistedModelId, setPersistedModelId] = usePersistedModel({
|
|
74
|
+
harness,
|
|
75
|
+
enabled: !isGuest,
|
|
76
|
+
});
|
|
77
|
+
// Guest note: this stays undefined for guests by construction — guest
|
|
78
|
+
// executions never carry a modelName (the first message omits it and the
|
|
79
|
+
// server-side guest execution profile owns the field thereafter). The
|
|
80
|
+
// guest flow test asserts that invariant; if it ever breaks, fix the
|
|
81
|
+
// server profile rather than special-casing here.
|
|
71
82
|
const lastExecModelId = useMemo(() => {
|
|
72
83
|
const lastExec = conv.completedExecutions.at(-1);
|
|
73
84
|
return lastExec?.spec?.executionConfig?.modelName || undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSessionPageFlow.js","sourceRoot":"","sources":["../../src/session/useSessionPageFlow.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAE9F,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAkC,MAAM,uBAAuB,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAkC,MAAM,qCAAqC,CAAC;AAE1G,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAsB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,uDAAuD,CAAC;AACjG,OAAO,EAAE,wBAAwB,EAA8B,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAqC,MAAM,6BAA6B,CAAC;AACxG,OAAO,EAAE,0BAA0B,EAA2B,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAgC,MAAM,wBAAwB,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAG1F;;;GAGG;AACH,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;AA0KzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAkC;IAElC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAE7C,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,sBAAsB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,OAAO,GAAkB,gBAAgB,CAC7C,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,OAAO,CAAC,WAAW,CACnD,CAAC;IACF,MAAM,eAAe,GAAsC,wBAAwB,CACjF,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,eAAe,IAAI,eAAe,CAAC,WAAW,CACnE,CAAC;IACF,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"useSessionPageFlow.js","sourceRoot":"","sources":["../../src/session/useSessionPageFlow.ts"],"names":[],"mappings":"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"}
|
|
@@ -801,6 +801,70 @@ describe("useNewSessionFlow", () => {
|
|
|
801
801
|
expect(opts.onError).toHaveBeenCalled();
|
|
802
802
|
});
|
|
803
803
|
|
|
804
|
+
it("always uses the cursor harness, ignoring a stored Console choice", () => {
|
|
805
|
+
// A browser previously used in the Console must not leak its stored
|
|
806
|
+
// harness into a share/embed session.
|
|
807
|
+
localStorage.setItem(STORAGE_KEY_HARNESS, "native");
|
|
808
|
+
const opts = { ...defaultOptions(), audience: "guest" as const };
|
|
809
|
+
const { result } = renderHook(() => useNewSessionFlow(opts), { wrapper: createWrapper() });
|
|
810
|
+
|
|
811
|
+
expect(result.current.harness).toBe("cursor");
|
|
812
|
+
});
|
|
813
|
+
|
|
814
|
+
it("ignores the embedder's defaultHarness — guests get platform policy", () => {
|
|
815
|
+
const opts = {
|
|
816
|
+
...defaultOptions(),
|
|
817
|
+
audience: "guest" as const,
|
|
818
|
+
defaultHarness: "native" as const,
|
|
819
|
+
};
|
|
820
|
+
const { result } = renderHook(() => useNewSessionFlow(opts), { wrapper: createWrapper() });
|
|
821
|
+
|
|
822
|
+
expect(result.current.harness).toBe("cursor");
|
|
823
|
+
});
|
|
824
|
+
|
|
825
|
+
it("does not restore a stored model — modelId stays undefined", () => {
|
|
826
|
+
localStorage.setItem(STORAGE_KEY_MODEL_CURSOR, DEFAULT_CURSOR_MODEL_ID);
|
|
827
|
+
const opts = { ...defaultOptions(), audience: "guest" as const };
|
|
828
|
+
const { result } = renderHook(() => useNewSessionFlow(opts), { wrapper: createWrapper() });
|
|
829
|
+
|
|
830
|
+
expect(result.current.modelId).toBeUndefined();
|
|
831
|
+
});
|
|
832
|
+
|
|
833
|
+
it("never writes Console preference keys", () => {
|
|
834
|
+
const opts = { ...defaultOptions(), audience: "guest" as const };
|
|
835
|
+
const { result } = renderHook(() => useNewSessionFlow(opts), { wrapper: createWrapper() });
|
|
836
|
+
|
|
837
|
+
act(() => result.current.setHarness("native"));
|
|
838
|
+
act(() => result.current.setModelId(DEFAULT_CURSOR_MODEL_ID));
|
|
839
|
+
|
|
840
|
+
expect(localStorage.getItem(STORAGE_KEY_HARNESS)).toBeNull();
|
|
841
|
+
expect(localStorage.getItem(STORAGE_KEY_MODEL_NATIVE)).toBeNull();
|
|
842
|
+
expect(localStorage.getItem(STORAGE_KEY_MODEL_CURSOR)).toBeNull();
|
|
843
|
+
});
|
|
844
|
+
|
|
845
|
+
it("submits with the cursor harness and NO model (server resolves Auto)", async () => {
|
|
846
|
+
// Stored values simulate a Console-used browser: neither may leak.
|
|
847
|
+
localStorage.setItem(STORAGE_KEY_HARNESS, "native");
|
|
848
|
+
localStorage.setItem(STORAGE_KEY_MODEL_CURSOR, DEFAULT_CURSOR_MODEL_ID);
|
|
849
|
+
const opts = { ...defaultOptions(), audience: "guest" as const };
|
|
850
|
+
const { result } = renderHook(() => useNewSessionFlow(opts), { wrapper: createWrapper() });
|
|
851
|
+
|
|
852
|
+
act(() => {
|
|
853
|
+
result.current.setAgentRef({ org: "acme", slug: "support-bot" });
|
|
854
|
+
result.current.setResolution({ mode: "saved", instanceId: "shared-inst" });
|
|
855
|
+
});
|
|
856
|
+
await act(async () => {
|
|
857
|
+
await result.current.submit("Hello");
|
|
858
|
+
});
|
|
859
|
+
|
|
860
|
+
const execInput = mockCreateExecution.mock.calls[0][0];
|
|
861
|
+
expect(execInput.sessionSpec.harness).toBe("cursor");
|
|
862
|
+
// Omitted model = cursor's Auto ("default") in the runner. If this ever
|
|
863
|
+
// carries a value, guest follow-ups would silently pin to it via
|
|
864
|
+
// lastExecModelId in useSessionPageFlow.
|
|
865
|
+
expect(execInput.modelName).toBeUndefined();
|
|
866
|
+
});
|
|
867
|
+
|
|
804
868
|
it("surfaces launch-gate refusal copy verbatim from the status description", async () => {
|
|
805
869
|
// The backend resolves owner-customizable refusal copy server-side and
|
|
806
870
|
// carries it in the gRPC status description — the flow must hand it to
|
|
@@ -70,6 +70,42 @@ describe("usePersistedModel", () => {
|
|
|
70
70
|
});
|
|
71
71
|
});
|
|
72
72
|
|
|
73
|
+
describe("disabled mode (guest isolation)", () => {
|
|
74
|
+
it("returns undefined even when a valid model is stored", () => {
|
|
75
|
+
localStorage.setItem(STORAGE_KEY_NATIVE, DEFAULT_MODEL_ID);
|
|
76
|
+
const { result } = renderHook(
|
|
77
|
+
() => usePersistedModel({ harness: "native", enabled: false }),
|
|
78
|
+
{ wrapper: createWrapper() },
|
|
79
|
+
);
|
|
80
|
+
expect(result.current[0]).toBeUndefined();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("never writes localStorage through the setter", () => {
|
|
84
|
+
const { result } = renderHook(
|
|
85
|
+
() => usePersistedModel({ harness: "native", enabled: false }),
|
|
86
|
+
{ wrapper: createWrapper() },
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
act(() => result.current[1](DEFAULT_MODEL_ID));
|
|
90
|
+
|
|
91
|
+
expect(localStorage.getItem(STORAGE_KEY_NATIVE)).toBeNull();
|
|
92
|
+
expect(result.current[0]).toBeUndefined();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("does not re-read storage on a harness transition", () => {
|
|
96
|
+
localStorage.setItem(STORAGE_KEY_CURSOR, DEFAULT_CURSOR_MODEL_ID);
|
|
97
|
+
const { result, rerender } = renderHook(
|
|
98
|
+
({ harness }: { harness: "native" | "cursor" }) =>
|
|
99
|
+
usePersistedModel({ harness, enabled: false }),
|
|
100
|
+
{ initialProps: { harness: "native" as "native" | "cursor" }, wrapper: createWrapper() },
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
rerender({ harness: "cursor" });
|
|
104
|
+
|
|
105
|
+
expect(result.current[0]).toBeUndefined();
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
73
109
|
describe("compound key handling", () => {
|
|
74
110
|
it("extracts plain modelId from compound key in localStorage", () => {
|
|
75
111
|
localStorage.setItem(STORAGE_KEY_CURSOR, "cursor/default");
|
|
@@ -61,8 +61,17 @@ vi.mock("../../execution/useSessionVariables", () => ({
|
|
|
61
61
|
useSessionVariables: () => mockSessionVariables,
|
|
62
62
|
}));
|
|
63
63
|
|
|
64
|
+
// Honors `enabled` like the real hook: disabled → no persisted model. Guest
|
|
65
|
+
// isolation depends on this contract (usePersistedModel has its own tests).
|
|
66
|
+
const usePersistedModelSpy = vi.fn(
|
|
67
|
+
(opts?: { harness?: string; enabled?: boolean }) =>
|
|
68
|
+
(opts?.enabled === false
|
|
69
|
+
? ([undefined, vi.fn()] as const)
|
|
70
|
+
: (["model-x", vi.fn()] as const)),
|
|
71
|
+
);
|
|
64
72
|
vi.mock("../usePersistedModel", () => ({
|
|
65
|
-
usePersistedModel: (
|
|
73
|
+
usePersistedModel: (opts?: { harness?: string; enabled?: boolean }) =>
|
|
74
|
+
usePersistedModelSpy(opts),
|
|
66
75
|
}));
|
|
67
76
|
|
|
68
77
|
const useAgentRefFromSessionSpy = vi.fn((_instanceId: string | null) => ({
|
|
@@ -109,4 +118,42 @@ describe("useSessionPageFlow — guest audience", () => {
|
|
|
109
118
|
// No override: the execution continues on the session's bound instance.
|
|
110
119
|
expect(mockSendFollowUp.mock.calls[0][1].agentInstanceId).toBeUndefined();
|
|
111
120
|
});
|
|
121
|
+
|
|
122
|
+
it("disables model persistence — a Console-stored model must not leak in", () => {
|
|
123
|
+
renderHook(() => useSessionPageFlow({ ...OPTS, audience: "guest" }));
|
|
124
|
+
|
|
125
|
+
expect(usePersistedModelSpy).toHaveBeenCalledWith(
|
|
126
|
+
expect.objectContaining({ enabled: false }),
|
|
127
|
+
);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it("keeps model persistence for other audiences", () => {
|
|
131
|
+
renderHook(() => useSessionPageFlow(OPTS));
|
|
132
|
+
|
|
133
|
+
expect(usePersistedModelSpy).toHaveBeenCalledWith(
|
|
134
|
+
expect.objectContaining({ enabled: true }),
|
|
135
|
+
);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it("sends follow-ups with NO model — the session's harness resolves it", async () => {
|
|
139
|
+
// Invariant this relies on: guest executions never carry a modelName
|
|
140
|
+
// (the first message omits it and the server-side guest execution
|
|
141
|
+
// profile owns spec.execution_config thereafter), so the composer's
|
|
142
|
+
// lastExecModelId fallback stays undefined too. If this test starts
|
|
143
|
+
// failing because a guest execution carries a model, fix the server
|
|
144
|
+
// profile — do not special-case lastExecModelId.
|
|
145
|
+
mockConv.completedExecutions = [
|
|
146
|
+
{ spec: { executionConfig: { maxCostUsd: 0.5 } } },
|
|
147
|
+
];
|
|
148
|
+
const { result } = renderHook(() =>
|
|
149
|
+
useSessionPageFlow({ ...OPTS, audience: "guest" }),
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
await act(async () => {
|
|
153
|
+
await result.current.handleSubmit("follow up");
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
expect(mockSendFollowUp.mock.calls[0][1].modelName).toBeUndefined();
|
|
157
|
+
mockConv.completedExecutions = [];
|
|
158
|
+
});
|
|
112
159
|
});
|
|
@@ -23,6 +23,21 @@ const DEFAULT_AGENT_TIMEOUT_MS = 10_000;
|
|
|
23
23
|
|
|
24
24
|
const STORAGE_KEY_HARNESS = "stigmer:session:harness";
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Platform policy for guest (share/embed) sessions: the cursor harness with
|
|
28
|
+
* the Auto model (an omitted modelName resolves to cursor's "default"/Auto in
|
|
29
|
+
* the runner).
|
|
30
|
+
*
|
|
31
|
+
* This lives CLIENT-side deliberately — it is the only layer that can. The
|
|
32
|
+
* SDK's guest audience covers both public visitors (guest tokens) and org
|
|
33
|
+
* members chatting via an org-audience share (their own member tokens, which
|
|
34
|
+
* carry no share linkage in Phase A) — the server cannot distinguish the
|
|
35
|
+
* latter from ordinary Console traffic, so share-surface policy must be
|
|
36
|
+
* applied where the surface is known. Server-side guest-token gates own the
|
|
37
|
+
* abuse controls (rate limits, bounded execution profile).
|
|
38
|
+
*/
|
|
39
|
+
const GUEST_HARNESS: HarnessOption = "cursor";
|
|
40
|
+
|
|
26
41
|
function modelStorageKey(harness: HarnessOption): string {
|
|
27
42
|
return harness === "cursor"
|
|
28
43
|
? "stigmer:session:model:cursor"
|
|
@@ -78,6 +93,10 @@ export interface UseNewSessionFlowOptions {
|
|
|
78
93
|
* localStorage on explicit change — always takes precedence on
|
|
79
94
|
* subsequent visits.
|
|
80
95
|
*
|
|
96
|
+
* Ignored for the `"guest"` audience: guest sessions always run the
|
|
97
|
+
* platform's share-surface policy (cursor harness, Auto model), never an
|
|
98
|
+
* embedder preference or a stored Console choice.
|
|
99
|
+
*
|
|
81
100
|
* @default DEFAULT_HARNESS ("native")
|
|
82
101
|
*/
|
|
83
102
|
readonly defaultHarness?: HarnessOption;
|
|
@@ -205,6 +224,10 @@ export function useNewSessionFlow(
|
|
|
205
224
|
const adapter = useRunnerAdapter();
|
|
206
225
|
|
|
207
226
|
const [harness, setHarnessRaw] = useState<HarnessOption>(() => {
|
|
227
|
+
// Guests get the fixed platform policy (see GUEST_HARNESS) and never
|
|
228
|
+
// touch localStorage: a browser previously used in the Console must not
|
|
229
|
+
// leak its stored harness into a share/embed session.
|
|
230
|
+
if (isGuest) return GUEST_HARNESS;
|
|
208
231
|
if (typeof window === "undefined") return defaultHarness ?? DEFAULT_HARNESS;
|
|
209
232
|
// Only explicit user choices are persisted (see setHarness), so a
|
|
210
233
|
// stored value always outranks the embedder's defaultHarness.
|
|
@@ -241,6 +264,9 @@ export function useNewSessionFlow(
|
|
|
241
264
|
const setHarness = useCallback(
|
|
242
265
|
(h: HarnessOption) => {
|
|
243
266
|
setHarnessRaw(h);
|
|
267
|
+
// Guests have no harness picker; if a caller invokes this anyway, the
|
|
268
|
+
// guest surface must never write into the Console's preference keys.
|
|
269
|
+
if (isGuest) return;
|
|
244
270
|
// Persist only explicit choices — never the seeded value — so the
|
|
245
271
|
// embedder's defaultHarness keeps applying until the user decides.
|
|
246
272
|
localStorage.setItem(STORAGE_KEY_HARNESS, h);
|
|
@@ -248,13 +274,16 @@ export function useNewSessionFlow(
|
|
|
248
274
|
const plain = storedModel ? (parseModelKey(storedModel)?.modelId ?? storedModel) : undefined;
|
|
249
275
|
setModelId(plain);
|
|
250
276
|
},
|
|
251
|
-
[],
|
|
277
|
+
[isGuest],
|
|
252
278
|
);
|
|
253
279
|
|
|
254
280
|
// Restore persisted model — only after the registry has loaded so
|
|
255
281
|
// getModel can actually validate the stored ID against live data.
|
|
282
|
+
// Guests skip the restore: modelId stays undefined, the create omits
|
|
283
|
+
// modelName, and the cursor harness resolves it to Auto — a Console-used
|
|
284
|
+
// browser must not leak its stored model into a share/embed session.
|
|
256
285
|
useEffect(() => {
|
|
257
|
-
if (isModelsLoading) return;
|
|
286
|
+
if (isGuest || isModelsLoading) return;
|
|
258
287
|
const stored = localStorage.getItem(modelStorageKey(harness));
|
|
259
288
|
if (stored) {
|
|
260
289
|
const plain = parseModelKey(stored)?.modelId ?? stored;
|
|
@@ -262,16 +291,18 @@ export function useNewSessionFlow(
|
|
|
262
291
|
setModelId(plain);
|
|
263
292
|
}
|
|
264
293
|
}
|
|
265
|
-
}, [getModel, harness, isModelsLoading]);
|
|
294
|
+
}, [getModel, harness, isGuest, isModelsLoading]);
|
|
266
295
|
|
|
267
296
|
// Persist model on change (using current harness key).
|
|
268
297
|
// Strip compound keys (e.g. "cursor/default") to plain modelId before storing.
|
|
298
|
+
// Guests never persist — the symmetric half of the isolation above.
|
|
269
299
|
useEffect(() => {
|
|
300
|
+
if (isGuest) return;
|
|
270
301
|
if (modelId) {
|
|
271
302
|
const plain = parseModelKey(modelId)?.modelId ?? modelId;
|
|
272
303
|
localStorage.setItem(modelStorageKey(harness), plain);
|
|
273
304
|
}
|
|
274
|
-
}, [modelId, harness]);
|
|
305
|
+
}, [modelId, harness, isGuest]);
|
|
275
306
|
|
|
276
307
|
const submit = useCallback(
|
|
277
308
|
async (
|
|
@@ -15,6 +15,17 @@ export interface UsePersistedModelOptions {
|
|
|
15
15
|
* When `"native"` or omitted, the default key and registry apply.
|
|
16
16
|
*/
|
|
17
17
|
readonly harness?: HarnessOption;
|
|
18
|
+
/**
|
|
19
|
+
* When `false`, the hook is a stable no-op: it never reads or writes
|
|
20
|
+
* localStorage and always returns `undefined` with a no-op setter.
|
|
21
|
+
*
|
|
22
|
+
* Guest (share/embed) surfaces disable persistence so a browser previously
|
|
23
|
+
* used in the Console cannot leak its stored model into a guest session,
|
|
24
|
+
* and a guest session never pollutes the Console's preference keys.
|
|
25
|
+
*
|
|
26
|
+
* @default true
|
|
27
|
+
*/
|
|
28
|
+
readonly enabled?: boolean;
|
|
18
29
|
}
|
|
19
30
|
|
|
20
31
|
/** Return value of {@link usePersistedModel}. */
|
|
@@ -60,32 +71,43 @@ export function usePersistedModel(
|
|
|
60
71
|
options?: UsePersistedModelOptions,
|
|
61
72
|
): UsePersistedModelReturn {
|
|
62
73
|
const harness = options?.harness;
|
|
74
|
+
const enabled = options?.enabled ?? true;
|
|
63
75
|
const { getModel } = useModelRegistry({ harness });
|
|
64
76
|
const key = storageKey(harness);
|
|
65
77
|
const prevKeyRef = useRef(key);
|
|
66
78
|
|
|
67
79
|
const [modelId, setModelId] = useState<string | undefined>(() => {
|
|
68
|
-
if (typeof window === "undefined") return undefined;
|
|
80
|
+
if (!enabled || typeof window === "undefined") return undefined;
|
|
69
81
|
const raw = localStorage.getItem(key);
|
|
70
82
|
return raw ? extractPlainModelId(raw) : undefined;
|
|
71
83
|
});
|
|
72
84
|
|
|
73
85
|
// Re-read from localStorage when the storage key changes (harness transition).
|
|
74
86
|
useEffect(() => {
|
|
87
|
+
if (!enabled) return;
|
|
75
88
|
if (prevKeyRef.current === key) return;
|
|
76
89
|
prevKeyRef.current = key;
|
|
77
90
|
|
|
78
91
|
if (typeof window === "undefined") return;
|
|
79
92
|
const raw = localStorage.getItem(key);
|
|
80
93
|
setModelId(raw ? extractPlainModelId(raw) : undefined);
|
|
81
|
-
}, [key]);
|
|
94
|
+
}, [enabled, key]);
|
|
82
95
|
|
|
83
96
|
useEffect(() => {
|
|
97
|
+
if (!enabled) return;
|
|
84
98
|
if (modelId) {
|
|
85
99
|
localStorage.setItem(key, modelId);
|
|
86
100
|
}
|
|
87
|
-
}, [modelId, key]);
|
|
101
|
+
}, [enabled, modelId, key]);
|
|
102
|
+
|
|
103
|
+
if (!enabled) {
|
|
104
|
+
// Stable no-op shape: undefined model, inert setter. Returned after the
|
|
105
|
+
// hooks above so the hook order is identical whether enabled or not.
|
|
106
|
+
return [undefined, NOOP_SET_MODEL] as const;
|
|
107
|
+
}
|
|
88
108
|
|
|
89
109
|
const validModelId = modelId && getModel(modelId) ? modelId : undefined;
|
|
90
110
|
return [validModelId, setModelId] as const;
|
|
91
111
|
}
|
|
112
|
+
|
|
113
|
+
const NOOP_SET_MODEL: (id: string) => void = () => {};
|
|
@@ -249,8 +249,19 @@ export function useSessionPageFlow(
|
|
|
249
249
|
const executionTarget: ExecutionTargetOption | undefined = fromProtoExecutionTarget(
|
|
250
250
|
conv.session?.spec?.executionTarget ?? ExecutionTarget.UNSPECIFIED,
|
|
251
251
|
);
|
|
252
|
-
|
|
253
|
-
|
|
252
|
+
// Guests never read or write the Console's persisted model preference —
|
|
253
|
+
// their follow-ups carry no modelName, and the session's harness (cursor
|
|
254
|
+
// for share surfaces) resolves the model server-side.
|
|
255
|
+
const [persistedModelId, setPersistedModelId] = usePersistedModel({
|
|
256
|
+
harness,
|
|
257
|
+
enabled: !isGuest,
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// Guest note: this stays undefined for guests by construction — guest
|
|
261
|
+
// executions never carry a modelName (the first message omits it and the
|
|
262
|
+
// server-side guest execution profile owns the field thereafter). The
|
|
263
|
+
// guest flow test asserts that invariant; if it ever breaks, fix the
|
|
264
|
+
// server profile rather than special-casing here.
|
|
254
265
|
const lastExecModelId = useMemo(() => {
|
|
255
266
|
const lastExec = conv.completedExecutions.at(-1);
|
|
256
267
|
return lastExec?.spec?.executionConfig?.modelName || undefined;
|