@timurproko/a1 0.2.7-dev.808 → 0.2.7-dev.809

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.
Files changed (77) hide show
  1. package/dist/app/session-shell/dialog-coordinator.d.ts +42 -0
  2. package/dist/app/session-shell/dialog-coordinator.js +133 -0
  3. package/dist/app/session-shell/dock-chrome.d.ts +34 -0
  4. package/dist/app/session-shell/dock-chrome.js +109 -0
  5. package/dist/app/session-shell/exit-notice.d.ts +1 -1
  6. package/dist/app/session-shell/exit-notice.js +1 -1
  7. package/dist/app/session-shell/extension-surface.d.ts +30 -0
  8. package/dist/app/session-shell/extension-surface.js +105 -0
  9. package/dist/app/session-shell/input-surface-switch.d.ts +36 -0
  10. package/dist/app/session-shell/input-surface-switch.js +85 -0
  11. package/dist/app/session-shell/login-interaction.d.ts +27 -0
  12. package/dist/app/session-shell/login-interaction.js +91 -0
  13. package/dist/app/session-shell/prompt-submission.d.ts +48 -0
  14. package/dist/app/session-shell/prompt-submission.js +276 -0
  15. package/dist/app/session-shell/resident-tab-coordinator.d.ts +41 -0
  16. package/dist/app/session-shell/resident-tab-coordinator.js +120 -0
  17. package/dist/app/session-shell/session-concern.d.ts +22 -0
  18. package/dist/app/session-shell/session-concern.js +29 -0
  19. package/dist/app/session-shell/session-lifecycle.d.ts +29 -0
  20. package/dist/app/session-shell/session-lifecycle.js +49 -0
  21. package/dist/app/session-shell/session-shell-root.d.ts +1 -1
  22. package/dist/app/session-shell/session-shell-root.js +182 -931
  23. package/dist/app/session-shell/session-shell.d.ts +2 -8
  24. package/dist/app/session-shell/session-shell.js +202 -901
  25. package/dist/app/session-shell/settings-bindings.d.ts +17 -0
  26. package/dist/app/session-shell/settings-bindings.js +91 -0
  27. package/dist/app/session-shell/shell-editor-factory.d.ts +27 -0
  28. package/dist/app/session-shell/shell-editor-factory.js +102 -0
  29. package/dist/app/session-shell/shell-host.d.ts +6 -0
  30. package/dist/app/session-shell/shell-host.js +8 -0
  31. package/dist/app/session-shell/shell-layout.d.ts +64 -0
  32. package/dist/app/session-shell/shell-layout.js +18 -0
  33. package/dist/app/session-shell/suggestion-surface.d.ts +25 -0
  34. package/dist/app/session-shell/suggestion-surface.js +63 -0
  35. package/dist/app/session-shell/transcript-document.d.ts +78 -0
  36. package/dist/app/session-shell/transcript-document.js +365 -0
  37. package/dist/app/session-shell/viewport-layout.d.ts +31 -0
  38. package/dist/app/session-shell/viewport-layout.js +160 -0
  39. package/dist/app/session-shell/workflow-output.d.ts +33 -0
  40. package/dist/app/session-shell/workflow-output.js +174 -0
  41. package/dist/app/session-shell/workflow-router.d.ts +25 -0
  42. package/dist/app/session-shell/workflow-router.js +39 -0
  43. package/dist/composition/owned-ui.d.ts +4 -25
  44. package/dist/composition/owned-ui.js +26 -270
  45. package/dist/composition/resident-tab-bridge.d.ts +16 -0
  46. package/dist/composition/resident-tab-bridge.js +159 -0
  47. package/dist/composition/session-backend.d.ts +19 -0
  48. package/dist/composition/session-backend.js +1 -0
  49. package/dist/composition/session-runtime-registry.d.ts +20 -0
  50. package/dist/composition/session-runtime-registry.js +85 -0
  51. package/dist/composition/startup-route.d.ts +32 -0
  52. package/dist/composition/startup-route.js +72 -0
  53. package/dist/integrations/pi/engine/adapter.d.ts +4 -77
  54. package/dist/integrations/pi/engine/adapter.js +85 -393
  55. package/dist/integrations/pi/engine/command-dispatch.d.ts +13 -0
  56. package/dist/integrations/pi/engine/command-dispatch.js +57 -0
  57. package/dist/integrations/pi/engine/host.js +2 -2
  58. package/dist/integrations/pi/engine/ports.d.ts +56 -0
  59. package/dist/integrations/pi/engine/ports.js +89 -0
  60. package/dist/integrations/pi/engine/view-state.d.ts +42 -0
  61. package/dist/integrations/pi/engine/view-state.js +126 -0
  62. package/dist/native/darwin-arm64/manifest.json +1 -1
  63. package/dist/native/darwin-arm64/terminal-host.manifest.json +3 -3
  64. package/dist/native/darwin-arm64/terminal-host.node +0 -0
  65. package/dist/native/darwin-x64/manifest.json +1 -1
  66. package/dist/native/darwin-x64/terminal-host.manifest.json +3 -3
  67. package/dist/native/darwin-x64/terminal-host.node +0 -0
  68. package/dist/native/linux-x64/manifest.json +1 -1
  69. package/dist/native/linux-x64/terminal-host.manifest.json +3 -3
  70. package/dist/native/linux-x64/terminal-host.node +0 -0
  71. package/dist/native/win32-x64/manifest.json +2 -2
  72. package/dist/native/win32-x64/process-guardian.node +0 -0
  73. package/dist/native/win32-x64/terminal-host.manifest.json +3 -3
  74. package/dist/native/win32-x64/terminal-host.node +0 -0
  75. package/docs/architecture/boundaries.md +14 -0
  76. package/docs/architecture/resident-tabs.md +6 -6
  77. package/package.json +1 -1
@@ -0,0 +1,85 @@
1
+ const SESSION_RUNTIME_REFRESH_MS = 30_000;
2
+ /**
3
+ * The live worktree claims this runtime's agents hold: each agent's session identity, the heartbeat
4
+ * that keeps the claims fresh, and their release when the runtime is disposed.
5
+ */
6
+ export class SessionRuntimeRegistry {
7
+ #options;
8
+ // Invariant: one entry per agent of this runtime; each agent holds its own claim, and the runtime's exit releases all.
9
+ #identities = new Map();
10
+ #owner = null;
11
+ #timer = null;
12
+ #refresh = Promise.resolve();
13
+ #disposed = false;
14
+ constructor(options) {
15
+ this.#options = options;
16
+ }
17
+ /** The repository context reader for one agent; undefined names the primary agent. */
18
+ readerFor(agentId) {
19
+ return async (sessionId, sessionFile, signal) => {
20
+ const { runtimeId, inspectProcess } = this.#options;
21
+ const owner = await this.#ownerIdentity();
22
+ if (owner === null || runtimeId === undefined || inspectProcess === undefined)
23
+ return null;
24
+ const identity = { sessionId, sessionFile };
25
+ this.#identities.set(agentId, identity);
26
+ const { activateSessionRepositoryContext } = await import("../foundation/lifecycle/session-repository-context.js");
27
+ const context = await activateSessionRepositoryContext(identity, runtimeId, owner, {
28
+ signal,
29
+ inspectProcess,
30
+ ...(agentId === undefined ? {} : { agentId }),
31
+ });
32
+ this.#arm();
33
+ return context;
34
+ };
35
+ }
36
+ /** Stops the heartbeat, waits for an in-flight refresh, and releases every claim this runtime holds. */
37
+ async dispose() {
38
+ this.#disposed = true;
39
+ if (this.#timer !== null)
40
+ clearInterval(this.#timer);
41
+ this.#timer = null;
42
+ await this.#refresh;
43
+ const { runtimeId } = this.#options;
44
+ const owner = await this.#ownerIdentity();
45
+ if (runtimeId === undefined || owner === null)
46
+ return;
47
+ await import("../foundation/lifecycle/session-repository-context.js")
48
+ .then(module => module.releaseSessionRepositoryRuntime(runtimeId, owner))
49
+ .catch(() => undefined);
50
+ }
51
+ async #ownerIdentity() {
52
+ const { runtimeId, inspectProcess } = this.#options;
53
+ if (runtimeId === undefined || inspectProcess === undefined)
54
+ return null;
55
+ this.#owner ??= inspectProcess(process.pid).catch(() => null);
56
+ return await this.#owner;
57
+ }
58
+ #arm() {
59
+ if (this.#timer !== null)
60
+ return;
61
+ this.#timer = setInterval(() => this.#queueRefresh(), this.#options.refreshMs ?? SESSION_RUNTIME_REFRESH_MS);
62
+ this.#timer.unref();
63
+ }
64
+ #queueRefresh() {
65
+ const { runtimeId, inspectProcess } = this.#options;
66
+ if (this.#disposed || this.#identities.size === 0 || runtimeId === undefined || inspectProcess === undefined)
67
+ return;
68
+ this.#refresh = this.#refresh.then(async () => {
69
+ if (this.#disposed)
70
+ return;
71
+ const owner = await this.#ownerIdentity();
72
+ if (owner === null)
73
+ return;
74
+ const { registerSessionRepositoryRuntime } = await import("../foundation/lifecycle/session-repository-context.js");
75
+ for (const [agentId, identity] of this.#identities) {
76
+ if (this.#disposed)
77
+ return;
78
+ await registerSessionRepositoryRuntime(identity, runtimeId, owner, {
79
+ inspectProcess,
80
+ ...(agentId === undefined ? {} : { agentId }),
81
+ }).catch(() => undefined);
82
+ }
83
+ }).catch(() => undefined);
84
+ }
85
+ }
@@ -0,0 +1,32 @@
1
+ import type { OwnedUiShellEngineOptions } from "../app/session-shell/index.js";
2
+ import type { ReleaseNoteCatalog } from "../features/owned-ui/release-notes.js";
3
+ type StartupRoute = NonNullable<OwnedUiShellEngineOptions["startupRoute"]>;
4
+ export interface StartupReleaseNoteOptions {
5
+ readonly ownedSurfaces: boolean;
6
+ /** Deterministic catalog and version seams for composition tests. */
7
+ readonly releaseNotes?: ReleaseNoteCatalog;
8
+ readonly packageVersion?: string;
9
+ /** Without a profile there is nowhere to remember the note as seen, so it is never shown on startup. */
10
+ readonly profileId?: string;
11
+ readonly configDir: string;
12
+ }
13
+ export declare function readPackageVersion(): Promise<string>;
14
+ /**
15
+ * The release notes bare A1 ships and the one note this version shows once per profile on startup:
16
+ * the packaged catalog (or why it could not be read), the running version, and the claim that
17
+ * marks the note seen after its route closes.
18
+ */
19
+ export declare class StartupReleaseNote {
20
+ #private;
21
+ readonly catalog: ReleaseNoteCatalog | null;
22
+ readonly failure: unknown;
23
+ readonly packageVersion: string | null;
24
+ static load(options: StartupReleaseNoteOptions): Promise<StartupReleaseNote>;
25
+ private constructor();
26
+ /** The changelog route to present after the first frame, or undefined when there is no unseen note to show. */
27
+ get startupRoute(): StartupRoute | undefined;
28
+ /** Waits for a pending acknowledgement; a failed one stays unseen and is never reported. */
29
+ settleAcknowledgement(): Promise<void>;
30
+ releaseClaim(): Promise<void>;
31
+ }
32
+ export {};
@@ -0,0 +1,72 @@
1
+ import { readFile } from "node:fs/promises";
2
+ export async function readPackageVersion() {
3
+ const manifest = JSON.parse(await readFile(new URL("../../package.json", import.meta.url), "utf8"));
4
+ const version = manifest?.version;
5
+ if (typeof version !== "string")
6
+ throw new Error("A1 package version is unavailable");
7
+ return version;
8
+ }
9
+ /**
10
+ * The release notes bare A1 ships and the one note this version shows once per profile on startup:
11
+ * the packaged catalog (or why it could not be read), the running version, and the claim that
12
+ * marks the note seen after its route closes.
13
+ */
14
+ export class StartupReleaseNote {
15
+ catalog;
16
+ failure;
17
+ packageVersion;
18
+ #current;
19
+ #claim;
20
+ #acknowledgement = null;
21
+ static async load(options) {
22
+ let catalog = null;
23
+ let failure;
24
+ if (options.ownedSurfaces) {
25
+ try {
26
+ catalog = options.releaseNotes
27
+ ?? await import("../features/owned-ui/release-notes.js").then(module => module.readPackagedReleaseNotes());
28
+ }
29
+ catch (error) {
30
+ failure = error;
31
+ }
32
+ }
33
+ const packageVersion = options.ownedSurfaces ? options.packageVersion ?? await readPackageVersion() : null;
34
+ const current = packageVersion === null ? null : catalog?.current(packageVersion) ?? null;
35
+ const profileId = options.profileId;
36
+ const claim = current === null || profileId === undefined
37
+ ? null
38
+ : await import("../features/owned-ui/release-note-state.js").then(module => module.claimReleaseNote({
39
+ configDir: options.configDir, profileId, version: current.version,
40
+ }));
41
+ return new StartupReleaseNote(catalog, failure, packageVersion, current, claim);
42
+ }
43
+ constructor(catalog, failure, packageVersion, current, claim) {
44
+ this.catalog = catalog;
45
+ this.failure = failure;
46
+ this.packageVersion = packageVersion;
47
+ this.#current = current;
48
+ this.#claim = claim;
49
+ }
50
+ /** The changelog route to present after the first frame, or undefined when there is no unseen note to show. */
51
+ get startupRoute() {
52
+ const current = this.#current;
53
+ const claim = this.#claim;
54
+ if (current === null || claim === null)
55
+ return undefined;
56
+ return {
57
+ route: "changelog",
58
+ input: { document: current.markdown },
59
+ onClosed: () => {
60
+ this.#acknowledgement ??= claim.acknowledge();
61
+ return this.#acknowledgement;
62
+ },
63
+ };
64
+ }
65
+ /** Waits for a pending acknowledgement; a failed one stays unseen and is never reported. */
66
+ async settleAcknowledgement() {
67
+ await this.#acknowledgement?.catch(() => undefined);
68
+ }
69
+ async releaseClaim() {
70
+ await this.#claim?.release();
71
+ }
72
+ }
@@ -1,38 +1,17 @@
1
- import { type AgentSession } from "../startup-public.js";
2
- import { type OwnedUiCommand, type OwnedUiExtensionPort, type OwnedUiExtensionUiPort, type OwnedUiImageAttachment, type OwnedUiPromptSuggestionGeneratorPort, type OwnedUiPromptSuggestionReasoning, type OwnedUiPromptSuggestionRequest, type OwnedUiPromptSuggestionResult, type OwnedUiEvent, type OwnedUiReleaseUpdate, type OwnedUiSessionBackend, type OwnedUiSessionCatalogPort, type OwnedUiSessionIdentityPort, type OwnedUiSessionPort, type OwnedUiSessionSettingsPort, type OwnedUiSessionViewModel, type OwnedUiSnapshot, type OwnedUiWorkflowPort } from "../../../contracts/owned-ui/index.js";
3
- import type { PiAuthenticationProviderOption, PiBashWorkflowResult, PiModelsContext, PiModelsRefreshResult, PiPinnedSettingsCallback, PiPinnedSettingsSnapshot, PiProjectTrustContext, PiProjectTrustUpdate, PiScopedModelsContext, PiScopedModelsRefreshResult, PiSessionResumeMetadata, PiSessionSelectorContext, PiTreeSelectorContext, PiWorkflowAutocompleteCommand, PiWorkflowHost, PiWorkflowInteractionHost, PiWorkflowOption, PiWorkflowRequest, PiWorkflowResult } from "./workflows.js";
1
+ import { type OwnedUiCommand, type OwnedUiExtensionPort, type OwnedUiPromptSuggestionGeneratorPort, type OwnedUiPromptSuggestionReasoning, type OwnedUiPromptSuggestionRequest, type OwnedUiPromptSuggestionResult, type OwnedUiEvent, type OwnedUiSessionBackend, type OwnedUiSessionCatalogPort, type OwnedUiSessionIdentityPort, type OwnedUiSessionPort, type OwnedUiSessionSettingsPort, type OwnedUiSessionViewModel, type OwnedUiSnapshot, type OwnedUiWorkflowPort } from "../../../contracts/owned-ui/index.js";
2
+ import type { PiPinnedSettingsSnapshot, PiWorkflowHost, PiWorkflowInteractionHost, PiWorkflowRequest, PiWorkflowResult } from "./workflows.js";
4
3
  import type { PiSettingsBridge } from "./settings-bridge.js";
5
- import type { PiSettingOwnerHandlers } from "./settings-bridge.js";
6
4
  import type { PiProjectTrustPreflightPrompt } from "./project-trust-preflight.js";
7
5
  import type { PiSessionForkPrompt, PiSessionSelection } from "./session-selection.js";
8
- import type { AgentSettingOwner } from "../../../contracts/agent-engine/index.js";
9
6
  import { type AdapterCommandResult } from "./command-dispatch.js";
10
- import { type OwnedPiVisualExtensionSupport } from "./extension-ui-binding.js";
11
- import { type OwnedPiExtensionResourceSummary, type OwnedPiResourceSummary } from "./resource-catalog.js";
12
7
  import { type PiEnginePackageUpdateProbe, type PiEngineRuntimeFactory, type PiRepositoryContextReader } from "./session-runtime.js";
13
8
  import { type PiEngineHostSessionPorts } from "./host-ports.js";
14
- import { PiWorkflowContexts } from "./workflow-contexts.js";
9
+ import { type PiSessionPresentationSource } from "./ports.js";
15
10
  export type { OwnedPiExtensionResourceSummary, OwnedPiExtensionSourceSummary, OwnedPiResourceSummary } from "./resource-catalog.js";
16
11
  export type { PiEngineRuntimeFactory, PiEngineRuntimeFactoryInput } from "./session-runtime.js";
17
12
  export type { AdapterCommandResult } from "./command-dispatch.js";
18
13
  export type { OwnedPiVisualExtensionSupport } from "./extension-ui-binding.js";
19
- /**
20
- * The Pi objects pinned selectors and transcript renderers are built from. They are not part of the
21
- * session backend contract; only the session presenters owner reads them.
22
- */
23
- export interface PiSessionPresentationSource {
24
- pinnedModelSelectorContext(): ReturnType<PiWorkflowContexts["pinnedModelSelectorContext"]>;
25
- pinnedSessionSelectorContext(): PiSessionSelectorContext;
26
- pinnedTreeSelectorContext(): PiTreeSelectorContext;
27
- pinnedMessageRenderer(customType: string): unknown;
28
- pinnedToolRenderers(toolName: string): unknown;
29
- pinnedShortcutDescriptions(bindings: Parameters<AgentSession["extensionRunner"]["getShortcuts"]>[0]): readonly {
30
- readonly key: string;
31
- readonly description: string;
32
- }[];
33
- pinnedSettingsModels(): Pick<PiPinnedSettingsSnapshot, "currentModel" | "availableDefaultModels">;
34
- applyPinnedSettingValue(callback: PiPinnedSettingsCallback, value: unknown): Promise<PiWorkflowResult>;
35
- }
14
+ export type { PiSessionPresentationSource } from "./ports.js";
36
15
  /** Explicit flush failure when required delivery was interrupted rather than completed. */
37
16
  export declare class EngineDeliveryError extends Error {
38
17
  constructor();
@@ -80,22 +59,6 @@ export declare class PiEngineAdapter implements OwnedUiSessionBackend, OwnedUiPr
80
59
  /** The Pi objects behind pinned selectors and renderers, for the session presenters owner only. */
81
60
  presentationSource(): PiSessionPresentationSource;
82
61
  setWorkflowInteractionHost(interaction: PiWorkflowInteractionHost): void;
83
- get sessionId(): string;
84
- get sessionGeneration(): number;
85
- /** Actual session replacements, excluding delivery-only invalidation of callbacks. */
86
- get sessionBindingGeneration(): number;
87
- get cwd(): string;
88
- get agentDir(): string;
89
- resolveTranscriptImage(assetId: string): OwnedUiImageAttachment | null;
90
- currentSessionFile(): string | null;
91
- currentSessionResumeMetadata(): PiSessionResumeMetadata | null;
92
- get disposed(): boolean;
93
- /**
94
- * Report a newer A1 release found by the startup check. The shell renders the diagnostic as
95
- * pinned Pi's `Update Available` notice; it arrives whenever the check resolves, so a late
96
- * result is appended to the transcript like Pi's own fire-and-forget version check.
97
- */
98
- announceReleaseUpdate(release: OwnedUiReleaseUpdate): void;
99
62
  suggestionReasoningPolicy(): OwnedUiPromptSuggestionReasoning;
100
63
  generate(request: OwnedUiPromptSuggestionRequest): Promise<OwnedUiPromptSuggestionResult>;
101
64
  generateResidentTabName(instruction: string, maxTokens: number, signal: AbortSignal): Promise<string | null>;
@@ -120,51 +83,15 @@ export declare class PiEngineAdapter implements OwnedUiSessionBackend, OwnedUiPr
120
83
  peakBytes: number;
121
84
  };
122
85
  flushEvents(): Promise<void>;
123
- nonVisualResources(): readonly OwnedPiResourceSummary[];
124
- extensionResources(): readonly OwnedPiExtensionResourceSummary[];
125
- workflowAutocompleteCommands(): readonly PiWorkflowAutocompleteCommand[];
126
- visualExtensionSupport(): OwnedPiVisualExtensionSupport;
127
- bindExtensionUi(ui: OwnedUiExtensionUiPort, shutdown?: () => void | Promise<void>): Promise<void>;
128
- unbindExtensionUi(): Promise<void>;
129
- cycleModelWorkflow(direction: "forward" | "backward"): Promise<PiWorkflowResult>;
130
- pinnedProjectTrustContext(): PiProjectTrustContext;
131
- persistProjectTrust(updates: readonly PiProjectTrustUpdate[]): void;
132
- pinnedScopedModelsContext(): PiScopedModelsContext;
133
- updateScopedModels(enabledModelIds: readonly string[] | null): void;
134
- persistScopedModels(enabledModelIds: readonly string[] | null): void;
135
- refreshScopedModels(signal: AbortSignal): Promise<PiScopedModelsRefreshResult>;
136
- modelsContext(): PiModelsContext;
137
- setSessionModelScope(scopeIds: readonly string[]): void;
138
- persistModelScope(scopeIds: readonly string[]): void;
139
- refreshModels(signal: AbortSignal): Promise<PiModelsRefreshResult>;
140
- pinnedLoginOptions(authType?: "oauth" | "api_key"): readonly PiAuthenticationProviderOption[];
141
- pinnedLoginMethodOptions(providerReference: string): {
142
- readonly title: string;
143
- readonly options: readonly PiWorkflowOption[];
144
- };
145
- pinnedAmbientAuthentication(selection: string): ReturnType<PiWorkflowContexts["pinnedAmbientAuthentication"]>;
146
- pinnedLogoutOptions(): Promise<readonly PiAuthenticationProviderOption[]>;
147
- pinnedForkOptions(): readonly PiWorkflowOption[];
148
- /** Bind the owned UI's clipboard lifecycle without changing the comparison host. True means acknowledged delivery. */
149
- bindClipboardWriter(writer: (text: string) => Promise<boolean>): () => void;
150
- /** Workflow and tree copying share the active owner's write fence and delivery acknowledgment. */
151
- copyWorkflowText(text: string): Promise<boolean>;
152
86
  abortBashWorkflow(): void;
153
- executeBashWorkflow(command: string, excludeFromContext: boolean): Promise<PiBashWorkflowResult>;
154
- reloadBlockedResult(): PiWorkflowResult | null;
155
87
  executeWorkflow(request: PiWorkflowRequest): Promise<PiWorkflowResult>;
156
88
  /**
157
89
  * The theme the engine is configured with, in the engine's own grammar: a
158
90
  * theme's name, or a `light/dark` pair meaning "follow the terminal".
159
91
  */
160
92
  configuredTheme(): string | undefined;
161
- /** Persist the global thinking default without changing the live session level. */
162
- setDefaultThinkingLevel(level: PiPinnedSettingsSnapshot["defaultThinkingLevel"]): void;
163
93
  /** Settings port for the live runtime, or null before the runtime is available. */
164
94
  settingsPort(): PiSettingsBridge | null;
165
- /** Which settings surface this adapter serves; hidden-in-bare effects are unbindable in bare mode. */
166
- get settingsProductMode(): "bare" | "comparison";
167
- bindSettingsOwner(owner: AgentSettingOwner, handlers: PiSettingOwnerHandlers): () => void;
168
95
  pinnedSettingsSnapshot(): PiPinnedSettingsSnapshot;
169
96
  clearQueuedWorkflows(): readonly string[];
170
97
  view(): OwnedUiSessionViewModel;