@kortix/sdk 0.10.16 → 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 +114 -62
- 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 +9 -4
- package/dist/browser/session-sync/session-sync-registry.d.ts.map +1 -1
- package/dist/browser/session-sync/session-sync-registry.js +111 -29
- 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 +198 -24
- package/dist/core/client/kortix.d.ts.map +1 -1
- package/dist/core/client/kortix.js +112 -20
- package/dist/core/client/kortix.js.map +1 -1
- package/dist/core/http/api-client.d.ts.map +1 -1
- package/dist/core/http/api-client.js +48 -68
- package/dist/core/http/api-client.js.map +1 -1
- package/dist/core/rest/platform-client/host-boundary.d.ts +121 -0
- package/dist/core/rest/platform-client/host-boundary.d.ts.map +1 -0
- package/dist/core/rest/platform-client/host-boundary.js +243 -0
- package/dist/core/rest/platform-client/host-boundary.js.map +1 -0
- package/dist/core/rest/platform-client/index.d.ts +1 -0
- package/dist/core/rest/platform-client/index.d.ts.map +1 -1
- package/dist/core/rest/platform-client/index.js +1 -0
- package/dist/core/rest/platform-client/index.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/account-lifecycle.d.ts +22 -0
- package/dist/core/rest/projects-client/account-lifecycle.d.ts.map +1 -0
- package/dist/core/rest/projects-client/account-lifecycle.js +26 -0
- package/dist/core/rest/projects-client/account-lifecycle.js.map +1 -0
- package/dist/core/rest/projects-client/admin-providers.d.ts +10 -0
- package/dist/core/rest/projects-client/admin-providers.d.ts.map +1 -0
- package/dist/core/rest/projects-client/admin-providers.js +34 -0
- package/dist/core/rest/projects-client/admin-providers.js.map +1 -0
- package/dist/core/rest/projects-client/agent-config.d.ts +17 -2
- 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 +101 -0
- package/dist/core/rest/projects-client/billing.d.ts.map +1 -1
- package/dist/core/rest/projects-client/billing.js +42 -0
- package/dist/core/rest/projects-client/billing.js.map +1 -1
- package/dist/core/rest/projects-client/channels.d.ts +8 -27
- package/dist/core/rest/projects-client/channels.d.ts.map +1 -1
- package/dist/core/rest/projects-client/channels.js +12 -23
- package/dist/core/rest/projects-client/channels.js.map +1 -1
- package/dist/core/rest/projects-client/connectors.d.ts +234 -24
- package/dist/core/rest/projects-client/connectors.d.ts.map +1 -1
- package/dist/core/rest/projects-client/connectors.js +114 -15
- package/dist/core/rest/projects-client/connectors.js.map +1 -1
- package/dist/core/rest/projects-client/gateway.d.ts +1 -0
- package/dist/core/rest/projects-client/gateway.d.ts.map +1 -1
- package/dist/core/rest/projects-client/gateway.js.map +1 -1
- package/dist/core/rest/projects-client/iam.d.ts +509 -0
- package/dist/core/rest/projects-client/iam.d.ts.map +1 -0
- package/dist/core/rest/projects-client/iam.js +301 -0
- package/dist/core/rest/projects-client/iam.js.map +1 -0
- package/dist/core/rest/projects-client/index.d.ts +7 -0
- package/dist/core/rest/projects-client/index.d.ts.map +1 -1
- package/dist/core/rest/projects-client/index.js +7 -0
- package/dist/core/rest/projects-client/index.js.map +1 -1
- package/dist/core/rest/projects-client/marketplace-catalog.d.ts +9 -2
- package/dist/core/rest/projects-client/marketplace-catalog.d.ts.map +1 -1
- package/dist/core/rest/projects-client/marketplace-catalog.js +7 -0
- package/dist/core/rest/projects-client/marketplace-catalog.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/presentations.d.ts +12 -0
- package/dist/core/rest/projects-client/presentations.d.ts.map +1 -0
- package/dist/core/rest/projects-client/presentations.js +9 -0
- package/dist/core/rest/projects-client/presentations.js.map +1 -0
- package/dist/core/rest/projects-client/projects.d.ts +62 -10
- package/dist/core/rest/projects-client/projects.d.ts.map +1 -1
- package/dist/core/rest/projects-client/projects.js +14 -7
- package/dist/core/rest/projects-client/projects.js.map +1 -1
- package/dist/core/rest/projects-client/public-voice-join.d.ts +59 -0
- package/dist/core/rest/projects-client/public-voice-join.d.ts.map +1 -0
- package/dist/core/rest/projects-client/public-voice-join.js +64 -0
- package/dist/core/rest/projects-client/public-voice-join.js.map +1 -0
- package/dist/core/rest/projects-client/referrals.d.ts +53 -0
- package/dist/core/rest/projects-client/referrals.d.ts.map +1 -0
- package/dist/core/rest/projects-client/referrals.js +27 -0
- package/dist/core/rest/projects-client/referrals.js.map +1 -0
- 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.map +1 -1
- package/dist/core/rest/projects-client/session-sandbox.js +1 -0
- package/dist/core/rest/projects-client/session-sandbox.js.map +1 -1
- package/dist/core/rest/projects-client/sessions.d.ts +143 -18
- package/dist/core/rest/projects-client/sessions.d.ts.map +1 -1
- package/dist/core/rest/projects-client/sessions.js +43 -1
- 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 +2 -0
- package/dist/core/session/index.d.ts.map +1 -1
- package/dist/core/session/index.js +2 -0
- package/dist/core/session/index.js.map +1 -1
- package/dist/core/session/presentation.d.ts +12 -0
- package/dist/core/session/presentation.d.ts.map +1 -0
- package/dist/core/session/presentation.js +70 -0
- package/dist/core/session/presentation.js.map +1 -0
- 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/rewind.d.ts +18 -0
- package/dist/core/session/rewind.d.ts.map +1 -0
- package/dist/core/session/rewind.js +17 -0
- package/dist/core/session/rewind.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/url.d.ts +43 -0
- package/dist/core/session/url.d.ts.map +1 -1
- package/dist/core/session/url.js +81 -0
- package/dist/core/session/url.js.map +1 -1
- package/dist/core/session-sync/session-sync-controller.d.ts +40 -1
- package/dist/core/session-sync/session-sync-controller.d.ts.map +1 -1
- package/dist/core/session-sync/session-sync-controller.js +161 -6
- package/dist/core/session-sync/session-sync-controller.js.map +1 -1
- package/dist/core/stream/fetch-sse.d.ts +23 -0
- package/dist/core/stream/fetch-sse.d.ts.map +1 -0
- package/dist/core/stream/fetch-sse.js +119 -0
- package/dist/core/stream/fetch-sse.js.map +1 -0
- package/dist/core/turns/state.d.ts.map +1 -1
- package/dist/core/turns/state.js +11 -4
- package/dist/core/turns/state.js.map +1 -1
- package/dist/core/turns/types.d.ts +6 -0
- package/dist/core/turns/types.d.ts.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/kortix.esm.min.js +19 -16
- package/dist/kortix.global.js +19 -16
- package/dist/node/server.d.ts +14 -0
- package/dist/node/server.d.ts.map +1 -1
- package/dist/node/server.js +42 -0
- package/dist/node/server.js.map +1 -1
- package/dist/react/agent-selection-scope.d.ts +8 -0
- package/dist/react/agent-selection-scope.d.ts.map +1 -0
- package/dist/react/agent-selection-scope.js +4 -0
- package/dist/react/agent-selection-scope.js.map +1 -0
- package/dist/react/index.d.ts +12 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +12 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/initial-session-pin.d.ts +8 -0
- package/dist/react/initial-session-pin.d.ts.map +1 -0
- package/dist/react/initial-session-pin.js +4 -0
- package/dist/react/initial-session-pin.js.map +1 -0
- 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 +25 -2
- package/dist/react/opencode.d.ts.map +1 -1
- package/dist/react/opencode.js +24 -1
- package/dist/react/opencode.js.map +1 -1
- package/dist/react/provider-selection.d.ts +1 -0
- package/dist/react/provider-selection.d.ts.map +1 -1
- package/dist/react/provider-selection.js +22 -0
- package/dist/react/provider-selection.js.map +1 -1
- package/dist/react/run-pty-command.d.ts +5 -0
- package/dist/react/run-pty-command.d.ts.map +1 -0
- package/dist/react/run-pty-command.js +42 -0
- package/dist/react/run-pty-command.js.map +1 -0
- package/dist/react/runtime-actions.d.ts +51 -0
- package/dist/react/runtime-actions.d.ts.map +1 -0
- package/dist/react/runtime-actions.js +105 -0
- package/dist/react/runtime-actions.js.map +1 -0
- package/dist/react/session-agent-name-guard.d.ts +16 -0
- package/dist/react/session-agent-name-guard.d.ts.map +1 -0
- package/dist/react/session-agent-name-guard.js +22 -0
- package/dist/react/session-agent-name-guard.js.map +1 -0
- package/dist/react/session-title-sync.d.ts +23 -0
- package/dist/react/session-title-sync.d.ts.map +1 -0
- package/dist/react/session-title-sync.js +85 -0
- package/dist/react/session-title-sync.js.map +1 -0
- package/dist/react/use-admin-accounts.d.ts +122 -0
- package/dist/react/use-admin-accounts.d.ts.map +1 -0
- package/dist/react/use-admin-accounts.js +146 -0
- package/dist/react/use-admin-accounts.js.map +1 -0
- package/dist/react/use-admin-analytics.d.ts +332 -0
- package/dist/react/use-admin-analytics.d.ts.map +1 -0
- package/dist/react/use-admin-analytics.js +518 -0
- package/dist/react/use-admin-analytics.js.map +1 -0
- package/dist/react/use-admin-billing.d.ts +27 -0
- package/dist/react/use-admin-billing.d.ts.map +1 -0
- package/dist/react/use-admin-billing.js +61 -0
- package/dist/react/use-admin-billing.js.map +1 -0
- package/dist/react/use-admin-feedback.d.ts +119 -0
- package/dist/react/use-admin-feedback.d.ts.map +1 -0
- package/dist/react/use-admin-feedback.js +148 -0
- package/dist/react/use-admin-feedback.js.map +1 -0
- package/dist/react/use-admin-sandboxes.d.ts +157 -0
- package/dist/react/use-admin-sandboxes.d.ts.map +1 -0
- package/dist/react/use-admin-sandboxes.js +145 -0
- package/dist/react/use-admin-sandboxes.js.map +1 -0
- package/dist/react/use-authenticated-preview-url.d.ts +24 -0
- package/dist/react/use-authenticated-preview-url.d.ts.map +1 -0
- package/dist/react/use-authenticated-preview-url.js +137 -0
- package/dist/react/use-authenticated-preview-url.js.map +1 -0
- package/dist/react/use-canonical-opencode-session.d.ts +4 -0
- package/dist/react/use-canonical-opencode-session.d.ts.map +1 -1
- package/dist/react/use-canonical-opencode-session.js +9 -4
- package/dist/react/use-canonical-opencode-session.js.map +1 -1
- package/dist/react/use-model-defaults.d.ts +22 -0
- package/dist/react/use-model-defaults.d.ts.map +1 -0
- package/dist/react/use-model-defaults.js +104 -0
- package/dist/react/use-model-defaults.js.map +1 -0
- 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 +41 -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-events/index.d.ts +3 -1
- package/dist/react/use-opencode-events/index.d.ts.map +1 -1
- package/dist/react/use-opencode-events/index.js +6 -2
- package/dist/react/use-opencode-events/index.js.map +1 -1
- package/dist/react/use-opencode-local.d.ts.map +1 -1
- package/dist/react/use-opencode-local.js +10 -1
- package/dist/react/use-opencode-local.js.map +1 -1
- package/dist/react/use-opencode-sessions/agents.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/agents.js +5 -3
- package/dist/react/use-opencode-sessions/agents.js.map +1 -1
- package/dist/react/use-opencode-sessions/commands.d.ts +7 -2
- package/dist/react/use-opencode-sessions/commands.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/commands.js +13 -9
- package/dist/react/use-opencode-sessions/commands.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/provider-load-plan.d.ts +6 -0
- package/dist/react/use-opencode-sessions/provider-load-plan.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/provider-load-plan.js +4 -0
- package/dist/react/use-opencode-sessions/provider-load-plan.js.map +1 -0
- package/dist/react/use-opencode-sessions/providers.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/providers.js +39 -27
- package/dist/react/use-opencode-sessions/providers.js.map +1 -1
- package/dist/react/use-opencode-sessions/sessions.d.ts +1 -1
- package/dist/react/use-opencode-sessions/sessions.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/sessions.js +18 -9
- 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-ops-overview.d.ts +64 -0
- package/dist/react/use-ops-overview.d.ts.map +1 -0
- package/dist/react/use-ops-overview.js +16 -0
- package/dist/react/use-ops-overview.js.map +1 -0
- package/dist/react/use-session-model-selection.d.ts +15 -0
- package/dist/react/use-session-model-selection.d.ts.map +1 -0
- package/dist/react/use-session-model-selection.js +27 -0
- package/dist/react/use-session-model-selection.js.map +1 -0
- 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 +87 -17
- package/dist/react/use-session-sync.js.map +1 -1
- package/dist/react/use-session.d.ts +72 -1
- package/dist/react/use-session.d.ts.map +1 -1
- package/dist/react/use-session.js +222 -32
- package/dist/react/use-session.js.map +1 -1
- package/dist/react/use-system-status.d.ts +39 -0
- package/dist/react/use-system-status.d.ts.map +1 -0
- package/dist/react/use-system-status.js +68 -0
- package/dist/react/use-system-status.js.map +1 -0
- package/dist/react/use-teams-installations.d.ts +36 -0
- package/dist/react/use-teams-installations.d.ts.map +1 -0
- package/dist/react/use-teams-installations.js +94 -0
- package/dist/react/use-teams-installations.js.map +1 -0
- package/dist/react/use-tunnel.d.ts +120 -0
- package/dist/react/use-tunnel.d.ts.map +1 -0
- package/dist/react/use-tunnel.js +268 -0
- package/dist/react/use-tunnel.js.map +1 -0
- package/package.json +2 -2
|
@@ -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,15 +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>;
|
|
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;
|
|
33
35
|
export declare function loadSessionTranscriptMessages(sessionId: string): Promise<SessionSyncPage['messages']>;
|
|
34
36
|
export declare function noteSessionSyncEvent(event: {
|
|
35
|
-
|
|
37
|
+
type?: string;
|
|
38
|
+
properties?: unknown;
|
|
36
39
|
}): void;
|
|
37
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;
|
|
38
43
|
export {};
|
|
39
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();
|
|
@@ -40,53 +67,62 @@ function createController(sessionId) {
|
|
|
40
67
|
if (!(sessionId in state.messages))
|
|
41
68
|
state.hydrate(sessionId, []);
|
|
42
69
|
},
|
|
43
|
-
setStatus: (status) =>
|
|
70
|
+
setStatus: (status) => {
|
|
71
|
+
controllers.get(key)?.controller.observePromptStatus(status);
|
|
72
|
+
useSyncStore.getState().setStatus(sessionId, status);
|
|
73
|
+
},
|
|
44
74
|
onTelemetry: (event) => reportTelemetry(sessionId, event),
|
|
45
75
|
});
|
|
46
76
|
}
|
|
47
|
-
function evictInactiveControllers(
|
|
77
|
+
function evictInactiveControllers(protectedKey) {
|
|
48
78
|
if (controllers.size <= MAX_CONTROLLERS)
|
|
49
79
|
return;
|
|
50
80
|
const inactive = [...controllers.entries()]
|
|
51
|
-
.filter(([
|
|
81
|
+
.filter(([key, entry]) => entry.consumers === 0 && key !== protectedKey)
|
|
52
82
|
.sort((a, b) => a[1].lastUsedAt - b[1].lastUsedAt);
|
|
53
|
-
for (const [
|
|
83
|
+
for (const [key, entry] of inactive) {
|
|
54
84
|
entry.controller.destroy();
|
|
55
|
-
controllers.delete(
|
|
85
|
+
controllers.delete(key);
|
|
56
86
|
if (controllers.size <= MAX_CONTROLLERS)
|
|
57
87
|
return;
|
|
58
88
|
}
|
|
59
89
|
}
|
|
60
|
-
function getOrCreateRegistryEntry(sessionId, client, initialConsumers = 0) {
|
|
61
|
-
const
|
|
90
|
+
function getOrCreateRegistryEntry(sessionId, client, initialConsumers = 0, runtimeScope) {
|
|
91
|
+
const key = controllerKey(sessionId, runtimeScope);
|
|
92
|
+
const existing = controllers.get(key);
|
|
62
93
|
if (existing) {
|
|
63
94
|
existing.client = client;
|
|
64
95
|
existing.lastUsedAt = Date.now();
|
|
65
96
|
return existing;
|
|
66
97
|
}
|
|
67
98
|
const entry = {
|
|
68
|
-
|
|
99
|
+
sessionId,
|
|
100
|
+
runtimeScope: runtimeScopeKey(runtimeScope),
|
|
101
|
+
controller: createController(sessionId, key),
|
|
69
102
|
client,
|
|
70
103
|
consumers: initialConsumers,
|
|
71
104
|
lastUsedAt: Date.now(),
|
|
72
105
|
};
|
|
73
|
-
controllers.set(
|
|
106
|
+
controllers.set(key, entry);
|
|
74
107
|
return entry;
|
|
75
108
|
}
|
|
76
|
-
export function getSessionSyncController(sessionId, client) {
|
|
77
|
-
const
|
|
78
|
-
|
|
109
|
+
export function getSessionSyncController(sessionId, client, runtimeScope) {
|
|
110
|
+
const key = controllerKey(sessionId, runtimeScope);
|
|
111
|
+
const entry = getOrCreateRegistryEntry(sessionId, client, 0, runtimeScope);
|
|
112
|
+
evictInactiveControllers(key);
|
|
79
113
|
return entry.controller;
|
|
80
114
|
}
|
|
81
115
|
export async function prefetchSessionSyncOnce(sessionId, source, client) {
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
|
|
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);
|
|
85
121
|
if (entry.prefetchedSource === source)
|
|
86
122
|
return true;
|
|
87
123
|
await entry.controller.reconcile('manual');
|
|
88
124
|
const succeeded = entry.controller.getSnapshot().freshness === 'fresh';
|
|
89
|
-
const current = controllers.get(
|
|
125
|
+
const current = controllers.get(key);
|
|
90
126
|
if (succeeded && current === entry)
|
|
91
127
|
current.prefetchedSource = source;
|
|
92
128
|
return succeeded;
|
|
@@ -98,20 +134,21 @@ export function clearActiveSessionPrefetches() {
|
|
|
98
134
|
}
|
|
99
135
|
}
|
|
100
136
|
}
|
|
101
|
-
export function retainSessionSyncController(sessionId) {
|
|
102
|
-
|
|
137
|
+
export function retainSessionSyncController(sessionId, runtimeScope) {
|
|
138
|
+
const key = controllerKey(sessionId, runtimeScope);
|
|
139
|
+
let entry = controllers.get(key);
|
|
103
140
|
if (entry) {
|
|
104
141
|
entry.client = undefined;
|
|
105
142
|
entry.consumers += 1;
|
|
106
143
|
entry.lastUsedAt = Date.now();
|
|
107
144
|
}
|
|
108
145
|
else {
|
|
109
|
-
entry = getOrCreateRegistryEntry(sessionId, undefined, 1);
|
|
146
|
+
entry = getOrCreateRegistryEntry(sessionId, undefined, 1, runtimeScope);
|
|
110
147
|
}
|
|
111
148
|
evictInactiveControllers();
|
|
112
149
|
const controller = entry.controller;
|
|
113
150
|
return () => {
|
|
114
|
-
const current = controllers.get(
|
|
151
|
+
const current = controllers.get(key);
|
|
115
152
|
if (!current || current.controller !== controller)
|
|
116
153
|
return;
|
|
117
154
|
current.consumers = Math.max(0, current.consumers - 1);
|
|
@@ -121,13 +158,29 @@ export function retainSessionSyncController(sessionId) {
|
|
|
121
158
|
evictInactiveControllers();
|
|
122
159
|
};
|
|
123
160
|
}
|
|
124
|
-
export function reconcileSessionTail(sessionId, reason) {
|
|
125
|
-
return getSessionSyncController(sessionId).reconcile(reason);
|
|
161
|
+
export function reconcileSessionTail(sessionId, reason, runtimeScope) {
|
|
162
|
+
return getSessionSyncController(sessionId, undefined, runtimeScope).reconcile(reason);
|
|
163
|
+
}
|
|
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();
|
|
174
|
+
}
|
|
175
|
+
export function endSessionPromptObservation(sessionId, runtimeScope) {
|
|
176
|
+
findExistingSessionEntry(sessionId, runtimeScope)?.controller.endPromptObservation();
|
|
126
177
|
}
|
|
127
178
|
export function loadSessionTranscriptMessages(sessionId) {
|
|
128
179
|
return loadCompleteSessionHistory((request) => readSessionMessagePage(getClient(), sessionId, request));
|
|
129
180
|
}
|
|
130
181
|
export function noteSessionSyncEvent(event) {
|
|
182
|
+
if (!event.properties || typeof event.properties !== 'object')
|
|
183
|
+
return;
|
|
131
184
|
const properties = event.properties;
|
|
132
185
|
const info = properties.info;
|
|
133
186
|
const part = properties.part;
|
|
@@ -136,11 +189,40 @@ export function noteSessionSyncEvent(event) {
|
|
|
136
189
|
part?.sessionID;
|
|
137
190
|
if (!sessionId)
|
|
138
191
|
return;
|
|
139
|
-
|
|
192
|
+
const controller = findExistingSessionEntry(sessionId)?.controller;
|
|
193
|
+
if (!controller)
|
|
194
|
+
return;
|
|
195
|
+
controller.noteActivity();
|
|
196
|
+
if (event.type === 'session.status') {
|
|
197
|
+
const status = properties.status;
|
|
198
|
+
if (status)
|
|
199
|
+
controller.observePromptStatus(status);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (event.type === 'session.idle') {
|
|
203
|
+
controller.observePromptStatus({ type: 'idle' });
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (event.type === 'session.error') {
|
|
207
|
+
controller.endPromptObservation();
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
if (event.type === 'message.updated' && info?.role === 'assistant') {
|
|
211
|
+
controller.observePromptActivity();
|
|
212
|
+
}
|
|
140
213
|
}
|
|
141
214
|
export function resetSessionSyncControllers() {
|
|
142
215
|
for (const entry of controllers.values())
|
|
143
216
|
entry.controller.destroy();
|
|
144
217
|
controllers.clear();
|
|
145
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
|
+
}
|
|
146
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"}
|