@kortix/sdk 0.11.0 → 0.12.0
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/README.md +110 -73
- package/dist/browser/cache/idb-sync-cache-key.d.ts +2 -0
- package/dist/browser/cache/idb-sync-cache-key.d.ts.map +1 -0
- package/dist/browser/cache/idb-sync-cache-key.js +7 -0
- package/dist/browser/cache/idb-sync-cache-key.js.map +1 -0
- package/dist/browser/cache/idb-sync-cache.d.ts +3 -3
- package/dist/browser/cache/idb-sync-cache.d.ts.map +1 -1
- package/dist/browser/cache/idb-sync-cache.js +49 -26
- package/dist/browser/cache/idb-sync-cache.js.map +1 -1
- package/dist/browser/session-sync/session-cache-ownership.d.ts +36 -0
- package/dist/browser/session-sync/session-cache-ownership.d.ts.map +1 -0
- package/dist/browser/session-sync/session-cache-ownership.js +66 -0
- package/dist/browser/session-sync/session-cache-ownership.js.map +1 -0
- package/dist/browser/session-sync/session-sync-registry.d.ts +8 -6
- package/dist/browser/session-sync/session-sync-registry.d.ts.map +1 -1
- package/dist/browser/session-sync/session-sync-registry.js +86 -33
- package/dist/browser/session-sync/session-sync-registry.js.map +1 -1
- package/dist/browser/session-sync/session-transcript-cache.d.ts +55 -0
- package/dist/browser/session-sync/session-transcript-cache.d.ts.map +1 -0
- package/dist/browser/session-sync/session-transcript-cache.js +69 -0
- package/dist/browser/session-sync/session-transcript-cache.js.map +1 -0
- package/dist/core/client/kortix.d.ts +72 -25
- package/dist/core/client/kortix.d.ts.map +1 -1
- package/dist/core/client/kortix.js +76 -17
- package/dist/core/client/kortix.js.map +1 -1
- package/dist/core/rest/platform-client/host-boundary.d.ts +7 -0
- package/dist/core/rest/platform-client/host-boundary.d.ts.map +1 -1
- package/dist/core/rest/platform-client/host-boundary.js +14 -0
- package/dist/core/rest/platform-client/host-boundary.js.map +1 -1
- package/dist/core/rest/projects-client/access.d.ts +1 -2
- package/dist/core/rest/projects-client/access.d.ts.map +1 -1
- package/dist/core/rest/projects-client/access.js +9 -6
- package/dist/core/rest/projects-client/access.js.map +1 -1
- package/dist/core/rest/projects-client/agent-config.d.ts +15 -7
- package/dist/core/rest/projects-client/agent-config.d.ts.map +1 -1
- package/dist/core/rest/projects-client/agent-config.js +43 -2
- package/dist/core/rest/projects-client/agent-config.js.map +1 -1
- package/dist/core/rest/projects-client/agent-scope.d.ts +4 -0
- package/dist/core/rest/projects-client/agent-scope.d.ts.map +1 -1
- package/dist/core/rest/projects-client/agent-scope.js +34 -1
- package/dist/core/rest/projects-client/agent-scope.js.map +1 -1
- package/dist/core/rest/projects-client/audit.d.ts +34 -0
- package/dist/core/rest/projects-client/audit.d.ts.map +1 -1
- package/dist/core/rest/projects-client/audit.js +49 -4
- package/dist/core/rest/projects-client/audit.js.map +1 -1
- package/dist/core/rest/projects-client/billing.d.ts +26 -14
- package/dist/core/rest/projects-client/billing.d.ts.map +1 -1
- package/dist/core/rest/projects-client/billing.js +4 -5
- package/dist/core/rest/projects-client/billing.js.map +1 -1
- package/dist/core/rest/projects-client/connectors.d.ts +106 -45
- package/dist/core/rest/projects-client/connectors.d.ts.map +1 -1
- package/dist/core/rest/projects-client/connectors.js +95 -58
- package/dist/core/rest/projects-client/connectors.js.map +1 -1
- package/dist/core/rest/projects-client/iam.d.ts +17 -0
- package/dist/core/rest/projects-client/iam.d.ts.map +1 -1
- package/dist/core/rest/projects-client/iam.js +14 -0
- package/dist/core/rest/projects-client/iam.js.map +1 -1
- package/dist/core/rest/projects-client/index.d.ts +1 -0
- package/dist/core/rest/projects-client/index.d.ts.map +1 -1
- package/dist/core/rest/projects-client/index.js +1 -0
- package/dist/core/rest/projects-client/index.js.map +1 -1
- package/dist/core/rest/projects-client/policies.d.ts +18 -0
- package/dist/core/rest/projects-client/policies.d.ts.map +1 -1
- package/dist/core/rest/projects-client/policies.js.map +1 -1
- package/dist/core/rest/projects-client/projects.d.ts +8 -1
- package/dist/core/rest/projects-client/projects.d.ts.map +1 -1
- package/dist/core/rest/projects-client/projects.js.map +1 -1
- package/dist/core/rest/projects-client/sandbox.d.ts +50 -0
- package/dist/core/rest/projects-client/sandbox.d.ts.map +1 -1
- package/dist/core/rest/projects-client/sandbox.js.map +1 -1
- package/dist/core/rest/projects-client/session-costs.d.ts +102 -0
- package/dist/core/rest/projects-client/session-costs.d.ts.map +1 -0
- package/dist/core/rest/projects-client/session-costs.js +25 -0
- package/dist/core/rest/projects-client/session-costs.js.map +1 -0
- package/dist/core/rest/projects-client/session-sandbox.d.ts +0 -2
- package/dist/core/rest/projects-client/session-sandbox.d.ts.map +1 -1
- package/dist/core/rest/projects-client/session-sandbox.js +1 -10
- package/dist/core/rest/projects-client/session-sandbox.js.map +1 -1
- package/dist/core/rest/projects-client/sessions.d.ts +80 -44
- package/dist/core/rest/projects-client/sessions.d.ts.map +1 -1
- package/dist/core/rest/projects-client/sessions.js +9 -15
- package/dist/core/rest/projects-client/sessions.js.map +1 -1
- package/dist/core/rest/projects-client/setup-links.d.ts +37 -0
- package/dist/core/rest/projects-client/setup-links.d.ts.map +1 -1
- package/dist/core/rest/projects-client/setup-links.js +11 -0
- package/dist/core/rest/projects-client/setup-links.js.map +1 -1
- package/dist/core/session/index.d.ts +1 -1
- package/dist/core/session/index.d.ts.map +1 -1
- package/dist/core/session/index.js +1 -1
- package/dist/core/session/index.js.map +1 -1
- package/dist/core/session/preview-auth.d.ts +32 -0
- package/dist/core/session/preview-auth.d.ts.map +1 -0
- package/dist/core/session/preview-auth.js +53 -0
- package/dist/core/session/preview-auth.js.map +1 -0
- package/dist/core/session/server-store/url-helpers.d.ts.map +1 -1
- package/dist/core/session/server-store/url-helpers.js +5 -3
- package/dist/core/session/server-store/url-helpers.js.map +1 -1
- package/dist/core/session-sync/session-sync-controller.d.ts +12 -1
- package/dist/core/session-sync/session-sync-controller.d.ts.map +1 -1
- package/dist/core/session-sync/session-sync-controller.js +34 -2
- package/dist/core/session-sync/session-sync-controller.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/kortix.esm.min.js +19 -24
- package/dist/kortix.global.js +19 -24
- package/dist/platform/auth-core.d.ts +5 -3
- package/dist/platform/auth-core.d.ts.map +1 -1
- package/dist/platform/auth-core.js +6 -4
- package/dist/platform/auth-core.js.map +1 -1
- package/dist/react/index.d.ts +0 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +0 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/model-flatten.d.ts +8 -0
- package/dist/react/model-flatten.d.ts.map +1 -1
- package/dist/react/model-flatten.js +1 -0
- package/dist/react/model-flatten.js.map +1 -1
- package/dist/react/opencode.d.ts +1 -1
- package/dist/react/opencode.d.ts.map +1 -1
- package/dist/react/opencode.js +1 -1
- package/dist/react/opencode.js.map +1 -1
- package/dist/react/session-title-sync.d.ts +9 -5
- package/dist/react/session-title-sync.d.ts.map +1 -1
- package/dist/react/session-title-sync.js +14 -10
- package/dist/react/session-title-sync.js.map +1 -1
- package/dist/react/use-canonical-opencode-session.d.ts +2 -2
- package/dist/react/use-canonical-opencode-session.d.ts.map +1 -1
- package/dist/react/use-model-store.d.ts +6 -14
- package/dist/react/use-model-store.d.ts.map +1 -1
- package/dist/react/use-model-store.js +30 -52
- package/dist/react/use-model-store.js.map +1 -1
- package/dist/react/use-opencode-events/handle-event.d.ts.map +1 -1
- package/dist/react/use-opencode-events/handle-event.js +103 -41
- package/dist/react/use-opencode-events/handle-event.js.map +1 -1
- package/dist/react/use-opencode-sessions/keys.d.ts +3 -1
- package/dist/react/use-opencode-sessions/keys.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/keys.js +2 -0
- package/dist/react/use-opencode-sessions/keys.js.map +1 -1
- package/dist/react/use-opencode-sessions/sessions.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/sessions.js +16 -7
- package/dist/react/use-opencode-sessions/sessions.js.map +1 -1
- package/dist/react/use-opencode-sessions/shared.d.ts +3 -2
- package/dist/react/use-opencode-sessions/shared.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/shared.js +6 -3
- package/dist/react/use-opencode-sessions/shared.js.map +1 -1
- package/dist/react/use-opencode-sessions/sharing.js +2 -2
- package/dist/react/use-opencode-sessions/sharing.js.map +1 -1
- package/dist/react/use-session-sync.d.ts +13 -1
- package/dist/react/use-session-sync.d.ts.map +1 -1
- package/dist/react/use-session-sync.js +85 -17
- package/dist/react/use-session-sync.js.map +1 -1
- package/dist/react/use-session.d.ts +36 -39
- package/dist/react/use-session.d.ts.map +1 -1
- package/dist/react/use-session.js +100 -205
- package/dist/react/use-session.js.map +1 -1
- package/package.json +2 -2
- package/dist/core/acp/client.d.ts +0 -45
- package/dist/core/acp/client.d.ts.map +0 -1
- package/dist/core/acp/client.js +0 -277
- package/dist/core/acp/client.js.map +0 -1
- package/dist/core/acp/index.d.ts +0 -5
- package/dist/core/acp/index.d.ts.map +0 -1
- package/dist/core/acp/index.js +0 -5
- package/dist/core/acp/index.js.map +0 -1
- package/dist/core/acp/projection.d.ts +0 -23
- package/dist/core/acp/projection.d.ts.map +0 -1
- package/dist/core/acp/projection.js +0 -603
- package/dist/core/acp/projection.js.map +0 -1
- package/dist/core/acp/session-controller.d.ts +0 -90
- package/dist/core/acp/session-controller.d.ts.map +0 -1
- package/dist/core/acp/session-controller.js +0 -530
- package/dist/core/acp/session-controller.js.map +0 -1
- package/dist/core/acp/types.d.ts +0 -66
- package/dist/core/acp/types.d.ts.map +0 -1
- package/dist/core/acp/types.js +0 -21
- package/dist/core/acp/types.js.map +0 -1
- package/dist/core/session/runtime-transport.d.ts +0 -16
- package/dist/core/session/runtime-transport.d.ts.map +0 -1
- package/dist/core/session/runtime-transport.js +0 -30
- package/dist/core/session/runtime-transport.js.map +0 -1
- package/dist/react/session-busy.d.ts +0 -8
- package/dist/react/session-busy.d.ts.map +0 -1
- package/dist/react/session-busy.js +0 -4
- package/dist/react/session-busy.js.map +0 -1
- package/dist/react/use-acp-session-runtime.d.ts +0 -34
- package/dist/react/use-acp-session-runtime.d.ts.map +0 -1
- package/dist/react/use-acp-session-runtime.js +0 -84
- package/dist/react/use-acp-session-runtime.js.map +0 -1
- package/dist/react/use-admin-users.d.ts +0 -98
- package/dist/react/use-admin-users.d.ts.map +0 -1
- package/dist/react/use-admin-users.js +0 -121
- package/dist/react/use-admin-users.js.map +0 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks which sandbox currently owns each bare OpenCode session id in the
|
|
3
|
+
* compatibility sync store. OpenCode ids are local to a sandbox. A restored
|
|
4
|
+
* snapshot can therefore expose the same id from two different sandboxes.
|
|
5
|
+
*
|
|
6
|
+
* Two kinds of owner scope exist, and the difference matters:
|
|
7
|
+
*
|
|
8
|
+
* - `kortix:<projectId>/<sessionId>` — AUTHORITATIVE. The consumer was told
|
|
9
|
+
* which Kortix session it is reading, so it survives a sandbox replacement
|
|
10
|
+
* for that session (the transcript is not wiped when the box is re-created).
|
|
11
|
+
* - `runtime:<sandboxId>` — FALLBACK, for a standalone consumer that was given
|
|
12
|
+
* nothing but a bare OpenCode id.
|
|
13
|
+
*
|
|
14
|
+
* The two kinds must never be read as a disagreement. They describe the SAME
|
|
15
|
+
* session from two consumers that simply know different amounts about it, and
|
|
16
|
+
* both live in the one active runtime. Treating that as a collision made the
|
|
17
|
+
* two hooks evict each other: whichever claimed last owned the id, and the
|
|
18
|
+
* other one read an empty transcript for the rest of the page's life.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveSessionCacheOwnerScope(runtimeScope: string, kortixSessionScope?: string): string | null;
|
|
21
|
+
/**
|
|
22
|
+
* Do two owner scopes name genuinely DIFFERENT owners of the same OpenCode id
|
|
23
|
+
* — i.e. is the cached data for this id foreign to the asking consumer?
|
|
24
|
+
*
|
|
25
|
+
* Only two scopes of the same KIND can disagree. That is the real case this
|
|
26
|
+
* module exists to catch: another sandbox (or another Kortix session) reusing
|
|
27
|
+
* an OpenCode id. A fallback scope never contradicts an authoritative one.
|
|
28
|
+
*/
|
|
29
|
+
export declare function sessionCacheOwnerScopesConflict(a: string | null, b: string | null): boolean;
|
|
30
|
+
export declare function getSessionCacheOwnership(sessionId: string): string | null;
|
|
31
|
+
export declare function claimSessionCacheOwnership(sessionId: string, ownerScope: string): {
|
|
32
|
+
changed: boolean;
|
|
33
|
+
previousOwnerScope: string | null;
|
|
34
|
+
};
|
|
35
|
+
export declare function resetSessionCacheOwnership(): void;
|
|
36
|
+
//# sourceMappingURL=session-cache-ownership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-cache-ownership.d.ts","sourceRoot":"","sources":["../../../src/browser/session-sync/session-cache-ownership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAUH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,MAAM,EACpB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,GAAG,IAAI,CAIf;AAED;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAG3F;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEzE;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAgBzD;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks which sandbox currently owns each bare OpenCode session id in the
|
|
3
|
+
* compatibility sync store. OpenCode ids are local to a sandbox. A restored
|
|
4
|
+
* snapshot can therefore expose the same id from two different sandboxes.
|
|
5
|
+
*
|
|
6
|
+
* Two kinds of owner scope exist, and the difference matters:
|
|
7
|
+
*
|
|
8
|
+
* - `kortix:<projectId>/<sessionId>` — AUTHORITATIVE. The consumer was told
|
|
9
|
+
* which Kortix session it is reading, so it survives a sandbox replacement
|
|
10
|
+
* for that session (the transcript is not wiped when the box is re-created).
|
|
11
|
+
* - `runtime:<sandboxId>` — FALLBACK, for a standalone consumer that was given
|
|
12
|
+
* nothing but a bare OpenCode id.
|
|
13
|
+
*
|
|
14
|
+
* The two kinds must never be read as a disagreement. They describe the SAME
|
|
15
|
+
* session from two consumers that simply know different amounts about it, and
|
|
16
|
+
* both live in the one active runtime. Treating that as a collision made the
|
|
17
|
+
* two hooks evict each other: whichever claimed last owned the id, and the
|
|
18
|
+
* other one read an empty transcript for the rest of the page's life.
|
|
19
|
+
*/
|
|
20
|
+
const owners = new Map();
|
|
21
|
+
const AUTHORITATIVE_PREFIX = 'kortix:';
|
|
22
|
+
function isAuthoritative(ownerScope) {
|
|
23
|
+
return ownerScope.startsWith(AUTHORITATIVE_PREFIX);
|
|
24
|
+
}
|
|
25
|
+
export function resolveSessionCacheOwnerScope(runtimeScope, kortixSessionScope) {
|
|
26
|
+
if (kortixSessionScope)
|
|
27
|
+
return `${AUTHORITATIVE_PREFIX}${kortixSessionScope}`;
|
|
28
|
+
if (!runtimeScope || runtimeScope === 'none')
|
|
29
|
+
return null;
|
|
30
|
+
return `runtime:${runtimeScope}`;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Do two owner scopes name genuinely DIFFERENT owners of the same OpenCode id
|
|
34
|
+
* — i.e. is the cached data for this id foreign to the asking consumer?
|
|
35
|
+
*
|
|
36
|
+
* Only two scopes of the same KIND can disagree. That is the real case this
|
|
37
|
+
* module exists to catch: another sandbox (or another Kortix session) reusing
|
|
38
|
+
* an OpenCode id. A fallback scope never contradicts an authoritative one.
|
|
39
|
+
*/
|
|
40
|
+
export function sessionCacheOwnerScopesConflict(a, b) {
|
|
41
|
+
if (!a || !b || a === b)
|
|
42
|
+
return false;
|
|
43
|
+
return isAuthoritative(a) === isAuthoritative(b);
|
|
44
|
+
}
|
|
45
|
+
export function getSessionCacheOwnership(sessionId) {
|
|
46
|
+
return owners.get(sessionId) ?? null;
|
|
47
|
+
}
|
|
48
|
+
export function claimSessionCacheOwnership(sessionId, ownerScope) {
|
|
49
|
+
const previousOwnerScope = getSessionCacheOwnership(sessionId);
|
|
50
|
+
if (previousOwnerScope === ownerScope) {
|
|
51
|
+
return { changed: false, previousOwnerScope };
|
|
52
|
+
}
|
|
53
|
+
// A fallback claim never displaces an authoritative one — the consumer that
|
|
54
|
+
// knows which Kortix session this is stays the owner of record.
|
|
55
|
+
if (previousOwnerScope !== null &&
|
|
56
|
+
!isAuthoritative(ownerScope) &&
|
|
57
|
+
isAuthoritative(previousOwnerScope)) {
|
|
58
|
+
return { changed: false, previousOwnerScope };
|
|
59
|
+
}
|
|
60
|
+
owners.set(sessionId, ownerScope);
|
|
61
|
+
return { changed: true, previousOwnerScope };
|
|
62
|
+
}
|
|
63
|
+
export function resetSessionCacheOwnership() {
|
|
64
|
+
owners.clear();
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=session-cache-ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-cache-ownership.js","sourceRoot":"","sources":["../../../src/browser/session-sync/session-cache-ownership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEzC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAEvC,SAAS,eAAe,CAAC,UAAkB;IACzC,OAAO,UAAU,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,YAAoB,EACpB,kBAA2B;IAE3B,IAAI,kBAAkB;QAAE,OAAO,GAAG,oBAAoB,GAAG,kBAAkB,EAAE,CAAC;IAC9E,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC1D,OAAO,WAAW,YAAY,EAAE,CAAC;AACnC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,+BAA+B,CAAC,CAAgB,EAAE,CAAgB;IAChF,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,eAAe,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,SAAiB;IACxD,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,SAAiB,EACjB,UAAkB;IAElB,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAC/D,IAAI,kBAAkB,KAAK,UAAU,EAAE,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAChD,CAAC;IACD,4EAA4E;IAC5E,gEAAgE;IAChE,IACE,kBAAkB,KAAK,IAAI;QAC3B,CAAC,eAAe,CAAC,UAAU,CAAC;QAC5B,eAAe,CAAC,kBAAkB,CAAC,EACnC,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAChD,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,MAAM,CAAC,KAAK,EAAE,CAAC;AACjB,CAAC"}
|
|
@@ -25,18 +25,20 @@ export declare function readSessionMessagePage(client: SessionMessageClient, ses
|
|
|
25
25
|
limit: number;
|
|
26
26
|
before?: string;
|
|
27
27
|
}): Promise<SessionSyncPage>;
|
|
28
|
-
export declare function getSessionSyncController(sessionId: string, client?: SessionMessageClient): SessionSyncController;
|
|
28
|
+
export declare function getSessionSyncController(sessionId: string, client?: SessionMessageClient, runtimeScope?: string): SessionSyncController;
|
|
29
29
|
export declare function prefetchSessionSyncOnce(sessionId: string, source: SessionPrefetchSource, client?: SessionMessageClient): Promise<boolean>;
|
|
30
30
|
export declare function clearActiveSessionPrefetches(): void;
|
|
31
|
-
export declare function retainSessionSyncController(sessionId: string): () => void;
|
|
32
|
-
export declare function reconcileSessionTail(sessionId: string, reason: SessionSyncReason): Promise<void>;
|
|
33
|
-
export declare function beginSessionPromptObservation(sessionId: string): void;
|
|
34
|
-
export declare function endSessionPromptObservation(sessionId: string): void;
|
|
31
|
+
export declare function retainSessionSyncController(sessionId: string, runtimeScope?: string): () => void;
|
|
32
|
+
export declare function reconcileSessionTail(sessionId: string, reason: SessionSyncReason, runtimeScope?: string): Promise<void>;
|
|
33
|
+
export declare function beginSessionPromptObservation(sessionId: string, runtimeScope?: string): void;
|
|
34
|
+
export declare function endSessionPromptObservation(sessionId: string, runtimeScope?: string): void;
|
|
35
35
|
export declare function loadSessionTranscriptMessages(sessionId: string): Promise<SessionSyncPage['messages']>;
|
|
36
36
|
export declare function noteSessionSyncEvent(event: {
|
|
37
37
|
type?: string;
|
|
38
|
-
properties
|
|
38
|
+
properties?: unknown;
|
|
39
39
|
}): void;
|
|
40
40
|
export declare function resetSessionSyncControllers(): void;
|
|
41
|
+
/** Retire controllers for one wire id after a different sandbox claims it. */
|
|
42
|
+
export declare function resetSessionSyncControllersForSession(sessionId: string, keepRuntimeScope?: string): void;
|
|
41
43
|
export {};
|
|
42
44
|
//# sourceMappingURL=session-sync-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-sync-registry.d.ts","sourceRoot":"","sources":["../../../src/browser/session-sync/session-sync-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"session-sync-registry.d.ts","sourceRoot":"","sources":["../../../src/browser/session-sync/session-sync-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE/E,OAAO,EACL,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAGvB,MAAM,iDAAiD,CAAC;AAIzD,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,IAAI,EAAE,CAAA;KAAE,CAAC,CAAC;IAC/C,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,UAAU,oBAAoB;IAC5B,OAAO,EAAE;QACP,QAAQ,EAAE,CAAC,OAAO,EAAE;YAClB,SAAS,EAAE,MAAM,CAAC;YAClB,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAChC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;SAAE,CAAC,CAAC;KAClE,CAAC;CACH;AAED,eAAO,MAAM,8BAA8B,eAAoC,CAAC;AAChF,KAAK,qBAAqB,GAAG,MAAM,GAAG,OAAO,8BAA8B,CAAC;AA4C5E,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,eAAe,CAAC,CAU1B;AAwED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,oBAAoB,EAC7B,YAAY,CAAC,EAAE,MAAM,GACpB,qBAAqB,CAKvB;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,qBAAqB,EAC7B,MAAM,CAAC,EAAE,oBAAoB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAiBlB;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAMnD;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAoBhG;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,iBAAiB,EACzB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAW5F;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAE1F;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAItC;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,IAAI,CA8BP;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAGlD;AAED,8EAA8E;AAC9E,wBAAgB,qCAAqC,CACnD,SAAS,EAAE,MAAM,EACjB,gBAAgB,CAAC,EAAE,MAAM,GACxB,IAAI,CAMN"}
|
|
@@ -1,9 +1,36 @@
|
|
|
1
|
-
import { useSyncStore } from '../stores/sync-store.js';
|
|
2
1
|
import { getClient } from '../../core/runtime/client.js';
|
|
3
2
|
import { SessionSyncController, loadCompleteSessionHistory, } from '../../core/session-sync/session-sync-controller.js';
|
|
3
|
+
import { getCurrentRuntimeSandboxId } from '../../core/session/current-runtime.js';
|
|
4
|
+
import { useSyncStore } from '../stores/sync-store.js';
|
|
4
5
|
export const ACTIVE_SESSION_PREFETCH_SOURCE = Symbol('active-session-prefetch');
|
|
5
6
|
const MAX_CONTROLLERS = 20;
|
|
6
7
|
const controllers = new Map();
|
|
8
|
+
function runtimeScopeKey(runtimeScope) {
|
|
9
|
+
return runtimeScope ?? getCurrentRuntimeSandboxId() ?? 'none';
|
|
10
|
+
}
|
|
11
|
+
function controllerKey(sessionId, runtimeScope) {
|
|
12
|
+
return `${runtimeScopeKey(runtimeScope)}\n${sessionId}`;
|
|
13
|
+
}
|
|
14
|
+
function findExistingSessionEntry(sessionId, runtimeScope) {
|
|
15
|
+
const exact = controllers.get(controllerKey(sessionId, runtimeScope));
|
|
16
|
+
if (exact)
|
|
17
|
+
return exact;
|
|
18
|
+
// During a React runtime switch, the framework-free current-runtime store can
|
|
19
|
+
// be briefly unbound while the session's sandbox-scoped controller remains
|
|
20
|
+
// mounted. Reuse that controller only when the wire id has one unambiguous
|
|
21
|
+
// owner. Never route across multiple sandboxes that contain the same id.
|
|
22
|
+
if (runtimeScopeKey(runtimeScope) !== 'none')
|
|
23
|
+
return undefined;
|
|
24
|
+
let match;
|
|
25
|
+
for (const entry of controllers.values()) {
|
|
26
|
+
if (entry.sessionId !== sessionId)
|
|
27
|
+
continue;
|
|
28
|
+
if (match)
|
|
29
|
+
return undefined;
|
|
30
|
+
match = entry;
|
|
31
|
+
}
|
|
32
|
+
return match;
|
|
33
|
+
}
|
|
7
34
|
export async function readSessionMessagePage(client, sessionId, request) {
|
|
8
35
|
const result = await client.session.messages({
|
|
9
36
|
sessionID: sessionId,
|
|
@@ -18,15 +45,15 @@ export async function readSessionMessagePage(client, sessionId, request) {
|
|
|
18
45
|
function reportTelemetry(sessionId, event) {
|
|
19
46
|
console.debug('[session-sync]', { sessionId, ...event });
|
|
20
47
|
}
|
|
21
|
-
function resolveClient(
|
|
22
|
-
return controllers.get(
|
|
48
|
+
function resolveClient(key) {
|
|
49
|
+
return controllers.get(key)?.client ?? getClient();
|
|
23
50
|
}
|
|
24
|
-
function createController(sessionId) {
|
|
51
|
+
function createController(sessionId, key) {
|
|
25
52
|
return new SessionSyncController({
|
|
26
53
|
sessionId,
|
|
27
|
-
loadPage: (request) => readSessionMessagePage(resolveClient(
|
|
54
|
+
loadPage: (request) => readSessionMessagePage(resolveClient(key), sessionId, request),
|
|
28
55
|
loadStatus: async () => {
|
|
29
|
-
const loadStatus = resolveClient(
|
|
56
|
+
const loadStatus = resolveClient(key).session.status;
|
|
30
57
|
if (!loadStatus)
|
|
31
58
|
return { type: 'idle' };
|
|
32
59
|
const result = await loadStatus();
|
|
@@ -41,55 +68,61 @@ function createController(sessionId) {
|
|
|
41
68
|
state.hydrate(sessionId, []);
|
|
42
69
|
},
|
|
43
70
|
setStatus: (status) => {
|
|
44
|
-
controllers.get(
|
|
71
|
+
controllers.get(key)?.controller.observePromptStatus(status);
|
|
45
72
|
useSyncStore.getState().setStatus(sessionId, status);
|
|
46
73
|
},
|
|
47
74
|
onTelemetry: (event) => reportTelemetry(sessionId, event),
|
|
48
75
|
});
|
|
49
76
|
}
|
|
50
|
-
function evictInactiveControllers(
|
|
77
|
+
function evictInactiveControllers(protectedKey) {
|
|
51
78
|
if (controllers.size <= MAX_CONTROLLERS)
|
|
52
79
|
return;
|
|
53
80
|
const inactive = [...controllers.entries()]
|
|
54
|
-
.filter(([
|
|
81
|
+
.filter(([key, entry]) => entry.consumers === 0 && key !== protectedKey)
|
|
55
82
|
.sort((a, b) => a[1].lastUsedAt - b[1].lastUsedAt);
|
|
56
|
-
for (const [
|
|
83
|
+
for (const [key, entry] of inactive) {
|
|
57
84
|
entry.controller.destroy();
|
|
58
|
-
controllers.delete(
|
|
85
|
+
controllers.delete(key);
|
|
59
86
|
if (controllers.size <= MAX_CONTROLLERS)
|
|
60
87
|
return;
|
|
61
88
|
}
|
|
62
89
|
}
|
|
63
|
-
function getOrCreateRegistryEntry(sessionId, client, initialConsumers = 0) {
|
|
64
|
-
const
|
|
90
|
+
function getOrCreateRegistryEntry(sessionId, client, initialConsumers = 0, runtimeScope) {
|
|
91
|
+
const key = controllerKey(sessionId, runtimeScope);
|
|
92
|
+
const existing = controllers.get(key);
|
|
65
93
|
if (existing) {
|
|
66
94
|
existing.client = client;
|
|
67
95
|
existing.lastUsedAt = Date.now();
|
|
68
96
|
return existing;
|
|
69
97
|
}
|
|
70
98
|
const entry = {
|
|
71
|
-
|
|
99
|
+
sessionId,
|
|
100
|
+
runtimeScope: runtimeScopeKey(runtimeScope),
|
|
101
|
+
controller: createController(sessionId, key),
|
|
72
102
|
client,
|
|
73
103
|
consumers: initialConsumers,
|
|
74
104
|
lastUsedAt: Date.now(),
|
|
75
105
|
};
|
|
76
|
-
controllers.set(
|
|
106
|
+
controllers.set(key, entry);
|
|
77
107
|
return entry;
|
|
78
108
|
}
|
|
79
|
-
export function getSessionSyncController(sessionId, client) {
|
|
80
|
-
const
|
|
81
|
-
|
|
109
|
+
export function getSessionSyncController(sessionId, client, runtimeScope) {
|
|
110
|
+
const key = controllerKey(sessionId, runtimeScope);
|
|
111
|
+
const entry = getOrCreateRegistryEntry(sessionId, client, 0, runtimeScope);
|
|
112
|
+
evictInactiveControllers(key);
|
|
82
113
|
return entry.controller;
|
|
83
114
|
}
|
|
84
115
|
export async function prefetchSessionSyncOnce(sessionId, source, client) {
|
|
85
|
-
const
|
|
86
|
-
const
|
|
87
|
-
|
|
116
|
+
const runtimeScope = source === ACTIVE_SESSION_PREFETCH_SOURCE ? runtimeScopeKey() : source;
|
|
117
|
+
const key = controllerKey(sessionId, runtimeScope);
|
|
118
|
+
const existing = controllers.get(key);
|
|
119
|
+
const entry = getOrCreateRegistryEntry(sessionId, existing?.consumers ? undefined : client, 0, runtimeScope);
|
|
120
|
+
evictInactiveControllers(key);
|
|
88
121
|
if (entry.prefetchedSource === source)
|
|
89
122
|
return true;
|
|
90
123
|
await entry.controller.reconcile('manual');
|
|
91
124
|
const succeeded = entry.controller.getSnapshot().freshness === 'fresh';
|
|
92
|
-
const current = controllers.get(
|
|
125
|
+
const current = controllers.get(key);
|
|
93
126
|
if (succeeded && current === entry)
|
|
94
127
|
current.prefetchedSource = source;
|
|
95
128
|
return succeeded;
|
|
@@ -101,20 +134,21 @@ export function clearActiveSessionPrefetches() {
|
|
|
101
134
|
}
|
|
102
135
|
}
|
|
103
136
|
}
|
|
104
|
-
export function retainSessionSyncController(sessionId) {
|
|
105
|
-
|
|
137
|
+
export function retainSessionSyncController(sessionId, runtimeScope) {
|
|
138
|
+
const key = controllerKey(sessionId, runtimeScope);
|
|
139
|
+
let entry = controllers.get(key);
|
|
106
140
|
if (entry) {
|
|
107
141
|
entry.client = undefined;
|
|
108
142
|
entry.consumers += 1;
|
|
109
143
|
entry.lastUsedAt = Date.now();
|
|
110
144
|
}
|
|
111
145
|
else {
|
|
112
|
-
entry = getOrCreateRegistryEntry(sessionId, undefined, 1);
|
|
146
|
+
entry = getOrCreateRegistryEntry(sessionId, undefined, 1, runtimeScope);
|
|
113
147
|
}
|
|
114
148
|
evictInactiveControllers();
|
|
115
149
|
const controller = entry.controller;
|
|
116
150
|
return () => {
|
|
117
|
-
const current = controllers.get(
|
|
151
|
+
const current = controllers.get(key);
|
|
118
152
|
if (!current || current.controller !== controller)
|
|
119
153
|
return;
|
|
120
154
|
current.consumers = Math.max(0, current.consumers - 1);
|
|
@@ -124,19 +158,29 @@ export function retainSessionSyncController(sessionId) {
|
|
|
124
158
|
evictInactiveControllers();
|
|
125
159
|
};
|
|
126
160
|
}
|
|
127
|
-
export function reconcileSessionTail(sessionId, reason) {
|
|
128
|
-
return getSessionSyncController(sessionId).reconcile(reason);
|
|
161
|
+
export function reconcileSessionTail(sessionId, reason, runtimeScope) {
|
|
162
|
+
return getSessionSyncController(sessionId, undefined, runtimeScope).reconcile(reason);
|
|
129
163
|
}
|
|
130
|
-
export function beginSessionPromptObservation(sessionId) {
|
|
131
|
-
|
|
164
|
+
export function beginSessionPromptObservation(sessionId, runtimeScope) {
|
|
165
|
+
const existing = findExistingSessionEntry(sessionId, runtimeScope);
|
|
166
|
+
if (existing) {
|
|
167
|
+
existing.controller.beginPromptObservation();
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const hasAmbiguousOwner = [...controllers.values()].some((entry) => entry.sessionId === sessionId);
|
|
171
|
+
if (runtimeScopeKey(runtimeScope) === 'none' && hasAmbiguousOwner)
|
|
172
|
+
return;
|
|
173
|
+
getSessionSyncController(sessionId, undefined, runtimeScope).beginPromptObservation();
|
|
132
174
|
}
|
|
133
|
-
export function endSessionPromptObservation(sessionId) {
|
|
134
|
-
|
|
175
|
+
export function endSessionPromptObservation(sessionId, runtimeScope) {
|
|
176
|
+
findExistingSessionEntry(sessionId, runtimeScope)?.controller.endPromptObservation();
|
|
135
177
|
}
|
|
136
178
|
export function loadSessionTranscriptMessages(sessionId) {
|
|
137
179
|
return loadCompleteSessionHistory((request) => readSessionMessagePage(getClient(), sessionId, request));
|
|
138
180
|
}
|
|
139
181
|
export function noteSessionSyncEvent(event) {
|
|
182
|
+
if (!event.properties || typeof event.properties !== 'object')
|
|
183
|
+
return;
|
|
140
184
|
const properties = event.properties;
|
|
141
185
|
const info = properties.info;
|
|
142
186
|
const part = properties.part;
|
|
@@ -145,7 +189,7 @@ export function noteSessionSyncEvent(event) {
|
|
|
145
189
|
part?.sessionID;
|
|
146
190
|
if (!sessionId)
|
|
147
191
|
return;
|
|
148
|
-
const controller =
|
|
192
|
+
const controller = findExistingSessionEntry(sessionId)?.controller;
|
|
149
193
|
if (!controller)
|
|
150
194
|
return;
|
|
151
195
|
controller.noteActivity();
|
|
@@ -172,4 +216,13 @@ export function resetSessionSyncControllers() {
|
|
|
172
216
|
entry.controller.destroy();
|
|
173
217
|
controllers.clear();
|
|
174
218
|
}
|
|
219
|
+
/** Retire controllers for one wire id after a different sandbox claims it. */
|
|
220
|
+
export function resetSessionSyncControllersForSession(sessionId, keepRuntimeScope) {
|
|
221
|
+
for (const [key, entry] of controllers) {
|
|
222
|
+
if (entry.sessionId !== sessionId || entry.runtimeScope === keepRuntimeScope)
|
|
223
|
+
continue;
|
|
224
|
+
entry.controller.destroy();
|
|
225
|
+
controllers.delete(key);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
175
228
|
//# sourceMappingURL=session-sync-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-sync-registry.js","sourceRoot":"","sources":["../../../src/browser/session-sync/session-sync-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"session-sync-registry.js","sourceRoot":"","sources":["../../../src/browser/session-sync/session-sync-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EACL,qBAAqB,EAIrB,0BAA0B,GAC3B,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAkBpD,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAahF,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;AAErD,SAAS,eAAe,CAAC,YAAqB;IAC5C,OAAO,YAAY,IAAI,0BAA0B,EAAE,IAAI,MAAM,CAAC;AAChE,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB,EAAE,YAAqB;IAC7D,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,KAAK,SAAS,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,wBAAwB,CAC/B,SAAiB,EACjB,YAAqB;IAErB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IACtE,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,8EAA8E;IAC9E,2EAA2E;IAC3E,2EAA2E;IAC3E,yEAAyE;IACzE,IAAI,eAAe,CAAC,YAAY,CAAC,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAC/D,IAAI,KAAgC,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;YAAE,SAAS;QAC5C,IAAI,KAAK;YAAE,OAAO,SAAS,CAAC;QAC5B,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAA4B,EAC5B,SAAiB,EACjB,OAA2C;IAE3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC3C,SAAS,EAAE,SAAS;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC,CAAC;IACH,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;QAC3B,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,SAAS;KACvE,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,SAAiB,EAAE,KAAgC;IAC1E,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB,EAAE,GAAW;IACtD,OAAO,IAAI,qBAAqB,CAAC;QAC/B,SAAS;QACT,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC;QACrF,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YACrD,IAAI,CAAC,UAAU;gBAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAmB,CAAC;YAC1D,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;YAClC,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,IAAK,EAAE,IAAI,EAAE,MAAM,EAAoB,CAAC;QACzE,CAAC;QACD,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;YACpB,YAAY,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACvD,CAAC;QACD,UAAU,EAAE,GAAG,EAAE;YACf,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC;gBAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YACpB,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC7D,YAAY,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QACD,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC;KAC1D,CAAC,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB,CAAC,YAAqB;IACrD,IAAI,WAAW,CAAC,IAAI,IAAI,eAAe;QAAE,OAAO;IAChD,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;SACxC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,CAAC,IAAI,GAAG,KAAK,YAAY,CAAC;SACvE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACrD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;QACpC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC3B,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,WAAW,CAAC,IAAI,IAAI,eAAe;YAAE,OAAO;IAClD,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,SAAiB,EACjB,MAA6B,EAC7B,gBAAgB,GAAG,CAAC,EACpB,YAAqB;IAErB,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAkB;QAC3B,SAAS;QACT,YAAY,EAAE,eAAe,CAAC,YAAY,CAAC;QAC3C,UAAU,EAAE,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC;QAC5C,MAAM;QACN,SAAS,EAAE,gBAAgB;QAC3B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;KACvB,CAAC;IACF,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,SAAiB,EACjB,MAA6B,EAC7B,YAAqB;IAErB,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;IAC3E,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,UAAU,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAiB,EACjB,MAA6B,EAC7B,MAA6B;IAE7B,MAAM,YAAY,GAAG,MAAM,KAAK,8BAA8B,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5F,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,wBAAwB,CACpC,SAAS,EACT,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EACxC,CAAC,EACD,YAAY,CACb,CAAC;IACF,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,gBAAgB,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,SAAS,KAAK,OAAO,CAAC;IACvE,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,SAAS,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,CAAC,gBAAgB,GAAG,MAAM,CAAC;IACtE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC1C,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,gBAAgB,KAAK,8BAA8B,EAAE,CAAC;YAC9D,KAAK,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACrC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,SAAiB,EAAE,YAAqB;IAClF,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnD,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;QACzB,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC;QACrB,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,wBAAwB,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;IAC1E,CAAC;IACD,wBAAwB,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACpC,OAAO,GAAG,EAAE;QACV,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU;YAAE,OAAO;QAC1D,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,SAAS,KAAK,CAAC;YAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvD,wBAAwB,EAAE,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,MAAyB,EACzB,YAAqB;IAErB,OAAO,wBAAwB,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,SAAiB,EAAE,YAAqB;IACpF,MAAM,QAAQ,GAAG,wBAAwB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnE,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,MAAM,iBAAiB,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CACtD,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CACzC,CAAC;IACF,IAAI,eAAe,CAAC,YAAY,CAAC,KAAK,MAAM,IAAI,iBAAiB;QAAE,OAAO;IAC1E,wBAAwB,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,sBAAsB,EAAE,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,SAAiB,EAAE,YAAqB;IAClF,wBAAwB,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,oBAAoB,EAAE,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,SAAiB;IAEjB,OAAO,0BAA0B,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5C,sBAAsB,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CACxD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAGpC;IACC,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO;IACtE,MAAM,UAAU,GAAG,KAAK,CAAC,UAAqC,CAAC;IAC/D,MAAM,IAAI,GAAG,UAAU,CAAC,IAAyD,CAAC;IAClF,MAAM,IAAI,GAAG,UAAU,CAAC,IAA0C,CAAC;IACnE,MAAM,SAAS,GACb,CAAC,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,IAAI,UAAU,CAAC,SAAS,CAAC;QAClE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS,CAAC;IAClB,IAAI,CAAC,SAAS;QAAE,OAAO;IACvB,MAAM,UAAU,GAAG,wBAAwB,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC;IACnE,IAAI,CAAC,UAAU;QAAE,OAAO;IACxB,UAAU,CAAC,YAAY,EAAE,CAAC;IAE1B,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAmC,CAAC;QAC9D,IAAI,MAAM;YAAE,UAAU,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAClC,UAAU,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,UAAU,CAAC,oBAAoB,EAAE,CAAC;QAClC,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,IAAI,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;QACnE,UAAU,CAAC,qBAAqB,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IACrE,WAAW,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,qCAAqC,CACnD,SAAiB,EACjB,gBAAyB;IAEzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,YAAY,KAAK,gBAAgB;YAAE,SAAS;QACvF,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC3B,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local transcript cache — the reason a session can paint before its sandbox
|
|
3
|
+
* is awake.
|
|
4
|
+
*
|
|
5
|
+
* Reading a transcript used to be gated on booting a VM: the messages live on
|
|
6
|
+
* the opencode runtime *inside* the session's sandbox, reachable only through
|
|
7
|
+
* `/p/{externalId}/…`, so opening a hibernated session meant waiting out the
|
|
8
|
+
* whole `/start` wake before a single word appeared. The transcript is already
|
|
9
|
+
* settled history; it does not need a running machine to be shown.
|
|
10
|
+
*
|
|
11
|
+
* So: mirror the tail into IndexedDB as it arrives, and hydrate straight back
|
|
12
|
+
* out of it on open. The live runtime still reconciles behind it — this only
|
|
13
|
+
* changes WHEN the user sees what is already theirs, never what is true.
|
|
14
|
+
*/
|
|
15
|
+
import type { Message, Part } from '@opencode-ai/sdk/v2/client';
|
|
16
|
+
export interface CachedTranscript {
|
|
17
|
+
messages: Message[];
|
|
18
|
+
parts: Record<string, Part[]>;
|
|
19
|
+
}
|
|
20
|
+
interface TranscriptStoreSlice {
|
|
21
|
+
messages: Record<string, Message[]>;
|
|
22
|
+
parts: Record<string, Part[]>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Pull one session's messages, plus only the parts belonging to them, out of
|
|
26
|
+
* the (globally part-keyed) sync store. Returns null when there is nothing
|
|
27
|
+
* worth persisting — an absent session and an empty one are the same to a
|
|
28
|
+
* cache whose entire job is having something to show.
|
|
29
|
+
*/
|
|
30
|
+
export declare function selectSessionTranscript(state: TranscriptStoreSlice, sessionId: string): CachedTranscript | null;
|
|
31
|
+
/** Reshape a cached transcript into the `{ info, parts }` rows `hydrate` takes. */
|
|
32
|
+
export declare function toHydrateEntries(transcript: CachedTranscript): Array<{
|
|
33
|
+
info: Message;
|
|
34
|
+
parts: Part[];
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* The cache is a first-paint accelerator, never a source of truth. Once the
|
|
38
|
+
* store holds anything for this session — from SSE, an optimistic send, or a
|
|
39
|
+
* completed reconcile — it outranks whatever is on disk, so hydrating again
|
|
40
|
+
* could only ever move the transcript backwards.
|
|
41
|
+
*/
|
|
42
|
+
export declare function shouldHydrateFromCache(input: {
|
|
43
|
+
storeHasSession: boolean;
|
|
44
|
+
cachedMessageCount: number;
|
|
45
|
+
}): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Read this session's cached transcript. Resolves to null when there is no
|
|
48
|
+
* usable entry — the caller then simply waits for the runtime, exactly as
|
|
49
|
+
* before this cache existed.
|
|
50
|
+
*/
|
|
51
|
+
export declare function readCachedTranscript(sessionId: string, kortixSessionScope?: string): Promise<CachedTranscript | null>;
|
|
52
|
+
/** Mirror the session's current tail to disk. Debounced inside the IDB layer. */
|
|
53
|
+
export declare function writeCachedTranscript(state: TranscriptStoreSlice, sessionId: string, kortixSessionScope?: string): Promise<void>;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=session-transcript-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-transcript-cache.d.ts","sourceRoot":"","sources":["../../../src/browser/session-sync/session-transcript-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAIhE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;CAC/B;AAED,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,oBAAoB,EAC3B,SAAS,EAAE,MAAM,GAChB,gBAAgB,GAAG,IAAI,CASzB;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,gBAAgB,GAC3B,KAAK,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,CAIzC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,GAAG,OAAO,CAGV;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAIlC;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,oBAAoB,EAC3B,SAAS,EAAE,MAAM,EACjB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local transcript cache — the reason a session can paint before its sandbox
|
|
3
|
+
* is awake.
|
|
4
|
+
*
|
|
5
|
+
* Reading a transcript used to be gated on booting a VM: the messages live on
|
|
6
|
+
* the opencode runtime *inside* the session's sandbox, reachable only through
|
|
7
|
+
* `/p/{externalId}/…`, so opening a hibernated session meant waiting out the
|
|
8
|
+
* whole `/start` wake before a single word appeared. The transcript is already
|
|
9
|
+
* settled history; it does not need a running machine to be shown.
|
|
10
|
+
*
|
|
11
|
+
* So: mirror the tail into IndexedDB as it arrives, and hydrate straight back
|
|
12
|
+
* out of it on open. The live runtime still reconciles behind it — this only
|
|
13
|
+
* changes WHEN the user sees what is already theirs, never what is true.
|
|
14
|
+
*/
|
|
15
|
+
import { loadSessionFromIDB, saveSessionToIDB } from '../cache/idb-sync-cache.js';
|
|
16
|
+
/**
|
|
17
|
+
* Pull one session's messages, plus only the parts belonging to them, out of
|
|
18
|
+
* the (globally part-keyed) sync store. Returns null when there is nothing
|
|
19
|
+
* worth persisting — an absent session and an empty one are the same to a
|
|
20
|
+
* cache whose entire job is having something to show.
|
|
21
|
+
*/
|
|
22
|
+
export function selectSessionTranscript(state, sessionId) {
|
|
23
|
+
const messages = state.messages[sessionId];
|
|
24
|
+
if (!messages || messages.length === 0)
|
|
25
|
+
return null;
|
|
26
|
+
const parts = {};
|
|
27
|
+
for (const message of messages) {
|
|
28
|
+
if (!message?.id)
|
|
29
|
+
continue;
|
|
30
|
+
parts[message.id] = state.parts[message.id] ?? [];
|
|
31
|
+
}
|
|
32
|
+
return { messages, parts };
|
|
33
|
+
}
|
|
34
|
+
/** Reshape a cached transcript into the `{ info, parts }` rows `hydrate` takes. */
|
|
35
|
+
export function toHydrateEntries(transcript) {
|
|
36
|
+
return (transcript.messages ?? [])
|
|
37
|
+
.filter((message) => !!message?.id)
|
|
38
|
+
.map((message) => ({ info: message, parts: transcript.parts?.[message.id] ?? [] }));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The cache is a first-paint accelerator, never a source of truth. Once the
|
|
42
|
+
* store holds anything for this session — from SSE, an optimistic send, or a
|
|
43
|
+
* completed reconcile — it outranks whatever is on disk, so hydrating again
|
|
44
|
+
* could only ever move the transcript backwards.
|
|
45
|
+
*/
|
|
46
|
+
export function shouldHydrateFromCache(input) {
|
|
47
|
+
if (input.storeHasSession)
|
|
48
|
+
return false;
|
|
49
|
+
return input.cachedMessageCount > 0;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Read this session's cached transcript. Resolves to null when there is no
|
|
53
|
+
* usable entry — the caller then simply waits for the runtime, exactly as
|
|
54
|
+
* before this cache existed.
|
|
55
|
+
*/
|
|
56
|
+
export async function readCachedTranscript(sessionId, kortixSessionScope) {
|
|
57
|
+
const cached = await loadSessionFromIDB(sessionId, kortixSessionScope);
|
|
58
|
+
if (!cached || !Array.isArray(cached.messages) || cached.messages.length === 0)
|
|
59
|
+
return null;
|
|
60
|
+
return { messages: cached.messages, parts: cached.parts ?? {} };
|
|
61
|
+
}
|
|
62
|
+
/** Mirror the session's current tail to disk. Debounced inside the IDB layer. */
|
|
63
|
+
export function writeCachedTranscript(state, sessionId, kortixSessionScope) {
|
|
64
|
+
const transcript = selectSessionTranscript(state, sessionId);
|
|
65
|
+
if (!transcript)
|
|
66
|
+
return Promise.resolve();
|
|
67
|
+
return saveSessionToIDB(sessionId, transcript.messages, transcript.parts, kortixSessionScope);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=session-transcript-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-transcript-cache.js","sourceRoot":"","sources":["../../../src/browser/session-sync/session-transcript-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAY/E;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAA2B,EAC3B,SAAiB;IAEjB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,EAAE,EAAE;YAAE,SAAS;QAC3B,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,gBAAgB,CAC9B,UAA4B;IAE5B,OAAO,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;SAC/B,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;SAClC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACxF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAGtC;IACC,IAAI,KAAK,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,SAAiB,EACjB,kBAA2B;IAE3B,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACvE,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5F,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;AAClE,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CACnC,KAA2B,EAC3B,SAAiB,EACjB,kBAA2B;IAE3B,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1C,OAAO,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;AAChG,CAAC"}
|