@vibesdotdev/terminal-client 0.0.0-stage → 1.0.0-rc.2

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 (195) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +102 -2
  3. package/dist/ansi/index.d.ts +11 -0
  4. package/dist/ansi/index.d.ts.map +1 -0
  5. package/dist/ansi/index.js +11 -0
  6. package/dist/ansi/index.js.map +1 -0
  7. package/dist/ansi/keymap.d.ts +77 -0
  8. package/dist/ansi/keymap.d.ts.map +1 -0
  9. package/dist/ansi/keymap.js +257 -0
  10. package/dist/ansi/keymap.js.map +1 -0
  11. package/dist/api-client-plugin.d.ts +4 -0
  12. package/dist/api-client-plugin.d.ts.map +1 -0
  13. package/dist/api-client-plugin.js +16 -0
  14. package/dist/api-client-plugin.js.map +1 -0
  15. package/dist/client/http-session.d.ts +44 -0
  16. package/dist/client/http-session.d.ts.map +1 -0
  17. package/dist/client/http-session.js +457 -0
  18. package/dist/client/http-session.js.map +1 -0
  19. package/dist/client/index.d.ts +8 -0
  20. package/dist/client/index.d.ts.map +1 -0
  21. package/dist/client/index.js +8 -0
  22. package/dist/client/index.js.map +1 -0
  23. package/dist/client.d.ts +56 -0
  24. package/dist/client.d.ts.map +1 -0
  25. package/dist/client.js +169 -0
  26. package/dist/client.js.map +1 -0
  27. package/dist/index.d.ts +14 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +14 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/pty-bridge/index.d.ts +15 -0
  32. package/dist/pty-bridge/index.d.ts.map +1 -0
  33. package/dist/pty-bridge/index.js +15 -0
  34. package/dist/pty-bridge/index.js.map +1 -0
  35. package/dist/pty-bridge/protocol.d.ts +6 -0
  36. package/dist/pty-bridge/protocol.d.ts.map +1 -0
  37. package/dist/pty-bridge/protocol.js +6 -0
  38. package/dist/pty-bridge/protocol.js.map +1 -0
  39. package/dist/pty-bridge/server.d.ts +7 -0
  40. package/dist/pty-bridge/server.d.ts.map +1 -0
  41. package/dist/pty-bridge/server.js +9 -0
  42. package/dist/pty-bridge/server.js.map +1 -0
  43. package/dist/remote-session.d.ts +51 -0
  44. package/dist/remote-session.d.ts.map +1 -0
  45. package/dist/remote-session.js +326 -0
  46. package/dist/remote-session.js.map +1 -0
  47. package/dist/schemas/http.d.ts +61 -0
  48. package/dist/schemas/http.d.ts.map +1 -0
  49. package/dist/schemas/http.js +45 -0
  50. package/dist/schemas/http.js.map +1 -0
  51. package/dist/schemas/remote.d.ts +25 -0
  52. package/dist/schemas/remote.d.ts.map +1 -0
  53. package/dist/schemas/remote.js +23 -0
  54. package/dist/schemas/remote.js.map +1 -0
  55. package/dist/schemas/session.d.ts +26 -0
  56. package/dist/schemas/session.d.ts.map +1 -0
  57. package/dist/schemas/session.js +17 -0
  58. package/dist/schemas/session.js.map +1 -0
  59. package/dist/schemas/store.d.ts +29 -0
  60. package/dist/schemas/store.d.ts.map +1 -0
  61. package/dist/schemas/store.js +22 -0
  62. package/dist/schemas/store.js.map +1 -0
  63. package/dist/schemas/terminal.d.ts +296 -0
  64. package/dist/schemas/terminal.d.ts.map +1 -0
  65. package/dist/schemas/terminal.js +243 -0
  66. package/dist/schemas/terminal.js.map +1 -0
  67. package/dist/server/index.d.ts +9 -0
  68. package/dist/server/index.d.ts.map +1 -0
  69. package/dist/server/index.js +9 -0
  70. package/dist/server/index.js.map +1 -0
  71. package/dist/server/session-store.d.ts +176 -0
  72. package/dist/server/session-store.d.ts.map +1 -0
  73. package/dist/server/session-store.js +462 -0
  74. package/dist/server/session-store.js.map +1 -0
  75. package/dist/server/sse-stream.d.ts +32 -0
  76. package/dist/server/sse-stream.d.ts.map +1 -0
  77. package/dist/server/sse-stream.js +87 -0
  78. package/dist/server/sse-stream.js.map +1 -0
  79. package/dist/svelte/HostPicker.svelte +256 -0
  80. package/dist/svelte/HostPicker.svelte.d.ts +30 -0
  81. package/dist/svelte/HostPicker.svelte.d.ts.map +1 -0
  82. package/dist/svelte/README.md +52 -0
  83. package/dist/svelte/ReconnectBanner.svelte +88 -0
  84. package/dist/svelte/ReconnectBanner.svelte.d.ts +16 -0
  85. package/dist/svelte/ReconnectBanner.svelte.d.ts.map +1 -0
  86. package/dist/svelte/SessionTabs.svelte +192 -0
  87. package/dist/svelte/SessionTabs.svelte.d.ts +17 -0
  88. package/dist/svelte/SessionTabs.svelte.d.ts.map +1 -0
  89. package/dist/svelte/Terminal.svelte +567 -0
  90. package/dist/svelte/Terminal.svelte.d.ts +25 -0
  91. package/dist/svelte/Terminal.svelte.d.ts.map +1 -0
  92. package/dist/svelte/TerminalMobileToolbar.svelte +56 -0
  93. package/dist/svelte/TerminalMobileToolbar.svelte.d.ts +14 -0
  94. package/dist/svelte/TerminalMobileToolbar.svelte.d.ts.map +1 -0
  95. package/dist/svelte/TerminalWorkspace.svelte +562 -0
  96. package/dist/svelte/TerminalWorkspace.svelte.d.ts +25 -0
  97. package/dist/svelte/TerminalWorkspace.svelte.d.ts.map +1 -0
  98. package/dist/svelte/ambient.d.ts +9 -0
  99. package/dist/svelte/docs/terminal-svelte.docs.descriptor.d.ts +4 -0
  100. package/dist/svelte/docs/terminal-svelte.docs.descriptor.d.ts.map +1 -0
  101. package/dist/svelte/docs/terminal-svelte.docs.descriptor.js +74 -0
  102. package/dist/svelte/index.d.ts +27 -0
  103. package/dist/svelte/index.d.ts.map +1 -0
  104. package/dist/svelte/index.js +26 -0
  105. package/dist/svelte/styles.css +8 -0
  106. package/dist/svelte/terminal-session-authority.d.ts +17 -0
  107. package/dist/svelte/terminal-session-authority.d.ts.map +1 -0
  108. package/dist/svelte/terminal-session-authority.js +25 -0
  109. package/dist/svelte/terminal-svelte.plugin.d.ts +19 -0
  110. package/dist/svelte/terminal-svelte.plugin.d.ts.map +1 -0
  111. package/dist/svelte/terminal-svelte.plugin.js +42 -0
  112. package/dist/svelte/terminal-theme.d.ts +11 -0
  113. package/dist/svelte/terminal-theme.d.ts.map +1 -0
  114. package/dist/svelte/terminal-theme.js +116 -0
  115. package/dist/svelte/tool-widgets/TerminalToolCard.svelte +65 -0
  116. package/dist/svelte/tool-widgets/TerminalToolCard.svelte.d.ts +5 -0
  117. package/dist/svelte/tool-widgets/TerminalToolCard.svelte.d.ts.map +1 -0
  118. package/dist/svelte/tool-widgets/terminal-tool-card.d.ts +25 -0
  119. package/dist/svelte/tool-widgets/terminal-tool-card.d.ts.map +1 -0
  120. package/dist/svelte/tool-widgets/terminal-tool-card.js +116 -0
  121. package/dist/svelte/types.d.ts +160 -0
  122. package/dist/svelte/types.d.ts.map +1 -0
  123. package/dist/svelte/types.js +51 -0
  124. package/dist/svelte/workspace.d.ts +3 -0
  125. package/dist/svelte/workspace.d.ts.map +1 -0
  126. package/dist/svelte/workspace.js +2 -0
  127. package/dist/terminal-client.plugin.d.ts +3 -0
  128. package/dist/terminal-client.plugin.d.ts.map +1 -0
  129. package/dist/terminal-client.plugin.js +3 -0
  130. package/dist/terminal-client.plugin.js.map +1 -0
  131. package/dist/terminal-runtime.d.ts +30 -0
  132. package/dist/terminal-runtime.d.ts.map +1 -0
  133. package/dist/terminal-runtime.js +673 -0
  134. package/dist/terminal-runtime.js.map +1 -0
  135. package/dist/terminal.consumer.plugin.d.ts +14 -0
  136. package/dist/terminal.consumer.plugin.d.ts.map +1 -0
  137. package/dist/terminal.consumer.plugin.js +31 -0
  138. package/dist/terminal.consumer.plugin.js.map +1 -0
  139. package/dist/tools/terminal.impl.consumer.d.ts +11 -0
  140. package/dist/tools/terminal.impl.consumer.d.ts.map +1 -0
  141. package/dist/tools/terminal.impl.consumer.js +20 -0
  142. package/dist/tools/terminal.impl.consumer.js.map +1 -0
  143. package/dist/tools/terminal.schemas.d.ts +3 -0
  144. package/dist/tools/terminal.schemas.d.ts.map +1 -0
  145. package/dist/tools/terminal.schemas.js +3 -0
  146. package/dist/tools/terminal.schemas.js.map +1 -0
  147. package/dist/tools/terminal.unified.descriptor.d.ts +218 -0
  148. package/dist/tools/terminal.unified.descriptor.d.ts.map +1 -0
  149. package/dist/tools/terminal.unified.descriptor.js +36 -0
  150. package/dist/tools/terminal.unified.descriptor.js.map +1 -0
  151. package/dist/tui/index.d.ts +9 -0
  152. package/dist/tui/index.d.ts.map +1 -0
  153. package/dist/tui/index.js +8 -0
  154. package/dist/tui/index.js.map +1 -0
  155. package/dist/tui/terminal-open.descriptor.d.ts +9 -0
  156. package/dist/tui/terminal-open.descriptor.d.ts.map +1 -0
  157. package/dist/tui/terminal-open.descriptor.js +18 -0
  158. package/dist/tui/terminal-open.descriptor.js.map +1 -0
  159. package/dist/tui/terminal-open.impl.consumer.d.ts +9 -0
  160. package/dist/tui/terminal-open.impl.consumer.d.ts.map +1 -0
  161. package/dist/tui/terminal-open.impl.consumer.js +13 -0
  162. package/dist/tui/terminal-open.impl.consumer.js.map +1 -0
  163. package/dist/tui/terminal-registry.descriptor.d.ts +11 -0
  164. package/dist/tui/terminal-registry.descriptor.d.ts.map +1 -0
  165. package/dist/tui/terminal-registry.descriptor.js +17 -0
  166. package/dist/tui/terminal-registry.descriptor.js.map +1 -0
  167. package/dist/tui/terminal-registry.impl.consumer.d.ts +71 -0
  168. package/dist/tui/terminal-registry.impl.consumer.d.ts.map +1 -0
  169. package/dist/tui/terminal-registry.impl.consumer.js +190 -0
  170. package/dist/tui/terminal-registry.impl.consumer.js.map +1 -0
  171. package/dist/tui/terminal-tui.plugin.d.ts +10 -0
  172. package/dist/tui/terminal-tui.plugin.d.ts.map +1 -0
  173. package/dist/tui/terminal-tui.plugin.js +32 -0
  174. package/dist/tui/terminal-tui.plugin.js.map +1 -0
  175. package/dist/tui/terminal.descriptor.d.ts +10 -0
  176. package/dist/tui/terminal.descriptor.d.ts.map +1 -0
  177. package/dist/tui/terminal.descriptor.js +25 -0
  178. package/dist/tui/terminal.descriptor.js.map +1 -0
  179. package/dist/tui/terminal.impl.consumer.d.ts +14 -0
  180. package/dist/tui/terminal.impl.consumer.d.ts.map +1 -0
  181. package/dist/tui/terminal.impl.consumer.js +189 -0
  182. package/dist/tui/terminal.impl.consumer.js.map +1 -0
  183. package/dist/tui/terminal.state-key.d.ts +30 -0
  184. package/dist/tui/terminal.state-key.d.ts.map +1 -0
  185. package/dist/tui/terminal.state-key.js +9 -0
  186. package/dist/tui/terminal.state-key.js.map +1 -0
  187. package/dist/tui/terminal.state.d.ts +152 -0
  188. package/dist/tui/terminal.state.d.ts.map +1 -0
  189. package/dist/tui/terminal.state.js +149 -0
  190. package/dist/tui/terminal.state.js.map +1 -0
  191. package/dist/workspace.d.ts +155 -0
  192. package/dist/workspace.d.ts.map +1 -0
  193. package/dist/workspace.js +292 -0
  194. package/dist/workspace.js.map +1 -0
  195. package/package.json +228 -4
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @vibesdotdev/terminal-client/svelte
3
+ *
4
+ * The xterm.js rendering surface for an L3 `ExecutionSession` byte stream.
5
+ * `<Terminal session={…} />` writes keystrokes to the PTY, paints output, and
6
+ * wires resize/signal/exit. Transport-agnostic: the same component renders a
7
+ * local PTY (L9a) and an RPC proxy (L9b).
8
+ *
9
+ * Registers no runtime kinds — Terminal is a view over a session. The
10
+ * `./plugin` entrypoint registers package docs; the shared workspace entrypoint
11
+ * composes session choices through the host's handed runtime.
12
+ *
13
+ * All `@xterm/*` imports are deferred to `onMount` inside the component, so this
14
+ * barrel is import-safe on the server (no eager DOM/WebGL import, no `$state`
15
+ * barrel trap).
16
+ */
17
+ export { default as Terminal } from './Terminal.svelte';
18
+ export { default as TerminalWorkspace } from './TerminalWorkspace.svelte';
19
+ export { default as TerminalMobileToolbar } from './TerminalMobileToolbar.svelte';
20
+ export { default as HostPicker } from './HostPicker.svelte';
21
+ export { default as SessionTabs } from './SessionTabs.svelte';
22
+ export { default as ReconnectBanner } from './ReconnectBanner.svelte';
23
+ export { default as TerminalToolCard } from './tool-widgets/TerminalToolCard.svelte';
24
+ export { registerTerminalSvelteToolWidget, terminalSveltePlugin, terminalSvelteWidgetDescriptor, default } from './terminal-svelte.plugin.ts';
25
+ export { openTerminalWorkspaceSession, openTerminalWorkspaceTargetSession, terminalWorkspaceCapabilityBanner, terminalWorkspaceError, terminalWorkspaceExitedEvent, terminalWorkspacePlaceDefaultCapabilities, terminalWorkspacePlaceLabel, terminalWorkspaceStatusLabel, terminalWorkspaceVesselStateSchema, type OpenTerminalWorkspaceSessionInput, type OpenTerminalWorkspaceSessionResult, type OpenTerminalWorkspaceTargetSessionInput, type OpenTerminalWorkspaceTargetSessionResult, type TerminalWorkspaceExitedEvent, type TerminalWorkspaceLifecycleEvent, type TerminalWorkspaceOpenedReceipt, type TerminalWorkspaceRuntimePlaceOption, type TerminalWorkspaceSessionMode, type TerminalWorkspaceStatus } from '../workspace.ts';
26
+ export { DEFAULT_FONT, DEFAULT_TERMINAL_THEME, VIBES_TERMINAL_THEME, type ExecutionSession, type TerminalProps, type TerminalTheme, type HostOption, type TabSession } from './types.ts';
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svelte/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AACrF,OAAO,EACN,gCAAgC,EAChC,oBAAoB,EACpB,8BAA8B,EAC9B,OAAO,EACP,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,4BAA4B,EAC5B,kCAAkC,EAClC,iCAAiC,EACjC,sBAAsB,EACtB,4BAA4B,EAC5B,yCAAyC,EACzC,2BAA2B,EAC3B,4BAA4B,EAC5B,kCAAkC,EAClC,KAAK,iCAAiC,EACtC,KAAK,kCAAkC,EACvC,KAAK,uCAAuC,EAC5C,KAAK,wCAAwC,EAC7C,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,mCAAmC,EACxC,KAAK,4BAA4B,EACjC,KAAK,uBAAuB,EAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @vibesdotdev/terminal-client/svelte
3
+ *
4
+ * The xterm.js rendering surface for an L3 `ExecutionSession` byte stream.
5
+ * `<Terminal session={…} />` writes keystrokes to the PTY, paints output, and
6
+ * wires resize/signal/exit. Transport-agnostic: the same component renders a
7
+ * local PTY (L9a) and an RPC proxy (L9b).
8
+ *
9
+ * Registers no runtime kinds — Terminal is a view over a session. The
10
+ * `./plugin` entrypoint registers package docs; the shared workspace entrypoint
11
+ * composes session choices through the host's handed runtime.
12
+ *
13
+ * All `@xterm/*` imports are deferred to `onMount` inside the component, so this
14
+ * barrel is import-safe on the server (no eager DOM/WebGL import, no `$state`
15
+ * barrel trap).
16
+ */
17
+ export { default as Terminal } from './Terminal.svelte';
18
+ export { default as TerminalWorkspace } from './TerminalWorkspace.svelte';
19
+ export { default as TerminalMobileToolbar } from './TerminalMobileToolbar.svelte';
20
+ export { default as HostPicker } from './HostPicker.svelte';
21
+ export { default as SessionTabs } from './SessionTabs.svelte';
22
+ export { default as ReconnectBanner } from './ReconnectBanner.svelte';
23
+ export { default as TerminalToolCard } from './tool-widgets/TerminalToolCard.svelte';
24
+ export { registerTerminalSvelteToolWidget, terminalSveltePlugin, terminalSvelteWidgetDescriptor, default } from "./terminal-svelte.plugin.js";
25
+ export { openTerminalWorkspaceSession, openTerminalWorkspaceTargetSession, terminalWorkspaceCapabilityBanner, terminalWorkspaceError, terminalWorkspaceExitedEvent, terminalWorkspacePlaceDefaultCapabilities, terminalWorkspacePlaceLabel, terminalWorkspaceStatusLabel, terminalWorkspaceVesselStateSchema } from "../workspace.js";
26
+ export { DEFAULT_FONT, DEFAULT_TERMINAL_THEME, VIBES_TERMINAL_THEME } from "./types.js";
@@ -0,0 +1,8 @@
1
+ /*
2
+ * Tailwind v4 source declaration for consumers — mirrors @vibesdotdev/kit's
3
+ * styles.css pattern. Apps that @import this file get this package's
4
+ * components scanned by their Tailwind build, so utility classes used only
5
+ * inside these components are emitted in the app's CSS bundle (Tailwind
6
+ * never scans node_modules). Paths resolve relative to this file.
7
+ */
8
+ @source "./";
@@ -0,0 +1,17 @@
1
+ export interface TerminalSessionLease<T> {
2
+ session: T;
3
+ generation: number;
4
+ }
5
+ /**
6
+ * Keeps async output/exit callbacks scoped to the session attachment that
7
+ * created them. Detaching invalidates every outstanding lease immediately.
8
+ */
9
+ export declare class TerminalSessionAuthority<T> {
10
+ private generation;
11
+ private currentSession;
12
+ get current(): T | null;
13
+ attach(session: T): TerminalSessionLease<T>;
14
+ detach(session?: T): void;
15
+ isCurrent(lease: TerminalSessionLease<T>): boolean;
16
+ }
17
+ //# sourceMappingURL=terminal-session-authority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-session-authority.d.ts","sourceRoot":"","sources":["../../src/svelte/terminal-session-authority.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,qBAAa,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,cAAc,CAAkB;IAExC,IAAI,OAAO,IAAI,CAAC,GAAG,IAAI,CAEtB;IAED,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC;IAM3C,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI;IAMzB,SAAS,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO;CAGlD"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Keeps async output/exit callbacks scoped to the session attachment that
3
+ * created them. Detaching invalidates every outstanding lease immediately.
4
+ */
5
+ export class TerminalSessionAuthority {
6
+ generation = 0;
7
+ currentSession = null;
8
+ get current() {
9
+ return this.currentSession;
10
+ }
11
+ attach(session) {
12
+ this.currentSession = session;
13
+ this.generation += 1;
14
+ return { session, generation: this.generation };
15
+ }
16
+ detach(session) {
17
+ if (session !== undefined && this.currentSession !== session)
18
+ return;
19
+ this.currentSession = null;
20
+ this.generation += 1;
21
+ }
22
+ isCurrent(lease) {
23
+ return this.currentSession === lease.session && this.generation === lease.generation;
24
+ }
25
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Designed Kit card for `tools/tool:terminal`. Queued as `tools/ui` when the
3
+ * kind is not yet registered so docs-only hosts can still load this plugin.
4
+ */
5
+ export declare const terminalSvelteWidgetDescriptor: {
6
+ id: string;
7
+ kind: "tools/ui";
8
+ name: string;
9
+ description: string;
10
+ surfaces: readonly ["web"];
11
+ role: "widget";
12
+ targetToolId: string;
13
+ targetId: string;
14
+ enabled: boolean;
15
+ };
16
+ export declare function registerTerminalSvelteToolWidget(): void;
17
+ export declare const terminalSveltePlugin: import("@vibesdotdev/kernel").RuntimePlugin;
18
+ export default terminalSveltePlugin;
19
+ //# sourceMappingURL=terminal-svelte.plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-svelte.plugin.d.ts","sourceRoot":"","sources":["../../src/svelte/terminal-svelte.plugin.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,eAAO,MAAM,8BAA8B;;;;;;;;;;CAU1C,CAAC;AAEF,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD;AAID,eAAO,MAAM,oBAAoB,6CAiB/B,CAAC;AAEH,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { createRuntimeImplementation, createRuntimePlugin, loader, settle } from '@vibesdotdev/kernel';
2
+ import terminalSvelteDocsDescriptor from "./docs/terminal-svelte.docs.descriptor.js";
3
+ const loadTerminalToolCard = () => import('./tool-widgets/TerminalToolCard.svelte');
4
+ const kitToolWidgets = await settle(() => import('@vibesdotdev/kit/components/tool-widgets'));
5
+ const registerKitToolWidget = kitToolWidgets.ok ? kitToolWidgets.value.registerToolWidget : undefined;
6
+ /**
7
+ * Designed Kit card for `tools/tool:terminal`. Queued as `tools/ui` when the
8
+ * kind is not yet registered so docs-only hosts can still load this plugin.
9
+ */
10
+ export const terminalSvelteWidgetDescriptor = {
11
+ id: 'terminal.svelte-widget',
12
+ kind: 'tools/ui',
13
+ name: 'Terminal Svelte Widget',
14
+ description: 'Renders terminal tool results: cwd, command/session, and an output excerpt.',
15
+ surfaces: ['web'],
16
+ role: 'widget',
17
+ targetToolId: 'terminal',
18
+ targetId: 'terminal',
19
+ enabled: true
20
+ };
21
+ export function registerTerminalSvelteToolWidget() {
22
+ registerKitToolWidget?.(terminalSvelteWidgetDescriptor.targetToolId, loadTerminalToolCard);
23
+ }
24
+ registerTerminalSvelteToolWidget();
25
+ export const terminalSveltePlugin = createRuntimePlugin({
26
+ id: '@vibesdotdev/terminal-client/svelte',
27
+ name: 'Terminal Svelte',
28
+ description: 'Svelte terminal surfaces over runtime-resolved interactive execution sessions, including the designed terminal tool card.',
29
+ descriptors: [terminalSvelteDocsDescriptor, terminalSvelteWidgetDescriptor],
30
+ loaders: [
31
+ loader(terminalSvelteWidgetDescriptor.id, { kind: 'tools/ui', scope: 'browser' }, async () => {
32
+ registerTerminalSvelteToolWidget();
33
+ const module = await loadTerminalToolCard();
34
+ return createRuntimeImplementation({
35
+ kind: 'tools/ui',
36
+ id: terminalSvelteWidgetDescriptor.id,
37
+ implementation: { web: { component: module.default } }
38
+ });
39
+ })
40
+ ]
41
+ });
42
+ export default terminalSveltePlugin;
@@ -0,0 +1,11 @@
1
+ import { type TerminalTheme } from './types.ts';
2
+ interface TerminalAppearance {
3
+ theme: TerminalTheme;
4
+ fontFamily: string;
5
+ }
6
+ /** Resolve CSS through the browser: xterm cannot consume var() or oklch() itself. */
7
+ export declare function readTerminalAppearance(host: HTMLElement): TerminalAppearance;
8
+ /** Follow ancestor appearance, asynchronously loaded theme CSS, and font metrics. */
9
+ export declare function observeTerminalAppearance(host: HTMLElement, refresh: () => void): () => void;
10
+ export {};
11
+ //# sourceMappingURL=terminal-theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-theme.d.ts","sourceRoot":"","sources":["../../src/svelte/terminal-theme.ts"],"names":[],"mappings":"AACA,OAAO,EAAwC,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAoDtF,UAAU,kBAAkB;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,kBAAkB,CAuB5E;AAED,qFAAqF;AACrF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAkC5F"}
@@ -0,0 +1,116 @@
1
+ import { normalizeVibesMonacoColor } from '@vibesdotdev/kit/components/code/monaco-theme.js';
2
+ import { DEFAULT_FONT, DEFAULT_TERMINAL_THEME } from "./types.js";
3
+ const tokens = {
4
+ background: '--background',
5
+ foreground: '--foreground',
6
+ cursor: '--ring',
7
+ cursorAccent: '--background',
8
+ selectionBackground: '--accent',
9
+ selectionForeground: '--accent-foreground',
10
+ black: '--background',
11
+ red: '--destructive',
12
+ green: '--success',
13
+ yellow: '--warning',
14
+ blue: '--info',
15
+ magenta: '--primary',
16
+ cyan: '--info',
17
+ white: '--foreground',
18
+ brightBlack: '--muted-foreground',
19
+ brightRed: '--destructive',
20
+ brightGreen: '--success',
21
+ brightYellow: '--warning',
22
+ brightBlue: '--info',
23
+ brightMagenta: '--primary',
24
+ brightCyan: '--info',
25
+ brightWhite: '--foreground'
26
+ };
27
+ const terminalThemeKeys = [
28
+ 'background',
29
+ 'foreground',
30
+ 'cursor',
31
+ 'cursorAccent',
32
+ 'selectionBackground',
33
+ 'selectionForeground',
34
+ 'black',
35
+ 'red',
36
+ 'green',
37
+ 'yellow',
38
+ 'blue',
39
+ 'magenta',
40
+ 'cyan',
41
+ 'white',
42
+ 'brightBlack',
43
+ 'brightRed',
44
+ 'brightGreen',
45
+ 'brightYellow',
46
+ 'brightBlue',
47
+ 'brightMagenta',
48
+ 'brightCyan',
49
+ 'brightWhite'
50
+ ];
51
+ /** Resolve CSS through the browser: xterm cannot consume var() or oklch() itself. */
52
+ export function readTerminalAppearance(host) {
53
+ const document = host.ownerDocument;
54
+ const view = document.defaultView;
55
+ if (!view)
56
+ return { theme: { ...DEFAULT_TERMINAL_THEME }, fontFamily: DEFAULT_FONT.family };
57
+ const probe = document.createElement('span');
58
+ probe.style.cssText =
59
+ 'position:absolute;visibility:hidden;pointer-events:none;width:0;height:0;overflow:hidden';
60
+ probe.setAttribute('aria-hidden', 'true');
61
+ host.appendChild(probe);
62
+ try {
63
+ const theme = {};
64
+ for (const key of terminalThemeKeys) {
65
+ const terminalToken = key.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
66
+ probe.style.color = `var(--terminal-${terminalToken}, var(${tokens[key]}, ${DEFAULT_TERMINAL_THEME[key]}))`;
67
+ theme[key] =
68
+ normalizeVibesMonacoColor(view.getComputedStyle(probe).color, document) ??
69
+ DEFAULT_TERMINAL_THEME[key];
70
+ }
71
+ probe.style.fontFamily = `var(--vibes-font-mono, var(--font-mono, ${DEFAULT_FONT.family}))`;
72
+ return { theme, fontFamily: view.getComputedStyle(probe).fontFamily };
73
+ }
74
+ finally {
75
+ probe.remove();
76
+ }
77
+ }
78
+ /** Follow ancestor appearance, asynchronously loaded theme CSS, and font metrics. */
79
+ export function observeTerminalAppearance(host, refresh) {
80
+ const document = host.ownerDocument;
81
+ const view = document.defaultView;
82
+ if (!view)
83
+ return () => { };
84
+ let frame = null;
85
+ const schedule = () => {
86
+ if (frame !== null)
87
+ return;
88
+ frame = view.requestAnimationFrame(() => {
89
+ frame = null;
90
+ refresh();
91
+ });
92
+ };
93
+ const observer = new view.MutationObserver(schedule);
94
+ for (let element = host; element; element = element.parentElement) {
95
+ observer.observe(element, { attributes: true });
96
+ }
97
+ if (document.head)
98
+ observer.observe(document.head, {
99
+ childList: true,
100
+ subtree: true,
101
+ attributes: true,
102
+ characterData: true
103
+ });
104
+ const media = view.matchMedia('(prefers-color-scheme: dark)');
105
+ media.addEventListener('change', schedule);
106
+ document.addEventListener('load', schedule, true);
107
+ document.fonts?.addEventListener('loadingdone', schedule);
108
+ return () => {
109
+ observer.disconnect();
110
+ media.removeEventListener('change', schedule);
111
+ document.removeEventListener('load', schedule, true);
112
+ document.fonts?.removeEventListener('loadingdone', schedule);
113
+ if (frame !== null)
114
+ view.cancelAnimationFrame(frame);
115
+ };
116
+ }
@@ -0,0 +1,65 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Designed Kit card for the `terminal` tool: cwd, command/session, and a
4
+ * bounded output excerpt through CodeViewer.
5
+ */
6
+ import { CodeViewer } from '@vibesdotdev/kit/components/code';
7
+ import { Badge } from '@vibesdotdev/kit/components/ui/badge';
8
+ import {
9
+ ToolCard,
10
+ ToolCardBody,
11
+ type ToolWidgetProps
12
+ } from '@vibesdotdev/kit/components/tool-widgets';
13
+ import { presentTerminalToolCard } from './terminal-tool-card.js';
14
+
15
+ let { tool, compact = false }: ToolWidgetProps = $props();
16
+
17
+ const view = $derived(presentTerminalToolCard(tool.input, tool.output));
18
+ const exitOk = $derived(view.exitCode === 0 || view.exitCode === null);
19
+ </script>
20
+
21
+ <ToolCard {tool} {compact} title={view.title} icon="lucide:terminal">
22
+ <ToolCardBody {compact}>
23
+ <div class="flex flex-wrap items-center gap-1.5">
24
+ {#if view.action}
25
+ <Badge variant="outline" class="text-caption">{view.action}</Badge>
26
+ {/if}
27
+ {#if view.sessionId}
28
+ <Badge variant="secondary" class="font-mono text-caption">{view.sessionId}</Badge>
29
+ {/if}
30
+ {#if view.exitCode !== null}
31
+ <Badge variant={exitOk ? 'secondary' : 'destructive'} class="text-caption">
32
+ exit {view.exitCode}
33
+ </Badge>
34
+ {/if}
35
+ {#if view.timedOut}
36
+ <Badge variant="warning" class="text-caption">timed out</Badge>
37
+ {/if}
38
+ </div>
39
+ {#if view.cwd}
40
+ <p class="truncate font-mono text-muted-foreground" data-terminal-cwd={view.cwd}>
41
+ cwd {view.cwd}
42
+ </p>
43
+ {/if}
44
+ {#if view.command}
45
+ <p class="truncate font-mono text-foreground" data-terminal-command={view.command}>
46
+ {view.command}
47
+ </p>
48
+ {/if}
49
+ {#if view.excerpt}
50
+ {#if view.truncated}
51
+ <p class="text-caption text-muted-foreground">Showing the tail of the output.</p>
52
+ {/if}
53
+ <CodeViewer
54
+ code={view.excerpt}
55
+ language="plaintext"
56
+ appearance="system"
57
+ maxHeight="16rem"
58
+ minHeight="0"
59
+ showLineNumbers={false}
60
+ />
61
+ {:else if !tool.error}
62
+ <p class="text-muted-foreground italic">Running…</p>
63
+ {/if}
64
+ </ToolCardBody>
65
+ </ToolCard>
@@ -0,0 +1,5 @@
1
+ import { type ToolWidgetProps } from '@vibesdotdev/kit/components/tool-widgets';
2
+ declare const TerminalToolCard: import("svelte").Component<ToolWidgetProps, {}, "">;
3
+ type TerminalToolCard = ReturnType<typeof TerminalToolCard>;
4
+ export default TerminalToolCard;
5
+ //# sourceMappingURL=TerminalToolCard.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalToolCard.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/tool-widgets/TerminalToolCard.svelte.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,eAAe,EACpB,MAAM,0CAA0C,CAAC;AAyDnD,QAAA,MAAM,gBAAgB,qDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Presentation for the `terminal` Kit ToolCard. Chat and other hosts map a
3
+ * tool call onto `{ input, output }`; this layer extracts cwd, command/session,
4
+ * and a bounded output excerpt for CodeViewer.
5
+ */
6
+ export declare const TERMINAL_OUTPUT_EXCERPT_MAX_CHARS = 4000;
7
+ export interface TerminalToolCardView {
8
+ title: string;
9
+ action: string;
10
+ cwd: string;
11
+ command: string;
12
+ sessionId: string;
13
+ excerpt: string;
14
+ truncated: boolean;
15
+ exitCode: number | null;
16
+ timedOut: boolean;
17
+ }
18
+ interface TerminalOutputExcerpt {
19
+ excerpt: string;
20
+ truncated: boolean;
21
+ }
22
+ export declare function excerptTerminalOutput(output: string, maxChars?: number): TerminalOutputExcerpt;
23
+ export declare function presentTerminalToolCard<Input, Output>(input: Input, output: Output): TerminalToolCardView;
24
+ export {};
25
+ //# sourceMappingURL=terminal-tool-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-tool-card.d.ts","sourceRoot":"","sources":["../../../src/svelte/tool-widgets/terminal-tool-card.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,eAAO,MAAM,iCAAiC,OAAQ,CAAC;AAEvD,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,qBAAqB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACnB;AAqED,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,MAAM,EACd,QAAQ,SAAoC,GAC1C,qBAAqB,CAMvB;AAUD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EACpD,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACZ,oBAAoB,CAuBtB"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Presentation for the `terminal` Kit ToolCard. Chat and other hosts map a
3
+ * tool call onto `{ input, output }`; this layer extracts cwd, command/session,
4
+ * and a bounded output excerpt for CodeViewer.
5
+ */
6
+ import { CapabilityError } from '@vibesdotdev/kernel';
7
+ import * as z from 'zod/v4';
8
+ export const TERMINAL_OUTPUT_EXCERPT_MAX_CHARS = 4_000;
9
+ const NonEmptyStringSchema = z.string().min(1);
10
+ const StringListSchema = z.array(NonEmptyStringSchema);
11
+ const TerminalCardSessionSchema = z.object({
12
+ id: z.string().optional(),
13
+ command: z.string().optional(),
14
+ status: z.string().optional()
15
+ }).passthrough();
16
+ const TerminalCardRecordSchema = z.object({
17
+ action: z.string().optional(),
18
+ cwd: z.string().optional(),
19
+ command: z.union([z.string(), z.array(z.string())]).optional(),
20
+ args: z.array(z.string()).optional(),
21
+ sessionId: z.string().optional(),
22
+ text: z.string().optional(),
23
+ keys: z.array(z.string()).optional(),
24
+ output: z.string().optional(),
25
+ stdout: z.string().optional(),
26
+ sessions: z.array(TerminalCardSessionSchema).optional(),
27
+ exitCode: z.number().finite().nullable().optional(),
28
+ timedOut: z.boolean().optional()
29
+ }).passthrough();
30
+ function parseRecord(value) {
31
+ try {
32
+ const parsed = TerminalCardRecordSchema.safeParse(value);
33
+ return parsed.success ? parsed.data : null;
34
+ }
35
+ catch (cause) {
36
+ throw new CapabilityError('The terminal tool card data is unreadable.', 'INVALID_INPUT', {
37
+ reason: 'terminal-tool-card-data-invalid',
38
+ retryable: false,
39
+ cause
40
+ });
41
+ }
42
+ }
43
+ function nonEmptyStrings(values) {
44
+ if (values === undefined)
45
+ return [];
46
+ const parsed = StringListSchema.safeParse(values);
47
+ return parsed.success ? parsed.data : [];
48
+ }
49
+ function joinCommand(command, args) {
50
+ if (Array.isArray(command))
51
+ return nonEmptyStrings(command).join(' ');
52
+ const base = command ?? '';
53
+ const extra = nonEmptyStrings(args);
54
+ if (base && extra.length > 0)
55
+ return [base, ...extra].join(' ');
56
+ if (base)
57
+ return base;
58
+ return extra.join(' ');
59
+ }
60
+ function commandFrom(input, output) {
61
+ const fromFields = joinCommand(input?.command ?? output?.command, input?.args);
62
+ if (fromFields)
63
+ return fromFields;
64
+ if (input?.text)
65
+ return input.text;
66
+ return nonEmptyStrings(input?.keys).join(' ');
67
+ }
68
+ function formatSessions(sessions) {
69
+ if (sessions === undefined)
70
+ return '';
71
+ return sessions
72
+ .map((row) => [row.status, row.id, row.command].filter(Boolean).join(' '))
73
+ .filter(Boolean)
74
+ .join('\n');
75
+ }
76
+ export function excerptTerminalOutput(output, maxChars = TERMINAL_OUTPUT_EXCERPT_MAX_CHARS) {
77
+ if (output.length <= maxChars)
78
+ return { excerpt: output, truncated: false };
79
+ let slice = output.slice(output.length - maxChars);
80
+ const newline = slice.indexOf('\n');
81
+ if (newline >= 0 && newline < slice.length - 1)
82
+ slice = slice.slice(newline + 1);
83
+ return { excerpt: slice, truncated: true };
84
+ }
85
+ function excerptFrom(output) {
86
+ const stream = output?.output || output?.stdout || '';
87
+ if (stream)
88
+ return excerptTerminalOutput(stream);
89
+ const sessions = formatSessions(output?.sessions);
90
+ if (sessions)
91
+ return excerptTerminalOutput(sessions);
92
+ return { excerpt: '', truncated: false };
93
+ }
94
+ export function presentTerminalToolCard(input, output) {
95
+ const inRecord = parseRecord(input);
96
+ const outRecord = parseRecord(output);
97
+ const action = outRecord?.action || inRecord?.action || '';
98
+ const cwd = inRecord?.cwd || outRecord?.cwd || '';
99
+ const command = commandFrom(inRecord, outRecord);
100
+ const sessionId = outRecord?.sessionId || inRecord?.sessionId || '';
101
+ const { excerpt, truncated } = excerptFrom(outRecord);
102
+ const exitCode = outRecord?.exitCode ?? null;
103
+ const timedOut = outRecord?.timedOut === true;
104
+ const title = command || (sessionId ? `Session ${sessionId}` : '') || (action ? `Terminal ${action}` : 'Terminal');
105
+ return {
106
+ title,
107
+ action,
108
+ cwd,
109
+ command,
110
+ sessionId,
111
+ excerpt,
112
+ truncated,
113
+ exitCode,
114
+ timedOut
115
+ };
116
+ }