overmux 0.0.4 → 0.0.6

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 (151) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +16 -2
  3. package/dist/bin.js +140 -127
  4. package/dist/bin.js.map +1 -1
  5. package/dist/docs/000-index.md +2 -4
  6. package/dist/docs/100-introduction/200-how-overmux-works.md +126 -2
  7. package/dist/docs/100-introduction/{300-why-overmux.md → 300-why-i-built-overmux.md} +1 -1
  8. package/dist/docs/200-getting-started/100-install-and-run-overmux.md +2 -2
  9. package/dist/docs/200-getting-started/400-secure-with-https/200-tailscale-serve.md +3 -3
  10. package/dist/docs/200-getting-started/400-secure-with-https/300-cloudflare-tunnel.md +2 -2
  11. package/dist/docs/200-getting-started/400-secure-with-https/400-self-hosted-reverse-proxy.md +2 -2
  12. package/dist/docs/200-getting-started/500-set-up-overmux-with-packages.md +42 -0
  13. package/dist/docs/400-reference/100-project-structure.md +83 -0
  14. package/dist/docs/400-reference/200-configuration.md +257 -0
  15. package/dist/docs/400-reference/300-storage-locations.md +46 -0
  16. package/dist/docs/400-reference/400-authentication-and-security.md +37 -0
  17. package/dist/docs/400-reference/500-server/000-index.md +13 -0
  18. package/dist/docs/400-reference/500-server/100-resources.md +191 -0
  19. package/dist/docs/400-reference/500-server/200-operations.md +111 -0
  20. package/dist/docs/400-reference/500-server/300-streams.md +140 -0
  21. package/dist/docs/400-reference/500-server/400-notifications.md +32 -0
  22. package/dist/docs/400-reference/500-server/500-api.md +118 -0
  23. package/dist/docs/400-reference/600-client/000-index.md +9 -0
  24. package/dist/docs/400-reference/600-client/005-setting-up-your-ui.md +137 -0
  25. package/dist/docs/400-reference/600-client/007-deep-links.md +87 -0
  26. package/dist/docs/400-reference/600-client/010-commands.md +189 -0
  27. package/dist/docs/400-reference/600-client/020-shortcuts.md +171 -0
  28. package/dist/docs/400-reference/600-client/100-api.md +370 -0
  29. package/dist/docs/400-reference/600-client/200-theming.md +209 -0
  30. package/dist/docs/400-reference/600-client/300-tech-stack-recommendations.md +12 -0
  31. package/dist/docs/400-reference/{400-cli → 700-cli}/050-init.md +2 -4
  32. package/{docs/400-reference/400-cli → dist/docs/400-reference/700-cli}/100-serve.md +9 -4
  33. package/{docs/400-reference/400-cli → dist/docs/400-reference/700-cli}/200-auth.md +1 -4
  34. package/dist/docs/400-reference/{400-cli → 700-cli}/300-call.md +1 -4
  35. package/dist/docs/400-reference/{400-cli → 700-cli}/350-instance.md +1 -4
  36. package/dist/docs/400-reference/700-cli/600-docs.md +128 -0
  37. package/dist/docs/400-reference/{400-cli → 700-cli}/700-desktop.md +1 -3
  38. package/dist/docs/500-hosted-pages.md +0 -1
  39. package/dist/exports/client.d.ts +5 -14
  40. package/dist/exports/client.d.ts.map +1 -1
  41. package/dist/exports/client.js +141 -46
  42. package/dist/exports/client.js.map +1 -1
  43. package/dist/exports/{index-DS70rKzo.d.ts → index-Cz3xkCa4.d.ts} +50 -36
  44. package/dist/exports/index-Cz3xkCa4.d.ts.map +1 -0
  45. package/dist/exports/index.d.ts +1 -1
  46. package/dist/exports/index.js +19 -5
  47. package/dist/exports/index.js.map +1 -1
  48. package/dist/exports/{notifications-av0FK0yZ.js → notifications-BFAD3QQl.js} +29 -4
  49. package/dist/exports/notifications-BFAD3QQl.js.map +1 -0
  50. package/dist/exports/server.d.ts +1 -44
  51. package/dist/exports/server.d.ts.map +1 -1
  52. package/dist/exports/server.js +9 -1061
  53. package/dist/exports/server.js.map +1 -1
  54. package/dist/internal/server/coordinator/server-child.js +47 -43
  55. package/dist/internal/server/coordinator/server-child.js.map +1 -1
  56. package/docs/000-index.md +2 -4
  57. package/docs/100-introduction/200-how-overmux-works.md +126 -2
  58. package/docs/100-introduction/{300-why-overmux.md → 300-why-i-built-overmux.md} +1 -1
  59. package/docs/200-getting-started/100-install-and-run-overmux.md +2 -2
  60. package/docs/200-getting-started/400-secure-with-https/200-tailscale-serve.md +3 -3
  61. package/docs/200-getting-started/400-secure-with-https/300-cloudflare-tunnel.md +2 -2
  62. package/docs/200-getting-started/400-secure-with-https/400-self-hosted-reverse-proxy.md +2 -2
  63. package/docs/200-getting-started/500-set-up-overmux-with-packages.md +42 -0
  64. package/docs/400-reference/100-project-structure.md +83 -0
  65. package/docs/400-reference/200-configuration.md +257 -0
  66. package/docs/400-reference/300-storage-locations.md +46 -0
  67. package/docs/400-reference/400-authentication-and-security.md +37 -0
  68. package/docs/400-reference/500-server/000-index.md +13 -0
  69. package/docs/400-reference/500-server/100-resources.md +191 -0
  70. package/docs/400-reference/500-server/200-operations.md +111 -0
  71. package/docs/400-reference/500-server/300-streams.md +140 -0
  72. package/docs/400-reference/500-server/400-notifications.md +32 -0
  73. package/docs/400-reference/500-server/500-api.md +118 -0
  74. package/docs/400-reference/600-client/000-index.md +9 -0
  75. package/docs/400-reference/600-client/005-setting-up-your-ui.md +137 -0
  76. package/docs/400-reference/600-client/007-deep-links.md +87 -0
  77. package/docs/400-reference/600-client/010-commands.md +189 -0
  78. package/docs/400-reference/600-client/020-shortcuts.md +171 -0
  79. package/docs/400-reference/600-client/100-api.md +370 -0
  80. package/docs/400-reference/600-client/200-theming.md +209 -0
  81. package/docs/400-reference/600-client/300-tech-stack-recommendations.md +12 -0
  82. package/docs/400-reference/{400-cli → 700-cli}/050-init.md +2 -4
  83. package/{dist/docs/400-reference/400-cli → docs/400-reference/700-cli}/100-serve.md +9 -4
  84. package/{dist/docs/400-reference/400-cli → docs/400-reference/700-cli}/200-auth.md +1 -4
  85. package/docs/400-reference/{400-cli → 700-cli}/300-call.md +1 -4
  86. package/docs/400-reference/{400-cli → 700-cli}/350-instance.md +1 -4
  87. package/docs/400-reference/700-cli/600-docs.md +128 -0
  88. package/docs/400-reference/{400-cli → 700-cli}/700-desktop.md +1 -3
  89. package/docs/500-hosted-pages.md +0 -1
  90. package/package.json +4 -3
  91. package/src/internal/cli/app.ts +3 -5
  92. package/src/internal/cli/commands/docs-ai-context.ts +33 -0
  93. package/src/internal/cli/commands/docs.ts +19 -2
  94. package/src/internal/cli/commands/init-template.ts +1 -1
  95. package/src/internal/cli/commands/serve.ts +3 -0
  96. package/src/internal/cli/login.ts +9 -9
  97. package/src/internal/client/client-definition.ts +6 -8
  98. package/src/internal/client/host/deep-link-navigation.ts +75 -0
  99. package/src/internal/client/host/overmux-host.tsx +9 -0
  100. package/src/internal/client/index.ts +0 -6
  101. package/src/internal/client/overmux-react.ts +71 -40
  102. package/src/internal/server/auth/auth-service.ts +2 -2
  103. package/src/internal/server/auth/instance-control.ts +65 -14
  104. package/src/internal/server/coordinator/ipc-protocol.ts +0 -1
  105. package/src/internal/server/runtime/create-runtime.ts +5 -3
  106. package/src/internal/server/runtime/runtime-instance.ts +5 -4
  107. package/src/internal/server/runtime/runtime-operations.ts +9 -3
  108. package/src/internal/server/runtime/runtime-resources.ts +12 -32
  109. package/src/internal/server/runtime/runtime-streams.ts +5 -6
  110. package/src/internal/server/server-logger.ts +5 -10
  111. package/src/internal/server/server-startup-options.ts +5 -10
  112. package/src/internal/server/start-application-server.ts +4 -7
  113. package/src/public/ai-context.ts +7 -29
  114. package/src/public/client.ts +0 -6
  115. package/src/public/config.ts +156 -31
  116. package/src/public/server.ts +1 -16
  117. package/dist/docs/100-introduction/100-what-is-overmux.md +0 -7
  118. package/dist/docs/300-fundamentals/100-project-structure.md +0 -23
  119. package/dist/docs/300-fundamentals/200-configuration.md +0 -3
  120. package/dist/docs/300-fundamentals/300-theming.md +0 -54
  121. package/dist/docs/300-fundamentals/400-server.md +0 -3
  122. package/dist/docs/300-fundamentals/500-client.md +0 -3
  123. package/dist/docs/300-fundamentals/600-operations.md +0 -3
  124. package/dist/docs/300-fundamentals/700-resources.md +0 -3
  125. package/dist/docs/300-fundamentals/800-streams.md +0 -3
  126. package/dist/docs/300-fundamentals/900-authentication-and-security.md +0 -3
  127. package/dist/docs/400-reference/100-configuration.md +0 -23
  128. package/dist/docs/400-reference/200-server-api.md +0 -21
  129. package/dist/docs/400-reference/300-client-api.md +0 -39
  130. package/dist/docs/400-reference/400-cli/400-check.md +0 -20
  131. package/dist/docs/400-reference/400-cli/500-ai-context.md +0 -102
  132. package/dist/docs/400-reference/400-cli/600-docs.md +0 -23
  133. package/dist/exports/index-DS70rKzo.d.ts.map +0 -1
  134. package/dist/exports/notifications-av0FK0yZ.js.map +0 -1
  135. package/docs/100-introduction/100-what-is-overmux.md +0 -7
  136. package/docs/300-fundamentals/100-project-structure.md +0 -23
  137. package/docs/300-fundamentals/200-configuration.md +0 -3
  138. package/docs/300-fundamentals/300-theming.md +0 -54
  139. package/docs/300-fundamentals/400-server.md +0 -3
  140. package/docs/300-fundamentals/500-client.md +0 -3
  141. package/docs/300-fundamentals/600-operations.md +0 -3
  142. package/docs/300-fundamentals/700-resources.md +0 -3
  143. package/docs/300-fundamentals/800-streams.md +0 -3
  144. package/docs/300-fundamentals/900-authentication-and-security.md +0 -3
  145. package/docs/400-reference/100-configuration.md +0 -23
  146. package/docs/400-reference/200-server-api.md +0 -21
  147. package/docs/400-reference/300-client-api.md +0 -39
  148. package/docs/400-reference/400-cli/400-check.md +0 -20
  149. package/docs/400-reference/400-cli/500-ai-context.md +0 -102
  150. package/docs/400-reference/400-cli/600-docs.md +0 -23
  151. package/src/internal/cli/commands/ai.ts +0 -44
@@ -0,0 +1,128 @@
1
+ ---
2
+ title: "`overmux docs`"
3
+ ---
4
+
5
+ Overmux documentation and AI context commands
6
+
7
+ ## `overmux docs path`
8
+
9
+ `overmux docs path` prints the installed Overmux CLI’s absolute documentation path.
10
+
11
+ ```console
12
+ $ overmux docs path
13
+ /path/to/somewhere/node_modules/overmux/docs
14
+ ```
15
+
16
+ ## `overmux docs ai-context`
17
+
18
+ `overmux docs ai-context` prints `CLAUDE.md`/`AGENTS.md` guidance for coding agents.
19
+
20
+ ### Usage
21
+
22
+ ```text
23
+ overmux docs ai-context
24
+ ```
25
+
26
+ Prints the selected snippets shown in [available snippets](#available-snippets).
27
+
28
+ ### Set up your coding agent
29
+
30
+ Tell your agent how to load Overmux guidance using `overmux docs ai-context`.
31
+
32
+ <CodeBlockTabs defaultValue="agents">
33
+ <CodeBlockTabsList>
34
+ <CodeBlockTabsTrigger value="agents">AGENTS.md</CodeBlockTabsTrigger>
35
+ <CodeBlockTabsTrigger value="claude">CLAUDE.md</CodeBlockTabsTrigger>
36
+ </CodeBlockTabsList>
37
+ <CodeBlockTab value="agents">
38
+
39
+ ```bash
40
+ echo 'Run `overmux docs ai-context` for help configuring Overmux.' >> AGENTS.md
41
+ ```
42
+
43
+ </CodeBlockTab>
44
+ <CodeBlockTab value="claude">
45
+
46
+ ```bash
47
+ echo 'Run `overmux docs ai-context` for help configuring Overmux.' >> CLAUDE.md
48
+ ```
49
+
50
+ </CodeBlockTab>
51
+ </CodeBlockTabs>
52
+
53
+ ### Configure context snippets
54
+
55
+ Use `aiContextSnippets` in `overmux.config.ts` to select which snippets `overmux docs ai-context` prints.
56
+
57
+ ```ts
58
+ import {
59
+ coreAiContextSnippets,
60
+ defineOvermuxConfig,
61
+ } from "overmux";
62
+
63
+ export default defineOvermuxConfig({
64
+ aiContextSnippets: coreAiContextSnippets,
65
+ // ...
66
+ });
67
+ ```
68
+
69
+ When `aiContextSnippets` is omitted, Overmux uses `defaultAiContextSnippets`. Set it to an empty array to emit no context.
70
+
71
+ You can compose an explicit selection from the individual exports:
72
+
73
+ ```ts
74
+ import {
75
+ defineOvermuxConfig,
76
+ packageSourceSnippet,
77
+ techStackRecommendationsSnippet,
78
+ } from "overmux";
79
+
80
+ export default defineOvermuxConfig({
81
+ aiContextSnippets: [
82
+ packageSourceSnippet,
83
+ techStackRecommendationsSnippet,
84
+ ],
85
+ // ...
86
+ });
87
+ ```
88
+
89
+ ### Options
90
+
91
+ | Flag | Description | Default |
92
+ | --- | --- | --- |
93
+ | `--config <path>, -c <path>` | Configuration file | `$XDG_CONFIG_HOME/overmux/overmux.config.ts` |
94
+
95
+ ### Snippet presets
96
+
97
+ [//]: # (BEGIN GENERATED AI CONTEXT PRESETS)
98
+
99
+ | Export | Included snippets |
100
+ | --- | --- |
101
+ | `defaultAiContextSnippets` | `package-source`, `tech-stack-recommendations` |
102
+ | `coreAiContextSnippets` | `package-source` |
103
+
104
+ [//]: # (END GENERATED AI CONTEXT PRESETS)
105
+
106
+ ### Available snippets
107
+
108
+ [//]: # (BEGIN GENERATED AI CONTEXT)
109
+
110
+ #### `package-source`
111
+
112
+ ```text
113
+ Overmux ships with documentation and TypeScript source.
114
+
115
+ Run `overmux docs path` to find the installed documentation directory for the Overmux CLI. This prints a documentation directory, not source paths.
116
+
117
+ Inspect TypeScript source in installed packages, e.g. `node_modules/overmux/src` and `node_modules/@overmux/xterm/src`.
118
+
119
+ Inspect these files so guidance matches the versions used by the application.
120
+ ```
121
+
122
+ #### `tech-stack-recommendations`
123
+
124
+ ```text
125
+ Prefer pnpm as the package manager, TanStack Router for routing, shadcn/ui for UI components, and Zod for schemas and runtime validation. Follow the application's established stack when it already differs.
126
+ ```
127
+
128
+ [//]: # (END GENERATED AI CONTEXT)
@@ -1,9 +1,7 @@
1
1
  ---
2
- title: "overmux desktop"
2
+ title: "`overmux desktop`"
3
3
  ---
4
4
 
5
- # `overmux desktop`
6
-
7
5
  Install or upgrade the experimental macOS desktop preview. The desktop version is independent from the `overmux` npm package version.
8
6
 
9
7
  ## Install
@@ -1,6 +1,5 @@
1
1
  ---
2
2
  title: Hosted pages
3
- description: Link to Overmux-owned settings and logout pages.
4
3
  ---
5
4
 
6
5
  # Hosted pages
@@ -1,8 +1,8 @@
1
- import { R as InstanceIdentity, w as ContractInputArguments } from "./index-DS70rKzo.js";
1
+ import { B as InstanceIdentity, w as ContractInputArguments } from "./index-Cz3xkCa4.js";
2
2
  import { z } from "zod";
3
3
  import { UseMutationResult } from "@tanstack/react-query";
4
4
  import { CSSProperties, ComponentType, ReactNode, RefObject } from "react";
5
- import { KeyBinding, KeyBinding as KeyBinding$1, formatKeyBinding, keyBindingSchema, matchesKeyBinding } from "@overmux/keybindings";
5
+ import { KeyBinding, KeyBinding as KeyBinding$1 } from "@overmux/keybindings";
6
6
  declare const enableBackgroundNotifications: () => Promise<boolean>;
7
7
  declare const disableBackgroundNotifications: () => Promise<void>;
8
8
  type DesktopHost = {
@@ -85,17 +85,6 @@ type ChordPrefix = {
85
85
  binding: KeyBinding$1;
86
86
  unmatched: "replay-to-focused-input";
87
87
  };
88
- declare const shortcutBindingSchema: z.ZodUnion<readonly [z.ZodCustom<KeyBinding$1, KeyBinding$1>, z.ZodArray<z.ZodCustom<KeyBinding$1, KeyBinding$1>>]>;
89
- declare const commandBindingSchema: z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodCustom<KeyBinding$1, KeyBinding$1>, z.ZodArray<z.ZodCustom<KeyBinding$1, KeyBinding$1>>]>, z.ZodObject<{
90
- binding: z.ZodUnion<readonly [z.ZodCustom<KeyBinding$1, KeyBinding$1>, z.ZodArray<z.ZodCustom<KeyBinding$1, KeyBinding$1>>]>;
91
- when: z.ZodObject<{
92
- media: z.ZodString;
93
- }, z.core.$strip>;
94
- }, z.core.$strip>]>;
95
- declare const chordPrefixSchema: z.ZodObject<{
96
- binding: z.ZodCustom<KeyBinding$1, KeyBinding$1>;
97
- unmatched: z.ZodLiteral<"replay-to-focused-input">;
98
- }, z.core.$strip>;
99
88
  declare const formatShortcutBinding: (binding: ShortcutBinding) => string;
100
89
  type CommandRunResult$1 = Promise<unknown> | unknown;
101
90
  type CommandRun<TServerConfig, TParams> = (input: {
@@ -139,6 +128,7 @@ type ClientAppDefinition<TCommands extends CommandRegistry = CommandRegistry> =
139
128
  chordPrefixes?: readonly ChordPrefix[];
140
129
  commands: TCommands;
141
130
  component: ComponentType;
131
+ navigate?: (route: string) => unknown;
142
132
  shortcutOverrides?: Partial<Record<Extract<keyof TCommands, string>, readonly CommandBinding[]>>;
143
133
  };
144
134
  declare const defineOvermuxClient: <const TCommands extends CommandRegistry>(definition: ClientAppDefinition<TCommands>) => ClientAppDefinition<TCommands>;
@@ -236,6 +226,7 @@ type ResourceResult<T> = {
236
226
  status: "success";
237
227
  };
238
228
  type StreamResult<TClientMessage, TServerMessage> = {
229
+ connectionId: symbol | undefined;
239
230
  close: () => void;
240
231
  error?: Error;
241
232
  send: (message: TClientMessage) => boolean;
@@ -263,5 +254,5 @@ type ShortcutInputTarget = {
263
254
  input: RefObject<HTMLElement | null>;
264
255
  };
265
256
  declare const useShortcutInputTarget: (target: ShortcutInputTarget) => void;
266
- export { type ChordPrefix, type CommandBinding, type CommandEntry, type CommandHandle, type ConditionalShortcutBinding, type InstanceIdentity, type KeyBinding, type KeySequence, type OvermuxClientAppearance, type OvermuxContrast, type OvermuxExternalPortalContainer, OvermuxHost, OvermuxPortal, type OvermuxPortalProps, type OvermuxScheme, type OvermuxServerApi, type OvermuxStyle, OvermuxThemeScope, type OvermuxThemeScopeProps, type OvermuxThemeToken, type ResourceResult, type ShortcutBinding, type ShortcutInputTarget, type SkipToken, type StreamResult, chordPrefixSchema, commandBindingSchema, createOvermuxHooks, defineCommandRegistry, defineOvermuxClient, disableBackgroundNotifications, enableBackgroundNotifications, formatKeyBinding, formatShortcutBinding, keyBindingSchema, matchesKeyBinding, readClipboardText, shortcutBindingSchema, skipToken, useCommand, useCommands, useShortcutInputTarget, writeClipboardText };
257
+ export { type ChordPrefix, type CommandBinding, type CommandEntry, type CommandHandle, type ConditionalShortcutBinding, type InstanceIdentity, type KeyBinding, type KeySequence, type OvermuxClientAppearance, type OvermuxContrast, type OvermuxExternalPortalContainer, OvermuxHost, OvermuxPortal, type OvermuxPortalProps, type OvermuxScheme, type OvermuxServerApi, type OvermuxStyle, OvermuxThemeScope, type OvermuxThemeScopeProps, type OvermuxThemeToken, type ResourceResult, type ShortcutBinding, type ShortcutInputTarget, type SkipToken, type StreamResult, createOvermuxHooks, defineCommandRegistry, defineOvermuxClient, disableBackgroundNotifications, enableBackgroundNotifications, formatShortcutBinding, readClipboardText, skipToken, useCommand, useCommands, useShortcutInputTarget, writeClipboardText };
267
258
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","names":[],"sources":["../../src/internal/client/background-notifications.ts","../../src/internal/client/host/desktop-host.ts","../../src/internal/client/clipboard.ts","../../src/internal/client/browser-api.ts","../../src/internal/client/theme-scope.tsx","../../src/internal/client/client-definition.ts","../../src/internal/client/commands.tsx","../../src/internal/client/overmux-react.ts","../../src/internal/client/host/overmux-host.tsx","../../src/internal/client/shortcuts.tsx"],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","names":[],"sources":["../../src/internal/client/background-notifications.ts","../../src/internal/client/host/desktop-host.ts","../../src/internal/client/clipboard.ts","../../src/internal/client/browser-api.ts","../../src/internal/client/theme-scope.tsx","../../src/internal/client/client-definition.ts","../../src/internal/client/commands.tsx","../../src/internal/client/overmux-react.ts","../../src/internal/client/host/overmux-host.tsx","../../src/internal/client/shortcuts.tsx"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import "./style.css";
2
- import { a as notificationSchema, l as resolveOvermuxReturnTo, o as overmuxLogoutPath, r as instanceIdSchema, t as createInstanceIdentity } from "./notifications-av0FK0yZ.js";
2
+ import { a as notificationSchema, c as parseDeepLink, l as resolveOvermuxReturnTo, o as overmuxLogoutPath, r as instanceIdSchema, t as createInstanceIdentity } from "./notifications-BFAD3QQl.js";
3
3
  import { z } from "zod";
4
4
  import { QueryClient, QueryClientProvider, useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
5
5
  import { Component, createContext, createElement, useCallback, useContext, useEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
6
- import { formatKeyBinding, formatKeyBinding as formatKeyBinding$1, keyBindingSchema, keyBindingSchema as keyBindingSchema$1, matchesKeyBinding, matchesKeyBinding as matchesKeyBinding$1, platformBinding } from "@overmux/keybindings";
6
+ import { formatKeyBinding, keyBindingSchema, matchesKeyBinding, platformBinding } from "@overmux/keybindings";
7
7
  import { createPortal } from "react-dom";
8
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region src/internal/shared/background-notifications.ts
@@ -320,16 +320,16 @@ const writeClipboardText = async (text) => {
320
320
  };
321
321
  //#endregion
322
322
  //#region src/internal/client/client-definition.ts
323
- const shortcutBindingSchema = z.union([keyBindingSchema$1, z.array(keyBindingSchema$1).min(2)]);
323
+ const shortcutBindingSchema = z.union([keyBindingSchema, z.array(keyBindingSchema).min(2)]);
324
324
  const commandBindingSchema = z.union([shortcutBindingSchema, z.object({
325
325
  binding: shortcutBindingSchema,
326
326
  when: z.object({ media: z.string().trim().min(1) })
327
327
  })]);
328
328
  const chordPrefixSchema = z.object({
329
- binding: keyBindingSchema$1,
329
+ binding: keyBindingSchema,
330
330
  unmatched: z.literal("replay-to-focused-input")
331
331
  });
332
- const formatShortcutBinding = (binding) => typeof binding === "string" ? formatKeyBinding$1(binding) : binding.map(formatKeyBinding$1).join(" ");
332
+ const formatShortcutBinding = (binding) => typeof binding === "string" ? formatKeyBinding(binding) : binding.map(formatKeyBinding).join(" ");
333
333
  const validateBindings = (bindings) => bindings?.forEach((binding) => commandBindingSchema.parse(binding));
334
334
  const defineCommandRegistry = () => (commands) => Object.fromEntries(Object.entries(commands).map(([id, command]) => {
335
335
  validateBindings(command.defaultBindings);
@@ -519,57 +519,98 @@ const useOperationById = (id, signal) => {
519
519
  const useStreamById = (id, input) => {
520
520
  const { manifest, overmuxServerApi } = useRuntime();
521
521
  const streamAvailable = manifest.streams.includes(id);
522
- const [state, setState] = useState({ status: "opening" });
523
- const listeners = useMemo(() => /* @__PURE__ */ new Set(), []);
524
522
  const canonicalInput = useCanonicalInput(input);
523
+ const scope = useMemo(() => ({
524
+ canonicalInput,
525
+ id,
526
+ overmuxServerApi,
527
+ streamAvailable
528
+ }), [
529
+ canonicalInput,
530
+ id,
531
+ overmuxServerApi,
532
+ streamAvailable
533
+ ]);
534
+ const [state, setState] = useState({
535
+ scope,
536
+ status: "opening"
537
+ });
538
+ const [listeners] = useState(() => /* @__PURE__ */ new Set());
525
539
  const streamRef = useRef(void 0);
526
540
  useEffect(() => {
527
541
  streamRef.current?.close();
528
542
  streamRef.current = void 0;
529
- if (!streamAvailable) {
530
- setState({ status: "closed" });
543
+ if (!scope.streamAvailable) {
544
+ setState({
545
+ scope,
546
+ status: "closed"
547
+ });
531
548
  return;
532
549
  }
533
- setState({ status: "opening" });
534
- const stream = overmuxServerApi.openStream({
535
- id,
536
- input: canonicalInput,
537
- onClose: () => setState({ status: "closed" }),
538
- onError: (error) => setState({
550
+ setState({
551
+ scope,
552
+ status: "opening"
553
+ });
554
+ let active = true;
555
+ const stream = scope.overmuxServerApi.openStream({
556
+ id: scope.id,
557
+ input: scope.canonicalInput,
558
+ onClose: () => active && setState({
559
+ scope,
560
+ status: "closed"
561
+ }),
562
+ onError: (error) => active && setState({
563
+ scope,
539
564
  error,
540
565
  status: "closed"
541
566
  }),
542
- onOpen: () => setState({ status: "open" }),
543
- onMessage: (message) => listeners.forEach((listener) => listener(message))
567
+ onOpen: () => active && setState({
568
+ scope,
569
+ connectionId: Symbol(scope.id),
570
+ status: "open"
571
+ }),
572
+ onMessage: (message) => active && listeners.forEach((listener) => listener(message))
544
573
  });
545
- streamRef.current = stream;
546
- return () => {
547
- stream.close();
548
- if (streamRef.current === stream) streamRef.current = void 0;
574
+ const connection = {
575
+ close: () => {
576
+ if (!active) return;
577
+ active = false;
578
+ if (streamRef.current === connection) streamRef.current = void 0;
579
+ setState({
580
+ scope,
581
+ status: "closed"
582
+ });
583
+ stream.close();
584
+ },
585
+ send: stream.send
549
586
  };
550
- }, [
551
- canonicalInput,
552
- id,
553
- listeners,
554
- overmuxServerApi,
555
- streamAvailable
556
- ]);
557
- const close = useCallback(() => {
558
- streamRef.current?.close();
559
- streamRef.current = void 0;
560
- setState({ status: "closed" });
561
- }, []);
562
- const send = useCallback((message) => streamRef.current?.send(message) ?? false, []);
563
- const subscribe = useCallback((listener) => {
564
- listeners.add(listener);
565
- return () => listeners.delete(listener);
566
- }, [listeners]);
587
+ streamRef.current = connection;
588
+ return connection.close;
589
+ }, [listeners, scope]);
590
+ const [methods] = useState(() => ({
591
+ close: () => streamRef.current?.close(),
592
+ send: (message) => streamRef.current?.send(message) ?? false,
593
+ subscribe: (listener) => {
594
+ listeners.add(listener);
595
+ return () => listeners.delete(listener);
596
+ }
597
+ }));
598
+ if (!streamAvailable) return {
599
+ ...methods,
600
+ connectionId: void 0,
601
+ error: /* @__PURE__ */ new Error(`Stream is not available: ${id}`),
602
+ status: "closed"
603
+ };
604
+ if (state.scope !== scope) return {
605
+ ...methods,
606
+ connectionId: void 0,
607
+ status: "opening"
608
+ };
567
609
  return {
568
- close,
569
- error: streamAvailable ? state.error : /* @__PURE__ */ new Error(`Stream is not available: ${id}`),
570
- send,
571
- status: streamAvailable ? state.status : "closed",
572
- subscribe
610
+ ...methods,
611
+ connectionId: state.connectionId,
612
+ error: state.error,
613
+ status: state.status
573
614
  };
574
615
  };
575
616
  const undiscoveredInstance = () => void 0;
@@ -763,12 +804,62 @@ const installInstanceForwarding = (transport) => {
763
804
  return unsubscribe;
764
805
  };
765
806
  //#endregion
807
+ //#region src/internal/client/host/deep-link-navigation.ts
808
+ const defaultNavigate = (route) => window.location.assign(route);
809
+ /**
810
+ * Intercepts overmux:// anchor activation inside the running app, including the
811
+ * temporary anchors created by xterm's default link handler. Without this,
812
+ * browser/PWA clicks dispatch the custom protocol to the OS, which fails in
813
+ * Android PWAs where it is not possible to install an Overmux protocol handler.
814
+ *
815
+ * Validates the original URL and compares its instance ID with authenticated
816
+ * runtime discovery. For same-instance links, preventDefault stops OS dispatch
817
+ * and navigate receives only the local path, query, and fragment. By default,
818
+ * this loads that route on the current origin; a supplied router callback avoids
819
+ * a document reload. Instance IDs are never treated as network hostnames.
820
+ *
821
+ * Valid cross-instance links remain Desktop's responsibility. Browsers/PWAs
822
+ * block unknown or different instances; all hosts block invalid links. Ordinary
823
+ * links and clicks already cancelled by application code are left untouched.
824
+ * Returns cleanup for the document listeners when the runtime unmounts.
825
+ */
826
+ const installDeepLinkNavigation = ({ getInstance, navigate = defaultNavigate }) => {
827
+ const onClick = (event) => {
828
+ if (event.defaultPrevented || event.button > 1) return;
829
+ const anchor = event.composedPath().find((target) => target instanceof HTMLAnchorElement);
830
+ if (anchor?.protocol !== "overmux:") return;
831
+ let link;
832
+ try {
833
+ link = parseDeepLink(anchor.getAttribute("href") ?? "");
834
+ } catch {
835
+ event.preventDefault();
836
+ console.warn("Cannot open an invalid Overmux deep link.");
837
+ return;
838
+ }
839
+ if (link.instanceId !== getInstance()?.instanceId) {
840
+ if (window.overmuxHost?.version !== 1) {
841
+ event.preventDefault();
842
+ console.warn("Cannot open an Overmux link to an unknown or different instance in this browser.");
843
+ }
844
+ return;
845
+ }
846
+ event.preventDefault();
847
+ navigate(link.route);
848
+ };
849
+ document.addEventListener("click", onClick);
850
+ document.addEventListener("auxclick", onClick);
851
+ return () => {
852
+ document.removeEventListener("click", onClick);
853
+ document.removeEventListener("auxclick", onClick);
854
+ };
855
+ };
856
+ //#endregion
766
857
  //#region src/internal/client/shortcuts.tsx
767
858
  const bindingSequence = (binding) => typeof binding === "string" ? [binding] : [...binding];
768
859
  const normalizedBinding = (binding) => bindingSequence(binding).map((key) => platformBinding(key));
769
860
  const sequenceMatches = (binding, pending, event) => {
770
861
  const sequence = normalizedBinding(binding);
771
- return sequence.length > pending.length && pending.every((key, index) => sequence[index] === key) && matchesKeyBinding$1(sequence[pending.length], event);
862
+ return sequence.length > pending.length && pending.every((key, index) => sequence[index] === key) && matchesKeyBinding(sequence[pending.length], event);
772
863
  };
773
864
  const isTextInput = (element) => element instanceof HTMLInputElement || element instanceof HTMLSelectElement || element instanceof HTMLTextAreaElement || element instanceof HTMLElement && (element.isContentEditable || element.getAttribute("role") === "textbox");
774
865
  const acceptsTextInput = (bindings) => {
@@ -924,7 +1015,7 @@ const ShortcutHost = ({ children, definition, registrations, registrationRevisio
924
1015
  if (runShortcut(complete.shortcut, event, registrations)) event.stopPropagation();
925
1016
  return;
926
1017
  }
927
- if (!pending.length) pendingTarget = definition.chordPrefixes?.some((prefix) => matchesKeyBinding$1(prefix.binding, event)) ? selectShortcutInputTarget(inputTargets, document.activeElement) : void 0;
1018
+ if (!pending.length) pendingTarget = definition.chordPrefixes?.some((prefix) => matchesKeyBinding(prefix.binding, event)) ? selectShortcutInputTarget(inputTargets, document.activeElement) : void 0;
928
1019
  pending = [...pending, normalizedBinding(matches[0].binding)[pending.length]];
929
1020
  pendingEvents = [...pendingEvents, event];
930
1021
  event.preventDefault();
@@ -1703,6 +1794,10 @@ const OvermuxRuntime = ({ definition }) => {
1703
1794
  }, [transport]);
1704
1795
  useEffect(() => installNotificationForwarding(transport), [transport]);
1705
1796
  useEffect(() => installInstanceForwarding(transport), [transport]);
1797
+ useEffect(() => installDeepLinkNavigation({
1798
+ getInstance: transport.getInstance,
1799
+ navigate: definition.navigate
1800
+ }), [transport, definition.navigate]);
1706
1801
  const refreshCommands = useCallback(() => setRegistrationRevision((revision) => revision + 1), []);
1707
1802
  const registerCommand = useCallback((registration) => {
1708
1803
  registrations.add(registration);
@@ -1747,6 +1842,6 @@ const OvermuxHost = ({ definition }) => /* @__PURE__ */ jsx(OvermuxThemeScope, {
1747
1842
  children: location.pathname === "/_overmux/settings" ? /* @__PURE__ */ jsx(HostedSettingsPage, {}) : location.pathname === "/_overmux/logout" ? /* @__PURE__ */ jsx(HostedLogoutPage, {}) : /* @__PURE__ */ jsx(OvermuxRuntime, { definition })
1748
1843
  });
1749
1844
  //#endregion
1750
- export { OvermuxHost, OvermuxPortal, OvermuxThemeScope, chordPrefixSchema, commandBindingSchema, createOvermuxHooks, defineCommandRegistry, defineOvermuxClient, disableBackgroundNotifications, enableBackgroundNotifications, formatKeyBinding, formatShortcutBinding, keyBindingSchema, matchesKeyBinding, readClipboardText, shortcutBindingSchema, skipToken, useCommand, useCommands, useShortcutInputTarget, writeClipboardText };
1845
+ export { OvermuxHost, OvermuxPortal, OvermuxThemeScope, createOvermuxHooks, defineCommandRegistry, defineOvermuxClient, disableBackgroundNotifications, enableBackgroundNotifications, formatShortcutBinding, readClipboardText, skipToken, useCommand, useCommands, useShortcutInputTarget, writeClipboardText };
1751
1846
 
1752
1847
  //# sourceMappingURL=client.js.map