diff --git a/.github/workflows/port-docs.yml b/.github/workflows/port-docs.yml index 88b9edabc..8b2af0ed7 100644 --- a/.github/workflows/port-docs.yml +++ b/.github/workflows/port-docs.yml @@ -497,6 +497,22 @@ jobs: mix deps.get --only prod mix run --no-start "$EXPORTER" _build/docs/api.json + - if: matrix.port == 'ocaml' + uses: ocaml/setup-ocaml@ff66428f72b64472e749b22e0ad4dded4b2ddca6 # v3.9.1 + with: + ocaml-compiler: ocaml-base-compiler.5.5.2 + opam-local-packages: port/*.opam + - name: Export OCaml API from the selected source + if: matrix.port == 'ocaml' + working-directory: port + env: + LIBTMUX_API_EXPORT: '1' + run: | + set -euo pipefail + opam install . --deps-only --with-doc --yes + opam exec -- dune build @install tools/api_export.exe + opam exec -- python3 tools/export_api.py --output _build/docs/ocaml.json + - if: matrix.port == 'ruby' uses: ruby/setup-ruby@14594264cd68ce8a2345dd349bc3d138a4ef85c8 # v1.327.0 with: diff --git a/.github/workflows/reusable-deploy.yml b/.github/workflows/reusable-deploy.yml index 2c32efe52..6abfd29b0 100644 --- a/.github/workflows/reusable-deploy.yml +++ b/.github/workflows/reusable-deploy.yml @@ -144,7 +144,7 @@ jobs: echo "::error::path-prefix '$p' must be an unrooted path using letters, digits, '.', '_', '-' and '/', without '..'" >&2 exit 1 fi - reserved=(py ruby lua powershell julia elixir ts rs go java kotlin scala csharp fsharp cxx swift manifest _shell) + reserved=(py ruby lua powershell julia elixir ts rs go java kotlin scala csharp fsharp cxx swift ocaml manifest _shell) for r in "${reserved[@]}"; do if [[ "$p" == "$r" ]]; then echo "::error::path-prefix '$p' is a bare reserved top-level name — qualify it, e.g. '$r/latest'" >&2 @@ -153,7 +153,7 @@ jobs: done if [[ -n "${PORT_IN:-}" ]]; then case "$PORT_IN" in - py|ruby|lua|powershell|julia|elixir|ts|rs|go|java|kotlin|scala|csharp|fsharp|cxx|swift) ;; + py|ruby|lua|powershell|julia|elixir|ts|rs|go|java|kotlin|scala|csharp|fsharp|cxx|swift|ocaml) ;; *) echo "::error::unknown port '$PORT_IN'" >&2; exit 1 ;; esac if [[ ! "$VERSION_IN" =~ ^[a-zA-Z0-9][a-zA-Z0-9._-]*$ || "$VERSION_IN" == *..* ]]; then diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 91f9f8e88..e9d612640 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -53,11 +53,14 @@ jobs: - name: Resolve integrated guide sources id: integrated-sources run: | - echo "ruby=$(jq -r .revision site/src/data/api/ruby.json)" >> "$GITHUB_OUTPUT" - echo "lua=$(jq -r .revision site/src/data/api/lua.json)" >> "$GITHUB_OUTPUT" - echo "powershell=$(jq -r .revision site/src/data/api/powershell.json)" >> "$GITHUB_OUTPUT" - echo "julia=$(jq -r .revision site/src/data/api/julia.json)" >> "$GITHUB_OUTPUT" - echo "elixir=$(jq -r .revision site/src/data/api/elixir.json)" >> "$GITHUB_OUTPUT" + { + echo "ruby=$(jq -r .revision site/src/data/api/ruby.json)" + echo "lua=$(jq -r .revision site/src/data/api/lua.json)" + echo "powershell=$(jq -r .revision site/src/data/api/powershell.json)" + echo "julia=$(jq -r .revision site/src/data/api/julia.json)" + echo "elixir=$(jq -r .revision site/src/data/api/elixir.json)" + echo "ocaml=$(jq -r .revision site/src/data/api/ocaml.json)" + } >> "$GITHUB_OUTPUT" - uses: actions/checkout@v7 with: @@ -89,6 +92,12 @@ jobs: ref: ${{ steps.integrated-sources.outputs.elixir }} path: .port-sources/elixir persist-credentials: false + - uses: actions/checkout@v7 + with: + repository: libtmux/libtmux-ocaml + ref: ${{ steps.integrated-sources.outputs.ocaml }} + path: .port-sources/ocaml + persist-credentials: false # The exporter tests compile a fixture with the package's own toolchain: # the exact pair the integrated Elixir source pins, read as port-docs.yml @@ -112,6 +121,7 @@ jobs: LIBTMUX_DOCS_CHECKOUT_POWERSHELL: ${{ github.workspace }}/.port-sources/powershell LIBTMUX_DOCS_CHECKOUT_JULIA: ${{ github.workspace }}/.port-sources/julia LIBTMUX_DOCS_CHECKOUT_ELIXIR: ${{ github.workspace }}/.port-sources/elixir + LIBTMUX_DOCS_CHECKOUT_OCAML: ${{ github.workspace }}/.port-sources/ocaml run: | node scripts/stage-port-docs.mjs --from-source node scripts/stage-port-docs.mjs --cached --check @@ -131,12 +141,15 @@ jobs: PREVIEW_PREFIX: pr-${{ github.event.pull_request.number }} LIBTMUX_DOCS_CHECKOUT_RUBY: ${{ github.workspace }}/.port-sources/ruby LIBTMUX_DOCS_CHECKOUT_LUA: ${{ github.workspace }}/.port-sources/lua + LIBTMUX_DOCS_CHECKOUT_OCAML: ${{ github.workspace }}/.port-sources/ocaml # PowerShell, Julia and Elixir paths stay scoped to guide staging # above, which checks the cache used by ordinary builds. Native API # and MCP export freshness remain owning-port checks, not claims of # this root audit. Elixir's exporter tests run in the unit step; its # committed model is derived again by port-docs.yml at publication. - LIBTMUX_DOCS_SKIP_NATIVE_MODEL_PORTS: ruby,lua,powershell,julia,elixir + # OCaml's checkout also feeds source-derived usage checks. Its + # compiled API is qualified by the owning port's exporter job. + LIBTMUX_DOCS_SKIP_NATIVE_MODEL_PORTS: ruby,lua,powershell,julia,elixir,ocaml - name: Upload audited preview if: github.event_name == 'pull_request' diff --git a/packages/api-model/src/builtins.ts b/packages/api-model/src/builtins.ts index 246d01d17..45ec7877a 100644 --- a/packages/api-model/src/builtins.ts +++ b/packages/api-model/src/builtins.ts @@ -153,6 +153,15 @@ const ELIXIR_BUILTIN_TYPES = [ ] export const BUILTINS: Record> = { + ocaml: { + Iarray: 'https://ocaml.org/manual/5.5/api/Iarray.html', + 'Iarray.t': 'https://ocaml.org/manual/5.5/api/Iarray.html#TYPEt', + List: 'https://ocaml.org/manual/5.5/api/List.html', + Seq: 'https://ocaml.org/manual/5.5/api/Seq.html', + 'Seq.t': 'https://ocaml.org/manual/5.5/api/Seq.html#TYPEt', + 'Seq.filter': 'https://ocaml.org/manual/5.5/api/Seq.html#VALfilter', + Unix: 'https://ocaml.org/manual/5.5/api/Unix.html', + }, elixir: { ...Object.fromEntries(ELIXIR_BASIC_TYPES.map((name) => [name, elixirDocs('typespecs.html#basic-types')])), ...Object.fromEntries(ELIXIR_BUILTIN_TYPES.map((name) => [name, elixirDocs('typespecs.html#built-in-types')])), diff --git a/packages/api-model/src/concepts.ts b/packages/api-model/src/concepts.ts index f5b23c9ac..a194e51ca 100644 --- a/packages/api-model/src/concepts.ts +++ b/packages/api-model/src/concepts.ts @@ -3824,6 +3824,74 @@ for (const [id, binding] of Object.entries(ELIXIR_CONCEPTS)) { if (binding.note) (concept.notes ??= {}).elixir = binding.note } CONCEPTS['list-session-panes']!.absent!.julia = 'Traverse `windows(session)` and `panes(window)` in the captured snapshot. `panes(snapshot)` has server-wide scope.' + +const OCAML_CONCEPTS: Record = { + server: { symbol: 'Libtmux_unix.Client.t', variants: ['Libtmux_eio.Client.t'], note: 'A client is a live, generation-bound server connection. Endpoint describes a socket without connecting; closing a client releases its resources.' }, + session: { symbol: 'Libtmux.Session.t' }, + window: { symbol: 'Libtmux.Window.t', note: 'A global window can have several session placements. Window_link holds the session, index and current flag.' }, + pane: { symbol: 'Libtmux.Pane.t' }, + 'workspace-description': { symbol: 'Libtmux_workspace.Config.t' }, + 'build-workspace': { symbol: 'Libtmux_unix.Workspace.await', variants: ['Libtmux_eio.Workspace.await'], note: 'Apply a validated Plan through submit, then await its retained execution receipt. Inspect preserves partial and late outcomes.' }, + snapshot: { symbol: 'Libtmux_unix.Client.capture', variants: ['Libtmux_eio.Client.capture'], note: 'Acquires a complete immutable graph over an interval. Earlier observations remain readable without refreshing.' }, + 'list-sessions': { symbol: 'Libtmux.Snapshot.sessions', note: 'Reads an immutable array of already captured sessions without I/O.' }, + 'list-windows': { symbol: 'Libtmux.Session.windows', note: 'Reads distinct captured global windows in this session. window_links preserves individual indexed placements.' }, + 'list-panes': { symbol: 'Libtmux.Window.panes', note: 'Reads captured panes in one global window without I/O.' }, + 'list-server-windows': { symbol: 'Libtmux.Snapshot.windows', note: 'Reads captured global windows; use window_links for indexed session placements.' }, + 'list-server-panes': { symbol: 'Libtmux.Snapshot.panes' }, + 'list-clients': { symbol: 'Libtmux.Snapshot.clients', note: 'Reads captured attached-client observations, separate from transport Client.t handles.' }, + 'pane-window': { symbol: 'Libtmux.Pane.window' }, + 'window-session': { symbol: 'Libtmux.Window_link.session', note: 'The session belongs to a placement. A global Window has no single containing session.' }, + 'window-link-window': { symbol: 'Libtmux.Window_link.window' }, + 'client-session': { symbol: 'Libtmux.Client_observation.session', note: 'Returns the captured session when the attached client had one.' }, + 'get-session': { symbol: 'Libtmux.Snapshot.find_session', note: 'Exact opaque-ID lookup in an existing snapshot, without I/O or tmux target expansion.' }, + 'get-window': { symbol: 'Libtmux.Snapshot.find_window', note: 'Exact opaque-ID lookup in an existing snapshot, without I/O.' }, + 'get-pane': { symbol: 'Libtmux.Snapshot.find_pane', note: 'Exact opaque-ID lookup in an existing snapshot, without I/O.' }, + 'window-index': { symbol: 'Libtmux.Window_link.index' }, + 'window-active': { symbol: 'Libtmux.Window_link.is_current' }, +} +for (const [concept, operation] of Object.entries({ + 'capture-pane': 'capture_text', 'send-keys': 'send_keys', 'split-pane': 'split_pane', + 'respawn-pane': 'respawn_pane', 'clear-history': 'clear_history', 'set-pane-title': 'set_pane_title', + 'select-layout': 'select_layout', 'rotate-panes': 'rotate_panes', 'unlink-window': 'unlink_window_at', + 'new-session': 'create_session', 'new-window': 'create_window', 'kill-session': 'kill_session', + 'kill-window': 'kill_window', 'kill-pane': 'kill_pane', 'rename-session': 'rename_session', + 'rename-window': 'rename_window', 'select-window': 'select_window_at', 'select-pane': 'select_pane', + 'resize-pane': 'resize_pane', 'resize-window': 'resize_window', 'link-window': 'link_window', + 'move-window': 'move_window_at', 'break-pane': 'break_pane', 'move-pane': 'move_pane', + 'join-pane': 'move_pane', 'swap-pane': 'swap_panes', 'detach-client': 'request_detach_client_at', + 'refresh-client': 'refresh_client_at', 'switch-client': 'switch_client_at', + 'wait-for': 'wait_for', 'server-version': 'version', +})) OCAML_CONCEPTS[concept] = { symbol: `Libtmux_unix.Client.${operation}`, variants: [`Libtmux_eio.Client.${operation}`] } +for (const [prefix, owner, members] of [ + ['session', 'Session', ['id', 'name', 'attached']], + ['window', 'Window', ['id', 'name', 'height', 'width', 'layout']], + ['pane', 'Pane', ['id', 'index', 'height', 'width', 'title', 'active', 'current_command', 'current_path', 'pid', 'dead']], +] as const) for (const member of members) OCAML_CONCEPTS[`${prefix}-${member.replaceAll('_', '-')}`] = { symbol: `Libtmux.${owner}.${member}` } +for (const scope of ['server', 'session', 'window', 'pane']) { + for (const [suffix, operation] of Object.entries({ options: 'capture_options', option: 'read_option', hooks: 'capture_hooks' })) { + OCAML_CONCEPTS[`${scope}-${suffix}`] = { symbol: `Libtmux_unix.Client.${operation}`, variants: [`Libtmux_eio.Client.${operation}`], note: 'Pass the corresponding explicit Options scope; captured tables preserve their source and inheritance policy.' } + } + for (const [prefix, operation] of Object.entries({ 'set-': 'set_option', 'unset-': 'unset_option' })) OCAML_CONCEPTS[`${prefix}${scope}-option`] = { symbol: `Libtmux_unix.Client.${operation}`, variants: [`Libtmux_eio.Client.${operation}`] } + for (const [prefix, operation] of Object.entries({ 'set-': 'set_hook', 'unset-': 'remove_hook' })) OCAML_CONCEPTS[`${prefix}${scope}-hook`] = { symbol: `Libtmux_unix.Client.${operation}`, variants: [`Libtmux_eio.Client.${operation}`] } +} +for (const scope of ['server', 'session']) { + OCAML_CONCEPTS[`${scope}-environment`] = { symbol: 'Libtmux_unix.Client.capture_environment', variants: ['Libtmux_eio.Client.capture_environment'], note: 'Pass Environment.Global for server values or Environment.Session with a bound session target. Acquisition is explicit.' } + for (const [prefix, operation] of Object.entries({ 'set-': 'set_environment', 'unset-': 'unset_environment', 'remove-': 'remove_environment' })) OCAML_CONCEPTS[`${prefix}${scope}-environment`] = { symbol: `Libtmux_unix.Client.${operation}`, variants: [`Libtmux_eio.Client.${operation}`] } +} +for (const [id, binding] of Object.entries(OCAML_CONCEPTS)) { + const concept = CONCEPTS[id] + if (!concept) throw new Error(`concepts: OCaml maps unknown concept ${id}`) + concept.symbols.ocaml = binding.symbol + if (binding.note) (concept.notes ??= {}).ocaml = binding.note + if (binding.variants) (concept.variants ??= {}).ocaml = binding.variants +} +for (const [id, reason] of Object.entries({ + 'freeze-workspace': 'The workspace packages validate and apply descriptions; they do not export a live session as configuration.', + 'list-session-panes': 'Traverse Session.windows and Window.panes in the captured graph. Snapshot.panes has server-wide scope.', + 'pane-session': 'A pane belongs to a global window that can have several session placements. Traverse Window.links and Window_link.session.', + 'kill-server': 'Client.close releases transport resources. The public client API does not terminate a borrowed tmux daemon.', + 'server-from-env': 'Endpoint selection is explicit. Construct a named socket or socket path; the library does not infer an ambient server.', +})) (CONCEPTS[id]!.absent ??= {}).ocaml = reason for (const concept of Object.values(CONCEPTS)) { concept.absent ??= {} if (!concept.symbols.powershell) concept.absent.powershell ??= 'No source-verified PowerShell equivalent is recorded for this operation.' @@ -3834,6 +3902,7 @@ for (const concept of Object.values(CONCEPTS)) { if (!concept.symbols.kotlin) concept.absent.kotlin = 'No source-verified Kotlin equivalent is recorded for this operation.' if (!concept.symbols.scala) concept.absent.scala = 'No source-verified Scala equivalent is recorded for this operation.' if (!concept.symbols.fsharp) concept.absent.fsharp = 'No source-verified F# equivalent is recorded for this operation.' + if (!concept.symbols.ocaml) concept.absent.ocaml ??= 'No direct public OCaml equivalent is recorded for this operation.' } /** Every concept naming this symbol, including concepts sharing an overload group. */ diff --git a/packages/api-model/src/doc/roles.ts b/packages/api-model/src/doc/roles.ts index 791867b29..cbbfb3bd7 100644 --- a/packages/api-model/src/doc/roles.ts +++ b/packages/api-model/src/doc/roles.ts @@ -48,6 +48,8 @@ export type DocSpan = target: string /** What to show. `~` means "last segment only"; explicit titles win. */ label: string + /** Custom odoc labels are prose rather than code. */ + code?: boolean } /** @@ -296,6 +298,7 @@ const SYNTAX: Record> = { // ExDoc links a Markdown destination written as code: [the server](`LibTmux.Server`). elixir: new Set(['markdown-link', 'exdoc']), powershell: new Set(['markdown-link']), + ocaml: new Set(['odoc', 'markdown-link']), } /** @@ -352,6 +355,21 @@ function tokenizeRun(text: string, lang?: string): DocSpan[] { type Hit = { start: number; end: number; span: DocSpan } const hits: Hit[] = [] + if (syntax.has('odoc')) { + // The native exporter preserves references and converts odoc code and URL links to Markdown. + for (const match of text.matchAll(/\{\{!([^{}\s]+)\}([^{}]*)\}|\{!([^{}\s]+)\}/g)) { + let target = match[1] ?? match[3]! + const legacy = /^(type|val|module|module-type|class|class-type|exception|constructor|field):(.+)$/.exec(target) + const typed = /(?:^|\.)(module-type|class-type|type|val|value|module|class|exception|exn|constructor|const|field|recfield)-([^.]+)$/.exec(target) + const kind = legacy?.[1] ?? typed?.[1] + if (legacy) target = legacy[2]! + else if (typed) target = target.slice(0, typed.index) + (typed[0].startsWith('.') ? '.' : '') + typed[2]! + const label = match[1] ? match[2]! : target.replace(/(?:^|(?<=\.))(?:module-type|class-type|type|val|value|module|class|exception|exn|constructor|const|field|recfield)-/g, '') + hits.push({ start: match.index, end: match.index + match[0].length, + span: { kind: 'ref', role: `odoc:${kind ?? 'any'}`, target, label, ...(match[1] ? { code: false } : {}) } }) + } + } + if (syntax.has('documenter')) { // Documenter's named @ref destination contains spaces that Markdown URLs cannot. for (const match of text.matchAll(/\[(?:(`+)([^\n]*?)\1|([^\]\n]+))\]\(@ref\s+([^\n)]+)\)/g)) { @@ -599,7 +617,7 @@ function tokenizeRun(text: string, lang?: string): DocSpan[] { } } else { for (const code of markdownCode(text, masked.join(''))) { - const span: DocSpan = code.ticks === 1 + const span: DocSpan = syntax.has('odoc') ? { kind: 'code', text: code.text } : code.ticks === 1 ? { kind: 'ref', role: 'any', target: syntax.has('intra-doc') && RUST_CODE_PATH_RE.test(code.text) ? rustTarget(code.text) : code.text, label: code.text } : syntax.has('docc') && code.ticks === 2 ? { kind: 'ref', role: 'any', target: doccTarget(code.text), label: code.text } diff --git a/packages/api-model/src/inventory.ts b/packages/api-model/src/inventory.ts index 7c6867981..f190b9543 100644 --- a/packages/api-model/src/inventory.ts +++ b/packages/api-model/src/inventory.ts @@ -46,6 +46,7 @@ const DOMAIN: Record = { kotlin: 'std', scala: 'std', fsharp: 'std', + ocaml: 'std', csharp: 'std', swift: 'std', } diff --git a/packages/api-model/src/languages/ocaml-examples.ts b/packages/api-model/src/languages/ocaml-examples.ts new file mode 100644 index 000000000..682a31a09 --- /dev/null +++ b/packages/api-model/src/languages/ocaml-examples.ts @@ -0,0 +1,57 @@ +import type { ApiSymbol } from '../model.ts' + +interface Showcase { + capability: string + title: string + file: string + whole_file: boolean + command: string[] + expected_stdout_line: string + success_exit_code: number +} + +const targets: Readonly> = { + bootstrap: ['Libtmux_unix.Workspace.submit_bootstrap', 'Libtmux_unix.Workspace.await', 'Libtmux_unix.Workspace.client'], + graph: ['Libtmux.Snapshot.sessions', 'Libtmux.Session.window_links', 'Libtmux.Window.panes', 'Libtmux_unix.Client.capture'], + watch: ['Libtmux_eio.Client.subscribe', 'Libtmux_eio.Subscription.wait_for_bytes'], + 'send-keys': ['Libtmux_unix.Client.send_text', 'Libtmux_unix.Client.send_keys'], + 'rename-window': ['Libtmux_unix.Client.rename_window'], + 'create-window': ['Libtmux_unix.Client.create_window'], + 'move-window': ['Libtmux_unix.Client.move_window_at'], + layout: ['Libtmux_unix.Client.select_layout'], +} + +/** Read whole, CI-executed programs at the same commit as the public interface. */ +export function attachCompleteOcamlExamples(symbols: ApiSymbol[], read: (path: string) => string, revision: string): void { + const manifest = JSON.parse(read('examples/showcase.json')) as { + schema: string; tmux_floor: string; ci: { workflow: string; job: string; runner: string }; examples: Showcase[] + } + if (manifest.schema !== 'libtmux.showcase/1' || manifest.tmux_floor !== '3.3a' || + manifest.ci.workflow !== '.github/workflows/ocaml.yml' || manifest.ci.job !== 'native' || + manifest.ci.runner !== 'test/showcase_test.py' || !Array.isArray(manifest.examples)) { + throw new Error('Invalid OCaml CI showcase manifest') + } + const found = new Set() + for (const example of manifest.examples) { + if (!targets[example.capability] || found.has(example.capability) || !example.whole_file || + !/^examples\/showcase_[a-z_]+\.ml$/.test(example.file) || example.success_exit_code !== 0 || + JSON.stringify(example.command) !== JSON.stringify(['opam', 'exec', '--', 'dune', 'exec', + example.file.replace(/\.ml$/, '.exe'), '--', 'tmux'])) throw new Error('Invalid OCaml whole program') + found.add(example.capability) + const code = read(example.file) + if (!code.includes('let () =') || code.split('\n').length > 151) throw new Error('Incomplete OCaml entry point') + const sourceUrl = `https://github.com/libtmux/libtmux-ocaml/blob/${revision}/${example.file}` + for (const target of targets[example.capability]!) { + const matches = symbols.filter((symbol) => symbol.id === target) + if (matches.length !== 1) throw new Error(`OCaml showcase target must resolve once: ${target}`) + const symbol = matches[0]! + symbol.doc = { summary: '', ...symbol.doc, examples: [...(symbol.doc?.examples ?? []), + { lang: 'ocaml', code, sourceUrl, + intro: `${example.title}. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide.` }, + { lang: 'console', code: `$ ${example.command.join(' ')}\n`, intro: 'Run the recorded entry point:' }, + { lang: 'text', code: example.expected_stdout_line + '\n', intro: 'Expected outcome line, after the temporary socket path:' }, + ] } + } + } + if (found.size !== Object.keys(targets).length) throw new Error('Missing OCaml capability showcase') +} diff --git a/packages/api-model/src/languages/ocaml.test.ts b/packages/api-model/src/languages/ocaml.test.ts new file mode 100644 index 000000000..67e53846f --- /dev/null +++ b/packages/api-model/src/languages/ocaml.test.ts @@ -0,0 +1,102 @@ +import { describe, expect, it } from 'vitest' +import { extractOcamlArtifact } from './ocaml.ts' +import { SymbolIndex } from '../link.ts' +import type { ApiSymbol } from '../model.ts' + +const revision = 'a'.repeat(40) +const exporter = 'b'.repeat(40) +const artifact = () => ({ + schema: 'libtmux.ocaml-api/1', port: 'ocaml', compiler: '5.5.2', revision, + repo: 'https://github.com/libtmux/libtmux-ocaml', extractor: 'native cmti', + nativeProvenance: { files: [{ path: 'lib/libtmux.mli', sha256: 'c'.repeat(64) }], exporter: { revision: exporter } }, + sources: [{ package: 'libtmux', product: 'core', repo: 'https://github.com/libtmux/libtmux-ocaml', revision }], + symbols: [ + { id: 'Libtmux', name: 'Libtmux', qualifiedName: 'Libtmux', publicId: 'Libtmux', publicOwner: 'Libtmux', + apiScope: 'exported', package: 'libtmux', product: 'core', kind: 'module', modifiers: [], signatures: [], + source: { file: 'lib/libtmux.mli', line: 1, revision } }, + { id: 'Libtmux.t', name: 't', qualifiedName: 'Libtmux.t', publicId: 'Libtmux.t', parent: 'Libtmux', publicOwner: 'Libtmux', + apiScope: 'exported', package: 'libtmux', product: 'core', kind: 'typealias', modifiers: ['opaque'], + signatures: [{ raw: 'type t', params: [] }], source: { file: 'lib/libtmux.mli', line: 2, revision } }, + ], +}) + +describe('OCaml compiled public interfaces', () => { + it('keeps typed odoc links, custom labels, guide URLs and literal code distinct', () => { + const symbols = artifact().symbols as ApiSymbol[] + const common = { ...symbols[1]!, name: 'state', qualifiedName: 'Libtmux.state', modifiers: [] } + symbols.push({ ...common, id: 'Libtmux.state', publicId: 'Libtmux.state', kind: 'function' }, + { ...common, id: 'Libtmux.state:type', publicId: 'Libtmux.state:type', kind: 'enum' }, + { ...common, id: 'Libtmux.state:type.Ready', publicId: 'Libtmux.state:type.Ready', parent: 'Libtmux.state:type', name: 'Ready', qualifiedName: 'Libtmux.Ready', kind: 'constant', variant: 'unit' }) + const index = new SymbolIndex(symbols, (symbol) => `/${symbol.id}`, 'ocaml') + const spans = index.docSpans('{!type-state} {!val-state} {{!type-state}the state type} `state` [Guide](https://ocaml.org/manual/5.5/typedecl.html)', symbols[0]) + const references = spans.filter((span) => span.kind === 'ref') + expect(references.map((span) => span.link?.symbol?.id)).toEqual(['Libtmux.state:type', 'Libtmux.state', 'Libtmux.state:type']) + expect(references[2]).toMatchObject({ label: 'the state type', code: false }) + expect(spans).toContainEqual({ kind: 'code', text: 'state' }) + expect(spans).toContainEqual({ kind: 'link', text: 'Guide', href: 'https://ocaml.org/manual/5.5/typedecl.html' }) + expect(index.docSpans('{!type-missing}', symbols[0])[0]).toMatchObject({ target: 'missing', link: undefined }) + expect(index.docSpans('{!module-Libtmux.type-state}', symbols[1])[0]).toMatchObject({ link: { symbol: { id: 'Libtmux.state:type' } } }) + expect(index.docSpans('{!type:Libtmux.state}', symbols[1])[0]).toMatchObject({ link: { symbol: { id: 'Libtmux.state:type' } } }) + expect(index.docSpans('{!module-state}', symbols[0])[0]).toMatchObject({ link: undefined }) + expect(index.docSpans('{!Libtmux.Ready}', symbols[0])[0]).toMatchObject({ link: { symbol: { id: 'Libtmux.state:type.Ready' } } }) + expect(index.docSpans('{!type-state.constructor-Ready}', symbols[0])[0]).toMatchObject({ link: { symbol: { id: 'Libtmux.state:type.Ready' } } }) + expect(index.docSpans('{!val-Ready}', symbols[0])[0]).toMatchObject({ link: undefined }) + const signature = { raw: 'val state : t -> state', params: [] } + const typeSpans = index.linkType(signature.raw, symbols[2], signature) + expect(typeSpans.filter((span) => span.text === 'state')).toMatchObject([ + { declaration: true }, { link: { symbol: { id: 'Libtmux.state:type' } } }, + ]) + expect(index.linkType("('state, 'other) state", symbols[2]).filter((span) => span.link) + .map((span) => span.link?.symbol?.id)).toEqual(['Libtmux.state:type']) + expect(index.resolve('Iarray')?.href).toBe('https://ocaml.org/manual/5.5/api/Iarray.html') + expect(index.linkType('state Seq.t', symbols[2]).find((span) => span.text === 'Seq.t')?.link) + .toMatchObject({ href: 'https://ocaml.org/manual/5.5/api/Seq.html#TYPEt', external: true }) + }) + + it('retains opaque types, native signatures and independent source/tool identities', () => { + const model = extractOcamlArtifact(artifact(), revision) + expect(model.port).toBe('ocaml') + expect(model.symbols[1]?.signatures[0]?.raw).toBe('type t') + expect(model.symbols[1]?.modifiers).toEqual(['opaque']) + expect(model.revision).toBe(revision) + expect(model.nativeProvenance?.exporter.revision).toBe(exporter) + }) + + it('resolves module-alias members in odoc and signatures without crossing namespaces', () => { + const root = artifact().symbols[0]! as ApiSymbol + const symbol = (id: string, kind: ApiSymbol['kind'], parent: string, extra = {}): ApiSymbol => ({ + ...root, id, publicId: id, qualifiedName: id.replace(/:type$/, ''), + name: id.split('.').at(-1)!.replace(/:type$/, ''), kind, parent, ...extra, + }) + const owner = symbol('Libtmux.Client', 'module', 'Libtmux') + const values = [root, owner, + symbol('Libtmux.Report', 'module', 'Libtmux'), + symbol('Libtmux.Report.state', 'function', 'Libtmux.Report'), + symbol('Libtmux.Report.state:type', 'typealias', 'Libtmux.Report'), + symbol('Libtmux.Cleanup', 'module', 'Libtmux', { exportedFrom: 'Libtmux.Report' }), + symbol('Libtmux.Client.Local', 'module', owner.id, { exportedFrom: 'Libtmux.Cleanup' }), + symbol('Libtmux.Cycle', 'module', 'Libtmux', { exportedFrom: 'Libtmux.Cycle' }), + ] + const index = new SymbolIndex(values, (value) => `/${value.id}`, 'ocaml') + expect(index.resolve('Cleanup.state', 'odoc:val', owner)?.symbol?.id).toBe('Libtmux.Report.state') + expect(index.resolve('module-Local.type-state', 'odoc:type', owner)?.symbol?.id).toBe('Libtmux.Report.state:type') + expect(index.linkType('Local.state', owner)[0]?.link?.symbol?.id).toBe('Libtmux.Report.state:type') + expect(index.resolve('Cleanup.state', 'odoc:module', owner)).toBeUndefined() + expect(index.resolve('type-Cleanup.val-state', 'odoc:val', owner)).toBeUndefined() + expect(index.resolve('Cleanup.missing', 'odoc:val', owner)).toBeUndefined() + expect(index.resolve('Cycle.state', 'odoc:val', owner)).toBeUndefined() + }) + + it('rejects stale revisions, private paths, unknown products and unresolved aliases', () => { + expect(() => extractOcamlArtifact(artifact(), exporter)).toThrow(/revision/) + const privateSymbol = artifact() + privateSymbol.symbols[1]!.id = 'Libtmux__Graph.t' + expect(() => extractOcamlArtifact(privateSymbol)).toThrow(/public/) + const mcp = artifact() + mcp.symbols[1]!.product = 'mcp' + expect(() => extractOcamlArtifact(mcp)).toThrow(/product/) + const missing = artifact() + Object.assign(missing.symbols[1]!, { exportedFrom: 'Libtmux.Private' }) + expect(() => extractOcamlArtifact(missing)).toThrow(/alias/) + }) +}) diff --git a/packages/api-model/src/languages/ocaml.ts b/packages/api-model/src/languages/ocaml.ts new file mode 100644 index 000000000..b4771fe6a --- /dev/null +++ b/packages/api-model/src/languages/ocaml.ts @@ -0,0 +1,52 @@ +import type { ApiModel, ApiSymbol } from '../model.ts' + +interface OcamlArtifact extends ApiModel { + schema: string + compiler: string +} + +const roots: Readonly> = { + Libtmux: 'libtmux', Libtmux_workspace: 'libtmux-workspace', Libtmux_json: 'libtmux-json', + Libtmux_unix: 'libtmux-unix', Libtmux_eio: 'libtmux-eio', +} + +/** Adapt the native public .cmti export without parsing OCaml as another language. */ +export function extractOcamlArtifact(input: unknown, revision?: string): ApiModel { + const artifact = input as OcamlArtifact + if (artifact?.schema !== 'libtmux.ocaml-api/1' || artifact.port !== 'ocaml' || + artifact.compiler !== '5.5.2' || !/^[a-f0-9]{40}$/.test(artifact.revision ?? '') || + revision !== undefined && revision !== artifact.revision) { + throw new Error('OCaml artifact schema, compiler or library revision mismatch') + } + const exporterRevision = artifact.nativeProvenance?.exporter.revision + if (typeof exporterRevision !== 'string' || !/^[a-f0-9]{40}$/.test(exporterRevision) || + !artifact.nativeProvenance?.files.length || !Array.isArray(artifact.symbols) || !artifact.symbols.length) { + throw new Error('OCaml artifact requires committed exporter and public input provenance') + } + const ids = new Set(artifact.symbols.map((symbol) => symbol.id)) + if (ids.size !== artifact.symbols.length) throw new Error('Duplicate OCaml public identity') + for (const symbol of artifact.symbols) { + const root = symbol.id.split('.')[0]! + if (!roots[root] || symbol.id.includes('__') || symbol.package !== roots[root] || + symbol.apiScope !== 'exported' || symbol.publicOwner !== root || symbol.publicId !== symbol.id || + !symbol.qualifiedName || !symbol.name || symbol.parent && !ids.has(symbol.parent)) { + throw new Error(`Invalid OCaml public declaration: ${symbol.id}`) + } + if (!['core', 'workspace'].includes(symbol.product ?? '')) throw new Error('Unsupported OCaml product') + if (!/^(lib|unix|eio|json|workspace)\/\w+\.mli$/.test(symbol.source.file) || + !Number.isInteger(symbol.source.line) || (symbol.source.line ?? 0) < 1 || + symbol.source.revision !== artifact.revision) { + throw new Error(`Invalid OCaml source identity: ${symbol.id}`) + } + if (symbol.exportedFrom && !ids.has(symbol.exportedFrom)) throw new Error('Unresolved OCaml public alias') + if (!Array.isArray(symbol.signatures) || symbol.signatures.some((signature) => + !signature.raw || signature.params.some((param) => param.default !== undefined))) { + throw new Error(`Invalid OCaml native signature: ${symbol.id}`) + } + } + return { + port: 'ocaml', revision: artifact.revision, repo: artifact.repo, sources: artifact.sources, + extractor: artifact.extractor, nativeProvenance: artifact.nativeProvenance, + symbols: artifact.symbols.map((symbol): ApiSymbol => ({ ...symbol })), + } +} diff --git a/packages/api-model/src/link.ts b/packages/api-model/src/link.ts index e8e8553be..58f5b7077 100644 --- a/packages/api-model/src/link.ts +++ b/packages/api-model/src/link.ts @@ -34,6 +34,16 @@ const ROLE_KINDS: Record = { any: [], } +const ODOC_KINDS = new Map([ + ['type', ['typealias', 'enum', 'struct', 'union']], + ['val', ['function', 'constant']], ['value', ['function', 'constant']], + ['module', ['module']], ['module-type', ['interface']], + ['class', ['class']], ['class-type', ['interface']], + ['exception', ['exception']], ['exn', ['exception']], + ['constructor', ['constant']], ['const', ['constant']], + ['field', ['attribute']], ['recfield', ['attribute']], +]) + /** * Names that belong to the language, not to us. * @@ -89,6 +99,7 @@ const SIGNATURE_KEYWORDS: Record> = Object.fromEntries(Objec // Attributes that open a declaration, and the guard of a spec. elixir: 'spec type opaque callback macrocallback when', cxx: 'alignas alignof auto class concept const consteval constexpr constinit decltype default delete enum explicit extern final friend inline mutable namespace noexcept operator override register requires static struct template thread_local typedef typename union using virtual volatile', + ocaml: 'type val module sig end with and of private mutable exception include functor', }).map(([port, words]) => [port, new Set(words.split(' '))])) /** Language help stays separate from links to API declarations. */ @@ -317,6 +328,8 @@ function implSelfArguments(header: string): string[] | undefined { export class SymbolIndex { private readonly byPublic = new Map() private readonly byQualified = new Map() + /** Native qualified names and contextual constructor/field paths share this lookup. */ + private readonly ocamlPaths = new Map() // Keyed by declaration id. `parent` is a declaration id, so looking an owner // up in byPublic silently misses every time — which is why relative // references stayed at 0% until this map existed. @@ -390,6 +403,12 @@ export class SymbolIndex { aliases.push(s) this.byQualified.set(qualified, aliases) + if (this.lang === 'ocaml') { + for (const path of new Set([qualified, s.id.replace(/:type(?=\.|$)/g, '')])) { + this.ocamlPaths.set(path, [...(this.ocamlPaths.get(path) ?? []), s]) + } + } + const suffixes = new Set([pub, qualified].flatMap((name) => { const parts = name.split('.') return parts.slice(1).map((_, i) => parts.slice(i + 1).join('.')) @@ -706,6 +725,7 @@ export class SymbolIndex { * turned 59 dead references into links, most of the remaining gap. */ resolve(target: string, role = 'any', context?: ApiSymbol): LinkTarget | undefined { + if (this.lang === 'ocaml' && role.startsWith('odoc:')) return this.resolveOdoc(target, role.slice(5), context) // A name the context binds as a type parameter is that parameter, never a // same-named global. if (context && TYPE_PARAMETER_ROLES.has(role) && /^[A-Za-z_$][\w$]*$/.test(target)) { @@ -715,6 +735,61 @@ export class SymbolIndex { return role === 'typeparam' ? undefined : this.resolveSymbol(target, role, context) } + /** Resolve odoc's namespaces from the containing module outward, without a global suffix guess. */ + private resolveOdoc(target: string, role: string, context?: ApiSymbol, aliases = new Set()): LinkTarget | undefined { + const segments = target.split('.').map((part) => { + const typed = /^(module-type|class-type|type|val|value|module|class|exception|exn|constructor|const|field|recfield)-(.+)$/.exec(part) + return { name: typed?.[2] ?? part, role: typed?.[1] } + }) + if (segments.some((part) => !part.name)) return undefined + const path = segments.map((part) => part.name).join('.') + const matches = (symbol: ApiSymbol, kind: string | undefined) => { + if (!kind || kind === 'any') return true + if (!ODOC_KINDS.get(kind)?.includes(symbol.kind)) return false + if (kind === 'constructor' || kind === 'const') return symbol.variant !== undefined + if (kind === 'val' || kind === 'value') return symbol.variant === undefined + return true + } + const scopes = new Set() + for (let owner = context; owner; owner = this.parentOf(owner)) { + if (owner.kind === 'module' || owner.kind === 'interface') scopes.add(`${qualifiedNameOf(owner)}.`) + } + scopes.add('') + const parentsMatch = (symbol: ApiSymbol, last: number) => { + let ancestor = this.parentOf(symbol) + for (let i = last - 1; i >= 0; i--) { + // OCaml also exposes record labels and variant constructors directly in their module. + while (ancestor && ancestor.name !== segments[i]!.name && !['module', 'interface'].includes(ancestor.kind)) ancestor = this.parentOf(ancestor) + if (!ancestor || ancestor.name !== segments[i]!.name || !matches(ancestor, segments[i]!.role)) return false + ancestor = this.parentOf(ancestor) + } + return true + } + for (const scope of scopes) { + const candidates = (this.ocamlPaths.get(`${scope}${path}`) ?? []) + .filter((symbol) => matches(symbol, role) && parentsMatch(symbol, segments.length - 1)) + if (candidates.length === 1) { + const symbol = candidates[0]! + return { href: this.hrefFor(symbol), external: false, symbol } + } + if (candidates.length > 1) return undefined + // A module alias keeps its own page; its members link to their public declarations. + for (let count = segments.length - 1; count > 0; count--) { + const prefix = `${scope}${segments.slice(0, count).map((part) => part.name).join('.')}` + const modules = (this.ocamlPaths.get(prefix) ?? []).filter((symbol) => + symbol.kind === 'module' && symbol.exportedFrom && + matches(symbol, segments[count - 1]!.role) && parentsMatch(symbol, count - 1)) + if (modules.length > 1) return undefined + const alias = modules[0] + if (!alias) continue + if (aliases.has(alias.id)) return undefined + const suffix = target.split('.').slice(count).join('.') + return this.resolveOdoc(`${alias.exportedFrom}.${suffix}`, role, undefined, new Set([...aliases, alias.id])) + } + } + return undefined + } + private resolveSymbol(target: string, role: string, context?: ApiSymbol): LinkTarget | undefined { const relative = target.startsWith('.') const goType = this.lang === 'go' && role === 'class' @@ -1372,7 +1447,7 @@ export class SymbolIndex { // F# type variables start with an apostrophe but do not close like strings. const re = new RegExp(this.lang === 'cxx' ? String.raw`(?${cppLiteral}|\d(?:[eEpP][+-]|[\w.'])*)|(?\/\*[\s\S]*?\*\/|\/\/[^\n]*|${identifier})|(?[^A-Za-z_0-9"'/]+|["'/])` - : this.lang === 'fsharp' ? pattern.replace('(?', String.raw`(?'[A-Za-z_][A-Za-z0-9_]*(?![A-Za-z0-9_'])|`) + : this.lang === 'fsharp' || this.lang === 'ocaml' ? pattern.replace('(?', String.raw`(?'[A-Za-z_][A-Za-z0-9_]*(?![A-Za-z0-9_'])|`) : pattern, 'g') for (const m of annotation.matchAll(re)) { const whole = m[0] @@ -1534,7 +1609,15 @@ export class SymbolIndex { // renders unlinked in a signature is a builtin — `bool`, `Task`, // `Result`, `string` — which nothing here defines and no intersphinx // inventory covers for five of the eight ports. - const link = this.resolveSymbol(path, 'class', context) + let link = this.lang === 'ocaml' + ? /^[A-Z]/.test(path.split('.').at(-1)!) + ? this.resolveOdoc(path, 'module', context) ?? this.resolveOdoc(path, 'module-type', context) + : this.resolveOdoc(path, 'type', context) + : this.resolveSymbol(path, 'class', context) + if (!link && this.lang === 'ocaml') { + const href = builtinHref('ocaml', path) + if (href) link = { href, external: true } + } if (link || !['kotlin', 'scala'].includes(this.lang ?? '') || !ident.includes('.')) { out.push({ text: ident, link }) continue diff --git a/packages/api-model/src/model.ts b/packages/api-model/src/model.ts index 7ebbdd9c4..814a33c47 100644 --- a/packages/api-model/src/model.ts +++ b/packages/api-model/src/model.ts @@ -14,7 +14,7 @@ */ /** Language libraries, by the slug the site uses. */ -export type PortSlug = 'py' | 'ruby' | 'lua' | 'ts' | 'rs' | 'go' | 'java' | 'csharp' | 'cxx' | 'swift' | 'kotlin' | 'scala' | 'fsharp' | 'powershell' | 'julia' | 'elixir' +export type PortSlug = 'py' | 'ruby' | 'lua' | 'ts' | 'rs' | 'go' | 'java' | 'csharp' | 'cxx' | 'swift' | 'kotlin' | 'scala' | 'fsharp' | 'powershell' | 'julia' | 'elixir' | 'ocaml' export type ApiProduct = 'core' | 'workspace' | 'mcp' @@ -282,6 +282,8 @@ export interface ApiSymbol { variant?: 'unit' | 'tuple' | 'struct' /** Distinct native declarations sharing one public name, such as a TypeScript type/value pair. */ declarations?: { kind: SymbolKind; text: string; source: ApiSymbol['source']; doc?: DocBlock }[] + /** Original native comments; doc holds their normalized rendered content. */ + nativeDocumentation?: string[] /** Explicit source imports used to resolve aliases in native signatures. */ imports?: Record /** Relationships resolved by the native documentation producer. */ diff --git a/packages/api-model/src/nav-config.ts b/packages/api-model/src/nav-config.ts index 5ed414cd3..32b3ff2d2 100644 --- a/packages/api-model/src/nav-config.ts +++ b/packages/api-model/src/nav-config.ts @@ -744,6 +744,18 @@ const OVERRIDES: Record }> = { /** Place language-specific public helpers with the task they support. */ const LANGUAGE_PLACEMENTS: Record> = { + ocaml: { + server: ['Libtmux_unix.Client', 'Libtmux_eio.Client', 'Libtmux.Endpoint', 'Libtmux.Generation', 'Libtmux.Source'], + snapshots: ['Libtmux.Snapshot', 'Libtmux.Captured_text', 'Libtmux_unix.Rendered', 'Libtmux_eio.Rendered'], + queries: ['Libtmux.Field', 'Libtmux.Relation', 'Libtmux.Expr', 'Libtmux.Query', 'Libtmux.Model', 'Libtmux.Cardinality', 'Libtmux.Plan', 'Libtmux_json.Expr'], + commands: ['Libtmux', 'Libtmux.ID', 'Libtmux.Created', 'Libtmux.Operations', 'Libtmux.Spawn'], + layout: ['Libtmux.Geometry'], + options: ['Libtmux.Options'], + errors: ['Libtmux_json.Decode_error', 'Libtmux_unix.Cleanup', 'Libtmux_eio.Cleanup'], + workspace: ['Libtmux_workspace', 'Libtmux_workspace.Config', 'Libtmux_workspace.Execution'], + runtime: ['Libtmux_unix', 'Libtmux_eio', 'Libtmux_json'], + control: ['Libtmux.Output', 'Libtmux_unix.Cancellation', 'Libtmux_unix.Operation', 'Libtmux_eio.Operation', 'Libtmux_unix.Subscription', 'Libtmux_eio.Subscription'], + }, powershell: { commands: ['LibTmux\\Invoke-TmuxChain'], pane: ['LibTmux\\Send-TmuxText'], @@ -801,6 +813,7 @@ const LANGUAGE_PLACEMENTS: Record> = { /** Free functions and cmdlets need the same discovery-first order as object members. */ const LANGUAGE_ORDER: Record> = { + ocaml: { server: ['Libtmux_unix.Client', 'Libtmux_eio.Client', 'Libtmux.Endpoint', 'Libtmux.Source', 'Libtmux.Generation'] }, julia: Object.fromEntries(Object.entries({ server: ['Server', 'open_server', 'with_server', 'from_env', 'OwnedServer', 'ServerIdentity'], session: ['sessions', 'session', 'new_session', 'rename_session', 'kill_session', 'SessionRef', 'SessionID', 'SessionWhere'], @@ -854,7 +867,7 @@ function languageBucket(bucket: Bucket, port: string, root = bucket.id): Bucket } export const NAV: Record = Object.fromEntries( - ['powershell', 'julia', 'elixir', 'py', 'ruby', 'lua', 'ts', 'rs', 'go', 'java', 'kotlin', 'scala', 'fsharp', 'csharp', 'cxx', 'swift'].map((port) => [ + ['powershell', 'julia', 'elixir', 'py', 'ruby', 'lua', 'ts', 'rs', 'go', 'java', 'kotlin', 'scala', 'fsharp', 'csharp', 'cxx', 'swift', 'ocaml'].map((port) => [ port, { port, diff --git a/packages/api-model/src/nav-sidecar.ts b/packages/api-model/src/nav-sidecar.ts index 3cb42f7fe..e3b7e8cdf 100644 --- a/packages/api-model/src/nav-sidecar.ts +++ b/packages/api-model/src/nav-sidecar.ts @@ -49,7 +49,10 @@ export function navSidecarFor(scope: string, model: ApiModelBase, nav: NavConfig // type alias has a page, and a sidebar that placed only types gave 1,282 of // those pages no row. const moduleIds = new Set(model.symbols.filter((symbol) => symbol.kind === 'module').map((symbol) => symbol.id)) - const topLevel = model.symbols.filter((s) => !s.parent || (['powershell', 'julia'].includes(scope) && moduleIds.has(s.parent))) + const roots = new Set(model.symbols.filter((symbol) => !symbol.parent).map((symbol) => symbol.id)) + const topLevel = model.symbols.filter((s) => !s.parent || + (scope === 'ocaml' && roots.has(s.parent)) || + (['powershell', 'julia'].includes(scope) && moduleIds.has(s.parent))) const conceptIds = Object.fromEntries( Object.entries(CONCEPTS) .map(([k, c]) => [k, c.symbols[scope]] as const) diff --git a/packages/api-model/src/parser.ts b/packages/api-model/src/parser.ts index 2fec1d696..0da2d09a5 100644 --- a/packages/api-model/src/parser.ts +++ b/packages/api-model/src/parser.ts @@ -33,6 +33,7 @@ const GRAMMAR = { scala: 'scala', ruby: 'ruby', lua: 'lua', + ocaml: 'ocaml', } as const export type GrammarName = keyof typeof GRAMMAR diff --git a/packages/api-model/src/prose-fields.ts b/packages/api-model/src/prose-fields.ts index 988a36a2e..0518c3ad3 100644 --- a/packages/api-model/src/prose-fields.ts +++ b/packages/api-model/src/prose-fields.ts @@ -73,6 +73,8 @@ export const STRUCTURAL_FIELDS: string[] = [ '.doc.admonitions[].kind', '.doc.references[].name', '.doc.since', '.doc.examples[].code', '.doc.examples[].lang', '.doc.examples[].sourceUrl', // Extracted, and rendered by no component. + // OCaml's original odoc comments are provenance; `.doc` holds their rendered prose. + '.nativeDocumentation[]', '.doc.seeAlso[]', '.declarations[].*', '.declarations[].doc.*', '.declarations[].source.*', ] diff --git a/packages/api-model/src/prose.ts b/packages/api-model/src/prose.ts index f7486aab9..fa254eeb3 100644 --- a/packages/api-model/src/prose.ts +++ b/packages/api-model/src/prose.ts @@ -16,6 +16,7 @@ import { neverLinks } from './never-links.ts' */ export const PORT_NAME: Record = { + ocaml: 'OCaml', py: 'Python', ts: 'TypeScript', rs: 'Rust', diff --git a/packages/api-model/src/resolver.ts b/packages/api-model/src/resolver.ts index 676e2b52d..5d2845d48 100644 --- a/packages/api-model/src/resolver.ts +++ b/packages/api-model/src/resolver.ts @@ -106,7 +106,8 @@ export function notASymbol(text: string): string | undefined { if (/^\w+(?:\.\w+)+:[\w.-]+(?::[\w.<>{}-]+)?$/.test(text)) return 'a dependency coordinate' // `objects.inv` is the published Sphinx inventory, named by the setup guides next to a Python fence. if (/\.(?:tsv|html|inv)$/.test(text)) return 'a filename' - if (/\.(py|ts|go|rs|java|kt|kts|scala|cs|fs|fsi|fsproj|properties|cpp|hpp|c|h|lua|rb|swift|jl|exs?|ps1|psm1|psd1|md|json|ya?ml|toml|sh)\b/.test(text)) return 'a filename' + if (/\.(py|ts|go|rs|java|kt|kts|scala|cs|fs|fsi|fsproj|properties|cpp|hpp|c|h|lua|rb|swift|jl|exs?|ps1|psm1|psd1|ml|mli|opam|md|json|ya?ml|toml|sh)\b/.test(text)) return 'a filename' + if (/^[A-Za-z_][\w-]*:\d+$/.test(text)) return 'a numeric label' if (/(^|\s)--?[A-Za-z]/.test(text)) return 'a command-line flag' if (/[=<>!]=|\s[=<>]\s/.test(text)) return 'an expression, not a reference' if (/^new\s/.test(text)) return 'a constructor call' diff --git a/packages/api-model/test/builtins.test.ts b/packages/api-model/test/builtins.test.ts index 3d7ce1d7f..92c4addcf 100644 --- a/packages/api-model/test/builtins.test.ts +++ b/packages/api-model/test/builtins.test.ts @@ -92,6 +92,16 @@ describe('C++ standard references', () => { }) describe('standard types in product signatures', () => { + it('links the OCaml modules and sequence function used in native guides', () => { + const index = new SymbolIndex([], () => '#', 'ocaml') + for (const [name, page] of [['List', 'List.html'], ['Unix', 'Unix.html'], ['Seq.filter', 'Seq.html#VALfilter']]) { + expect(builtinHref('ocaml', name), name).toBe(`https://ocaml.org/manual/5.5/api/${page}`) + expect(index.resolve(name), name).toMatchObject({ href: `https://ocaml.org/manual/5.5/api/${page}`, external: true }) + expect(builtinHref('ts', name), name).toBeUndefined() + } + expect(index.resolve('Seq.invented')).toBeUndefined() + }) + it('links Scala Using.resource without losing the callee owner or expression', () => { const model = JSON.parse(readFileSync(new URL('../../../site/src/data/api/scala.json', import.meta.url), 'utf8')) as ApiModel const context = model.symbols.find((symbol) => symbol.id === 'io.github.libtmux.scaladsl.Server')! diff --git a/packages/api-model/test/concepts.test.ts b/packages/api-model/test/concepts.test.ts index 666339552..d25f7a9c0 100644 --- a/packages/api-model/test/concepts.test.ts +++ b/packages/api-model/test/concepts.test.ts @@ -101,6 +101,7 @@ describe('concept map', () => { ['powershell', 'LibTmux\\New-TmuxServer', 'function'], ['julia', 'LibTmux.Server', 'struct'], ['fsharp', 'LibTmux.FSharp.Server', 'module'], + ['ocaml', 'Libtmux_unix.Client.t', 'typealias'], ] for (const [port, id, kind] of expected) { const symbol = models.get(port)!.symbols.find((symbol) => (symbol.publicId ?? symbol.id) === id)! diff --git a/packages/api-model/test/resolver.test.ts b/packages/api-model/test/resolver.test.ts index 968b8d19a..6db39b07f 100644 --- a/packages/api-model/test/resolver.test.ts +++ b/packages/api-model/test/resolver.test.ts @@ -94,6 +94,14 @@ d('resolver', () => { expect(notASymbol('pane.height')).toBeUndefined() }) + it('keeps OCaml filenames and numeric output labels out of API references', () => { + for (const text of ['main.ml', 'json/libtmux_json.mli', 'libtmux.opam']) expect(notASymbol(text), text).toBe('a filename') + for (const text of ['editor:2', 'logs:1']) expect(notASymbol(text), text).toBe('a numeric label') + for (const text of ['Seq.filter', 'Enum.map/2', 'LibTmux.Session.new_window/1', 'Server:new_session']) { + expect(notASymbol(text), text).toBeUndefined() + } + }) + it('preserves an exact Swift selector instead of resolving its same-named property', () => { for (const id of ['Snapshot.panes(of:)', 'Snapshot.panes']) { const result = r.resolve('swift', id) diff --git a/scripts/build-site.sh b/scripts/build-site.sh index b970b1aec..d22381d42 100755 --- a/scripts/build-site.sh +++ b/scripts/build-site.sh @@ -303,7 +303,7 @@ if [ -n "${LIBTMUX_DOCS_PORT:-}" ] && { [ "$LIBTMUX_DOCS_PORT" = ruby ] || [ "$L node "$script_dir/gen-api-model.mjs" --port "$LIBTMUX_DOCS_PORT" node "$script_dir/stage-port-docs.mjs" --port "$LIBTMUX_DOCS_PORT" elif [ -n "${LIBTMUX_DOCS_SOURCE_SHA:-}" ] && { [ "$LIBTMUX_DOCS_PORT" = powershell ] || [ "$LIBTMUX_DOCS_PORT" = julia ] || - [ "$LIBTMUX_DOCS_PORT" = elixir ]; }; then + [ "$LIBTMUX_DOCS_PORT" = elixir ] || [ "$LIBTMUX_DOCS_PORT" = ocaml ]; }; then node "$script_dir/gen-api-model.mjs" --port "$LIBTMUX_DOCS_PORT" node "$script_dir/stage-port-docs.mjs" --port "$LIBTMUX_DOCS_PORT" --from-source node "$script_dir/gen-api-model.mjs" --port "$LIBTMUX_DOCS_PORT" --nav diff --git a/scripts/check-api-links.mjs b/scripts/check-api-links.mjs index 6015c8b25..3b81dd8c8 100755 --- a/scripts/check-api-links.mjs +++ b/scripts/check-api-links.mjs @@ -101,7 +101,7 @@ const EXCEPTIONS = new Map() } } -const FILE_RE = /^[\w./@-]+\.(py|ts|tsx|js|rs|go|java|cs|cpp|hpp|h|swift|jl|ex|exs|ps1|psm1|psd1|md|toml|json|ya?ml|sh)$/ +const FILE_RE = /^[\w./@-]+\.(py|ts|tsx|js|rs|go|java|cs|cpp|hpp|h|swift|jl|ex|exs|ps1|psm1|psd1|ml|mli|opam|md|toml|json|ya?ml|sh)$/ const PORT_BY_LABEL = Object.fromEntries(PORT_DEFS.map((port) => [port.name, port.slug])) PORT_BY_LABEL['C#'] = 'csharp' diff --git a/scripts/gen-api-model.mjs b/scripts/gen-api-model.mjs index 804f74e23..359577af4 100644 --- a/scripts/gen-api-model.mjs +++ b/scripts/gen-api-model.mjs @@ -18,9 +18,11 @@ import { extractLua } from '../packages/api-model/src/languages/lua.ts' import { extractRuby } from '../packages/api-model/src/languages/ruby.ts' import { extractPowerShell } from '../packages/api-model/src/languages/powershell.ts' import { extractJulia } from '../packages/api-model/src/languages/julia.ts' +import { extractOcamlArtifact } from '../packages/api-model/src/languages/ocaml.ts' import { extractElixir } from '../packages/api-model/src/languages/elixir.ts' import { attachCompleteGoExamples, readCompleteGoExamples } from '../packages/api-model/src/languages/go-examples.ts' import { attachCompleteCSharpExamples } from '../packages/api-model/src/languages/csharp-examples.ts' +import { attachCompleteOcamlExamples } from '../packages/api-model/src/languages/ocaml-examples.ts' import { attachCompleteFSharpExamples } from '../packages/api-model/src/languages/fsharp-examples.ts' import { attachCompleteRustExamples } from '../packages/api-model/src/languages/rust-examples.ts' import { attachNativeRustIdStructs } from '../packages/api-model/src/languages/rust-id-structs.ts' @@ -304,6 +306,11 @@ const PORTS = { 'docs/guide/scala/', 'examples/src/main/scala/'], repo: 'libtmux/libtmux-java', options: {}, }, + ocaml: { + checkout: '~/work/libtmux/libtmux-ocaml-docs-site', + root: '.', nativeArtifact: '_build/docs/ocaml.json', + repo: 'libtmux/libtmux-ocaml', options: {}, + }, fsharp: { checkout: '~/work/libtmux/libtmux-dotnet', root: 'src/LibTmux.FSharp', @@ -639,7 +646,7 @@ for (const [port, cfg] of Object.entries(PORTS)) { process.exit(1) } const artifact = JSON.parse(readFileSync(artifactPath, 'utf8')) - const nativeExtractors = { ruby: extractRuby, lua: extractLua, powershell: extractPowerShell, julia: extractJulia, elixir: extractElixir } + const nativeExtractors = { ruby: extractRuby, lua: extractLua, powershell: extractPowerShell, julia: extractJulia, elixir: extractElixir, ocaml: extractOcamlArtifact } model = nativeExtractors[port](artifact, head) } else { model = await extractProject({ @@ -651,6 +658,9 @@ for (const [port, cfg] of Object.entries(PORTS)) { }) } + if (port === 'ocaml') attachCompleteOcamlExamples(model.symbols, (file) => + execFileSync('git', ['-C', checkout, 'show', `${revision}:${file}`], { encoding: 'utf8', maxBuffer: 1 << 26 }), revision) + if (port === 'go') { // Read committed bytes at the citation revision, never a newer working tree. const files = (git(checkout, 'ls-tree', '-r', '--name-only', revision, 'tmux') ?? '') diff --git a/scripts/gen-registry.mjs b/scripts/gen-registry.mjs index 4eb7c70cf..496b0f53e 100644 --- a/scripts/gen-registry.mjs +++ b/scripts/gen-registry.mjs @@ -290,6 +290,25 @@ const PROBES = { const versions = body.split('\n').filter(Boolean) return versions.length > 0 ? versions : null }, + async ocaml(port) { + // The central opam repository stores each release in a package.version directory. + const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN + const { missing, body } = await getJson( + `https://api.github.com/repos/ocaml/opam-repository/contents/packages/${encodeURIComponent(port.packageName)}`, + { accept: 'application/vnd.github+json', ...(token ? { authorization: `Bearer ${token}` } : {}) }, + ) + if (missing || !Array.isArray(body)) throw new Error('opam package index is unavailable') + const prefix = `${port.packageName}.` + const versions = body.flatMap((entry) => { + if (!entry || typeof entry.name !== 'string' || typeof entry.type !== 'string') throw new Error('invalid opam package index') + if (entry.type !== 'dir' || !entry.name.startsWith(prefix)) return [] + const version = entry.name.slice(prefix.length) + if (!releaseTag(`v${version}`, port)) throw new Error('unrecognized opam package version') + return [version] + }) + if (!versions.length) throw new Error('opam package index contains no recognized versions') + return versions + }, async java(port) { const { missing, body } = await getText( `https://repo.maven.apache.org/maven2/${port.packageName.split(':')[0].replaceAll('.', '/')}/${port.packageName.split(':')[1]}/maven-metadata.xml`, diff --git a/scripts/gen-registry.negative.mjs b/scripts/gen-registry.negative.mjs index 6c0b1827f..f2b48d183 100644 --- a/scripts/gen-registry.negative.mjs +++ b/scripts/gen-registry.negative.mjs @@ -251,6 +251,34 @@ for (const [name, mutate] of mutations) { check('an incomplete Gallery entry is not an empty package feed', same(result.ports.powershell, seed.ports.powershell), result.error) result = invoke({ ...replies, [workspace]: { status: 500, body: 'unavailable' } }) check('a failed sibling package probe does not publish a partial PowerShell entry', same(result.ports.powershell, seed.ports.powershell), result.error) + + const ocamlTags = 'https://api.github.com/repos/libtmux/libtmux-ocaml/tags?per_page=100' + const opam = 'https://api.github.com/repos/ocaml/opam-repository/contents/packages/libtmux' + const ocaml = { ...replies, [ocamlTags]: tagged('v0.1.0-alpha.1', 'v0.1.0') } + writeFileSync(join(dir, 'published.json'), JSON.stringify(baseline)) + result = invoke({ ...ocaml, [opam]: { body: JSON.stringify([ + { type: 'dir', name: 'libtmux.0.1.0-alpha.1' }, + { type: 'dir', name: 'libtmux.0.1.0' }, + { type: 'file', name: 'README.md' }, + { type: 'dir', name: 'another-package.9.0.0' }, + ]) } }) + const publishedOcaml = { status: 'release', version: '0.1.0', release: '0.1.0', tag: 'v0.1.0' } + check('opam directory versions select the published release and its tag', + same(result.ports.ocaml, publishedOcaml), `${JSON.stringify(result.ports.ocaml)} ${result.error}`) + result = invoke({ ...ocaml, [opam]: { body: JSON.stringify([{ type: 'dir', name: 'libtmux.0.1.0-alpha.1' }]) } }) + check('opam does not treat an unpublished final tag as a registry release', + same(result.ports.ocaml, { status: 'prerelease', version: '0.1.0-alpha.1', release: null, tag: 'v0.1.0-alpha.1' }), result.error) + writeFileSync(join(dir, 'published.json'), JSON.stringify({ ...baseline, ports: { ...baseline.ports, ocaml: publishedOcaml } })) + for (const [why, response] of [ + ['HTTP 403', { status: 403, body: 'unavailable' }], + ['HTTP 404', { status: 404, body: 'not found' }], + ['HTTP 500', { status: 500, body: 'unavailable' }], + ['malformed data', { body: JSON.stringify([{ type: 'dir', name: 'libtmux.not-a-version' }]) }], + ]) { + result = invoke({ ...ocaml, [opam]: response }) + check(`opam ${why} preserves the last published entry`, same(result.ports.ocaml, publishedOcaml), result.error) + } + writeFileSync(join(dir, 'published.json'), JSON.stringify(baseline)) result = invoke({}, true) check('offline refresh fills missing ports and preserves published entries', Object.keys(result.ports).length === PORTS.length && same(result.ports.powershell, seed.ports.powershell) diff --git a/scripts/gen-tmux-usage.mjs b/scripts/gen-tmux-usage.mjs index c48e680a1..21b7e2001 100644 --- a/scripts/gen-tmux-usage.mjs +++ b/scripts/gen-tmux-usage.mjs @@ -38,6 +38,7 @@ import { dispatcherProblems, guardProblems, preflightProblems } from './lib/tmux import { forwardUsage } from './lib/tmux-usage-forward.mjs' import { settleCandidates, sweepCandidates } from './lib/tmux-usage-sweep.mjs' import { libraryScopes, scopeProblems } from './lib/tmux-usage-scopes.mjs' +import { bindOcamlDefinitions } from './lib/tmux-usage-ocaml.mjs' const root = resolve(dirname(fileURLToPath(import.meta.url)), '..') const dataDir = join(root, 'site/src/data') @@ -207,12 +208,18 @@ export async function scanPort({ port, model, commands, checkout, known, dispatc const symbols = publicSymbols(model) const functions = [] const types = [] + const modules = [] const sources = librarySources(checkout, model.revision, grammar) const wanted = new Set(commands) for (const [path, text] of sources) { const scanned = await scanSource({ grammar, text, commands: wanted, known, dispatch, builders, guards, labels, trace }) for (const fn of scanned.functions) functions.push({ ...fn, file: path }) for (const type of scanned.types) types.push({ ...type, file: path }) + for (const module of scanned.modules ?? []) modules.push({ ...module, file: path }) + } + if (port === 'ocaml') { + if (!sources.size || !functions.length) throw new Error('ocaml: the pinned library scan found no implementation functions') + bindOcamlDefinitions({ symbols, functions, modules, sources }) } const cache = new Map() const readSource = (path) => { @@ -479,6 +486,10 @@ export async function main() { } const checkout = checkoutFor(port) if (!existsSync(join(checkout, '.git')) && !existsSync(join(checkout, 'HEAD'))) { + if (check && port.slug === 'ocaml') { + failures.push('ocaml: source verification requires its pinned checkout; set LIBTMUX_DOCS_CHECKOUT_OCAML') + continue + } if (check) { console.log(`gen-tmux-usage: ${port.slug}: no checkout at ${checkout}; skipped regeneration`); continue } throw new Error(`${port.slug}: no checkout at ${checkout}; set LIBTMUX_DOCS_CHECKOUT_${port.slug.toUpperCase()}`) } diff --git a/scripts/lib/api-addresses.mjs b/scripts/lib/api-addresses.mjs index 6aae6e8b9..145d60e5b 100644 --- a/scripts/lib/api-addresses.mjs +++ b/scripts/lib/api-addresses.mjs @@ -52,6 +52,14 @@ export function addressOf(url) { const host = u.hostname const none = fragment ? 'heading' : 'none' + if (host === 'ocaml.org' && /^\/manual\/[^/]+\/api\//.test(u.pathname)) { + const path = dotted(stem) + const member = /^(?:TYPE|VAL)([a-z_][\w']*)$/.exec(fragment) + const constructor = /^TYPEELT[a-z_][\w']*\.([A-Z][\w']*)$/.exec(fragment) + const name = member?.[1] ?? constructor?.[1] + return { path: name ? [...path, name] : path, exact: true, fragment: name ? 'member' : none, type: stem } + } + if (host === 'doc.rust-lang.org' || host === 'docs.rs') { const item = RUST_ITEM.exec(stem) const type = item ? item[1] : stem === 'index' || !file ? undefined : stem diff --git a/scripts/lib/api-destinations.mjs b/scripts/lib/api-destinations.mjs index 6957c0dad..7fee9f8b5 100644 --- a/scripts/lib/api-destinations.mjs +++ b/scripts/lib/api-destinations.mjs @@ -62,6 +62,7 @@ export const API_HOSTS = new Set([ 'docs.oracle.com', 'docs.junit.org', 'kotlinlang.org', 'www.scala-lang.org', 'docs.scala-lang.org', 'typelevel.org', 'javadoc.io', 'learn.microsoft.com', 'fsharp.github.io', 'en.cppreference.com', 'eel.is', 'developer.apple.com', 'docs.swift.org', 'docs.ruby-lang.org', 'ruby-doc.org', 'www.lua.org', 'luals.github.io', 'docs.julialang.org', 'hexdocs.pm', 'www.erlang.org', + 'ocaml.org', 'gofastmcp.com', 'csharp.sdk.modelcontextprotocol.io', 'ts.sdk.modelcontextprotocol.io', 'modelcontextprotocol.io', 'cmake.org', ]) diff --git a/scripts/lib/api-identities.mjs b/scripts/lib/api-identities.mjs index 8d0e79de3..f0ef7d40a 100644 --- a/scripts/lib/api-identities.mjs +++ b/scripts/lib/api-identities.mjs @@ -281,6 +281,43 @@ function documenter(url, page, fragment) { return { via: 'documenter', declared, kind: declared === 'type' ? 'type' : bucket(declared === 'constant' ? 'constant' : declared), path: name.split('.'), title: page.title } } +function ocamldocMember(page, fragment) { + const member = /^(TYPE|VAL)([a-z_][\w']*)$/.exec(fragment) + const anchor = page.anchors.find((entry) => entry.id === fragment) + if (!member || !anchor) return undefined + const end = page.html.indexOf('', anchor.at) + if (end < 0) return undefined + const declaration = strip(page.html.slice(anchor.at, end)) + const isType = member[1] === 'TYPE' + const named = (isType + ? /^type\s+(?:(?:[+-]?'[\w']+|\([^)]*\))\s+)?([a-z_][\w']*)(?![\w'])/ + : /^val\s+([a-z_][\w']*)(?![\w'])/).exec(declaration) + if (named?.[1] !== member[2]) return undefined + return { declared: isType ? 'type' : 'val', kind: isType ? 'type' : 'member', name: member[2] } +} + +function ocamldoc(_url, page, fragment) { + const heading = page.headings.find((entry) => entry.level === 1)?.text ?? '' + const module = /^Module ([A-Z][\w']*(?:\.[A-Z][\w']*)*)$/.exec(heading) + if (!module) return undefined + const base = { via: 'ocamldoc', declared: 'module', kind: 'module', path: dotted(module[1]), title: page.title } + if (!fragment) return base + const anchor = page.anchors.find((entry) => entry.id === fragment) + if (!anchor) return undefined + const constructor = /^TYPEELT([a-z_][\w']*)\.([A-Z][\w']*)$/.exec(fragment) + if (constructor) { + const end = page.html.indexOf('', anchor.at) + const declaration = end < 0 ? '' : page.html.slice(anchor.at, end) + if (!ocamldocMember(page, `TYPE${constructor[1]}`) + || !/]*\bclass=["']constructor["'][^>]*>/.test(declaration) + || strip(declaration) !== constructor[2]) return undefined + return { ...base, declared: 'constructor', kind: 'member', path: [...base.path, constructor[2]] } + } + const member = ocamldocMember(page, fragment) + if (!member) return undefined + return { ...base, declared: member.declared, kind: member.kind, path: [...base.path, member.name] } +} + function mdn(url, page) { const { pathname } = new URL(splitUrl(url).page) const parts = decodeURIComponent(pathname).split('/').filter(Boolean) @@ -334,6 +371,7 @@ function parserFor(hostname, pathname, page) { if (hostname === 'docs.python.org') return cpython if (hostname === 'pkg.go.dev') return godoc if (hostname === 'docs.julialang.org') return documenter + if (hostname === 'ocaml.org' && /^\/manual\/[^/]+\/api\//.test(pathname)) return ocamldoc if (hostname === 'developer.mozilla.org') return mdn return undefined } @@ -409,7 +447,7 @@ export function judge(source, identity) { /** The language each reader's host documents, to hold a bare word on a link to the scope that language gives it. */ const PORT_OF = { rustdoc: 'rs', javadoc: 'java', dokka: 'kotlin', scaladoc: 'scala', cppreference: 'cxx', exdoc: 'elixir', fsdocs: 'fsharp', - learn: 'csharp', docfx: 'csharp', cpython: 'py', godoc: 'go', documenter: 'julia', mdn: 'ts', docc: 'swift', + learn: 'csharp', docfx: 'csharp', cpython: 'py', godoc: 'go', documenter: 'julia', mdn: 'ts', docc: 'swift', ocamldoc: 'ocaml', } /** A name written whole inside a link's words: `Option::map`, `AbortSignal.timeout`, `std::fs::read_to_string`. */ diff --git a/scripts/lib/api-links.mjs b/scripts/lib/api-links.mjs index b2fcfae9c..b9a3153e6 100644 --- a/scripts/lib/api-links.mjs +++ b/scripts/lib/api-links.mjs @@ -95,6 +95,7 @@ export function languageOfUrl(url) { 'docs.ruby-lang.org': 'ruby', 'ruby-doc.org': 'ruby', 'www.lua.org': 'lua', 'luals.github.io': 'lua', 'docs.julialang.org': 'julia', + 'ocaml.org': 'ocaml', 'www.erlang.org': 'erlang', 'modelcontextprotocol.io': 'any', } @@ -110,7 +111,7 @@ export const PORT_LANGUAGES = { py: ['python'], rs: ['rust'], go: ['go'], ts: ['typescript'], java: ['java'], kotlin: ['kotlin', 'java'], scala: ['scala', 'java'], csharp: ['csharp', 'dotnet'], fsharp: ['fsharp', 'dotnet'], powershell: ['powershell', 'dotnet'], - cxx: ['cpp'], swift: ['swift'], julia: ['julia'], lua: ['lua'], elixir: ['elixir', 'erlang'], ruby: ['ruby'], + cxx: ['cpp'], swift: ['swift'], julia: ['julia'], lua: ['lua'], elixir: ['elixir', 'erlang'], ruby: ['ruby'], ocaml: ['ocaml'], } /** diff --git a/scripts/lib/api-sources.mjs b/scripts/lib/api-sources.mjs index 4d42bbbaa..a3fe4d643 100644 --- a/scripts/lib/api-sources.mjs +++ b/scripts/lib/api-sources.mjs @@ -62,6 +62,7 @@ export const GO_PACKAGES = { * is one whole name. The rest are read from the name by `kindOf`. */ export const NAME_KINDS = { + ocaml: { Iarray: 'module', List: 'module', Seq: 'module', Unix: 'module', 'Iarray.t': 'type', 'Seq.t': 'type', 'Seq.filter': 'member' }, kotlin: { Dispatchers: 'object', NonCancellable: 'object', Unit: 'object' }, // `String` in Scala is the alias `Predef` declares, and its page is Predef's. scala: { Using: 'object', String: 'object' }, @@ -130,6 +131,7 @@ export const PRELUDE_MACROS = new Set(['std', 'core', 'alloc']) /** What each port means by a bare name it imports, as the owner the name's page is under. */ export const BARE_OWNERS = Object.fromEntries(Object.entries({ + ocaml: { '': ['Iarray', 'List', 'Seq', 'Unix'] }, java: { 'java.util': ['List', 'Set', 'Map', 'Optional', 'OptionalInt', 'OptionalLong', 'Collection', 'Iterator'], 'java.util.function': ['Function', 'Supplier', 'Consumer', 'Predicate', 'LongSupplier'], @@ -214,7 +216,7 @@ export function hintOwners(port, hint) { /** Ports whose names carry a kind a page can contradict: PascalCase types, camelCase members. */ const PASCAL = new Set(['java', 'kotlin', 'scala', 'csharp', 'fsharp']) /** Ports that compare kinds at all. */ -const KIND_CHECKED = new Set(['java', 'kotlin', 'scala', 'csharp', 'fsharp', 'rs', 'cxx', 'elixir']) +const KIND_CHECKED = new Set(['java', 'kotlin', 'scala', 'csharp', 'fsharp', 'rs', 'cxx', 'elixir', 'ocaml']) /** * A name as written: its segments with generics and subscripts out of the way diff --git a/scripts/lib/manifest-packages.mjs b/scripts/lib/manifest-packages.mjs index 78937bc5f..6970235bb 100644 --- a/scripts/lib/manifest-packages.mjs +++ b/scripts/lib/manifest-packages.mjs @@ -68,6 +68,16 @@ function newestTag(tags, prefix) { } const READERS = { + /** Directly authored opam manifests name the packages distributed from Git. */ + ocaml(repo) { + return { + distributions: repo.files().filter((path) => /^[^/]+\.opam$/.test(path)).map((manifest) => ({ + name: manifest.slice(0, -'.opam'.length), manifest, + ...(/^version:\s*"([^"]+)"/m.test(repo.read(manifest)) + ? { version: /^version:\s*"([^"]+)"/m.exec(repo.read(manifest))[1] } : {}), + })), units: [], + } + }, /** `[project] name` and `version`. */ py(repo, { repository, manifest = 'pyproject.toml' }) { const project = section(repo.read(manifest), 'project') @@ -224,7 +234,7 @@ const READERS = { /** Which reader a port uses: a wrapper port reads its parent's repository. */ const READER_FOR = { py: 'py', ruby: 'ruby', lua: 'lua', powershell: 'powershell', julia: 'julia', ts: 'ts', rs: 'rs', go: 'go', - java: 'java', kotlin: 'java', scala: 'java', csharp: 'dotnet', fsharp: 'dotnet', cxx: 'cxx', swift: 'swift', elixir: 'elixir', + java: 'java', kotlin: 'java', scala: 'java', csharp: 'dotnet', fsharp: 'dotnet', cxx: 'cxx', swift: 'swift', elixir: 'elixir', ocaml: 'ocaml', } /** diff --git a/scripts/lib/tmux-usage-derive.mjs b/scripts/lib/tmux-usage-derive.mjs index b9bd9bdd2..6d70f8354 100644 --- a/scripts/lib/tmux-usage-derive.mjs +++ b/scripts/lib/tmux-usage-derive.mjs @@ -66,6 +66,7 @@ export function shapeFits(call, fn) { */ export function callTargets(caller, callee, named, call) { if (!caller.calls.has(callee.name)) return false + if (caller.moduleCalls !== undefined) return (call?.targets ?? caller.moduleCalls.get(callee.name))?.has(`${callee.file}:${callee.start}:${callee.name}`) ?? false if (named.length <= 1) return true const calls = call ? [call] : (caller.callList ?? []).filter((candidate) => candidate.name === callee.name) // Overloads of one type are not always in one file: a Swift extension and a C# partial class add to the type from another. @@ -110,6 +111,10 @@ export function definitionsOf(functions, symbols, { sharedOwner = false, freeFun const byName = Map.groupBy(functions, (fn) => fn.name) const definitions = new Map() for (const symbol of symbols) { + if (symbol.implementations !== undefined) { + for (const fn of symbol.implementations) definitions.set(fn, [...(definitions.get(fn) ?? []), symbol]) + continue + } const name = bareName(symbol.name) const inFile = (byFile.get(symbol.file) ?? []).filter((fn) => fn.name === name) let hits = inFile.filter((fn) => symbol.line >= fn.start && symbol.line <= fn.nameLine) diff --git a/scripts/lib/tmux-usage-dispatch.mjs b/scripts/lib/tmux-usage-dispatch.mjs index ff21521ef..7bb5057b1 100644 --- a/scripts/lib/tmux-usage-dispatch.mjs +++ b/scripts/lib/tmux-usage-dispatch.mjs @@ -32,6 +32,7 @@ export const TRANSPORT = { cxx: { pattern: /::posix_spawnp?\(|::write\(/, files: /(?:posix_child|connection|process)\.cpp$/ }, swift: { pattern: /Subprocess\.run\(|Glibc\.write\(/, files: /Sources\/LibTmux\/(?:Transport|ControlMode|NonblockingLineWriter)\.swift$/ }, elixir: { pattern: /\bsend_port\(/, files: /transport\/oneshot\.ex$/ }, + ocaml: { pattern: /Unix\.write_substring\b/, files: /unix\/runtime_io\.ml$/ }, } const CONSTRUCTOR = /^(?:__init__|constructor|init|new|initialize)$/ diff --git a/scripts/lib/tmux-usage-ocaml.mjs b/scripts/lib/tmux-usage-ocaml.mjs new file mode 100644 index 000000000..69fa96f51 --- /dev/null +++ b/scripts/lib/tmux-usage-ocaml.mjs @@ -0,0 +1,80 @@ +import { basename, dirname } from 'node:path' + +/** Resolve public .mli values through the implementation's module aliases and includes. */ +export function bindOcamlDefinitions({ symbols, functions, modules, sources }) { + const files = [...sources.keys()] + const moduleName = (file) => basename(file, '.ml').replace(/^./, (letter) => letter.toUpperCase()) + const external = (name, from) => { + const matches = files.filter((file) => moduleName(file) === name) + return matches.find((file) => dirname(file) === dirname(from)) ?? (matches.length === 1 ? matches[0] : undefined) + } + const resolve = (file, path, name, seen = new Set()) => { + const key = `${file}:${path}:${name}` + if (seen.has(key)) return [] + const visited = new Set([...seen, key]) + const own = functions.filter((fn) => fn.file === file && fn.modulePath === path && fn.name === name) + if (own.length) return own + const aliases = modules.filter((module) => module.file === file && module.path === path && module.target && !module.open) + for (const alias of aliases) { + const parts = alias.target.split('.') + const targetFile = external(parts[0], file) + if (targetFile) { + const found = resolve(targetFile, parts.slice(1).join('.'), name, visited) + if (found.length) return found + } + } + const segments = path.split('.').filter(Boolean) + for (let count = segments.length - 1; count >= 0; count--) { + const prefix = segments.slice(0, count).join('.') + const next = segments.slice(0, count + 1).join('.') + const aliases = modules.filter((module) => module.file === file && module.path === next && module.target && !module.include && !module.open) + for (const alias of aliases) { + const parts = alias.target.split('.') + const targetFile = external(parts[0], file) + if (!targetFile) continue + const found = resolve(targetFile, [...parts.slice(1), ...segments.slice(count + 1)].join('.'), name, visited) + if (found.length) return found + } + // An included module contributes the values and nested modules of its scope. + for (const include of modules.filter((module) => module.file === file && module.path === prefix && module.include)) { + const parts = include.target.split('.') + const targetFile = external(parts[0], file) + if (!targetFile) continue + const found = resolve(targetFile, [...parts.slice(1), ...segments.slice(count)].join('.'), name, visited) + if (found.length) return found + } + } + return [] + } + for (const symbol of symbols) { + const file = symbol.file.replace(/\.mli$/, '.ml') + const parts = (symbol.qualified ?? symbol.id).split('.') + symbol.implementations = resolve(file, parts.slice(1, -1).join('.'), symbol.name).filter((fn) => !fn.enclosing && !fn.moduleArgument) + } + for (const caller of functions) { + caller.moduleCalls = new Map() + for (const call of caller.callList ?? []) { + const parts = call.path?.split('.') ?? [] + const name = parts.pop() + if (!name) continue + let found + if (parts.length) { + found = resolve(caller.file, parts.join('.'), name) + if (!found.length) { + const targetFile = external(parts[0], caller.file) + if (targetFile) found = resolve(targetFile, parts.slice(1).join('.'), name) + } + } else { + found = resolve(caller.file, caller.modulePath, name) + if (!found.length) for (const opened of modules.filter((module) => module.file === caller.file && module.open && (!module.path || caller.modulePath.startsWith(module.path)))) { + const parts = opened.target.split('.') + const targetFile = external(parts[0], caller.file) + if (targetFile) found.push(...resolve(targetFile, parts.slice(1).join('.'), name)) + } + } + call.targets = new Set(found.filter((fn) => !fn.enclosing || (fn.file === caller.file && fn.enclosing.start <= call.line && call.line <= fn.enclosing.end)) + .map((fn) => `${fn.file}:${fn.start}:${fn.name}`)) + caller.moduleCalls.set(name, new Set([...(caller.moduleCalls.get(name) ?? []), ...call.targets])) + } + } +} diff --git a/scripts/lib/tmux-usage-scan.mjs b/scripts/lib/tmux-usage-scan.mjs index 6288c77b3..71a5fe133 100644 --- a/scripts/lib/tmux-usage-scan.mjs +++ b/scripts/lib/tmux-usage-scan.mjs @@ -12,13 +12,13 @@ import { receiverOf, scanElixir, scanFSharp, scanJulia } from './tmux-usage-lexi /** Port to the grammar that reads its source. PowerShell cmdlets are C#; Julia, F# and Elixir are read by their text. */ export const GRAMMARS = { py: 'python', ts: 'typescript', rs: 'rust', go: 'go', java: 'java', kotlin: 'kotlin', scala: 'scala', - csharp: 'csharp', powershell: 'csharp', cxx: 'cpp', swift: 'swift', ruby: 'ruby', lua: 'lua', julia: 'julia', fsharp: 'fsharp', elixir: 'elixir', + csharp: 'csharp', powershell: 'csharp', cxx: 'cpp', swift: 'swift', ruby: 'ruby', lua: 'lua', julia: 'julia', fsharp: 'fsharp', elixir: 'elixir', ocaml: 'ocaml', } /** Source extensions per grammar, minus declaration-only files. */ export const EXTENSIONS = { python: /\.py$/, typescript: /(? false) { } /** The part of a `case`, `when` or `match` arm that is tested against, as opposed to the part that runs. */ -const LABELS = /^(?:switch_label|case_switch_label|case_pattern_switch_label|constant_pattern|match_pattern|when_condition|switch_pattern|case_pattern|case_label)$/ +const LABELS = /^(?:switch_label|case_switch_label|case_pattern_switch_label|constant_pattern|match_pattern|when_condition|switch_pattern|case_pattern|case_label|string_pattern)$/ /** Arms whose tested part is a named field: the node under that field is the label. */ const ARMS = { switch_case: ['value'], expression_case: ['value'], case_statement: ['value'], when: ['pattern'], in_clause: ['pattern'], case_clause: ['pattern', 'value'], switch_expression_arm: ['pattern'] } const COMPARISONS = /^(?:binary_expression|comparison_operator|binary_operator|equality_expression|infix_expression)$/ @@ -580,7 +589,7 @@ export function withoutPrimaryConstructors(text) { * @param {{ grammar: string, text: string, commands: ReadonlySet, known: ReadonlySet, dispatch?: ReadonlySet, builders?: ReadonlySet, guards?: { name: string, owner?: string }[], labels?: ReadonlyMap>, trace?: (site: object, context: object) => void }} input * `commands` are the names to find; `known` are all tmux command names, so * a list that holds a different command is not read as this command's flags. - * @returns {Promise<{ functions: ScannedFunction[], types: { name?: string, start: number, end: number }[], orphans: Site[] }>} + * @returns {Promise<{ functions: ScannedFunction[], types: { name?: string, start: number, end: number }[], orphans: Site[], modules?: { path: string, target?: string, include?: boolean, open?: boolean }[] }>} * `types` are the declarations that own functions, so a claim can anchor to * a class; `orphans` are the sites outside any named function. */ @@ -608,8 +617,13 @@ export async function scanSource({ grammar, text, commands, known, dispatch, bui const parser = await parserFor(grammar) // The Swift grammar predates typed throws; blanking the type keeps every line and column. const tree = parser.parse(grammar === 'swift' ? withoutNewSwift(text) : grammar === 'csharp' ? withoutPrimaryConstructors(text) : text) + if (grammar === 'ocaml' && tree.rootNode.hasError) { + tree.delete() + throw new Error('the OCaml grammar could not parse the implementation source') + } const functions = [] const types = [] + const modules = [] const orphans = [] const stack = [] const owners = [] @@ -708,6 +722,15 @@ export async function scanSource({ grammar, text, commands, known, dispatch, bui let pushed = false let owned = false let namespaced = false + if (grammar === 'ocaml' && node.type === 'module_binding') { + const body = node.childForFieldName('body') + modules.push({ path: [...owners.filter(Boolean), ownerName(grammar, node)].join('.'), ...(body?.type === 'module_path' ? { target: body.text } : {}) }) + } + if (grammar === 'ocaml' && ['include_module', 'open_module'].includes(node.type)) { + const body = node.namedChildren[0] + const target = body?.type === 'module_application' ? body.childForFieldName('functor') : body + if (target?.type === 'module_path') modules.push({ path: owners.filter(Boolean).join('.'), target: target.text, ...(node.type === 'open_module' ? { open: true } : { include: true }) }) + } if (OWN.has(node.type)) { const name = ownerName(grammar, node) if (node.type === 'namespace_definition') { @@ -727,7 +750,7 @@ export async function scanSource({ grammar, text, commands, known, dispatch, bui } else if (grammar === 'go' && node.type === 'function_declaration') { pushFunction(node.childForFieldName('name').text, undefined) pushed = true - } else if (FN.has(node.type) && !(stack.length && LOCAL_BINDINGS.has(node.type))) { + } else if (FN.has(node.type) && !(stack.length && (LOCAL_BINDINGS.has(node.type) || (grammar === 'ocaml' && !node.namedChildren.some((child) => child.type === 'parameter'))))) { const declared = declaredName(grammar, node) if (declared?.name) { pushFunction(declared.name, declared.owner, declared.scope); pushed = true } } @@ -738,6 +761,11 @@ export async function scanSource({ grammar, text, commands, known, dispatch, bui name, owner: owner ?? owners.filter(Boolean).at(-1), start: row(wrapper), nameLine: row(node.childForFieldName('name') ?? node), end: node.endPosition.row + 1, kind: node.type, sites: [], calls: new Map(), receivers: new Map(), ...(functionShape(grammar, node) ? { shape: functionShape(grammar, node) } : {}), + ...(grammar === 'ocaml' ? { + modulePath: owners.filter(Boolean).join('.'), + ...(stack.length ? { enclosing: { start: stack.at(-1).start, end: stack.at(-1).end } } : {}), + moduleArgument: inModuleArgument(node), + } : {}), // A namespace opened by a macro is invisible here, so an empty chain is unknown, not global. ...([...namespaces.filter(Boolean), ...scope].length ? { namespace: [...namespaces.filter(Boolean), ...scope].join('::') } : {}), } @@ -764,6 +792,7 @@ export async function scanSource({ grammar, text, commands, known, dispatch, bui const callee = calleeOf(grammar, node) if (callee?.name) { recordCall(stack.at(-1), callee.name, callee.receiver, row(node), callShape(grammar, node), calleeRow(node)) + if (grammar === 'ocaml') stack.at(-1).callList.at(-1).path = node.childForFieldName('function')?.text if (dispatch) { const callDepths = (stack.at(-1).callDepths ??= new Map()) callDepths.set(callee.name, Math.min(callDepths.get(callee.name) ?? Infinity, nesting(grammar, node))) @@ -833,7 +862,13 @@ export async function scanSource({ grammar, text, commands, known, dispatch, bui } walk(tree.rootNode) tree.delete() - return { functions, types, orphans } + return { functions, types, orphans, modules } +} + +/** A functor argument's local bindings do not add public members to its enclosing module. */ +function inModuleArgument(node) { + for (let at = node; at.parent; at = at.parent) if (at.parent.type === 'module_application' && at.parent.childForFieldName('argument')?.id === at.id) return true + return false } /** diff --git a/scripts/lib/tmux-usage-sweep.mjs b/scripts/lib/tmux-usage-sweep.mjs index c1bca8201..a9c77943a 100644 --- a/scripts/lib/tmux-usage-sweep.mjs +++ b/scripts/lib/tmux-usage-sweep.mjs @@ -39,6 +39,7 @@ export const LIBRARY_ROOTS = { powershell: ['src/LibTmux.PowerShell/'], cxx: ['include/libtmux/'], swift: ['Sources/LibTmux/'], + ocaml: ['lib/', 'unix/', 'eio/', 'workspace/', 'json/'], } const NOT_LIBRARY = /(^|\/)(tmuxtest|testing|tests?|examples?)(\/|$)/i /** Members every type has, whose names are never about a tmux command: `GetHashCode` is not a getter of a list. */ diff --git a/scripts/tmux-usage/claims.json b/scripts/tmux-usage/claims.json index e22e5ab83..4c10ea298 100644 --- a/scripts/tmux-usage/claims.json +++ b/scripts/tmux-usage/claims.json @@ -15193,6 +15193,6200 @@ "in": "server.Server.kill" } ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.rename_window", + "command": "rename-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:13", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.rename_window" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:247", + "has": [ + "let rename_window target ~name = Command.Rename_window (target, name)" + ] + }, + { + "at": "lib/commands.ml:247", + "has": [ + "let rename_window target ~name = Command.Rename_window (target, name)" + ] + }, + { + "at": "unix/engine.ml:145", + "has": [ + "| Rename_window (target, name) ->" + ] + }, + { + "at": "unix/engine.ml:148", + "has": [ + "( \"rename-window\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.rename_session", + "command": "rename-session", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:17", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.rename_session" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:248", + "has": [ + "let rename_session target ~name = Command.Rename_session (target, name)" + ] + }, + { + "at": "lib/commands.ml:248", + "has": [ + "let rename_session target ~name = Command.Rename_session (target, name)" + ] + }, + { + "at": "unix/engine.ml:154", + "has": [ + "| Rename_session (target, name) ->" + ] + }, + { + "at": "unix/engine.ml:157", + "has": [ + "( \"rename-session\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.switch_client_at", + "command": "switch-client", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:21", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.switch_client_at" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:250", + "has": [ + "let switch_client_at ?(update_environment = false) client ~session =" + ] + }, + { + "at": "lib/commands.ml:251", + "has": [ + "Command.Mutate (Switch_client_at { client; session; update_environment })" + ] + }, + { + "at": "unix/command_encoding.ml:223", + "has": [ + "| Command.Switch_client_at { client; session = target; update_environment } ->" + ] + }, + { + "at": "unix/command_encoding.ml:224", + "has": [ + "( \"switch-client\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.request_detach_client_at", + "command": "detach-client", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:25", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.request_detach_client_at" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:253", + "has": [ + "let request_detach_client_at client =" + ] + }, + { + "at": "lib/commands.ml:254", + "has": [ + "Command.Mutate (Request_detach_client_at client)" + ] + }, + { + "at": "unix/command_encoding.ml:227", + "has": [ + "| Request_detach_client_at client ->" + ] + }, + { + "at": "unix/command_encoding.ml:228", + "has": [ + "(\"detach-client\", [ \"-t\"; client_name c client ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.refresh_client_at", + "command": "refresh-client", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:29", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.refresh_client_at" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:256", + "has": [ + "let refresh_client_at ?(status_only = false) client =" + ] + }, + { + "at": "lib/commands.ml:257", + "has": [ + "Command.Mutate (Refresh_client_at (client, status_only))" + ] + }, + { + "at": "unix/command_encoding.ml:229", + "has": [ + "| Refresh_client_at (client, status_only) ->" + ] + }, + { + "at": "unix/command_encoding.ml:230", + "has": [ + "( \"refresh-client\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.resize_control_client_at", + "command": "refresh-client", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:33", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.resize_control_client_at" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:259", + "has": [ + "let resize_control_client_at client ~width ~height =" + ] + }, + { + "at": "lib/commands.ml:260", + "has": [ + "Command.Mutate (Resize_control_client_at { client; width; height })" + ] + }, + { + "at": "unix/command_encoding.ml:232", + "has": [ + "| Resize_control_client_at { client; width; height } ->" + ] + }, + { + "at": "unix/command_encoding.ml:233", + "has": [ + "( \"refresh-client\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.send_text", + "command": "send-keys", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:37", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.send_text target ~text)" + ], + "in": "Libtmux_unix.Client.send_text" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:262", + "has": [ + "let send_text target ~text = Command.Send_text (target, text)" + ] + }, + { + "at": "lib/commands.ml:262", + "has": [ + "let send_text target ~text = Command.Send_text (target, text)" + ] + }, + { + "at": "unix/engine.ml:163", + "has": [ + "| Send_text (target, text) ->" + ] + }, + { + "at": "unix/engine.ml:164", + "has": [ + "Some (\"send-keys\", [ \"-t\"; pane target; \"-l\"; \"--\"; text ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.send_keys", + "command": "send-keys", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:40", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.send_keys target keys)" + ], + "in": "Libtmux_unix.Client.send_keys" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:263", + "has": [ + "let send_keys target keys = Command.Send_keys (target, keys)" + ] + }, + { + "at": "lib/commands.ml:263", + "has": [ + "let send_keys target keys = Command.Send_keys (target, keys)" + ] + }, + { + "at": "unix/engine.ml:165", + "has": [ + "| Send_keys (target, keys) ->" + ] + }, + { + "at": "unix/engine.ml:174", + "has": [ + "Some (\"send-keys\", [ \"-t\"; pane target; \"--\" ] @ List.map key keys)" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.wait_for", + "command": "wait-for", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:315", + "has": [ + "C.raw lane ~pidfd:(Some c.pidfd)" + ] + }, + { + "at": "unix/generated_operations.ml:43", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.wait_for channel)" + ], + "in": "Libtmux_unix.Client.wait_for" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:264", + "has": [ + "let wait_for channel = Command.Wait_for channel" + ] + }, + { + "at": "lib/commands.ml:264", + "has": [ + "let wait_for channel = Command.Wait_for channel" + ] + }, + { + "at": "unix/engine.ml:175", + "has": [ + "| Wait_for channel | Signal channel ->" + ] + }, + { + "at": "unix/engine.ml:183", + "has": [ + "Some (\"wait-for\", args)" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.signal", + "command": "wait-for", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:46", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.signal channel)" + ], + "in": "Libtmux_unix.Client.signal" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:265", + "has": [ + "let signal channel = Command.Signal channel" + ] + }, + { + "at": "lib/commands.ml:265", + "has": [ + "let signal channel = Command.Signal channel" + ] + }, + { + "at": "unix/engine.ml:175", + "has": [ + "| Wait_for channel | Signal channel ->" + ] + }, + { + "at": "unix/engine.ml:183", + "has": [ + "Some (\"wait-for\", args)" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.capture_environment", + "command": "show-environment", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/environment_io.ml:103", + "has": [ + "Read_process.run c \"show-environment\" arguments (fun body ->" + ] + }, + { + "at": "unix/generated_operations.ml:49", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.capture_environment" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:267", + "has": [ + "let capture_environment ?(hidden = false) scope =" + ] + }, + { + "at": "lib/commands.ml:268", + "has": [ + "Command.Capture_environment (scope, hidden)" + ] + }, + { + "at": "unix/engine.ml:101", + "has": [ + "| Capture_environment (scope, hidden) ->" + ] + }, + { + "at": "unix/engine.ml:103", + "has": [ + "( \"show-environment\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.set_environment", + "command": "set-environment", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:53", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.set_environment" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:270", + "has": [ + "let set_environment ?(hidden = false) scope ~name value =" + ] + }, + { + "at": "lib/commands.ml:271", + "has": [ + "Command.Mutate (Set_environment { scope; name; value; hidden })" + ] + }, + { + "at": "unix/command_encoding.ml:286", + "has": [ + "| Set_environment { scope; name; value; hidden } ->" + ] + }, + { + "at": "unix/command_encoding.ml:288", + "has": [ + "( \"set-environment\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.unset_environment", + "command": "set-environment", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:57", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.unset_environment" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:273", + "has": [ + "let unset_environment scope name =" + ] + }, + { + "at": "lib/commands.ml:274", + "has": [ + "Command.Mutate (Unset_environment (scope, name))" + ] + }, + { + "at": "unix/command_encoding.ml:292", + "has": [ + "| Unset_environment (scope, name) ->" + ] + }, + { + "at": "unix/command_encoding.ml:294", + "has": [ + "(\"set-environment\", environment_scope c scope @ [ \"-u\"; \"--\"; name ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.remove_environment", + "command": "set-environment", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:61", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.remove_environment" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:276", + "has": [ + "let remove_environment scope name =" + ] + }, + { + "at": "lib/commands.ml:277", + "has": [ + "Command.Mutate (Remove_environment (scope, name))" + ] + }, + { + "at": "unix/command_encoding.ml:295", + "has": [ + "| Remove_environment (scope, name) ->" + ] + }, + { + "at": "unix/command_encoding.ml:297", + "has": [ + "(\"set-environment\", environment_scope c scope @ [ \"-r\"; \"--\"; name ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.capture_options", + "command": "show-options", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/options_io.ml:199", + "has": [ + "Read_process.run c" + ] + }, + { + "at": "unix/generated_operations.ml:65", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.capture_options" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:279", + "has": [ + "let capture_options ?(include_inherited = false) scope =" + ] + }, + { + "at": "lib/commands.ml:280", + "has": [ + "Command.Capture_options (scope, include_inherited)" + ] + }, + { + "at": "unix/engine.ml:107", + "has": [ + "| Capture_options (scope, include_inherited) ->" + ] + }, + { + "at": "unix/engine.ml:110", + "has": [ + "( \"show-options\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.read_option", + "command": "show-options", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/options_io.ml:223", + "has": [ + "Read_process.run c \"show-options\" arguments (fun body ->" + ] + }, + { + "at": "unix/generated_operations.ml:69", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.read_option" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:282", + "has": [ + "let read_option ?(include_inherited = true) scope name =" + ] + }, + { + "at": "lib/commands.ml:283", + "has": [ + "Command.Read_option (scope, name, include_inherited)" + ] + }, + { + "at": "unix/engine.ml:113", + "has": [ + "| Read_option (scope, name, include_inherited) ->" + ] + }, + { + "at": "unix/engine.ml:116", + "has": [ + "( \"show-options\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.set_option", + "command": "set-option", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:73", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.set_option" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:285", + "has": [ + "let set_option ?index ?(append = false) scope ~name value =" + ] + }, + { + "at": "lib/commands.ml:286", + "has": [ + "Command.Mutate (Set_option { scope; name; index; value; append })" + ] + }, + { + "at": "unix/command_encoding.ml:298", + "has": [ + "| Set_option { scope; name; index = number; value; append } ->" + ] + }, + { + "at": "unix/command_encoding.ml:307", + "has": [ + "( \"set-option\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.unset_option", + "command": "set-option", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:77", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.unset_option" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:288", + "has": [ + "let unset_option ?index scope name =" + ] + }, + { + "at": "lib/commands.ml:289", + "has": [ + "Command.Mutate (Unset_option (scope, name, index))" + ] + }, + { + "at": "unix/command_encoding.ml:311", + "has": [ + "| Unset_option (scope, name, number) ->" + ] + }, + { + "at": "unix/command_encoding.ml:313", + "has": [ + "( \"set-option\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.clear_option_array", + "command": "set-option", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:81", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.clear_option_array" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:291", + "has": [ + "let clear_option_array scope name =" + ] + }, + { + "at": "lib/commands.ml:292", + "has": [ + "Command.Mutate (Clear_option_array (scope, name))" + ] + }, + { + "at": "unix/command_encoding.ml:315", + "has": [ + "| Clear_option_array (scope, name) ->" + ] + }, + { + "at": "unix/command_encoding.ml:319", + "has": [ + "(\"set-option\", option_scope c scope @ [ \"--\"; name; \"\" ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.capture_hooks", + "command": "show-hooks", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/options_io.ml:199", + "has": [ + "Read_process.run c" + ] + }, + { + "at": "unix/generated_operations.ml:85", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.capture_hooks scope)" + ], + "in": "Libtmux_unix.Client.capture_hooks" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:294", + "has": [ + "let capture_hooks scope = Command.Capture_hooks scope" + ] + }, + { + "at": "lib/commands.ml:294", + "has": [ + "let capture_hooks scope = Command.Capture_hooks scope" + ] + }, + { + "at": "unix/engine.ml:120", + "has": [ + "| Capture_hooks scope ->" + ] + }, + { + "at": "unix/engine.ml:126", + "has": [ + "Some (\"show-hooks\", Command_encoding.option_scope connection scope)" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.read_hook", + "command": "show-options", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/options_io.ml:223", + "has": [ + "Read_process.run c \"show-options\" arguments (fun body ->" + ] + }, + { + "at": "unix/generated_operations.ml:88", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.read_hook" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:296", + "has": [ + "let read_hook ?(include_inherited = true) scope name =" + ] + }, + { + "at": "lib/commands.ml:297", + "has": [ + "Command.Read_hook (scope, name, include_inherited)" + ] + }, + { + "at": "unix/engine.ml:127", + "has": [ + "| Read_hook (scope, name, include_inherited) ->" + ] + }, + { + "at": "unix/engine.ml:131", + "has": [ + "( \"show-options\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.set_hook", + "command": "set-hook", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:92", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.set_hook" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:299", + "has": [ + "let set_hook ?index ?(append = false) scope ~name commands =" + ] + }, + { + "at": "lib/commands.ml:300", + "has": [ + "Command.Mutate (Set_hook { scope; name; index; commands; append })" + ] + }, + { + "at": "unix/command_encoding.ml:320", + "has": [ + "| Set_hook { scope; name; index = number; commands; append } ->" + ] + }, + { + "at": "unix/command_encoding.ml:325", + "has": [ + "( \"set-hook\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.remove_hook", + "command": "set-hook", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:96", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.remove_hook" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:302", + "has": [ + "let remove_hook ?index scope name =" + ] + }, + { + "at": "lib/commands.ml:303", + "has": [ + "Command.Mutate (Remove_hook (scope, name, index))" + ] + }, + { + "at": "unix/command_encoding.ml:329", + "has": [ + "| Remove_hook (scope, name, number) ->" + ] + }, + { + "at": "unix/command_encoding.ml:331", + "has": [ + "( \"set-hook\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.run_hook", + "command": "set-hook", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:100", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.run_hook scope name)" + ], + "in": "Libtmux_unix.Client.run_hook" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:305", + "has": [ + "let run_hook scope name = Command.Mutate (Run_hook (scope, name))" + ] + }, + { + "at": "lib/commands.ml:305", + "has": [ + "let run_hook scope name = Command.Mutate (Run_hook (scope, name))" + ] + }, + { + "at": "unix/command_encoding.ml:333", + "has": [ + "| Run_hook (scope, name) ->" + ] + }, + { + "at": "unix/command_encoding.ml:345", + "has": [ + "(\"set-hook\", option_scope c scope @ [ \"-R\"; \"--\"; name ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.create_session", + "command": "new-session", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:288", + "has": [ + "ignore (C.request c ~acknowledged ~replied name args);" + ] + }, + { + "at": "unix/generated_operations.ml:104", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.create_session" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:307", + "has": [ + "let create_session ?window_name ?(width = 80) ?(height = 24)" + ] + }, + { + "at": "lib/commands.ml:309", + "has": [ + "Command.Create_session { name; window_name; width; height; spawn }" + ] + }, + { + "at": "unix/command_encoding.ml:356", + "has": [ + "| Create_session { name; window_name; width; height; spawn = spec } ->" + ] + }, + { + "at": "unix/command_encoding.ml:360", + "has": [ + "( \"new-session\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.create_window", + "command": "new-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:288", + "has": [ + "ignore (C.request c ~acknowledged ~replied name args);" + ] + }, + { + "at": "unix/generated_operations.ml:109", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.create_window" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:311", + "has": [ + "let create_window ?index ?name ?(spawn = Spawn.default) session =" + ] + }, + { + "at": "lib/commands.ml:312", + "has": [ + "Command.Create_window { session; index; name; spawn }" + ] + }, + { + "at": "unix/command_encoding.ml:372", + "has": [ + "| Create_window { session = target; index = number; name; spawn = spec } ->" + ] + }, + { + "at": "unix/command_encoding.ml:377", + "has": [ + "( \"new-window\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.split_pane", + "command": "split-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:288", + "has": [ + "ignore (C.request c ~acknowledged ~replied name args);" + ] + }, + { + "at": "unix/generated_operations.ml:113", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.split_pane" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:314", + "has": [ + "let split_pane ?size ?(spawn = Spawn.default) pane ~direction =" + ] + }, + { + "at": "lib/commands.ml:315", + "has": [ + "Command.Split_pane { pane; direction; size; spawn }" + ] + }, + { + "at": "unix/command_encoding.ml:381", + "has": [ + "| Split_pane { pane = target; direction = side; size = extent; spawn = spec }" + ] + }, + { + "at": "unix/command_encoding.ml:384", + "has": [ + "( \"split-window\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.break_pane", + "command": "break-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:288", + "has": [ + "ignore (C.request c ~acknowledged ~replied name args);" + ] + }, + { + "at": "unix/generated_operations.ml:117", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.break_pane" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:317", + "has": [ + "let break_pane ?name pane ~session ~index =" + ] + }, + { + "at": "lib/commands.ml:318", + "has": [ + "Command.Break_pane { pane; session; index; name }" + ] + }, + { + "at": "unix/command_encoding.ml:389", + "has": [ + "| Break_pane { pane = target; session; index; name } ->" + ] + }, + { + "at": "unix/command_encoding.ml:390", + "has": [ + "( \"break-pane\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.kill_session", + "command": "kill-session", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:121", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.kill_session session)" + ], + "in": "Libtmux_unix.Client.kill_session" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:320", + "has": [ + "let kill_session session = Command.Mutate (Kill_session session)" + ] + }, + { + "at": "lib/commands.ml:320", + "has": [ + "let kill_session session = Command.Mutate (Kill_session session)" + ] + }, + { + "at": "unix/command_encoding.ml:240", + "has": [ + "| Command.Kill_session target -> (\"kill-session\", [ \"-t\"; session c target ])" + ] + }, + { + "at": "unix/command_encoding.ml:240", + "has": [ + "| Command.Kill_session target -> (\"kill-session\", [ \"-t\"; session c target ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.kill_window", + "command": "kill-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:124", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.kill_window window)" + ], + "in": "Libtmux_unix.Client.kill_window" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:321", + "has": [ + "let kill_window window = Command.Mutate (Kill_window window)" + ] + }, + { + "at": "lib/commands.ml:321", + "has": [ + "let kill_window window = Command.Mutate (Kill_window window)" + ] + }, + { + "at": "unix/command_encoding.ml:241", + "has": [ + "| Kill_window target -> (\"kill-window\", [ \"-t\"; window c target ])" + ] + }, + { + "at": "unix/command_encoding.ml:241", + "has": [ + "| Kill_window target -> (\"kill-window\", [ \"-t\"; window c target ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.kill_pane", + "command": "kill-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:127", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.kill_pane pane)" + ], + "in": "Libtmux_unix.Client.kill_pane" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:322", + "has": [ + "let kill_pane pane = Command.Mutate (Kill_pane pane)" + ] + }, + { + "at": "lib/commands.ml:322", + "has": [ + "let kill_pane pane = Command.Mutate (Kill_pane pane)" + ] + }, + { + "at": "unix/command_encoding.ml:242", + "has": [ + "| Kill_pane target -> (\"kill-pane\", [ \"-t\"; pane c target ])" + ] + }, + { + "at": "unix/command_encoding.ml:242", + "has": [ + "| Kill_pane target -> (\"kill-pane\", [ \"-t\"; pane c target ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.select_window_at", + "command": "select-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:130", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.select_window_at" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:324", + "has": [ + "let select_window_at session ~index =" + ] + }, + { + "at": "lib/commands.ml:325", + "has": [ + "Command.Mutate (Select_window_at (session, index))" + ] + }, + { + "at": "unix/command_encoding.ml:243", + "has": [ + "| Select_window_at (target, number) ->" + ] + }, + { + "at": "unix/command_encoding.ml:244", + "has": [ + "(\"select-window\", [ \"-t\"; at c target number ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.unlink_window_at", + "command": "unlink-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:134", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.unlink_window_at" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:327", + "has": [ + "let unlink_window_at ?(allow_kill = false) session ~index =" + ] + }, + { + "at": "lib/commands.ml:328", + "has": [ + "Command.Mutate (Unlink_window_at { session; index; allow_kill })" + ] + }, + { + "at": "unix/command_encoding.ml:245", + "has": [ + "| Unlink_window_at { session; index; allow_kill } ->" + ] + }, + { + "at": "unix/command_encoding.ml:246", + "has": [ + "( \"unlink-window\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.link_window", + "command": "link-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:138", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.link_window" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:330", + "has": [ + "let link_window window ~session ~index =" + ] + }, + { + "at": "lib/commands.ml:331", + "has": [ + "Command.Mutate (Link_window { window; session; index })" + ] + }, + { + "at": "unix/command_encoding.ml:248", + "has": [ + "| Link_window { window = target; session; index } ->" + ] + }, + { + "at": "unix/command_encoding.ml:249", + "has": [ + "(\"link-window\", [ \"-d\"; \"-s\"; window c target; \"-t\"; at c session index ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.move_window_at", + "command": "move-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:143", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.move_window_at" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:333", + "has": [ + "let move_window_at from_session ~from_index ~session ~index =" + ] + }, + { + "at": "lib/commands.ml:334", + "has": [ + "Command.Mutate (Move_window_at { from_session; from_index; session; index })" + ] + }, + { + "at": "unix/command_encoding.ml:250", + "has": [ + "| Move_window_at { from_session; from_index; session; index } ->" + ] + }, + { + "at": "unix/command_encoding.ml:251", + "has": [ + "( \"move-window\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.select_pane", + "command": "select-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:148", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.select_pane pane)" + ], + "in": "Libtmux_unix.Client.select_pane" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:336", + "has": [ + "let select_pane pane = Command.Mutate (Select_pane pane)" + ] + }, + { + "at": "lib/commands.ml:336", + "has": [ + "let select_pane pane = Command.Mutate (Select_pane pane)" + ] + }, + { + "at": "unix/command_encoding.ml:254", + "has": [ + "| Select_pane target -> (\"select-pane\", [ \"-t\"; pane c target ])" + ] + }, + { + "at": "unix/command_encoding.ml:254", + "has": [ + "| Select_pane target -> (\"select-pane\", [ \"-t\"; pane c target ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.set_pane_title", + "command": "select-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:151", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.set_pane_title" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:337", + "has": [ + "let set_pane_title pane ~title = Command.Mutate (Set_pane_title (pane, title))" + ] + }, + { + "at": "lib/commands.ml:337", + "has": [ + "let set_pane_title pane ~title = Command.Mutate (Set_pane_title (pane, title))" + ] + }, + { + "at": "unix/command_encoding.ml:255", + "has": [ + "| Set_pane_title (target, title) ->" + ] + }, + { + "at": "unix/command_encoding.ml:256", + "has": [ + "(\"select-pane\", [ \"-t\"; pane c target; \"-T\"; format_text title ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.resize_pane", + "command": "resize-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:155", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.resize_pane" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:339", + "has": [ + "let resize_pane ?width ?height pane =" + ] + }, + { + "at": "lib/commands.ml:340", + "has": [ + "Command.Mutate (Resize_pane { pane; width; height })" + ] + }, + { + "at": "unix/command_encoding.ml:257", + "has": [ + "| Resize_pane { pane = target; width; height } ->" + ] + }, + { + "at": "unix/command_encoding.ml:258", + "has": [ + "(\"resize-pane\", [ \"-t\"; pane c target ] @ geometry width height)" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.resize_window", + "command": "resize-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:159", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.resize_window" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:342", + "has": [ + "let resize_window ?width ?height window =" + ] + }, + { + "at": "lib/commands.ml:343", + "has": [ + "Command.Mutate (Resize_window { window; width; height })" + ] + }, + { + "at": "unix/command_encoding.ml:259", + "has": [ + "| Resize_window { window = target; width; height } ->" + ] + }, + { + "at": "unix/command_encoding.ml:260", + "has": [ + "(\"resize-window\", [ \"-t\"; window c target ] @ geometry width height)" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.select_layout", + "command": "select-layout", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:163", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.select_layout" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:345", + "has": [ + "let select_layout window layout =" + ] + }, + { + "at": "lib/commands.ml:346", + "has": [ + "Command.Mutate (Select_layout (window, layout))" + ] + }, + { + "at": "unix/command_encoding.ml:261", + "has": [ + "| Select_layout (target, value) ->" + ] + }, + { + "at": "unix/command_encoding.ml:262", + "has": [ + "(\"select-layout\", [ \"-t\"; window c target; \"--\"; layout value ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.cycle_layout", + "command": "next-layout", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:167", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.cycle_layout" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:348", + "has": [ + "let cycle_layout window direction =" + ] + }, + { + "at": "lib/commands.ml:349", + "has": [ + "Command.Mutate (Cycle_layout (window, direction))" + ] + }, + { + "at": "unix/command_encoding.ml:263", + "has": [ + "| Cycle_layout (target, value) ->" + ] + }, + { + "at": "unix/command_encoding.ml:265", + "has": [ + "| `Next -> \"next-layout\"" + ] + } + ], + "when": "direction is `Next" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.cycle_layout", + "command": "previous-layout", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:167", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.cycle_layout" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:348", + "has": [ + "let cycle_layout window direction =" + ] + }, + { + "at": "lib/commands.ml:349", + "has": [ + "Command.Mutate (Cycle_layout (window, direction))" + ] + }, + { + "at": "unix/command_encoding.ml:263", + "has": [ + "| Cycle_layout (target, value) ->" + ] + }, + { + "at": "unix/command_encoding.ml:266", + "has": [ + "| `Previous -> \"previous-layout\")," + ] + } + ], + "when": "direction is `Previous" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.move_pane", + "command": "move-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:171", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.move_pane" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:351", + "has": [ + "let move_pane ?size pane ~beside ~direction =" + ] + }, + { + "at": "lib/commands.ml:352", + "has": [ + "Command.Mutate (Move_pane { pane; beside; direction; size })" + ] + }, + { + "at": "unix/command_encoding.ml:268", + "has": [ + "| Move_pane { pane = target; beside; direction = side; size = extent } ->" + ] + }, + { + "at": "unix/command_encoding.ml:269", + "has": [ + "( \"move-pane\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.swap_panes", + "command": "swap-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:175", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.swap_panes pane other)" + ], + "in": "Libtmux_unix.Client.swap_panes" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:354", + "has": [ + "let swap_panes pane other = Command.Mutate (Swap_panes (pane, other))" + ] + }, + { + "at": "lib/commands.ml:354", + "has": [ + "let swap_panes pane other = Command.Mutate (Swap_panes (pane, other))" + ] + }, + { + "at": "unix/command_encoding.ml:272", + "has": [ + "| Swap_panes (target, other) ->" + ] + }, + { + "at": "unix/command_encoding.ml:273", + "has": [ + "(\"swap-pane\", [ \"-d\"; \"-s\"; pane c target; \"-t\"; pane c other ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.rotate_panes", + "command": "rotate-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:178", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.rotate_panes" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:356", + "has": [ + "let rotate_panes window direction =" + ] + }, + { + "at": "lib/commands.ml:357", + "has": [ + "Command.Mutate (Rotate_panes (window, direction))" + ] + }, + { + "at": "unix/command_encoding.ml:274", + "has": [ + "| Rotate_panes (target, value) ->" + ] + }, + { + "at": "unix/command_encoding.ml:275", + "has": [ + "( \"rotate-window\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.zoom_pane", + "command": "resize-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:182", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.zoom_pane pane)" + ], + "in": "Libtmux_unix.Client.zoom_pane" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:359", + "has": [ + "let zoom_pane pane = Command.Mutate (Zoom_pane pane)" + ] + }, + { + "at": "lib/commands.ml:359", + "has": [ + "let zoom_pane pane = Command.Mutate (Zoom_pane pane)" + ] + }, + { + "at": "unix/command_encoding.ml:278", + "has": [ + "| Zoom_pane target -> (\"resize-pane\", [ \"-Z\"; \"-t\"; pane c target ])" + ] + }, + { + "at": "unix/command_encoding.ml:278", + "has": [ + "| Zoom_pane target -> (\"resize-pane\", [ \"-Z\"; \"-t\"; pane c target ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.respawn_pane", + "command": "respawn-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:185", + "has": [ + "Client.run ?cancel connection" + ], + "in": "Libtmux_unix.Client.respawn_pane" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:361", + "has": [ + "let respawn_pane ?(kill_running = false) pane spawn =" + ] + }, + { + "at": "lib/commands.ml:362", + "has": [ + "Command.Mutate (Respawn_pane { pane; spawn; kill_running })" + ] + }, + { + "at": "unix/command_encoding.ml:279", + "has": [ + "| Respawn_pane { pane = target; spawn = spec; kill_running } ->" + ] + }, + { + "at": "unix/command_encoding.ml:281", + "has": [ + "( \"respawn-pane\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.clear_history", + "command": "clear-history", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "unix/generated_operations.ml:189", + "has": [ + "Client.run ?cancel connection (Libtmux.Operations.clear_history pane)" + ], + "in": "Libtmux_unix.Client.clear_history" + }, + { + "at": "unix/libtmux_unix.ml:111", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "lib/commands.ml:364", + "has": [ + "let clear_history pane = Command.Mutate (Clear_history pane)" + ] + }, + { + "at": "lib/commands.ml:364", + "has": [ + "let clear_history pane = Command.Mutate (Clear_history pane)" + ] + }, + { + "at": "unix/command_encoding.ml:285", + "has": [ + "| Clear_history target -> (\"clear-history\", [ \"-t\"; pane c target ])" + ] + }, + { + "at": "unix/command_encoding.ml:285", + "has": [ + "| Clear_history target -> (\"clear-history\", [ \"-t\"; pane c target ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.capture", + "command": "list-sessions", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/acquisition.ml:16", + "has": [ + "metadata client \"list-sessions\" []" + ] + }, + { + "at": "unix/libtmux_unix.ml:109", + "has": [ + "let capture ?cancel t = run ?cancel t (Libtmux.Operations.capture ())" + ], + "in": "Libtmux_unix.Client.capture" + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "unix/engine.ml:294", + "has": [ + "| Capture -> Acquisition.snapshot c" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.capture", + "command": "list-windows", + "scope": "server", + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/acquisition.ml:30", + "has": [ + "metadata client \"list-windows\" [ \"-a\" ]" + ] + }, + { + "at": "unix/libtmux_unix.ml:109", + "has": [ + "let capture ?cancel t = run ?cancel t (Libtmux.Operations.capture ())" + ], + "in": "Libtmux_unix.Client.capture" + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "unix/engine.ml:294", + "has": [ + "| Capture -> Acquisition.snapshot c" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.capture", + "command": "list-panes", + "scope": "server", + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/acquisition.ml:65", + "has": [ + "metadata client \"list-panes\" [ \"-a\" ]" + ] + }, + { + "at": "unix/libtmux_unix.ml:109", + "has": [ + "let capture ?cancel t = run ?cancel t (Libtmux.Operations.capture ())" + ], + "in": "Libtmux_unix.Client.capture" + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "unix/engine.ml:294", + "has": [ + "| Capture -> Acquisition.snapshot c" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.capture", + "command": "list-clients", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/acquisition.ml:118", + "has": [ + "metadata client \"list-clients\" []" + ] + }, + { + "at": "unix/libtmux_unix.ml:109", + "has": [ + "let capture ?cancel t = run ?cancel t (Libtmux.Operations.capture ())" + ], + "in": "Libtmux_unix.Client.capture" + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "unix/engine.ml:294", + "has": [ + "| Capture -> Acquisition.snapshot c" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.capture_text", + "command": "capture-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/rendered.ml:88", + "has": [ + "no_output client \"capture-pane\"" + ] + }, + { + "at": "unix/libtmux_unix.ml:118", + "has": [ + "run ?cancel t" + ], + "in": "Libtmux_unix.Client.capture_text" + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "unix/engine.ml:311", + "has": [ + "Rendered.capture ~scratch_dir c pane ~start ~end_" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.capture_text", + "command": "list-buffers", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/rendered.ml:100", + "has": [ + "metadata client \"list-buffers\"" + ] + }, + { + "at": "unix/libtmux_unix.ml:118", + "has": [ + "run ?cancel t" + ], + "in": "Libtmux_unix.Client.capture_text" + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "unix/engine.ml:311", + "has": [ + "Rendered.capture ~scratch_dir c pane ~start ~end_" + ] + } + ], + "incidental": true + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.capture_text", + "command": "save-buffer", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/rendered.ml:125", + "has": [ + "no_output client \"save-buffer\" [ \"-b\"; buffer; file.path ];" + ] + }, + { + "at": "unix/libtmux_unix.ml:118", + "has": [ + "run ?cancel t" + ], + "in": "Libtmux_unix.Client.capture_text" + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "unix/engine.ml:311", + "has": [ + "Rendered.capture ~scratch_dir c pane ~start ~end_" + ] + } + ], + "incidental": true + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.capture_text", + "command": "delete-buffer", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/rendered.ml:81", + "has": [ + "no_output client \"delete-buffer\" [ \"-b\"; buffer ];" + ] + }, + { + "at": "unix/libtmux_unix.ml:118", + "has": [ + "run ?cancel t" + ], + "in": "Libtmux_unix.Client.capture_text" + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "unix/engine.ml:311", + "has": [ + "Rendered.capture ~scratch_dir c pane ~start ~end_" + ] + } + ], + "incidental": true, + "when": "while the connection remains open" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.capture_text", + "command": "show-hooks", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/rendered.ml:27", + "has": [ + "let body = request client \"show-hooks\" arguments in" + ] + }, + { + "at": "unix/libtmux_unix.ml:118", + "has": [ + "run ?cancel t" + ], + "in": "Libtmux_unix.Client.capture_text" + }, + { + "at": "unix/libtmux_unix.ml:101", + "has": [ + "await_owned ?cancel (Engine.submit t.engine command)))" + ] + }, + { + "at": "unix/engine.ml:311", + "has": [ + "Rendered.capture ~scratch_dir c pane ~start ~end_" + ] + } + ], + "incidental": true + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.rename_window", + "command": "rename-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:9", + "has": [ + "Client.run connection (Libtmux.Operations.rename_window target ~name)" + ], + "in": "Libtmux_eio.Client.rename_window" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:247", + "has": [ + "let rename_window target ~name = Command.Rename_window (target, name)" + ] + }, + { + "at": "lib/commands.ml:247", + "has": [ + "let rename_window target ~name = Command.Rename_window (target, name)" + ] + }, + { + "at": "unix/engine.ml:145", + "has": [ + "| Rename_window (target, name) ->" + ] + }, + { + "at": "unix/engine.ml:148", + "has": [ + "( \"rename-window\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.rename_session", + "command": "rename-session", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:12", + "has": [ + "Client.run connection (Libtmux.Operations.rename_session target ~name)" + ], + "in": "Libtmux_eio.Client.rename_session" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:248", + "has": [ + "let rename_session target ~name = Command.Rename_session (target, name)" + ] + }, + { + "at": "lib/commands.ml:248", + "has": [ + "let rename_session target ~name = Command.Rename_session (target, name)" + ] + }, + { + "at": "unix/engine.ml:154", + "has": [ + "| Rename_session (target, name) ->" + ] + }, + { + "at": "unix/engine.ml:157", + "has": [ + "( \"rename-session\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.switch_client_at", + "command": "switch-client", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:15", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.switch_client_at" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:250", + "has": [ + "let switch_client_at ?(update_environment = false) client ~session =" + ] + }, + { + "at": "lib/commands.ml:251", + "has": [ + "Command.Mutate (Switch_client_at { client; session; update_environment })" + ] + }, + { + "at": "unix/command_encoding.ml:223", + "has": [ + "| Command.Switch_client_at { client; session = target; update_environment } ->" + ] + }, + { + "at": "unix/command_encoding.ml:224", + "has": [ + "( \"switch-client\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.request_detach_client_at", + "command": "detach-client", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:19", + "has": [ + "Client.run connection (Libtmux.Operations.request_detach_client_at client)" + ], + "in": "Libtmux_eio.Client.request_detach_client_at" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:253", + "has": [ + "let request_detach_client_at client =" + ] + }, + { + "at": "lib/commands.ml:254", + "has": [ + "Command.Mutate (Request_detach_client_at client)" + ] + }, + { + "at": "unix/command_encoding.ml:227", + "has": [ + "| Request_detach_client_at client ->" + ] + }, + { + "at": "unix/command_encoding.ml:228", + "has": [ + "(\"detach-client\", [ \"-t\"; client_name c client ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.refresh_client_at", + "command": "refresh-client", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:22", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.refresh_client_at" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:256", + "has": [ + "let refresh_client_at ?(status_only = false) client =" + ] + }, + { + "at": "lib/commands.ml:257", + "has": [ + "Command.Mutate (Refresh_client_at (client, status_only))" + ] + }, + { + "at": "unix/command_encoding.ml:229", + "has": [ + "| Refresh_client_at (client, status_only) ->" + ] + }, + { + "at": "unix/command_encoding.ml:230", + "has": [ + "( \"refresh-client\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.resize_control_client_at", + "command": "refresh-client", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:26", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.resize_control_client_at" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:259", + "has": [ + "let resize_control_client_at client ~width ~height =" + ] + }, + { + "at": "lib/commands.ml:260", + "has": [ + "Command.Mutate (Resize_control_client_at { client; width; height })" + ] + }, + { + "at": "unix/command_encoding.ml:232", + "has": [ + "| Resize_control_client_at { client; width; height } ->" + ] + }, + { + "at": "unix/command_encoding.ml:233", + "has": [ + "( \"refresh-client\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.send_text", + "command": "send-keys", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:30", + "has": [ + "Client.run connection (Libtmux.Operations.send_text target ~text)" + ], + "in": "Libtmux_eio.Client.send_text" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:262", + "has": [ + "let send_text target ~text = Command.Send_text (target, text)" + ] + }, + { + "at": "lib/commands.ml:262", + "has": [ + "let send_text target ~text = Command.Send_text (target, text)" + ] + }, + { + "at": "unix/engine.ml:163", + "has": [ + "| Send_text (target, text) ->" + ] + }, + { + "at": "unix/engine.ml:164", + "has": [ + "Some (\"send-keys\", [ \"-t\"; pane target; \"-l\"; \"--\"; text ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.send_keys", + "command": "send-keys", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:33", + "has": [ + "Client.run connection (Libtmux.Operations.send_keys target keys)" + ], + "in": "Libtmux_eio.Client.send_keys" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:263", + "has": [ + "let send_keys target keys = Command.Send_keys (target, keys)" + ] + }, + { + "at": "lib/commands.ml:263", + "has": [ + "let send_keys target keys = Command.Send_keys (target, keys)" + ] + }, + { + "at": "unix/engine.ml:165", + "has": [ + "| Send_keys (target, keys) ->" + ] + }, + { + "at": "unix/engine.ml:174", + "has": [ + "Some (\"send-keys\", [ \"-t\"; pane target; \"--\" ] @ List.map key keys)" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.wait_for", + "command": "wait-for", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:315", + "has": [ + "C.raw lane ~pidfd:(Some c.pidfd)" + ] + }, + { + "at": "eio/generated_operations.ml:36", + "has": [ + "Client.run connection (Libtmux.Operations.wait_for channel)" + ], + "in": "Libtmux_eio.Client.wait_for" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:264", + "has": [ + "let wait_for channel = Command.Wait_for channel" + ] + }, + { + "at": "lib/commands.ml:264", + "has": [ + "let wait_for channel = Command.Wait_for channel" + ] + }, + { + "at": "unix/engine.ml:175", + "has": [ + "| Wait_for channel | Signal channel ->" + ] + }, + { + "at": "unix/engine.ml:183", + "has": [ + "Some (\"wait-for\", args)" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.signal", + "command": "wait-for", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:39", + "has": [ + "Client.run connection (Libtmux.Operations.signal channel)" + ], + "in": "Libtmux_eio.Client.signal" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:265", + "has": [ + "let signal channel = Command.Signal channel" + ] + }, + { + "at": "lib/commands.ml:265", + "has": [ + "let signal channel = Command.Signal channel" + ] + }, + { + "at": "unix/engine.ml:175", + "has": [ + "| Wait_for channel | Signal channel ->" + ] + }, + { + "at": "unix/engine.ml:183", + "has": [ + "Some (\"wait-for\", args)" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.capture_environment", + "command": "show-environment", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/environment_io.ml:103", + "has": [ + "Read_process.run c \"show-environment\" arguments (fun body ->" + ] + }, + { + "at": "eio/generated_operations.ml:42", + "has": [ + "Client.run connection (Libtmux.Operations.capture_environment ?hidden scope)" + ], + "in": "Libtmux_eio.Client.capture_environment" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:267", + "has": [ + "let capture_environment ?(hidden = false) scope =" + ] + }, + { + "at": "lib/commands.ml:268", + "has": [ + "Command.Capture_environment (scope, hidden)" + ] + }, + { + "at": "unix/engine.ml:101", + "has": [ + "| Capture_environment (scope, hidden) ->" + ] + }, + { + "at": "unix/engine.ml:103", + "has": [ + "( \"show-environment\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.set_environment", + "command": "set-environment", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:45", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.set_environment" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:270", + "has": [ + "let set_environment ?(hidden = false) scope ~name value =" + ] + }, + { + "at": "lib/commands.ml:271", + "has": [ + "Command.Mutate (Set_environment { scope; name; value; hidden })" + ] + }, + { + "at": "unix/command_encoding.ml:286", + "has": [ + "| Set_environment { scope; name; value; hidden } ->" + ] + }, + { + "at": "unix/command_encoding.ml:288", + "has": [ + "( \"set-environment\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.unset_environment", + "command": "set-environment", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:49", + "has": [ + "Client.run connection (Libtmux.Operations.unset_environment scope name)" + ], + "in": "Libtmux_eio.Client.unset_environment" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:273", + "has": [ + "let unset_environment scope name =" + ] + }, + { + "at": "lib/commands.ml:274", + "has": [ + "Command.Mutate (Unset_environment (scope, name))" + ] + }, + { + "at": "unix/command_encoding.ml:292", + "has": [ + "| Unset_environment (scope, name) ->" + ] + }, + { + "at": "unix/command_encoding.ml:294", + "has": [ + "(\"set-environment\", environment_scope c scope @ [ \"-u\"; \"--\"; name ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.remove_environment", + "command": "set-environment", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:52", + "has": [ + "Client.run connection (Libtmux.Operations.remove_environment scope name)" + ], + "in": "Libtmux_eio.Client.remove_environment" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:276", + "has": [ + "let remove_environment scope name =" + ] + }, + { + "at": "lib/commands.ml:277", + "has": [ + "Command.Mutate (Remove_environment (scope, name))" + ] + }, + { + "at": "unix/command_encoding.ml:295", + "has": [ + "| Remove_environment (scope, name) ->" + ] + }, + { + "at": "unix/command_encoding.ml:297", + "has": [ + "(\"set-environment\", environment_scope c scope @ [ \"-r\"; \"--\"; name ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.capture_options", + "command": "show-options", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/options_io.ml:199", + "has": [ + "Read_process.run c" + ] + }, + { + "at": "eio/generated_operations.ml:55", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.capture_options" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:279", + "has": [ + "let capture_options ?(include_inherited = false) scope =" + ] + }, + { + "at": "lib/commands.ml:280", + "has": [ + "Command.Capture_options (scope, include_inherited)" + ] + }, + { + "at": "unix/engine.ml:107", + "has": [ + "| Capture_options (scope, include_inherited) ->" + ] + }, + { + "at": "unix/engine.ml:110", + "has": [ + "( \"show-options\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.read_option", + "command": "show-options", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/options_io.ml:223", + "has": [ + "Read_process.run c \"show-options\" arguments (fun body ->" + ] + }, + { + "at": "eio/generated_operations.ml:59", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.read_option" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:282", + "has": [ + "let read_option ?(include_inherited = true) scope name =" + ] + }, + { + "at": "lib/commands.ml:283", + "has": [ + "Command.Read_option (scope, name, include_inherited)" + ] + }, + { + "at": "unix/engine.ml:113", + "has": [ + "| Read_option (scope, name, include_inherited) ->" + ] + }, + { + "at": "unix/engine.ml:116", + "has": [ + "( \"show-options\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.set_option", + "command": "set-option", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:63", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.set_option" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:285", + "has": [ + "let set_option ?index ?(append = false) scope ~name value =" + ] + }, + { + "at": "lib/commands.ml:286", + "has": [ + "Command.Mutate (Set_option { scope; name; index; value; append })" + ] + }, + { + "at": "unix/command_encoding.ml:298", + "has": [ + "| Set_option { scope; name; index = number; value; append } ->" + ] + }, + { + "at": "unix/command_encoding.ml:307", + "has": [ + "( \"set-option\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.unset_option", + "command": "set-option", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:67", + "has": [ + "Client.run connection (Libtmux.Operations.unset_option ?index scope name)" + ], + "in": "Libtmux_eio.Client.unset_option" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:288", + "has": [ + "let unset_option ?index scope name =" + ] + }, + { + "at": "lib/commands.ml:289", + "has": [ + "Command.Mutate (Unset_option (scope, name, index))" + ] + }, + { + "at": "unix/command_encoding.ml:311", + "has": [ + "| Unset_option (scope, name, number) ->" + ] + }, + { + "at": "unix/command_encoding.ml:313", + "has": [ + "( \"set-option\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.clear_option_array", + "command": "set-option", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:70", + "has": [ + "Client.run connection (Libtmux.Operations.clear_option_array scope name)" + ], + "in": "Libtmux_eio.Client.clear_option_array" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:291", + "has": [ + "let clear_option_array scope name =" + ] + }, + { + "at": "lib/commands.ml:292", + "has": [ + "Command.Mutate (Clear_option_array (scope, name))" + ] + }, + { + "at": "unix/command_encoding.ml:315", + "has": [ + "| Clear_option_array (scope, name) ->" + ] + }, + { + "at": "unix/command_encoding.ml:319", + "has": [ + "(\"set-option\", option_scope c scope @ [ \"--\"; name; \"\" ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.capture_hooks", + "command": "show-hooks", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/options_io.ml:199", + "has": [ + "Read_process.run c" + ] + }, + { + "at": "eio/generated_operations.ml:73", + "has": [ + "Client.run connection (Libtmux.Operations.capture_hooks scope)" + ], + "in": "Libtmux_eio.Client.capture_hooks" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:294", + "has": [ + "let capture_hooks scope = Command.Capture_hooks scope" + ] + }, + { + "at": "lib/commands.ml:294", + "has": [ + "let capture_hooks scope = Command.Capture_hooks scope" + ] + }, + { + "at": "unix/engine.ml:120", + "has": [ + "| Capture_hooks scope ->" + ] + }, + { + "at": "unix/engine.ml:126", + "has": [ + "Some (\"show-hooks\", Command_encoding.option_scope connection scope)" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.read_hook", + "command": "show-options", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/options_io.ml:223", + "has": [ + "Read_process.run c \"show-options\" arguments (fun body ->" + ] + }, + { + "at": "eio/generated_operations.ml:76", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.read_hook" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:296", + "has": [ + "let read_hook ?(include_inherited = true) scope name =" + ] + }, + { + "at": "lib/commands.ml:297", + "has": [ + "Command.Read_hook (scope, name, include_inherited)" + ] + }, + { + "at": "unix/engine.ml:127", + "has": [ + "| Read_hook (scope, name, include_inherited) ->" + ] + }, + { + "at": "unix/engine.ml:131", + "has": [ + "( \"show-options\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.set_hook", + "command": "set-hook", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:80", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.set_hook" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:299", + "has": [ + "let set_hook ?index ?(append = false) scope ~name commands =" + ] + }, + { + "at": "lib/commands.ml:300", + "has": [ + "Command.Mutate (Set_hook { scope; name; index; commands; append })" + ] + }, + { + "at": "unix/command_encoding.ml:320", + "has": [ + "| Set_hook { scope; name; index = number; commands; append } ->" + ] + }, + { + "at": "unix/command_encoding.ml:325", + "has": [ + "( \"set-hook\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.remove_hook", + "command": "set-hook", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:84", + "has": [ + "Client.run connection (Libtmux.Operations.remove_hook ?index scope name)" + ], + "in": "Libtmux_eio.Client.remove_hook" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:302", + "has": [ + "let remove_hook ?index scope name =" + ] + }, + { + "at": "lib/commands.ml:303", + "has": [ + "Command.Mutate (Remove_hook (scope, name, index))" + ] + }, + { + "at": "unix/command_encoding.ml:329", + "has": [ + "| Remove_hook (scope, name, number) ->" + ] + }, + { + "at": "unix/command_encoding.ml:331", + "has": [ + "( \"set-hook\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.run_hook", + "command": "set-hook", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:87", + "has": [ + "Client.run connection (Libtmux.Operations.run_hook scope name)" + ], + "in": "Libtmux_eio.Client.run_hook" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:305", + "has": [ + "let run_hook scope name = Command.Mutate (Run_hook (scope, name))" + ] + }, + { + "at": "lib/commands.ml:305", + "has": [ + "let run_hook scope name = Command.Mutate (Run_hook (scope, name))" + ] + }, + { + "at": "unix/command_encoding.ml:333", + "has": [ + "| Run_hook (scope, name) ->" + ] + }, + { + "at": "unix/command_encoding.ml:345", + "has": [ + "(\"set-hook\", option_scope c scope @ [ \"-R\"; \"--\"; name ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.create_session", + "command": "new-session", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:288", + "has": [ + "ignore (C.request c ~acknowledged ~replied name args);" + ] + }, + { + "at": "eio/generated_operations.ml:90", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.create_session" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:307", + "has": [ + "let create_session ?window_name ?(width = 80) ?(height = 24)" + ] + }, + { + "at": "lib/commands.ml:309", + "has": [ + "Command.Create_session { name; window_name; width; height; spawn }" + ] + }, + { + "at": "unix/command_encoding.ml:356", + "has": [ + "| Create_session { name; window_name; width; height; spawn = spec } ->" + ] + }, + { + "at": "unix/command_encoding.ml:360", + "has": [ + "( \"new-session\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.create_window", + "command": "new-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:288", + "has": [ + "ignore (C.request c ~acknowledged ~replied name args);" + ] + }, + { + "at": "eio/generated_operations.ml:95", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.create_window" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:311", + "has": [ + "let create_window ?index ?name ?(spawn = Spawn.default) session =" + ] + }, + { + "at": "lib/commands.ml:312", + "has": [ + "Command.Create_window { session; index; name; spawn }" + ] + }, + { + "at": "unix/command_encoding.ml:372", + "has": [ + "| Create_window { session = target; index = number; name; spawn = spec } ->" + ] + }, + { + "at": "unix/command_encoding.ml:377", + "has": [ + "( \"new-window\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.split_pane", + "command": "split-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:288", + "has": [ + "ignore (C.request c ~acknowledged ~replied name args);" + ] + }, + { + "at": "eio/generated_operations.ml:99", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.split_pane" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:314", + "has": [ + "let split_pane ?size ?(spawn = Spawn.default) pane ~direction =" + ] + }, + { + "at": "lib/commands.ml:315", + "has": [ + "Command.Split_pane { pane; direction; size; spawn }" + ] + }, + { + "at": "unix/command_encoding.ml:381", + "has": [ + "| Split_pane { pane = target; direction = side; size = extent; spawn = spec }" + ] + }, + { + "at": "unix/command_encoding.ml:384", + "has": [ + "( \"split-window\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.break_pane", + "command": "break-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:288", + "has": [ + "ignore (C.request c ~acknowledged ~replied name args);" + ] + }, + { + "at": "eio/generated_operations.ml:103", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.break_pane" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:317", + "has": [ + "let break_pane ?name pane ~session ~index =" + ] + }, + { + "at": "lib/commands.ml:318", + "has": [ + "Command.Break_pane { pane; session; index; name }" + ] + }, + { + "at": "unix/command_encoding.ml:389", + "has": [ + "| Break_pane { pane = target; session; index; name } ->" + ] + }, + { + "at": "unix/command_encoding.ml:390", + "has": [ + "( \"break-pane\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.kill_session", + "command": "kill-session", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:107", + "has": [ + "Client.run connection (Libtmux.Operations.kill_session session)" + ], + "in": "Libtmux_eio.Client.kill_session" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:320", + "has": [ + "let kill_session session = Command.Mutate (Kill_session session)" + ] + }, + { + "at": "lib/commands.ml:320", + "has": [ + "let kill_session session = Command.Mutate (Kill_session session)" + ] + }, + { + "at": "unix/command_encoding.ml:240", + "has": [ + "| Command.Kill_session target -> (\"kill-session\", [ \"-t\"; session c target ])" + ] + }, + { + "at": "unix/command_encoding.ml:240", + "has": [ + "| Command.Kill_session target -> (\"kill-session\", [ \"-t\"; session c target ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.kill_window", + "command": "kill-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:110", + "has": [ + "Client.run connection (Libtmux.Operations.kill_window window)" + ], + "in": "Libtmux_eio.Client.kill_window" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:321", + "has": [ + "let kill_window window = Command.Mutate (Kill_window window)" + ] + }, + { + "at": "lib/commands.ml:321", + "has": [ + "let kill_window window = Command.Mutate (Kill_window window)" + ] + }, + { + "at": "unix/command_encoding.ml:241", + "has": [ + "| Kill_window target -> (\"kill-window\", [ \"-t\"; window c target ])" + ] + }, + { + "at": "unix/command_encoding.ml:241", + "has": [ + "| Kill_window target -> (\"kill-window\", [ \"-t\"; window c target ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.kill_pane", + "command": "kill-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:113", + "has": [ + "Client.run connection (Libtmux.Operations.kill_pane pane)" + ], + "in": "Libtmux_eio.Client.kill_pane" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:322", + "has": [ + "let kill_pane pane = Command.Mutate (Kill_pane pane)" + ] + }, + { + "at": "lib/commands.ml:322", + "has": [ + "let kill_pane pane = Command.Mutate (Kill_pane pane)" + ] + }, + { + "at": "unix/command_encoding.ml:242", + "has": [ + "| Kill_pane target -> (\"kill-pane\", [ \"-t\"; pane c target ])" + ] + }, + { + "at": "unix/command_encoding.ml:242", + "has": [ + "| Kill_pane target -> (\"kill-pane\", [ \"-t\"; pane c target ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.select_window_at", + "command": "select-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:116", + "has": [ + "Client.run connection (Libtmux.Operations.select_window_at session ~index)" + ], + "in": "Libtmux_eio.Client.select_window_at" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:324", + "has": [ + "let select_window_at session ~index =" + ] + }, + { + "at": "lib/commands.ml:325", + "has": [ + "Command.Mutate (Select_window_at (session, index))" + ] + }, + { + "at": "unix/command_encoding.ml:243", + "has": [ + "| Select_window_at (target, number) ->" + ] + }, + { + "at": "unix/command_encoding.ml:244", + "has": [ + "(\"select-window\", [ \"-t\"; at c target number ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.unlink_window_at", + "command": "unlink-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:119", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.unlink_window_at" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:327", + "has": [ + "let unlink_window_at ?(allow_kill = false) session ~index =" + ] + }, + { + "at": "lib/commands.ml:328", + "has": [ + "Command.Mutate (Unlink_window_at { session; index; allow_kill })" + ] + }, + { + "at": "unix/command_encoding.ml:245", + "has": [ + "| Unlink_window_at { session; index; allow_kill } ->" + ] + }, + { + "at": "unix/command_encoding.ml:246", + "has": [ + "( \"unlink-window\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.link_window", + "command": "link-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:123", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.link_window" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:330", + "has": [ + "let link_window window ~session ~index =" + ] + }, + { + "at": "lib/commands.ml:331", + "has": [ + "Command.Mutate (Link_window { window; session; index })" + ] + }, + { + "at": "unix/command_encoding.ml:248", + "has": [ + "| Link_window { window = target; session; index } ->" + ] + }, + { + "at": "unix/command_encoding.ml:249", + "has": [ + "(\"link-window\", [ \"-d\"; \"-s\"; window c target; \"-t\"; at c session index ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.move_window_at", + "command": "move-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:127", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.move_window_at" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:333", + "has": [ + "let move_window_at from_session ~from_index ~session ~index =" + ] + }, + { + "at": "lib/commands.ml:334", + "has": [ + "Command.Mutate (Move_window_at { from_session; from_index; session; index })" + ] + }, + { + "at": "unix/command_encoding.ml:250", + "has": [ + "| Move_window_at { from_session; from_index; session; index } ->" + ] + }, + { + "at": "unix/command_encoding.ml:251", + "has": [ + "( \"move-window\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.select_pane", + "command": "select-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:132", + "has": [ + "Client.run connection (Libtmux.Operations.select_pane pane)" + ], + "in": "Libtmux_eio.Client.select_pane" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:336", + "has": [ + "let select_pane pane = Command.Mutate (Select_pane pane)" + ] + }, + { + "at": "lib/commands.ml:336", + "has": [ + "let select_pane pane = Command.Mutate (Select_pane pane)" + ] + }, + { + "at": "unix/command_encoding.ml:254", + "has": [ + "| Select_pane target -> (\"select-pane\", [ \"-t\"; pane c target ])" + ] + }, + { + "at": "unix/command_encoding.ml:254", + "has": [ + "| Select_pane target -> (\"select-pane\", [ \"-t\"; pane c target ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.set_pane_title", + "command": "select-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:135", + "has": [ + "Client.run connection (Libtmux.Operations.set_pane_title pane ~title)" + ], + "in": "Libtmux_eio.Client.set_pane_title" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:337", + "has": [ + "let set_pane_title pane ~title = Command.Mutate (Set_pane_title (pane, title))" + ] + }, + { + "at": "lib/commands.ml:337", + "has": [ + "let set_pane_title pane ~title = Command.Mutate (Set_pane_title (pane, title))" + ] + }, + { + "at": "unix/command_encoding.ml:255", + "has": [ + "| Set_pane_title (target, title) ->" + ] + }, + { + "at": "unix/command_encoding.ml:256", + "has": [ + "(\"select-pane\", [ \"-t\"; pane c target; \"-T\"; format_text title ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.resize_pane", + "command": "resize-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:138", + "has": [ + "Client.run connection (Libtmux.Operations.resize_pane ?width ?height pane)" + ], + "in": "Libtmux_eio.Client.resize_pane" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:339", + "has": [ + "let resize_pane ?width ?height pane =" + ] + }, + { + "at": "lib/commands.ml:340", + "has": [ + "Command.Mutate (Resize_pane { pane; width; height })" + ] + }, + { + "at": "unix/command_encoding.ml:257", + "has": [ + "| Resize_pane { pane = target; width; height } ->" + ] + }, + { + "at": "unix/command_encoding.ml:258", + "has": [ + "(\"resize-pane\", [ \"-t\"; pane c target ] @ geometry width height)" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.resize_window", + "command": "resize-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:141", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.resize_window" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:342", + "has": [ + "let resize_window ?width ?height window =" + ] + }, + { + "at": "lib/commands.ml:343", + "has": [ + "Command.Mutate (Resize_window { window; width; height })" + ] + }, + { + "at": "unix/command_encoding.ml:259", + "has": [ + "| Resize_window { window = target; width; height } ->" + ] + }, + { + "at": "unix/command_encoding.ml:260", + "has": [ + "(\"resize-window\", [ \"-t\"; window c target ] @ geometry width height)" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.select_layout", + "command": "select-layout", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:145", + "has": [ + "Client.run connection (Libtmux.Operations.select_layout window layout)" + ], + "in": "Libtmux_eio.Client.select_layout" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:345", + "has": [ + "let select_layout window layout =" + ] + }, + { + "at": "lib/commands.ml:346", + "has": [ + "Command.Mutate (Select_layout (window, layout))" + ] + }, + { + "at": "unix/command_encoding.ml:261", + "has": [ + "| Select_layout (target, value) ->" + ] + }, + { + "at": "unix/command_encoding.ml:262", + "has": [ + "(\"select-layout\", [ \"-t\"; window c target; \"--\"; layout value ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.cycle_layout", + "command": "next-layout", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:148", + "has": [ + "Client.run connection (Libtmux.Operations.cycle_layout window direction)" + ], + "in": "Libtmux_eio.Client.cycle_layout" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:348", + "has": [ + "let cycle_layout window direction =" + ] + }, + { + "at": "lib/commands.ml:349", + "has": [ + "Command.Mutate (Cycle_layout (window, direction))" + ] + }, + { + "at": "unix/command_encoding.ml:263", + "has": [ + "| Cycle_layout (target, value) ->" + ] + }, + { + "at": "unix/command_encoding.ml:265", + "has": [ + "| `Next -> \"next-layout\"" + ] + } + ], + "when": "direction is `Next" + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.cycle_layout", + "command": "previous-layout", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:148", + "has": [ + "Client.run connection (Libtmux.Operations.cycle_layout window direction)" + ], + "in": "Libtmux_eio.Client.cycle_layout" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:348", + "has": [ + "let cycle_layout window direction =" + ] + }, + { + "at": "lib/commands.ml:349", + "has": [ + "Command.Mutate (Cycle_layout (window, direction))" + ] + }, + { + "at": "unix/command_encoding.ml:263", + "has": [ + "| Cycle_layout (target, value) ->" + ] + }, + { + "at": "unix/command_encoding.ml:266", + "has": [ + "| `Previous -> \"previous-layout\")," + ] + } + ], + "when": "direction is `Previous" + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.move_pane", + "command": "move-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:151", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.move_pane" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:351", + "has": [ + "let move_pane ?size pane ~beside ~direction =" + ] + }, + { + "at": "lib/commands.ml:352", + "has": [ + "Command.Mutate (Move_pane { pane; beside; direction; size })" + ] + }, + { + "at": "unix/command_encoding.ml:268", + "has": [ + "| Move_pane { pane = target; beside; direction = side; size = extent } ->" + ] + }, + { + "at": "unix/command_encoding.ml:269", + "has": [ + "( \"move-pane\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.swap_panes", + "command": "swap-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:155", + "has": [ + "Client.run connection (Libtmux.Operations.swap_panes pane other)" + ], + "in": "Libtmux_eio.Client.swap_panes" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:354", + "has": [ + "let swap_panes pane other = Command.Mutate (Swap_panes (pane, other))" + ] + }, + { + "at": "lib/commands.ml:354", + "has": [ + "let swap_panes pane other = Command.Mutate (Swap_panes (pane, other))" + ] + }, + { + "at": "unix/command_encoding.ml:272", + "has": [ + "| Swap_panes (target, other) ->" + ] + }, + { + "at": "unix/command_encoding.ml:273", + "has": [ + "(\"swap-pane\", [ \"-d\"; \"-s\"; pane c target; \"-t\"; pane c other ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.rotate_panes", + "command": "rotate-window", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:158", + "has": [ + "Client.run connection (Libtmux.Operations.rotate_panes window direction)" + ], + "in": "Libtmux_eio.Client.rotate_panes" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:356", + "has": [ + "let rotate_panes window direction =" + ] + }, + { + "at": "lib/commands.ml:357", + "has": [ + "Command.Mutate (Rotate_panes (window, direction))" + ] + }, + { + "at": "unix/command_encoding.ml:274", + "has": [ + "| Rotate_panes (target, value) ->" + ] + }, + { + "at": "unix/command_encoding.ml:275", + "has": [ + "( \"rotate-window\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.zoom_pane", + "command": "resize-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:161", + "has": [ + "Client.run connection (Libtmux.Operations.zoom_pane pane)" + ], + "in": "Libtmux_eio.Client.zoom_pane" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:359", + "has": [ + "let zoom_pane pane = Command.Mutate (Zoom_pane pane)" + ] + }, + { + "at": "lib/commands.ml:359", + "has": [ + "let zoom_pane pane = Command.Mutate (Zoom_pane pane)" + ] + }, + { + "at": "unix/command_encoding.ml:278", + "has": [ + "| Zoom_pane target -> (\"resize-pane\", [ \"-Z\"; \"-t\"; pane c target ])" + ] + }, + { + "at": "unix/command_encoding.ml:278", + "has": [ + "| Zoom_pane target -> (\"resize-pane\", [ \"-Z\"; \"-t\"; pane c target ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.respawn_pane", + "command": "respawn-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:164", + "has": [ + "Client.run connection" + ], + "in": "Libtmux_eio.Client.respawn_pane" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:361", + "has": [ + "let respawn_pane ?(kill_running = false) pane spawn =" + ] + }, + { + "at": "lib/commands.ml:362", + "has": [ + "Command.Mutate (Respawn_pane { pane; spawn; kill_running })" + ] + }, + { + "at": "unix/command_encoding.ml:279", + "has": [ + "| Respawn_pane { pane = target; spawn = spec; kill_running } ->" + ] + }, + { + "at": "unix/command_encoding.ml:281", + "has": [ + "( \"respawn-pane\"," + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.clear_history", + "command": "clear-history", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/engine.ml:283", + "has": [ + "C.no_output c ~acknowledged name args" + ] + }, + { + "at": "eio/generated_operations.ml:168", + "has": [ + "Client.run connection (Libtmux.Operations.clear_history pane)" + ], + "in": "Libtmux_eio.Client.clear_history" + }, + { + "at": "eio/libtmux_eio.ml:375", + "has": [ + "include Generated_operations.Make (struct" + ] + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "lib/commands.ml:364", + "has": [ + "let clear_history pane = Command.Mutate (Clear_history pane)" + ] + }, + { + "at": "lib/commands.ml:364", + "has": [ + "let clear_history pane = Command.Mutate (Clear_history pane)" + ] + }, + { + "at": "unix/command_encoding.ml:285", + "has": [ + "| Clear_history target -> (\"clear-history\", [ \"-t\"; pane c target ])" + ] + }, + { + "at": "unix/command_encoding.ml:285", + "has": [ + "| Clear_history target -> (\"clear-history\", [ \"-t\"; pane c target ])" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.capture", + "command": "list-sessions", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/acquisition.ml:16", + "has": [ + "metadata client \"list-sessions\" []" + ] + }, + { + "at": "eio/libtmux_eio.ml:373", + "has": [ + "let capture t = run t (Operations.capture ())" + ], + "in": "Libtmux_eio.Client.capture" + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "unix/engine.ml:294", + "has": [ + "| Capture -> Acquisition.snapshot c" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.capture", + "command": "list-windows", + "scope": "server", + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/acquisition.ml:30", + "has": [ + "metadata client \"list-windows\" [ \"-a\" ]" + ] + }, + { + "at": "eio/libtmux_eio.ml:373", + "has": [ + "let capture t = run t (Operations.capture ())" + ], + "in": "Libtmux_eio.Client.capture" + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "unix/engine.ml:294", + "has": [ + "| Capture -> Acquisition.snapshot c" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.capture", + "command": "list-panes", + "scope": "server", + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/acquisition.ml:65", + "has": [ + "metadata client \"list-panes\" [ \"-a\" ]" + ] + }, + { + "at": "eio/libtmux_eio.ml:373", + "has": [ + "let capture t = run t (Operations.capture ())" + ], + "in": "Libtmux_eio.Client.capture" + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "unix/engine.ml:294", + "has": [ + "| Capture -> Acquisition.snapshot c" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.capture", + "command": "list-clients", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/acquisition.ml:118", + "has": [ + "metadata client \"list-clients\" []" + ] + }, + { + "at": "eio/libtmux_eio.ml:373", + "has": [ + "let capture t = run t (Operations.capture ())" + ], + "in": "Libtmux_eio.Client.capture" + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "unix/engine.ml:294", + "has": [ + "| Capture -> Acquisition.snapshot c" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.capture_text", + "command": "capture-pane", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/rendered.ml:88", + "has": [ + "no_output client \"capture-pane\"" + ] + }, + { + "at": "eio/libtmux_eio.ml:382", + "has": [ + "run t (Operations.capture_text ?scratch_dir pane ~start ~end_)" + ], + "in": "Libtmux_eio.Client.capture_text" + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "unix/engine.ml:311", + "has": [ + "Rendered.capture ~scratch_dir c pane ~start ~end_" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.capture_text", + "command": "list-buffers", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/rendered.ml:100", + "has": [ + "metadata client \"list-buffers\"" + ] + }, + { + "at": "eio/libtmux_eio.ml:382", + "has": [ + "run t (Operations.capture_text ?scratch_dir pane ~start ~end_)" + ], + "in": "Libtmux_eio.Client.capture_text" + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "unix/engine.ml:311", + "has": [ + "Rendered.capture ~scratch_dir c pane ~start ~end_" + ] + } + ], + "incidental": true + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.capture_text", + "command": "save-buffer", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/rendered.ml:125", + "has": [ + "no_output client \"save-buffer\" [ \"-b\"; buffer; file.path ];" + ] + }, + { + "at": "eio/libtmux_eio.ml:382", + "has": [ + "run t (Operations.capture_text ?scratch_dir pane ~start ~end_)" + ], + "in": "Libtmux_eio.Client.capture_text" + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "unix/engine.ml:311", + "has": [ + "Rendered.capture ~scratch_dir c pane ~start ~end_" + ] + } + ], + "incidental": true + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.capture_text", + "command": "delete-buffer", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/rendered.ml:81", + "has": [ + "no_output client \"delete-buffer\" [ \"-b\"; buffer ];" + ] + }, + { + "at": "eio/libtmux_eio.ml:382", + "has": [ + "run t (Operations.capture_text ?scratch_dir pane ~start ~end_)" + ], + "in": "Libtmux_eio.Client.capture_text" + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "unix/engine.ml:311", + "has": [ + "Rendered.capture ~scratch_dir c pane ~start ~end_" + ] + } + ], + "incidental": true, + "when": "while the connection remains open" + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.capture_text", + "command": "show-hooks", + "scope": null, + "why": "The client executes the typed operation through the backend engine; the constructor and encoder select this tmux command.", + "evidence": [ + { + "at": "unix/rendered.ml:27", + "has": [ + "let body = request client \"show-hooks\" arguments in" + ] + }, + { + "at": "eio/libtmux_eio.ml:382", + "has": [ + "run t (Operations.capture_text ?scratch_dir pane ~start ~end_)" + ], + "in": "Libtmux_eio.Client.capture_text" + }, + { + "at": "eio/libtmux_eio.ml:362", + "has": [ + "let run t command = Result.bind (submit t command) await" + ] + }, + { + "at": "unix/engine.ml:311", + "has": [ + "Rendered.capture ~scratch_dir c pane ~start ~end_" + ] + } + ], + "incidental": true } ] } diff --git a/scripts/tmux-usage/conditions.json b/scripts/tmux-usage/conditions.json index 597feb833..4161675e6 100644 --- a/scripts/tmux-usage/conditions.json +++ b/scripts/tmux-usage/conditions.json @@ -673,6 +673,36 @@ ] } ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client.subscribe", + "command": "refresh-client", + "scope": null, + "when": "when opening a new stream lane", + "evidence": [ + { + "at": "unix/streaming.ml:390", + "has": [ + "if fresh && raw \"refresh-client\"" + ] + } + ] + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.subscribe", + "command": "refresh-client", + "scope": null, + "when": "when opening a new stream lane", + "evidence": [ + { + "at": "unix/streaming.ml:390", + "has": [ + "if fresh && raw \"refresh-client\"" + ] + } + ] } ] } diff --git a/scripts/tmux-usage/dispatchers.json b/scripts/tmux-usage/dispatchers.json index 1d99c7c05..0013ac17d 100644 --- a/scripts/tmux-usage/dispatchers.json +++ b/scripts/tmux-usage/dispatchers.json @@ -9490,6 +9490,185 @@ ] } ] + }, + { + "port": "ocaml", + "name": "raw", + "why": "Writes the supplied tmux command to the bound control client and waits for its reply.", + "evidence": [ + { + "at": "unix/connection.ml:119", + "has": [ + "let raw " + ], + "reaches": [ + { + "at": "unix/connection.ml:125", + "has": [ + "Runtime_io.write" + ], + "calls": "write", + "on": "runtime_io.ml" + }, + { + "at": "unix/runtime_io.ml:276", + "has": [ + "loop 0" + ], + "calls": "loop" + }, + { + "at": "unix/runtime_io.ml:263", + "has": [ + "Unix.write_substring" + ] + } + ] + } + ] + }, + { + "port": "ocaml", + "name": "request", + "why": "Writes the supplied tmux command to the bound control client and waits for its reply.", + "evidence": [ + { + "at": "unix/connection.ml:265", + "has": [ + "let request " + ], + "reaches": [ + { + "at": "unix/connection.ml:271", + "has": [ + "raw t.lane" + ], + "calls": "raw" + }, + { + "at": "unix/connection.ml:125", + "has": [ + "Runtime_io.write" + ], + "calls": "write", + "on": "runtime_io.ml" + }, + { + "at": "unix/runtime_io.ml:276", + "has": [ + "loop 0" + ], + "calls": "loop" + }, + { + "at": "unix/runtime_io.ml:263", + "has": [ + "Unix.write_substring" + ] + } + ] + } + ] + }, + { + "port": "ocaml", + "name": "metadata", + "why": "Writes the supplied tmux command to the bound control client and waits for its reply.", + "evidence": [ + { + "at": "unix/connection.ml:282", + "has": [ + "let metadata " + ], + "reaches": [ + { + "at": "unix/connection.ml:284", + "has": [ + "request t name" + ], + "calls": "request" + }, + { + "at": "unix/connection.ml:271", + "has": [ + "raw t.lane" + ], + "calls": "raw" + }, + { + "at": "unix/connection.ml:125", + "has": [ + "Runtime_io.write" + ], + "calls": "write", + "on": "runtime_io.ml" + }, + { + "at": "unix/runtime_io.ml:276", + "has": [ + "loop 0" + ], + "calls": "loop" + }, + { + "at": "unix/runtime_io.ml:263", + "has": [ + "Unix.write_substring" + ] + } + ] + } + ] + }, + { + "port": "ocaml", + "name": "no_output", + "why": "Writes the supplied tmux command to the bound control client and waits for its reply.", + "evidence": [ + { + "at": "unix/connection.ml:288", + "has": [ + "let no_output " + ], + "reaches": [ + { + "at": "unix/connection.ml:289", + "has": [ + "request t" + ], + "calls": "request" + }, + { + "at": "unix/connection.ml:271", + "has": [ + "raw t.lane" + ], + "calls": "raw" + }, + { + "at": "unix/connection.ml:125", + "has": [ + "Runtime_io.write" + ], + "calls": "write", + "on": "runtime_io.ml" + }, + { + "at": "unix/runtime_io.ml:276", + "has": [ + "loop 0" + ], + "calls": "loop" + }, + { + "at": "unix/runtime_io.ml:263", + "has": [ + "Unix.write_substring" + ] + } + ] + } + ] } ] } diff --git a/scripts/tmux-usage/not-senders.json b/scripts/tmux-usage/not-senders.json index 9cd6ced5a..2cc62a8f8 100644 --- a/scripts/tmux-usage/not-senders.json +++ b/scripts/tmux-usage/not-senders.json @@ -4557,6 +4557,255 @@ ] } ] + }, + { + "port": "ocaml", + "owner": "Operations", + "in": "lib/", + "kind": "builds", + "names": [ + "break_pane", + "clear_history", + "create_session", + "create_window", + "kill_pane", + "kill_session", + "kill_window", + "link_window", + "move_pane", + "move_window_at", + "read_hook", + "read_option", + "refresh_client_at", + "rename_session", + "rename_window", + "request_detach_client_at", + "resize_pane", + "resize_window", + "respawn_pane", + "select_layout", + "select_pane", + "select_window_at", + "send_keys", + "set_environment", + "set_hook", + "set_option", + "swap_panes", + "switch_client_at", + "unlink_window_at", + "unset_environment", + "unset_option", + "wait_for" + ], + "why": "These core functions construct typed command descriptions. Only a backend client executes them.", + "evidence": [ + { + "at": "lib/libtmux.mli:1071", + "has": [ + "Construction performs no I/O" + ] + }, + { + "at": "lib/commands.ml:247", + "has": [ + "Command.Rename_window" + ] + }, + { + "at": "lib/commands.ml:320", + "has": [ + "Command.Mutate (Kill_session" + ] + } + ] + }, + { + "port": "ocaml", + "owner": "Session", + "names": [ + "window_links" + ], + "kind": "values", + "why": "Reads window links from the captured arena without issuing link-window.", + "evidence": [ + { + "at": "lib/graph.ml:212", + "has": [ + "value.arena.session_links" + ] + } + ] + }, + { + "port": "ocaml", + "owner": "Snapshot", + "names": [ + "find_pane", + "find_session", + "find_window", + "window_links" + ], + "kind": "values", + "why": "Searches the immutable captured graph and returns existing rows without tmux I/O.", + "evidence": [ + { + "at": "lib/graph.ml:396", + "has": [ + "value.link_rows" + ] + }, + { + "at": "lib/graph.ml:405", + "has": [ + "value.session_index" + ] + }, + { + "at": "lib/graph.ml:409", + "has": [ + "value.window_index" + ] + }, + { + "at": "lib/graph.ml:413", + "has": [ + "value.pane_index" + ] + } + ] + }, + { + "port": "ocaml", + "owner": "Window", + "names": [ + "links" + ], + "kind": "values", + "why": "Reads links of the captured window without issuing link-window.", + "evidence": [ + { + "at": "lib/graph.ml:268", + "has": [ + "value.arena.window_links" + ] + } + ] + }, + { + "port": "ocaml", + "owner": "Client", + "names": [ + "clear_history" + ], + "commands": [ + "clear-prompt-history" + ], + "kind": "other-command", + "why": "Clears the target pane history with clear-history. It does not clear command-prompt history.", + "evidence": [ + { + "at": "lib/commands.ml:364", + "has": [ + "Command.Mutate (Clear_history" + ] + }, + { + "at": "unix/command_encoding.ml:285", + "has": [ + "\"clear-history\"" + ] + } + ] + }, + { + "port": "ocaml", + "owner": "Client", + "names": [ + "read_hook" + ], + "commands": [ + "show-hooks" + ], + "kind": "other-command", + "why": "Reads a single hook through show-options, including named user hooks, rather than listing hooks with show-hooks.", + "evidence": [ + { + "at": "unix/engine.ml:307", + "has": [ + "Read_hook" + ] + }, + { + "at": "unix/engine.ml:309", + "has": [ + "Options_io.read" + ] + }, + { + "at": "unix/options_io.ml:223", + "has": [ + "\"show-options\"" + ] + } + ] + }, + { + "port": "ocaml", + "owner": "Client", + "names": [ + "wait_for_text" + ], + "commands": [ + "wait-for" + ], + "kind": "no-send", + "why": "Observes rendered text and stream notifications. It does not use a tmux wait-for channel.", + "evidence": [ + { + "at": "unix/libtmux_unix.ml:123", + "has": [ + "Observation_wait.rendered" + ] + }, + { + "at": "eio/libtmux_eio.ml:386", + "has": [ + "Observation_wait.rendered" + ] + }, + { + "at": "unix/observation_wait.ml:49", + "has": [ + "capture_text !current" + ] + } + ] + }, + { + "port": "ocaml", + "owner": "Subscription", + "names": [ + "wait_for_bytes" + ], + "commands": [ + "wait-for" + ], + "kind": "no-send", + "why": "Matches a byte pattern against streamed output. It does not use a tmux wait-for channel.", + "evidence": [ + { + "at": "unix/libtmux_unix.ml:49", + "has": [ + "Streaming.wait_for_bytes" + ] + }, + { + "at": "eio/libtmux_eio.ml:122", + "has": [ + "Streaming.wait_for_bytes" + ] + } + ] } ] } diff --git a/scripts/type-links-ceiling.json b/scripts/type-links-ceiling.json index 27e19d6e2..ed9841aad 100644 --- a/scripts/type-links-ceiling.json +++ b/scripts/type-links-ceiling.json @@ -14,5 +14,6 @@ "swift": 1680, "kotlin": 24, "scala": 644, - "fsharp": 36 + "fsharp": 36, + "ocaml": 2031 } diff --git a/scripts/xref-floor.json b/scripts/xref-floor.json index 35dfb66f3..e00b102dc 100644 --- a/scripts/xref-floor.json +++ b/scripts/xref-floor.json @@ -14,5 +14,6 @@ "swift": 3739, "kotlin": 1671, "scala": 2966, - "fsharp": 284 + "fsharp": 284, + "ocaml": 4584 } diff --git a/site/ec.config.mjs b/site/ec.config.mjs index d856e9ee1..bc38bfb09 100644 --- a/site/ec.config.mjs +++ b/site/ec.config.mjs @@ -29,7 +29,7 @@ export default defineEcConfig({ }, plugins: [shellPrompt(), copyReadiness()], shiki: { langs: [tmuxUsage, ...bash, tmuxShell, tmuxConfig, properties], - langAlias: { sbt: 'scala', tmux: 'tmux-config', properties: properties.name } }, + langAlias: { dune: 'lisp', sbt: 'scala', tmux: 'tmux-config', properties: properties.name } }, useDarkModeMediaQuery: false, themeCssSelector: (theme) => theme.name === 'github-light' diff --git a/site/public/_shell/brand.css b/site/public/_shell/brand.css index cfdcb30bd..b1b171126 100644 --- a/site/public/_shell/brand.css +++ b/site/public/_shell/brand.css @@ -1999,3 +1999,128 @@ html[data-brand="elixir"][data-theme-mode="dark"], html[data-brand="elixir"][dat --lt-color-code-bg: #1c2229; } } +html[data-brand="ocaml"] { + color-scheme: light; + --brand-color: #EF7A08; + --brand-solid: #6c3704; + --brand-on-solid: #ffffff; + --button-bg-primary: #6c3704; + --button-text-primary: #ffffff; + --theme-primary: #6c3704; + --theme-secondary: #53606d; + --theme-accent: #6c3704; + --theme-background: #fafbfc; + --theme-text: #202830; + --background-color: #fafbfc; + --text-color: #202830; + --topnav-background: #fafbfc; + --topnav-text-color: #202830; + --topnav-link-color: #53606d; + --topnav-link-hover-color: #202830; + --color-background-primary: #fafbfc; + --color-background-secondary: #f3f5f7; + --color-background-border: #d6dce3; + --color-api-background-hover: #e9edf1; + --color-foreground-primary: #202830; + --color-foreground-secondary: #53606d; + --color-foreground-muted: #53606d; + --color-link: #6c3704; + --color-brand-primary: #6c3704; + --color-brand-content: #6c3704; + --color-inline-code-background: #f3f5f7; + --lt-color-bg: #fafbfc; + --lt-color-bg-secondary: #f3f5f7; + --lt-color-bg-hover: #e9edf1; + --lt-color-fg: #202830; + --lt-color-fg-secondary: #53606d; + --lt-color-fg-muted: #53606d; + --lt-color-border: #d6dce3; + --lt-color-accent: #6c3704; + --lt-color-link: #6c3704; + --lt-color-link-visited: #6c3704; + --lt-color-code-bg: #f3f5f7; +} +html[data-brand="ocaml"][data-theme-mode="dark"], html[data-brand="ocaml"][data-theme="dark"] { + color-scheme: dark; + --brand-color: #EF7A08; + --brand-solid: #6c3704; + --brand-on-solid: #ffffff; + --button-bg-primary: #6c3704; + --button-text-primary: #ffffff; + --theme-primary: #fad7b5; + --theme-secondary: #b7c1cd; + --theme-accent: #fad7b5; + --theme-background: #15191d; + --theme-text: #e7edf3; + --background-color: #15191d; + --text-color: #e7edf3; + --topnav-background: #15191d; + --topnav-text-color: #e7edf3; + --topnav-link-color: #b7c1cd; + --topnav-link-hover-color: #e7edf3; + --color-background-primary: #15191d; + --color-background-secondary: #1c2229; + --color-background-border: #3e4a57; + --color-api-background-hover: #29323d; + --color-foreground-primary: #e7edf3; + --color-foreground-secondary: #b7c1cd; + --color-foreground-muted: #b7c1cd; + --color-link: #fad7b5; + --color-brand-primary: #fad7b5; + --color-brand-content: #fad7b5; + --color-inline-code-background: #1c2229; + --lt-color-bg: #15191d; + --lt-color-bg-secondary: #1c2229; + --lt-color-bg-hover: #29323d; + --lt-color-fg: #e7edf3; + --lt-color-fg-secondary: #b7c1cd; + --lt-color-fg-muted: #b7c1cd; + --lt-color-border: #3e4a57; + --lt-color-accent: #fad7b5; + --lt-color-link: #fad7b5; + --lt-color-link-visited: #fad7b5; + --lt-color-code-bg: #1c2229; +} +@media (prefers-color-scheme: dark) { + html[data-brand="ocaml"]:not([data-theme-mode]):not([data-theme="light"]) { + color-scheme: dark; + --brand-color: #EF7A08; + --brand-solid: #6c3704; + --brand-on-solid: #ffffff; + --button-bg-primary: #6c3704; + --button-text-primary: #ffffff; + --theme-primary: #fad7b5; + --theme-secondary: #b7c1cd; + --theme-accent: #fad7b5; + --theme-background: #15191d; + --theme-text: #e7edf3; + --background-color: #15191d; + --text-color: #e7edf3; + --topnav-background: #15191d; + --topnav-text-color: #e7edf3; + --topnav-link-color: #b7c1cd; + --topnav-link-hover-color: #e7edf3; + --color-background-primary: #15191d; + --color-background-secondary: #1c2229; + --color-background-border: #3e4a57; + --color-api-background-hover: #29323d; + --color-foreground-primary: #e7edf3; + --color-foreground-secondary: #b7c1cd; + --color-foreground-muted: #b7c1cd; + --color-link: #fad7b5; + --color-brand-primary: #fad7b5; + --color-brand-content: #fad7b5; + --color-inline-code-background: #1c2229; + --lt-color-bg: #15191d; + --lt-color-bg-secondary: #1c2229; + --lt-color-bg-hover: #29323d; + --lt-color-fg: #e7edf3; + --lt-color-fg-secondary: #b7c1cd; + --lt-color-fg-muted: #b7c1cd; + --lt-color-border: #3e4a57; + --lt-color-accent: #fad7b5; + --lt-color-link: #fad7b5; + --lt-color-link-visited: #fad7b5; + --lt-color-code-bg: #1c2229; + } +} diff --git a/site/public/_shell/shell.js b/site/public/_shell/shell.js index c9779493e..05c740a8e 100644 --- a/site/public/_shell/shell.js +++ b/site/public/_shell/shell.js @@ -20,6 +20,7 @@ {"slug":"fsharp","name":"F#","shortName":"F#","logoLanguage":"fsharp","versionedDocs":true,"mcp":false}, {"slug":"cxx","name":"C++","shortName":"C++","logoLanguage":"cpp","versionedDocs":true,"mcp":true}, {"slug":"swift","name":"Swift","shortName":"Sw","logoLanguage":"swift","versionedDocs":true,"mcp":true}, + {"slug":"ocaml","name":"OCaml","shortName":"ML","logoLanguage":"ocaml","versionedDocs":true,"mcp":false}, ] // <<< end generated diff --git a/site/public/brand/catalog.json b/site/public/brand/catalog.json index fc11e07b2..928ddf99c 100644 --- a/site/public/brand/catalog.json +++ b/site/public/brand/catalog.json @@ -99,6 +99,11 @@ "id": "elixir", "label": "Elixir", "githubColor": "#8847B9" + }, + { + "id": "ocaml", + "label": "OCaml", + "githubColor": "#EF7A08" } ], "variants": [ @@ -19834,7 +19839,829 @@ "format": "xml" } ] + }, + { + "language": "ocaml", + "label": "OCaml", + "variant": "library", + "githubColor": "#EF7A08", + "alt": "libtmux for OCaml", + "files": [ + { + "file": "ocaml/library/logo.svg", + "bytes": 5882, + "sha256": "510affa78d0068e768a33146edd5028a409d4d599172809ad21ced27cf07ce9f", + "format": "svg", + "width": 512, + "height": 512, + "transparent": true + }, + { + "file": "ocaml/library/logo-16.png", + "bytes": 593, + "sha256": "2c6f929f18d52d3400a694b5885d1794e875edc50fe190e28e160c288ef30930", + "format": "png", + "width": 16, + "height": 16, + "transparent": true + }, + { + "file": "ocaml/library/logo-24.png", + "bytes": 775, + "sha256": "8589510b876dea4482b80a00f60ae85ca760bc62625fad193b739db5cb2050a9", + "format": "png", + "width": 24, + "height": 24, + "transparent": true + }, + { + "file": "ocaml/library/logo-32.png", + "bytes": 1049, + "sha256": "f334e280c82406906fd6e43ea392f27734617edd5f63cdbc90a0e58a5062e251", + "format": "png", + "width": 32, + "height": 32, + "transparent": true + }, + { + "file": "ocaml/library/logo-48.png", + "bytes": 1505, + "sha256": "4af1169542b61bc00a69f5f409c815215bbfcc6f8886215ec7043867382e5205", + "format": "png", + "width": 48, + "height": 48, + "transparent": true + }, + { + "file": "ocaml/library/logo-64.png", + "bytes": 1945, + "sha256": "d4329330a9fac1c889827445b139385a69ee883f54f349d6737d69608c13cad8", + "format": "png", + "width": 64, + "height": 64, + "transparent": true + }, + { + "file": "ocaml/library/logo-96.png", + "bytes": 2809, + "sha256": "e476e97d11889829d96471a4449a8bdb9a5ef3f4e2c1c05fe56c4e8323df5d82", + "format": "png", + "width": 96, + "height": 96, + "transparent": true + }, + { + "file": "ocaml/library/logo-128.png", + "bytes": 3741, + "sha256": "49d41d2c208dbb4f11ad20583462b65018add696d39e0aa038869024e68f423c", + "format": "png", + "width": 128, + "height": 128, + "transparent": true + }, + { + "file": "ocaml/library/logo-144.png", + "bytes": 4183, + "sha256": "e3acca4d8d2f860b11f479a05dc9ef618736e59b722d99aaeae51b0076ebfbd0", + "format": "png", + "width": 144, + "height": 144, + "transparent": true + }, + { + "file": "ocaml/library/logo-152.png", + "bytes": 4364, + "sha256": "3525c3c439d6281518c77744d6c8e84dfebdffd7d15d7e2aa2f710e3d14c04dc", + "format": "png", + "width": 152, + "height": 152, + "transparent": true + }, + { + "file": "ocaml/library/logo-167.png", + "bytes": 4839, + "sha256": "a4a7ca262c250decd9190c9b44e95650c77512ebd5f4258951f152f046447360", + "format": "png", + "width": 167, + "height": 167, + "transparent": true + }, + { + "file": "ocaml/library/logo-180.png", + "bytes": 5321, + "sha256": "59159c0246de9e884b5504024e9c32dfc53d6135eafc7c1433d9efd361d01475", + "format": "png", + "width": 180, + "height": 180, + "transparent": true + }, + { + "file": "ocaml/library/logo-192.png", + "bytes": 5665, + "sha256": "3ab8a6917f0322de82575260ba6966dd9dae630eb5959ec1371f728d696ad9dd", + "format": "png", + "width": 192, + "height": 192, + "transparent": true + }, + { + "file": "ocaml/library/logo-256.png", + "bytes": 7642, + "sha256": "f075d8e0b2d40c44cca0560781a73185f8e8e18a25367c41b8001e6c3d1f6348", + "format": "png", + "width": 256, + "height": 256, + "transparent": true + }, + { + "file": "ocaml/library/logo-384.png", + "bytes": 11845, + "sha256": "471bd330c0894daf938b39d652ad94d5d56fd0275f55ff31e670d75da2020dfc", + "format": "png", + "width": 384, + "height": 384, + "transparent": true + }, + { + "file": "ocaml/library/logo-512.png", + "bytes": 16443, + "sha256": "75bcbacb550c3c5e62dcc5deb364fa9841de9cf59a0c6980e91b8c6b248e60b2", + "format": "png", + "width": 512, + "height": 512, + "transparent": true + }, + { + "file": "ocaml/library/logo-1024.png", + "bytes": 37231, + "sha256": "be4beaca303c64454e92dd061a0e75b29e363d8d013af569c232b4f57197aa06", + "format": "png", + "width": 1024, + "height": 1024, + "transparent": true + }, + { + "file": "ocaml/library/favicon.ico", + "bytes": 22744, + "sha256": "4f3b21088d9ccbdd16f0b5383135f79b0ce9c45ca41997b3d00039886aa689de", + "format": "ico", + "sizes": [ + 16, + 32, + 48, + 256 + ] + }, + { + "file": "ocaml/library/safari-pinned-tab.svg", + "bytes": 5882, + "sha256": "807256e68d12931b6d2615434efe6eae2d08fd8b44552855704a750ade5b6339", + "format": "svg", + "width": 512, + "height": 512, + "monochrome": true + }, + { + "file": "ocaml/library/apple-touch-icon-light.png", + "bytes": 3880, + "sha256": "b784be4526a727a7114567c8f038bbd74dbcae2a76b5d1c8ff9544016cccd918", + "format": "png", + "width": 180, + "height": 180, + "transparent": false, + "purpose": "apple-touch" + }, + { + "file": "ocaml/library/app-icon-1024-light.png", + "bytes": 28623, + "sha256": "11490eed870f2805bbc1c4abfa5d0e0cfac4100c038fdcc2f81a909d465c81fd", + "format": "png", + "width": 1024, + "height": 1024, + "transparent": false, + "purpose": "app-icon" + }, + { + "file": "ocaml/library/maskable-192-light.png", + "bytes": 3109, + "sha256": "959871ff9bd5b58c61cfaab466ef8574056ddbcee373f0b7b47d6af270fb91fd", + "format": "png", + "width": 192, + "height": 192, + "transparent": false, + "purpose": "maskable", + "contentFraction": 0.52 + }, + { + "file": "ocaml/library/maskable-512-light.png", + "bytes": 9403, + "sha256": "b2c387594a5e9528da4396ed8dab737853467fff5d49843d04db4c79f7e15779", + "format": "png", + "width": 512, + "height": 512, + "transparent": false, + "purpose": "maskable", + "contentFraction": 0.52 + }, + { + "file": "ocaml/library/mstile-150-light.png", + "bytes": 3053, + "sha256": "da07a027027be3b2a48c49680d58ff089d13524978fced8debd233f381508126", + "format": "png", + "width": 150, + "height": 150, + "transparent": false, + "purpose": "windows-tile" + }, + { + "file": "ocaml/library/mstile-310-light.png", + "bytes": 6551, + "sha256": "ffe752793081b9f5d4b82f30fdf8bf4bb83d3df4ddef50547afdb5475cd7596d", + "format": "png", + "width": 310, + "height": 310, + "transparent": false, + "purpose": "windows-tile" + }, + { + "file": "ocaml/library/opengraph-light.png", + "bytes": 68057, + "sha256": "e9a033d66c58ebbd22c473518813602de32dceffbb96dac13b7518dc28f48fc6", + "format": "png", + "width": 1200, + "height": 630, + "transparent": false, + "purpose": "opengraph" + }, + { + "file": "ocaml/library/opengraph-light.jpg", + "bytes": 112267, + "sha256": "530179791707bbc488b5ca6a9a21161cd53cd9923892e7d4f733c5c5c4daf3dc", + "format": "jpeg", + "width": 1200, + "height": 630, + "transparent": false, + "purpose": "opengraph-fallback" + }, + { + "file": "ocaml/library/twitter-light.png", + "bytes": 67827, + "sha256": "5becaf2f08cd1327cd3a8877bf295dbd0ccf7e27eba205bf422bbb95cd9371ed", + "format": "png", + "width": 1200, + "height": 600, + "transparent": false, + "purpose": "twitter" + }, + { + "file": "ocaml/library/social-square-light.png", + "bytes": 77194, + "sha256": "e802e004054e294f2204dd08c9c4262a3193e41d79a922b23c3ed8e5f132ad3a", + "format": "png", + "width": 1080, + "height": 1080, + "transparent": false, + "purpose": "social-square" + }, + { + "file": "ocaml/library/site.webmanifest", + "bytes": 717, + "sha256": "817517c6916b3f0164c516796ca9abd29bd0185b2b0a91702110d13ff8fbf249", + "format": "webmanifest" + }, + { + "file": "ocaml/library/browserconfig.xml", + "bytes": 238, + "sha256": "14133b25b414820f149eabd99b80cf44f1c142ba9af1b77118712c0408cb790c", + "format": "xml" + }, + { + "file": "ocaml/library/apple-touch-icon-dark.png", + "bytes": 3911, + "sha256": "5aa01f22847244b478ac7e6523092aeaabdba9f84afe295e7004422486f47a0c", + "format": "png", + "width": 180, + "height": 180, + "transparent": false, + "purpose": "apple-touch" + }, + { + "file": "ocaml/library/app-icon-1024-dark.png", + "bytes": 28856, + "sha256": "bd72fe523064cb19239fc1c56ab270ea6fbfe973e2e4ce1d0eb2c576a018c485", + "format": "png", + "width": 1024, + "height": 1024, + "transparent": false, + "purpose": "app-icon" + }, + { + "file": "ocaml/library/maskable-192-dark.png", + "bytes": 3135, + "sha256": "5ab3003a20c7974e5ae87d8b9df1241df9c572195b124a6a9a08dbcdd113d0c7", + "format": "png", + "width": 192, + "height": 192, + "transparent": false, + "purpose": "maskable", + "contentFraction": 0.52 + }, + { + "file": "ocaml/library/maskable-512-dark.png", + "bytes": 9452, + "sha256": "f61ce9fccfdb8f89c4875bd08c293453aa788cae08e63b9f3bc0d0cf91274c76", + "format": "png", + "width": 512, + "height": 512, + "transparent": false, + "purpose": "maskable", + "contentFraction": 0.52 + }, + { + "file": "ocaml/library/mstile-150-dark.png", + "bytes": 3075, + "sha256": "27bdef4d343fb1871f0aa9d1dbb119bd65f4ae380d499c8b2ed29b1cbe34dafa", + "format": "png", + "width": 150, + "height": 150, + "transparent": false, + "purpose": "windows-tile" + }, + { + "file": "ocaml/library/mstile-310-dark.png", + "bytes": 6604, + "sha256": "d332eac5f0b1409e08ea27e8243dd1a7dd71da1d590ac75ab291d3a44eac7313", + "format": "png", + "width": 310, + "height": 310, + "transparent": false, + "purpose": "windows-tile" + }, + { + "file": "ocaml/library/opengraph-dark.png", + "bytes": 67913, + "sha256": "9e6358837141a4c00fdb9e81acb3dcbf4c0648b31b4f3e8dea9fcaf7f0a2bc6a", + "format": "png", + "width": 1200, + "height": 630, + "transparent": false, + "purpose": "opengraph" + }, + { + "file": "ocaml/library/opengraph-dark.jpg", + "bytes": 104853, + "sha256": "ef6846ac33b8897c17a11c418b79c41911b55114f98e6b61508b78ef9ef3fe0f", + "format": "jpeg", + "width": 1200, + "height": 630, + "transparent": false, + "purpose": "opengraph-fallback" + }, + { + "file": "ocaml/library/twitter-dark.png", + "bytes": 67720, + "sha256": "c3997c398981aee4879cb5245355fb83de7bad0df944f083f6ff90d74f814c2e", + "format": "png", + "width": 1200, + "height": 600, + "transparent": false, + "purpose": "twitter" + }, + { + "file": "ocaml/library/social-square-dark.png", + "bytes": 76925, + "sha256": "0d887acb8a9c709491a1546de0b354f95bd147c49b95681af84a6fc6258ac18d", + "format": "png", + "width": 1080, + "height": 1080, + "transparent": false, + "purpose": "social-square" + }, + { + "file": "ocaml/library/site-dark.webmanifest", + "bytes": 715, + "sha256": "ffe75367898385544c801df2e4b8c67f0d8b3e79b346823c0c003daeac80cd15", + "format": "webmanifest" + }, + { + "file": "ocaml/library/browserconfig-dark.xml", + "bytes": 236, + "sha256": "d6550a2d9d8074a5f7c4dcb03eaf68d469fe52d5cab8904597e83806ab357f2a", + "format": "xml" + } + ] + }, + { + "language": "ocaml", + "label": "OCaml", + "variant": "workspace", + "githubColor": "#EF7A08", + "alt": "libtmux for OCaml — workspace CLI", + "files": [ + { + "file": "ocaml/workspace/logo.svg", + "bytes": 2405, + "sha256": "49f31f5d60ed0bd4cfd6072d38e9d761a90f378ed2eca2044aa6607f389d6392", + "format": "svg", + "width": 512, + "height": 512, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-16.png", + "bytes": 292, + "sha256": "a84aa0e6d9c7e924940c25e8cb8c83dcc4660405ff09791a823ceb2677ea6cde", + "format": "png", + "width": 16, + "height": 16, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-24.png", + "bytes": 324, + "sha256": "f969a843eff7b1c43b11fb8f3cd21a8233bb101d0b1241e3c2279dd582cc681b", + "format": "png", + "width": 24, + "height": 24, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-32.png", + "bytes": 417, + "sha256": "4b405de1a3d42c0ee96fccc0e4bb7ecf60ee2b80867bac085e13d0e1448761f9", + "format": "png", + "width": 32, + "height": 32, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-48.png", + "bytes": 533, + "sha256": "4510e10be32ddd49d5d11c86ea57dd10bfb8f133a7ba4758a4335ac327985086", + "format": "png", + "width": 48, + "height": 48, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-64.png", + "bytes": 647, + "sha256": "0b3e2fad2833887e77556da41c06342ea1c40fe167fd4d0a500682398c856ca0", + "format": "png", + "width": 64, + "height": 64, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-96.png", + "bytes": 862, + "sha256": "f4d675d5d36ff825b53cc9421f0283202b1546821512afe9e49d6114b8991d8b", + "format": "png", + "width": 96, + "height": 96, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-128.png", + "bytes": 1135, + "sha256": "6fc92b3b4526e9d1909288b9d0ab205aea57ef0795dd291c35ea602d9b1d6a11", + "format": "png", + "width": 128, + "height": 128, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-144.png", + "bytes": 1291, + "sha256": "218538e5afaca868d61ddacd41fbf0760e341a59f62a900db7e0c524e5e6d1dd", + "format": "png", + "width": 144, + "height": 144, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-152.png", + "bytes": 1350, + "sha256": "0fde0882f9ae503e40428786f92adfa1bca20e8669464a3e14b6e55abd754896", + "format": "png", + "width": 152, + "height": 152, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-167.png", + "bytes": 1514, + "sha256": "f722a1b5f9274d1ae705e0cd2120926346d3ea4f0e51de6498e10d48bb24317e", + "format": "png", + "width": 167, + "height": 167, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-180.png", + "bytes": 1645, + "sha256": "575c1faba6726db2dcc119c340efcb30a8c2a39e2e7832969caddf3c3f53bf75", + "format": "png", + "width": 180, + "height": 180, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-192.png", + "bytes": 1769, + "sha256": "486c7b94fa339e5163840e319269b5c6c0dd51f449ae97b1b584ffeedb965041", + "format": "png", + "width": 192, + "height": 192, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-256.png", + "bytes": 2456, + "sha256": "742177a7bf586968e8f7db1f3d3a61a4049275d04ba7208b1c9c31ae2bd665b3", + "format": "png", + "width": 256, + "height": 256, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-384.png", + "bytes": 3771, + "sha256": "8c70bf905f777e9d96ea061261ccb9f0a31d3bcd3916440b91d5c3027fff7fb5", + "format": "png", + "width": 384, + "height": 384, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-512.png", + "bytes": 5415, + "sha256": "ecc4a18aafb13b5dd5abe6924eb8ac88d3d2667cb433dbda2fc3c0a56278cd11", + "format": "png", + "width": 512, + "height": 512, + "transparent": true + }, + { + "file": "ocaml/workspace/logo-1024.png", + "bytes": 13836, + "sha256": "12ac0d7b4a80d535d0e1f22f7508ac2e6209ca29da978d50106997f75563a13c", + "format": "png", + "width": 1024, + "height": 1024, + "transparent": true + }, + { + "file": "ocaml/workspace/favicon.ico", + "bytes": 17558, + "sha256": "0b058ad6c18eba50766df9132d86e62a93df3eb1c9165b7ad8dd4a5a4894acc6", + "format": "ico", + "sizes": [ + 16, + 32, + 48, + 256 + ] + }, + { + "file": "ocaml/workspace/safari-pinned-tab.svg", + "bytes": 2405, + "sha256": "7738ada39bb118c947fc8ef96d0ef3556787aafbe4dbb5df826eb8ddde8a25b0", + "format": "svg", + "width": 512, + "height": 512, + "monochrome": true + }, + { + "file": "ocaml/workspace/apple-touch-icon-light.png", + "bytes": 1319, + "sha256": "067742fe4dbfed8d1306482da50feb5420e19d8c2a977058981631cdc310f435", + "format": "png", + "width": 180, + "height": 180, + "transparent": false, + "purpose": "apple-touch" + }, + { + "file": "ocaml/workspace/app-icon-1024-light.png", + "bytes": 11541, + "sha256": "257d887c2b8eea354cfc7fa86ff6f13437238b7d47c7cacca6d69a2de6b9a9f4", + "format": "png", + "width": 1024, + "height": 1024, + "transparent": false, + "purpose": "app-icon" + }, + { + "file": "ocaml/workspace/maskable-192-light.png", + "bytes": 1144, + "sha256": "c61cc67edc54376e2ba11a4456c5f0697e42774b675dd5da8dd8164e083a15e7", + "format": "png", + "width": 192, + "height": 192, + "transparent": false, + "purpose": "maskable", + "contentFraction": 0.52 + }, + { + "file": "ocaml/workspace/maskable-512-light.png", + "bytes": 3846, + "sha256": "f8248aca7950eade76e5603067547a277fa566b81f4786d73c5389012f76cd29", + "format": "png", + "width": 512, + "height": 512, + "transparent": false, + "purpose": "maskable", + "contentFraction": 0.52 + }, + { + "file": "ocaml/workspace/mstile-150-light.png", + "bytes": 994, + "sha256": "d72508bd3377332672937c47279dcecc5b8269044d37c59fe18e47edddfc250a", + "format": "png", + "width": 150, + "height": 150, + "transparent": false, + "purpose": "windows-tile" + }, + { + "file": "ocaml/workspace/mstile-310-light.png", + "bytes": 2243, + "sha256": "59497fb37d68a576b3e647d1cb2c07a7e1c48de0de72cf3c45d4a1955b471275", + "format": "png", + "width": 310, + "height": 310, + "transparent": false, + "purpose": "windows-tile" + }, + { + "file": "ocaml/workspace/opengraph-light.png", + "bytes": 23424, + "sha256": "fb85526ac31a8b9e933b5043c94d2777fde3a9b1d8134268f474b15876bdd00c", + "format": "png", + "width": 1200, + "height": 630, + "transparent": false, + "purpose": "opengraph" + }, + { + "file": "ocaml/workspace/opengraph-light.jpg", + "bytes": 44987, + "sha256": "09550eb4a45751cb90ac66a0d0d3be751c5be0d0674f0061466c1d557900886c", + "format": "jpeg", + "width": 1200, + "height": 630, + "transparent": false, + "purpose": "opengraph-fallback" + }, + { + "file": "ocaml/workspace/twitter-light.png", + "bytes": 23278, + "sha256": "28b498a75c59ebac558b8af52d771986f4a08cc6846511251f6684a5383bb879", + "format": "png", + "width": 1200, + "height": 600, + "transparent": false, + "purpose": "twitter" + }, + { + "file": "ocaml/workspace/social-square-light.png", + "bytes": 26331, + "sha256": "f71e0312c3b28db31769d05bb1b6107d4a94250d3af76944fee698f965bf5aff", + "format": "png", + "width": 1080, + "height": 1080, + "transparent": false, + "purpose": "social-square" + }, + { + "file": "ocaml/workspace/site.webmanifest", + "bytes": 735, + "sha256": "fa5ac439d36980454dcc48ff494221e89d00cb4e2c3a4211c5aa0d710c0e60ef", + "format": "webmanifest" + }, + { + "file": "ocaml/workspace/browserconfig.xml", + "bytes": 238, + "sha256": "14133b25b414820f149eabd99b80cf44f1c142ba9af1b77118712c0408cb790c", + "format": "xml" + }, + { + "file": "ocaml/workspace/apple-touch-icon-dark.png", + "bytes": 1274, + "sha256": "4181b94058bbb68d14bbf24b89ebfe20c28c6946debf330039335dca90e10b79", + "format": "png", + "width": 180, + "height": 180, + "transparent": false, + "purpose": "apple-touch" + }, + { + "file": "ocaml/workspace/app-icon-1024-dark.png", + "bytes": 11293, + "sha256": "1c71283f8cf3e248a2327a21b9679d3a0f1a15828b63981e5a2429aef2e04d0b", + "format": "png", + "width": 1024, + "height": 1024, + "transparent": false, + "purpose": "app-icon" + }, + { + "file": "ocaml/workspace/maskable-192-dark.png", + "bytes": 1116, + "sha256": "d3fe724876aec8129dd7e31890e4e1f0d5a532aac931fa9ac5a4e27a360b3950", + "format": "png", + "width": 192, + "height": 192, + "transparent": false, + "purpose": "maskable", + "contentFraction": 0.52 + }, + { + "file": "ocaml/workspace/maskable-512-dark.png", + "bytes": 3772, + "sha256": "d968363d6cf94e1172035292e6bdad76c2d301077ba8d66594c7aaee71bf9ca0", + "format": "png", + "width": 512, + "height": 512, + "transparent": false, + "purpose": "maskable", + "contentFraction": 0.52 + }, + { + "file": "ocaml/workspace/mstile-150-dark.png", + "bytes": 971, + "sha256": "723e035a16407b2a6ebcd0e36e9885294de2a2829f03766cb007b36d199ecdb1", + "format": "png", + "width": 150, + "height": 150, + "transparent": false, + "purpose": "windows-tile" + }, + { + "file": "ocaml/workspace/mstile-310-dark.png", + "bytes": 2178, + "sha256": "6c696cd235320048d9acb8dd68353e282bc7e930a427ec0e0d68f499e0352f4f", + "format": "png", + "width": 310, + "height": 310, + "transparent": false, + "purpose": "windows-tile" + }, + { + "file": "ocaml/workspace/opengraph-dark.png", + "bytes": 23449, + "sha256": "c297bc46fa1752584b8c21b5dc3dc4bf7634dd9b078671585e62b6b1f039dee6", + "format": "png", + "width": 1200, + "height": 630, + "transparent": false, + "purpose": "opengraph" + }, + { + "file": "ocaml/workspace/opengraph-dark.jpg", + "bytes": 42656, + "sha256": "ec6b865b4cb33911ddc2adbed51778ef27fd8aeada27e63c675d5f8666b6801a", + "format": "jpeg", + "width": 1200, + "height": 630, + "transparent": false, + "purpose": "opengraph-fallback" + }, + { + "file": "ocaml/workspace/twitter-dark.png", + "bytes": 23302, + "sha256": "b8adbcaf4b961458293f58cd0949fb9057b61682cb717753c11b1318f0b2bce8", + "format": "png", + "width": 1200, + "height": 600, + "transparent": false, + "purpose": "twitter" + }, + { + "file": "ocaml/workspace/social-square-dark.png", + "bytes": 26370, + "sha256": "37e5250e76c7d94ac510f97a9e29eee6aadd8a5b532afe2f5ad028d560f55220", + "format": "png", + "width": 1080, + "height": 1080, + "transparent": false, + "purpose": "social-square" + }, + { + "file": "ocaml/workspace/site-dark.webmanifest", + "bytes": 733, + "sha256": "d3c1278072ccb8d7326dd3b757d6ac3be07e9d6dede2508fcb58849a18ae6a33", + "format": "webmanifest" + }, + { + "file": "ocaml/workspace/browserconfig-dark.xml", + "bytes": 236, + "sha256": "d6550a2d9d8074a5f7c4dcb03eaf68d469fe52d5cab8904597e83806ab357f2a", + "format": "xml" + } + ] } ], - "fileCount": 2064 + "fileCount": 2150 } diff --git a/site/public/brand/languages/ocaml/icon.svg b/site/public/brand/languages/ocaml/icon.svg new file mode 100644 index 000000000..3c1822dce --- /dev/null +++ b/site/public/brand/languages/ocaml/icon.svg @@ -0,0 +1,2 @@ + + diff --git a/site/public/brand/languages/ocaml/provenance.json b/site/public/brand/languages/ocaml/provenance.json new file mode 100644 index 000000000..b173794ab --- /dev/null +++ b/site/public/brand/languages/ocaml/provenance.json @@ -0,0 +1,15 @@ +{ + "name": "OCaml", + "asset": "icon.svg", + "sourceUrl": "https://raw.githubusercontent.com/libtmux/libtmux-ocaml/cb2c4469394f8c3b4a45331969730130f6f10a29/docs/assets/logo.svg", + "sourcePage": "https://github.com/libtmux/libtmux-ocaml/blob/cb2c4469394f8c3b4a45331969730130f6f10a29/docs/assets/source.json", + "upstreamRevision": "cb2c4469394f8c3b4a45331969730130f6f10a29", + "sha256": "510affa78d0068e768a33146edd5028a409d4d599172809ad21ced27cf07ce9f", + "modifications": "Uses the approved port logo as its language-picker icon.", + "license": { + "name": "MIT", + "urls": [ + "https://github.com/libtmux/libtmux-ocaml/blob/cb2c4469394f8c3b4a45331969730130f6f10a29/LICENSE" + ] + } +} diff --git a/site/public/brand/ocaml/library/app-icon-1024-dark.png b/site/public/brand/ocaml/library/app-icon-1024-dark.png new file mode 100644 index 000000000..cf36f60bd Binary files /dev/null and b/site/public/brand/ocaml/library/app-icon-1024-dark.png differ diff --git a/site/public/brand/ocaml/library/app-icon-1024-light.png b/site/public/brand/ocaml/library/app-icon-1024-light.png new file mode 100644 index 000000000..5ac05b684 Binary files /dev/null and b/site/public/brand/ocaml/library/app-icon-1024-light.png differ diff --git a/site/public/brand/ocaml/library/apple-touch-icon-dark.png b/site/public/brand/ocaml/library/apple-touch-icon-dark.png new file mode 100644 index 000000000..f324547ec Binary files /dev/null and b/site/public/brand/ocaml/library/apple-touch-icon-dark.png differ diff --git a/site/public/brand/ocaml/library/apple-touch-icon-light.png b/site/public/brand/ocaml/library/apple-touch-icon-light.png new file mode 100644 index 000000000..a1998fd77 Binary files /dev/null and b/site/public/brand/ocaml/library/apple-touch-icon-light.png differ diff --git a/site/public/brand/ocaml/library/browserconfig-dark.xml b/site/public/brand/ocaml/library/browserconfig-dark.xml new file mode 100644 index 000000000..2a7fe2ece --- /dev/null +++ b/site/public/brand/ocaml/library/browserconfig-dark.xml @@ -0,0 +1 @@ +#EF7A08 diff --git a/site/public/brand/ocaml/library/browserconfig.xml b/site/public/brand/ocaml/library/browserconfig.xml new file mode 100644 index 000000000..4f0a4d69e --- /dev/null +++ b/site/public/brand/ocaml/library/browserconfig.xml @@ -0,0 +1 @@ +#EF7A08 diff --git a/site/public/brand/ocaml/library/favicon.ico b/site/public/brand/ocaml/library/favicon.ico new file mode 100644 index 000000000..978266457 Binary files /dev/null and b/site/public/brand/ocaml/library/favicon.ico differ diff --git a/site/public/brand/ocaml/library/logo-1024.png b/site/public/brand/ocaml/library/logo-1024.png new file mode 100644 index 000000000..077caf424 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-1024.png differ diff --git a/site/public/brand/ocaml/library/logo-128.png b/site/public/brand/ocaml/library/logo-128.png new file mode 100644 index 000000000..5825e2f1b Binary files /dev/null and b/site/public/brand/ocaml/library/logo-128.png differ diff --git a/site/public/brand/ocaml/library/logo-144.png b/site/public/brand/ocaml/library/logo-144.png new file mode 100644 index 000000000..0e2c9cf06 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-144.png differ diff --git a/site/public/brand/ocaml/library/logo-152.png b/site/public/brand/ocaml/library/logo-152.png new file mode 100644 index 000000000..3979b82d5 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-152.png differ diff --git a/site/public/brand/ocaml/library/logo-16.png b/site/public/brand/ocaml/library/logo-16.png new file mode 100644 index 000000000..fc252ab91 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-16.png differ diff --git a/site/public/brand/ocaml/library/logo-167.png b/site/public/brand/ocaml/library/logo-167.png new file mode 100644 index 000000000..5197f2988 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-167.png differ diff --git a/site/public/brand/ocaml/library/logo-180.png b/site/public/brand/ocaml/library/logo-180.png new file mode 100644 index 000000000..cd5f9cf5f Binary files /dev/null and b/site/public/brand/ocaml/library/logo-180.png differ diff --git a/site/public/brand/ocaml/library/logo-192.png b/site/public/brand/ocaml/library/logo-192.png new file mode 100644 index 000000000..bc58429d8 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-192.png differ diff --git a/site/public/brand/ocaml/library/logo-24.png b/site/public/brand/ocaml/library/logo-24.png new file mode 100644 index 000000000..5cc778ef5 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-24.png differ diff --git a/site/public/brand/ocaml/library/logo-256.png b/site/public/brand/ocaml/library/logo-256.png new file mode 100644 index 000000000..f48e2bd42 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-256.png differ diff --git a/site/public/brand/ocaml/library/logo-32.png b/site/public/brand/ocaml/library/logo-32.png new file mode 100644 index 000000000..ce8f772b0 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-32.png differ diff --git a/site/public/brand/ocaml/library/logo-384.png b/site/public/brand/ocaml/library/logo-384.png new file mode 100644 index 000000000..3010f4fd5 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-384.png differ diff --git a/site/public/brand/ocaml/library/logo-48.png b/site/public/brand/ocaml/library/logo-48.png new file mode 100644 index 000000000..f0f0066a0 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-48.png differ diff --git a/site/public/brand/ocaml/library/logo-512.png b/site/public/brand/ocaml/library/logo-512.png new file mode 100644 index 000000000..3fc4f9e0d Binary files /dev/null and b/site/public/brand/ocaml/library/logo-512.png differ diff --git a/site/public/brand/ocaml/library/logo-64.png b/site/public/brand/ocaml/library/logo-64.png new file mode 100644 index 000000000..92c950117 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-64.png differ diff --git a/site/public/brand/ocaml/library/logo-96.png b/site/public/brand/ocaml/library/logo-96.png new file mode 100644 index 000000000..c4391e845 Binary files /dev/null and b/site/public/brand/ocaml/library/logo-96.png differ diff --git a/site/public/brand/ocaml/library/logo.svg b/site/public/brand/ocaml/library/logo.svg new file mode 100644 index 000000000..3c1822dce --- /dev/null +++ b/site/public/brand/ocaml/library/logo.svg @@ -0,0 +1,2 @@ + + diff --git a/site/public/brand/ocaml/library/maskable-192-dark.png b/site/public/brand/ocaml/library/maskable-192-dark.png new file mode 100644 index 000000000..9375f1631 Binary files /dev/null and b/site/public/brand/ocaml/library/maskable-192-dark.png differ diff --git a/site/public/brand/ocaml/library/maskable-192-light.png b/site/public/brand/ocaml/library/maskable-192-light.png new file mode 100644 index 000000000..93e31ae39 Binary files /dev/null and b/site/public/brand/ocaml/library/maskable-192-light.png differ diff --git a/site/public/brand/ocaml/library/maskable-512-dark.png b/site/public/brand/ocaml/library/maskable-512-dark.png new file mode 100644 index 000000000..850031bde Binary files /dev/null and b/site/public/brand/ocaml/library/maskable-512-dark.png differ diff --git a/site/public/brand/ocaml/library/maskable-512-light.png b/site/public/brand/ocaml/library/maskable-512-light.png new file mode 100644 index 000000000..a327d550b Binary files /dev/null and b/site/public/brand/ocaml/library/maskable-512-light.png differ diff --git a/site/public/brand/ocaml/library/mstile-150-dark.png b/site/public/brand/ocaml/library/mstile-150-dark.png new file mode 100644 index 000000000..ce55ad098 Binary files /dev/null and b/site/public/brand/ocaml/library/mstile-150-dark.png differ diff --git a/site/public/brand/ocaml/library/mstile-150-light.png b/site/public/brand/ocaml/library/mstile-150-light.png new file mode 100644 index 000000000..ddc084745 Binary files /dev/null and b/site/public/brand/ocaml/library/mstile-150-light.png differ diff --git a/site/public/brand/ocaml/library/mstile-310-dark.png b/site/public/brand/ocaml/library/mstile-310-dark.png new file mode 100644 index 000000000..8d6306a7d Binary files /dev/null and b/site/public/brand/ocaml/library/mstile-310-dark.png differ diff --git a/site/public/brand/ocaml/library/mstile-310-light.png b/site/public/brand/ocaml/library/mstile-310-light.png new file mode 100644 index 000000000..008e1b830 Binary files /dev/null and b/site/public/brand/ocaml/library/mstile-310-light.png differ diff --git a/site/public/brand/ocaml/library/opengraph-dark.jpg b/site/public/brand/ocaml/library/opengraph-dark.jpg new file mode 100644 index 000000000..8948effb1 Binary files /dev/null and b/site/public/brand/ocaml/library/opengraph-dark.jpg differ diff --git a/site/public/brand/ocaml/library/opengraph-dark.png b/site/public/brand/ocaml/library/opengraph-dark.png new file mode 100644 index 000000000..503d11181 Binary files /dev/null and b/site/public/brand/ocaml/library/opengraph-dark.png differ diff --git a/site/public/brand/ocaml/library/opengraph-light.jpg b/site/public/brand/ocaml/library/opengraph-light.jpg new file mode 100644 index 000000000..5585790a7 Binary files /dev/null and b/site/public/brand/ocaml/library/opengraph-light.jpg differ diff --git a/site/public/brand/ocaml/library/opengraph-light.png b/site/public/brand/ocaml/library/opengraph-light.png new file mode 100644 index 000000000..86d8da0f2 Binary files /dev/null and b/site/public/brand/ocaml/library/opengraph-light.png differ diff --git a/site/public/brand/ocaml/library/safari-pinned-tab.svg b/site/public/brand/ocaml/library/safari-pinned-tab.svg new file mode 100644 index 000000000..94378e63b --- /dev/null +++ b/site/public/brand/ocaml/library/safari-pinned-tab.svg @@ -0,0 +1,2 @@ + + diff --git a/site/public/brand/ocaml/library/site-dark.webmanifest b/site/public/brand/ocaml/library/site-dark.webmanifest new file mode 100644 index 000000000..793d6d59f --- /dev/null +++ b/site/public/brand/ocaml/library/site-dark.webmanifest @@ -0,0 +1,36 @@ +{ + "name": "libtmux for OCaml", + "short_name": "libtmux", + "id": "/", + "start_url": "/", + "scope": "/", + "display": "standalone", + "background_color": "#12161D", + "theme_color": "#EF7A08", + "icons": [ + { + "src": "logo-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "maskable-192-dark.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "logo-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "maskable-512-dark.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/site/public/brand/ocaml/library/site.webmanifest b/site/public/brand/ocaml/library/site.webmanifest new file mode 100644 index 000000000..545aed627 --- /dev/null +++ b/site/public/brand/ocaml/library/site.webmanifest @@ -0,0 +1,36 @@ +{ + "name": "libtmux for OCaml", + "short_name": "libtmux", + "id": "/", + "start_url": "/", + "scope": "/", + "display": "standalone", + "background_color": "#F4F4F1", + "theme_color": "#EF7A08", + "icons": [ + { + "src": "logo-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "maskable-192-light.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "logo-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "maskable-512-light.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/site/public/brand/ocaml/library/social-square-dark.png b/site/public/brand/ocaml/library/social-square-dark.png new file mode 100644 index 000000000..c04ed9fde Binary files /dev/null and b/site/public/brand/ocaml/library/social-square-dark.png differ diff --git a/site/public/brand/ocaml/library/social-square-light.png b/site/public/brand/ocaml/library/social-square-light.png new file mode 100644 index 000000000..9ae51f10f Binary files /dev/null and b/site/public/brand/ocaml/library/social-square-light.png differ diff --git a/site/public/brand/ocaml/library/twitter-dark.png b/site/public/brand/ocaml/library/twitter-dark.png new file mode 100644 index 000000000..9907d15e9 Binary files /dev/null and b/site/public/brand/ocaml/library/twitter-dark.png differ diff --git a/site/public/brand/ocaml/library/twitter-light.png b/site/public/brand/ocaml/library/twitter-light.png new file mode 100644 index 000000000..867bf4b6a Binary files /dev/null and b/site/public/brand/ocaml/library/twitter-light.png differ diff --git a/site/public/brand/ocaml/workspace/app-icon-1024-dark.png b/site/public/brand/ocaml/workspace/app-icon-1024-dark.png new file mode 100644 index 000000000..1fa319017 Binary files /dev/null and b/site/public/brand/ocaml/workspace/app-icon-1024-dark.png differ diff --git a/site/public/brand/ocaml/workspace/app-icon-1024-light.png b/site/public/brand/ocaml/workspace/app-icon-1024-light.png new file mode 100644 index 000000000..d5e5e0a21 Binary files /dev/null and b/site/public/brand/ocaml/workspace/app-icon-1024-light.png differ diff --git a/site/public/brand/ocaml/workspace/apple-touch-icon-dark.png b/site/public/brand/ocaml/workspace/apple-touch-icon-dark.png new file mode 100644 index 000000000..41e754521 Binary files /dev/null and b/site/public/brand/ocaml/workspace/apple-touch-icon-dark.png differ diff --git a/site/public/brand/ocaml/workspace/apple-touch-icon-light.png b/site/public/brand/ocaml/workspace/apple-touch-icon-light.png new file mode 100644 index 000000000..e11991615 Binary files /dev/null and b/site/public/brand/ocaml/workspace/apple-touch-icon-light.png differ diff --git a/site/public/brand/ocaml/workspace/browserconfig-dark.xml b/site/public/brand/ocaml/workspace/browserconfig-dark.xml new file mode 100644 index 000000000..2a7fe2ece --- /dev/null +++ b/site/public/brand/ocaml/workspace/browserconfig-dark.xml @@ -0,0 +1 @@ +#EF7A08 diff --git a/site/public/brand/ocaml/workspace/browserconfig.xml b/site/public/brand/ocaml/workspace/browserconfig.xml new file mode 100644 index 000000000..4f0a4d69e --- /dev/null +++ b/site/public/brand/ocaml/workspace/browserconfig.xml @@ -0,0 +1 @@ +#EF7A08 diff --git a/site/public/brand/ocaml/workspace/favicon.ico b/site/public/brand/ocaml/workspace/favicon.ico new file mode 100644 index 000000000..ef683b4e3 Binary files /dev/null and b/site/public/brand/ocaml/workspace/favicon.ico differ diff --git a/site/public/brand/ocaml/workspace/logo-1024.png b/site/public/brand/ocaml/workspace/logo-1024.png new file mode 100644 index 000000000..1d783fa31 Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-1024.png differ diff --git a/site/public/brand/ocaml/workspace/logo-128.png b/site/public/brand/ocaml/workspace/logo-128.png new file mode 100644 index 000000000..2da9a75bd Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-128.png differ diff --git a/site/public/brand/ocaml/workspace/logo-144.png b/site/public/brand/ocaml/workspace/logo-144.png new file mode 100644 index 000000000..f7541f4f9 Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-144.png differ diff --git a/site/public/brand/ocaml/workspace/logo-152.png b/site/public/brand/ocaml/workspace/logo-152.png new file mode 100644 index 000000000..00f3d9bd1 Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-152.png differ diff --git a/site/public/brand/ocaml/workspace/logo-16.png b/site/public/brand/ocaml/workspace/logo-16.png new file mode 100644 index 000000000..7cf84e1b8 Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-16.png differ diff --git a/site/public/brand/ocaml/workspace/logo-167.png b/site/public/brand/ocaml/workspace/logo-167.png new file mode 100644 index 000000000..574d430aa Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-167.png differ diff --git a/site/public/brand/ocaml/workspace/logo-180.png b/site/public/brand/ocaml/workspace/logo-180.png new file mode 100644 index 000000000..8a23104ae Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-180.png differ diff --git a/site/public/brand/ocaml/workspace/logo-192.png b/site/public/brand/ocaml/workspace/logo-192.png new file mode 100644 index 000000000..435aab925 Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-192.png differ diff --git a/site/public/brand/ocaml/workspace/logo-24.png b/site/public/brand/ocaml/workspace/logo-24.png new file mode 100644 index 000000000..9d01c4d96 Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-24.png differ diff --git a/site/public/brand/ocaml/workspace/logo-256.png b/site/public/brand/ocaml/workspace/logo-256.png new file mode 100644 index 000000000..bde3d5912 Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-256.png differ diff --git a/site/public/brand/ocaml/workspace/logo-32.png b/site/public/brand/ocaml/workspace/logo-32.png new file mode 100644 index 000000000..6ca01c7a3 Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-32.png differ diff --git a/site/public/brand/ocaml/workspace/logo-384.png b/site/public/brand/ocaml/workspace/logo-384.png new file mode 100644 index 000000000..3119743de Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-384.png differ diff --git a/site/public/brand/ocaml/workspace/logo-48.png b/site/public/brand/ocaml/workspace/logo-48.png new file mode 100644 index 000000000..28c9bb7be Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-48.png differ diff --git a/site/public/brand/ocaml/workspace/logo-512.png b/site/public/brand/ocaml/workspace/logo-512.png new file mode 100644 index 000000000..ffe4fb819 Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-512.png differ diff --git a/site/public/brand/ocaml/workspace/logo-64.png b/site/public/brand/ocaml/workspace/logo-64.png new file mode 100644 index 000000000..57a5dc7b2 Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-64.png differ diff --git a/site/public/brand/ocaml/workspace/logo-96.png b/site/public/brand/ocaml/workspace/logo-96.png new file mode 100644 index 000000000..6122c096e Binary files /dev/null and b/site/public/brand/ocaml/workspace/logo-96.png differ diff --git a/site/public/brand/ocaml/workspace/logo.svg b/site/public/brand/ocaml/workspace/logo.svg new file mode 100644 index 000000000..e157ce238 --- /dev/null +++ b/site/public/brand/ocaml/workspace/logo.svg @@ -0,0 +1,2 @@ + + diff --git a/site/public/brand/ocaml/workspace/maskable-192-dark.png b/site/public/brand/ocaml/workspace/maskable-192-dark.png new file mode 100644 index 000000000..4b2e51d98 Binary files /dev/null and b/site/public/brand/ocaml/workspace/maskable-192-dark.png differ diff --git a/site/public/brand/ocaml/workspace/maskable-192-light.png b/site/public/brand/ocaml/workspace/maskable-192-light.png new file mode 100644 index 000000000..71ebade35 Binary files /dev/null and b/site/public/brand/ocaml/workspace/maskable-192-light.png differ diff --git a/site/public/brand/ocaml/workspace/maskable-512-dark.png b/site/public/brand/ocaml/workspace/maskable-512-dark.png new file mode 100644 index 000000000..a11e49987 Binary files /dev/null and b/site/public/brand/ocaml/workspace/maskable-512-dark.png differ diff --git a/site/public/brand/ocaml/workspace/maskable-512-light.png b/site/public/brand/ocaml/workspace/maskable-512-light.png new file mode 100644 index 000000000..1c2a04839 Binary files /dev/null and b/site/public/brand/ocaml/workspace/maskable-512-light.png differ diff --git a/site/public/brand/ocaml/workspace/mstile-150-dark.png b/site/public/brand/ocaml/workspace/mstile-150-dark.png new file mode 100644 index 000000000..e2acea9c3 Binary files /dev/null and b/site/public/brand/ocaml/workspace/mstile-150-dark.png differ diff --git a/site/public/brand/ocaml/workspace/mstile-150-light.png b/site/public/brand/ocaml/workspace/mstile-150-light.png new file mode 100644 index 000000000..7389448dd Binary files /dev/null and b/site/public/brand/ocaml/workspace/mstile-150-light.png differ diff --git a/site/public/brand/ocaml/workspace/mstile-310-dark.png b/site/public/brand/ocaml/workspace/mstile-310-dark.png new file mode 100644 index 000000000..db6a75cea Binary files /dev/null and b/site/public/brand/ocaml/workspace/mstile-310-dark.png differ diff --git a/site/public/brand/ocaml/workspace/mstile-310-light.png b/site/public/brand/ocaml/workspace/mstile-310-light.png new file mode 100644 index 000000000..b9811fd6b Binary files /dev/null and b/site/public/brand/ocaml/workspace/mstile-310-light.png differ diff --git a/site/public/brand/ocaml/workspace/opengraph-dark.jpg b/site/public/brand/ocaml/workspace/opengraph-dark.jpg new file mode 100644 index 000000000..1200ae572 Binary files /dev/null and b/site/public/brand/ocaml/workspace/opengraph-dark.jpg differ diff --git a/site/public/brand/ocaml/workspace/opengraph-dark.png b/site/public/brand/ocaml/workspace/opengraph-dark.png new file mode 100644 index 000000000..718aa9e68 Binary files /dev/null and b/site/public/brand/ocaml/workspace/opengraph-dark.png differ diff --git a/site/public/brand/ocaml/workspace/opengraph-light.jpg b/site/public/brand/ocaml/workspace/opengraph-light.jpg new file mode 100644 index 000000000..03dd7025a Binary files /dev/null and b/site/public/brand/ocaml/workspace/opengraph-light.jpg differ diff --git a/site/public/brand/ocaml/workspace/opengraph-light.png b/site/public/brand/ocaml/workspace/opengraph-light.png new file mode 100644 index 000000000..d52e77008 Binary files /dev/null and b/site/public/brand/ocaml/workspace/opengraph-light.png differ diff --git a/site/public/brand/ocaml/workspace/safari-pinned-tab.svg b/site/public/brand/ocaml/workspace/safari-pinned-tab.svg new file mode 100644 index 000000000..4c5a59f7c --- /dev/null +++ b/site/public/brand/ocaml/workspace/safari-pinned-tab.svg @@ -0,0 +1,2 @@ + + diff --git a/site/public/brand/ocaml/workspace/site-dark.webmanifest b/site/public/brand/ocaml/workspace/site-dark.webmanifest new file mode 100644 index 000000000..35c4c1eb3 --- /dev/null +++ b/site/public/brand/ocaml/workspace/site-dark.webmanifest @@ -0,0 +1,36 @@ +{ + "name": "libtmux for OCaml — workspace CLI", + "short_name": "libtmux", + "id": "/", + "start_url": "/", + "scope": "/", + "display": "standalone", + "background_color": "#12161D", + "theme_color": "#EF7A08", + "icons": [ + { + "src": "logo-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "maskable-192-dark.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "logo-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "maskable-512-dark.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/site/public/brand/ocaml/workspace/site.webmanifest b/site/public/brand/ocaml/workspace/site.webmanifest new file mode 100644 index 000000000..54a2730ed --- /dev/null +++ b/site/public/brand/ocaml/workspace/site.webmanifest @@ -0,0 +1,36 @@ +{ + "name": "libtmux for OCaml — workspace CLI", + "short_name": "libtmux", + "id": "/", + "start_url": "/", + "scope": "/", + "display": "standalone", + "background_color": "#F4F4F1", + "theme_color": "#EF7A08", + "icons": [ + { + "src": "logo-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "maskable-192-light.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "logo-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "maskable-512-light.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/site/public/brand/ocaml/workspace/social-square-dark.png b/site/public/brand/ocaml/workspace/social-square-dark.png new file mode 100644 index 000000000..9b265a251 Binary files /dev/null and b/site/public/brand/ocaml/workspace/social-square-dark.png differ diff --git a/site/public/brand/ocaml/workspace/social-square-light.png b/site/public/brand/ocaml/workspace/social-square-light.png new file mode 100644 index 000000000..ba44411f3 Binary files /dev/null and b/site/public/brand/ocaml/workspace/social-square-light.png differ diff --git a/site/public/brand/ocaml/workspace/twitter-dark.png b/site/public/brand/ocaml/workspace/twitter-dark.png new file mode 100644 index 000000000..3f33d8ac0 Binary files /dev/null and b/site/public/brand/ocaml/workspace/twitter-dark.png differ diff --git a/site/public/brand/ocaml/workspace/twitter-light.png b/site/public/brand/ocaml/workspace/twitter-light.png new file mode 100644 index 000000000..f20a3b339 Binary files /dev/null and b/site/public/brand/ocaml/workspace/twitter-light.png differ diff --git a/site/public/versions.json b/site/public/versions.json index 92c408cda..df4f0b6b5 100644 --- a/site/public/versions.json +++ b/site/public/versions.json @@ -128,6 +128,14 @@ "kind": "trunk", "supported": true } + ], + "ocaml": [ + { + "slug": "latest", + "label": "latest", + "kind": "trunk", + "supported": true + } ] }, "defaultVersion": { @@ -146,6 +154,7 @@ "swift": "latest", "powershell": "latest", "julia": "latest", - "elixir": "latest" + "elixir": "latest", + "ocaml": "latest" } } diff --git a/site/src/components/api/ApiDoc.astro b/site/src/components/api/ApiDoc.astro index d7ff727fc..4bab85ae6 100644 --- a/site/src/components/api/ApiDoc.astro +++ b/site/src/components/api/ApiDoc.astro @@ -77,20 +77,20 @@ function mentionOf(link: LinkTarget | undefined, kind: string | undefined, title // A symbol is written the way its language's own documentation writes it: `kill()` in Python, `Server#kill` in Ruby. const owner = symbol && index.parentOf(symbol) // A tool is named on the wire, as a command is, and is not called by that name. - const label = symbol ? writtenForm({ + const label = symbol && span.code !== false ? writtenForm({ lang: index.language, kind: index.isMcpTool(symbol) ? 'command' : formKind(index.language, symbol, owner), symbol, owner, label: bare, chip, onOwnerPage: isWithin(context, owner, (scope) => index.parentOf(scope)), }) : bare const qualified = !chip && memberReference.test(label) && Boolean(span.link || parts.some((part) => part.link)) // The accessible name is the text a reader sees. const mention = mentionOf(span.link, symbol?.kind, symbol?.command?.kind ?? symbol?.kind, label) - const name = {labelParts(label, qualified).map((text) => qualified && text === '#' ? {text} : text)} + const name = span.code === false ? label : {labelParts(label, qualified).map((text) => qualified && text === '#' ? {text} : text)} if (span.link && mention) return ( {name} ) return span.link ? ( {name} - ) : ( + ) : span.code === false ? {label} : ( {parts.map((part) => { const separated = labelParts(part.text, qualified).map((text) => qualified && text === '#' ? {text} : text) if (!part.link) return separated diff --git a/site/src/components/api/ApiEntry.astro b/site/src/components/api/ApiEntry.astro index 9ca0a8037..d423edbf8 100644 --- a/site/src/components/api/ApiEntry.astro +++ b/site/src/components/api/ApiEntry.astro @@ -343,7 +343,7 @@ const hasBody = role={signatureLayouts.has(sig) ? 'region' : undefined} aria-label={signatureLayouts.has(sig) ? `Signature for ${symbol.name}${symbol.signatures.length > 1 ? `, overload ${symbol.signatures.indexOf(sig) + 1} of ${symbol.signatures.length}` : ''}` : undefined} data-code-columns={signatureLayouts.get(sig)?.limit} data-code-width-status={signatureLayouts.has(sig) ? (signatureLayouts.get(sig)!.failures.length ? 'unresolved' : 'fits') : undefined} data-code-width-failures={signatureLayouts.get(sig)?.failures.length ? JSON.stringify(signatureLayouts.get(sig)!.failures) : undefined}>{sig.label && sig.label !== '__AllParameterSets' && {sig.label}{sig.isDefault ? ' (default)' : ''}: } - )) : {anonymousDeclarationLabel(symbol)}) : <> + )) : {language === 'ocaml' && ['module', 'interface'].includes(symbol.kind) ? `${symbol.kind === 'interface' ? 'module type' : 'module'} ${symbol.name}` : anonymousDeclarationLabel(symbol)}) : <> {keyword && {keyword} } {prename && {prename}}{nameHref ? {symbol.name} : {symbol.name}}{alias?.typeParams && } { diff --git a/site/src/components/api/ApiReference.astro b/site/src/components/api/ApiReference.astro index 434c53e35..f3d6ad248 100644 --- a/site/src/components/api/ApiReference.astro +++ b/site/src/components/api/ApiReference.astro @@ -603,7 +603,7 @@ const bases = owner && 'extends' in owner ? owner.extends ?? [] : [] {mod.free.includes(o) && legacyIndexAnchors(o).map((id) => )}
{o.name} - + {context && } diff --git a/site/src/components/docs/DocPage.astro b/site/src/components/docs/DocPage.astro index dc03d3eef..53e0e02c0 100644 --- a/site/src/components/docs/DocPage.astro +++ b/site/src/components/docs/DocPage.astro @@ -119,6 +119,8 @@ const isWorkspaceOverview = entry.data.product === 'workspace' && pagePath === 'workspace' && productIsAvailable && Boolean(port && hasPackageInstalls(PORT_BY_SLUG[port], 'workspace')) +const hasWorkspaceGuide = isWorkspaceOverview && all.some((page) => page.data.port === port + && page.data.product === 'workspace' && docsPath(page) === 'workspace/source-guide') // Each overview shows what its port's own sources can show: workspace files // its tests load, or the tools its server advertises. The MCP worked example @@ -299,7 +301,7 @@ const productIntro = isProductOverview && port && coreHome )} {!placeholderLocale && } {!placeholderLocale && workspaceExamples && !workspaceExampleLeads && } - {!placeholderLocale && isWorkspaceOverview && !workspaceExamples && ( + {!placeholderLocale && isWorkspaceOverview && !workspaceExamples && !hasWorkspaceGuide && (

Tested example workspace files for this port are coming.

)} {!placeholderLocale && mcpTools && } diff --git a/site/src/content/docs/ports/ocaml/concepts/index.md b/site/src/content/docs/ports/ocaml/concepts/index.md new file mode 100644 index 000000000..fdf268d47 --- /dev/null +++ b/site/src/content/docs/ports/ocaml/concepts/index.md @@ -0,0 +1,21 @@ +--- +title: OCaml concepts +description: Understand immutable observations, window links and typed queries. +port: ocaml +route: concepts +cards: + - label: Captured object graph + href: ../guides/graph/ + body: Navigate sessions, shared windows, contextual links and panes. + - label: Local queries + href: ../guides/queries/ + body: Compose native predicates and typed expressions over captured values. + - label: Package boundaries + href: ../guides/packages/ + body: Choose the pure core or optional transports and consumers. +--- + +Snapshots hold immutable observations. A window can have several session links; +each link retains its own index and context. Process captured collections with +`Iarray`, `Seq` and ordinary functions. Typed expressions add inspectable query +data without replacing those collections. diff --git a/site/src/content/docs/ports/ocaml/core/index.md b/site/src/content/docs/ports/ocaml/core/index.md new file mode 100644 index 000000000..357c6a049 --- /dev/null +++ b/site/src/content/docs/ports/ocaml/core/index.md @@ -0,0 +1,23 @@ +--- +port: ocaml +route: core +title: "tmux client library for OCaml" +description: "tmux client library for OCaml. Control tmux, connect to and create servers, navigate sessions, windows, and panes, send keys, watch for changes via control mode, capture pane contents" +cards: + - label: Guides + href: ../guides/ + body: Capture, query, streaming and workspace guides. + - label: API reference + href: ../reference/ + body: Public modules, types and values. +--- + +Use the native OCaml library to capture sessions, shared windows and panes. +Process observations with `Iarray`, `Seq` and ordinary predicates. Typed +expressions add inspection and JSON interchange; client calls perform I/O. + +The core and workspace library depend on the standard library. Blocking Linux, +Eio, JSON and the workspace CLI are separate packages. This port excludes MCP. + +[Installation and first use](../guides/getting-started/) · +[Captured graph](../guides/graph/) · [API reference](../reference/) diff --git a/site/src/content/docs/ports/ocaml/examples/index.md b/site/src/content/docs/ports/ocaml/examples/index.md new file mode 100644 index 000000000..ad43e890a --- /dev/null +++ b/site/src/content/docs/ports/ocaml/examples/index.md @@ -0,0 +1,20 @@ +--- +title: OCaml examples +description: Run complete native OCaml programs against an isolated tmux server. +port: ocaml +route: examples +cards: + - label: Capability showcases + href: ../guides/showcases/ + body: Run installed programs with explicit setup, output checks and cleanup. + - label: Partial-failure recovery + href: ../guides/recovery/ + body: Inspect retained outcomes before deciding which action to take next. + - label: Workspaces + href: ../workspace/source-guide/ + body: Validate, plan and apply a complete JSON workspace. +--- + +Start with the [graph program](../guides/getting-started/), then run the +[capability showcases](../guides/showcases/). Each complete program uses public +packages and documents its inputs and ownership of tmux resources. diff --git a/site/src/content/docs/ports/ocaml/topics/index.md b/site/src/content/docs/ports/ocaml/topics/index.md new file mode 100644 index 000000000..f94107513 --- /dev/null +++ b/site/src/content/docs/ports/ocaml/topics/index.md @@ -0,0 +1,20 @@ +--- +title: OCaml topics +description: Understand native client operations, streaming and compatibility. +port: ocaml +route: topics +cards: + - label: Operations and completion + href: ../guides/control/ + body: Distinguish admission, acknowledgement, completion and uncertainty. + - label: Streaming and cancellation + href: ../guides/streaming/ + body: Observe bounded output subscriptions without blocking other clients. + - label: Compatibility + href: ../guides/compatibility/ + body: Check qualified platforms, tmux releases and remaining limitations. +--- + +Client operations perform explicit I/O. Captured observations remain local and +readable after client closure. Follow the guides below for operational +contracts, cancellation and supported environments. diff --git a/site/src/content/docs/ports/ocaml/workspace/index.md b/site/src/content/docs/ports/ocaml/workspace/index.md new file mode 100644 index 000000000..bb8c52f52 --- /dev/null +++ b/site/src/content/docs/ports/ocaml/workspace/index.md @@ -0,0 +1,26 @@ +--- +port: ocaml +product: workspace +route: workspace +title: tmux workspace manager, +subtitle: forged in OCaml. +shortTitle: OCaml-based tmux workspace manager +description: Validate, preview and apply JSON workspaces through the native OCaml library. +sidebar: + label: Overview + order: 0 +cards: + - label: Workspace guide + href: ./source-guide/ + body: Validate, plan and apply JSON configuration, then inspect its receipt. + - label: API reference + href: ./reference/ + body: Browse pure validation and planning alongside explicit execution. +--- + +Install `libtmux-workspace-cli` from the source checkout to run `tmux-workspace`. +The CLI uses the JSON decoder, pure workspace plan and native client packages. +It retains a receipt for recovery after partial or uncertain execution. + +[Run a complete workspace](../workspace/source-guide/) · +[Workspace API](../workspace/reference/) diff --git a/site/src/content/docs/ports/ocaml/workspace/reference.md b/site/src/content/docs/ports/ocaml/workspace/reference.md new file mode 100644 index 000000000..d1ba3f115 --- /dev/null +++ b/site/src/content/docs/ports/ocaml/workspace/reference.md @@ -0,0 +1,17 @@ +--- +title: OCaml workspace API reference +description: Public OCaml workspace validation, planning and execution APIs. +port: ocaml +product: workspace +sidebar: + label: Language API + order: 4 +--- + +Use `Libtmux_workspace` to validate configuration and build a plan without I/O. +Execute the plan through an explicit native client and retain its journal for +recovery. `Libtmux_json` decodes the versioned workspace JSON format. + +The declarations below document the workspace library at this site's source +revision. The [workspace guide](../source-guide/) shows installation, planning, +execution and receipt inspection with `tmux-workspace`. diff --git a/site/src/data/api-destination-evidence.json b/site/src/data/api-destination-evidence.json index 72ed2ad5a..6c0d57582 100644 --- a/site/src/data/api-destination-evidence.json +++ b/site/src/data/api-destination-evidence.json @@ -1,6 +1,6 @@ { "schema": 2, - "checkedAt": "2026-10-31", + "checkedAt": "2026-11-09", "inventories": [ {"name":"python","source":"https://docs.python.org/3/objects.inv","kind":"objects.inv","entries":16493,"digest":"9b186d22c55bd3056145d7009198a34a0274d7e4","ok":true,"missing":0,"checkedAt":"2026-10-25"}, {"name":"julia","source":"https://docs.julialang.org/en/v1/objects.inv","kind":"objects.inv","entries":2545,"digest":"94ff52276c38e7feea3d68234092a72496935b01","ok":true,"missing":0,"checkedAt":"2026-10-25"}, @@ -711,6 +711,18 @@ {"url":"https://luals.github.io/wiki/annotations/#documenting-types","host":"luals.github.io","status":200,"via":"html","title":"Lua Language Server | Wiki","ok":true,"fragment":"found","terminal":[{"symbol":"any","at":"section","reason":"the wiki lists the recognized types in one section"}],"checkedAt":"2026-10-25","names":["lua:any"],"sources":["builtin","prose"]}, {"url":"https://luals.github.io/wiki/annotations/#overload","host":"luals.github.io","status":200,"via":"html","title":"Lua Language Server | Wiki","heading":"@overload","ok":true,"fragment":"found","terminal":[{"key":"authored:Lua overload annotations","symbol":"Lua overload annotations","at":"review"}],"checkedAt":"2026-10-25","names":["glossary lua overload"],"sources":["authored"]}, {"url":"https://modelcontextprotocol.io/specification/2025-11-25/schema#toolannotations","host":"modelcontextprotocol.io","status":200,"via":"html","title":"Schema Reference - Model Context Protocol","heading":"ToolAnnotations","ok":true,"fragment":"found","terminal":[{"key":"authored:MCP ToolAnnotations","symbol":"MCP ToolAnnotations","at":"review"}],"checkedAt":"2026-10-25","names":["site/src/lib/api-glossary.ts"],"sources":["authored"]}, + {"url":"https://ocaml.org/docs/libraries-dune","host":"ocaml.org","status":200,"via":"html","title":"Libraries With Dune · OCaml Documentation","heading":"Libraries With Dune","ok":true,"terminal":[{"key":"authored:OCaml libraries with Dune","symbol":"OCaml libraries with Dune","at":"review"}],"checkedAt":"2026-11-08","names":["glossary ocaml package"],"sources":["authored"]}, + {"url":"https://ocaml.org/manual/5.5/api/Iarray.html","host":"ocaml.org","status":200,"via":"html","title":"OCaml library : Iarray","identity":{"via":"ocamldoc","declared":"module","kind":"module","path":["Iarray"]},"ok":true,"terminal":[{"key":"ocaml:Iarray","symbol":"Iarray","at":"identity"}],"checkedAt":"2026-11-08","names":["ocaml:Iarray"],"sources":["builtin","prose"]}, + {"url":"https://ocaml.org/manual/5.5/api/Iarray.html#TYPEt","host":"ocaml.org","status":200,"via":"html","title":"OCaml library : Iarray","identity":{"via":"ocamldoc","declared":"type","kind":"type","path":["Iarray","t"]},"fragment":"found","ok":true,"terminal":[{"key":"ocaml:Iarray.t","symbol":"t","at":"identity"}],"checkedAt":"2026-11-08","names":["ocaml:Iarray.t"],"sources":["builtin","type"]}, + {"url":"https://ocaml.org/manual/5.5/api/List.html","host":"ocaml.org","status":200,"via":"html","title":"OCaml library : List","identity":{"via":"ocamldoc","declared":"module","kind":"module","path":["List"]},"ok":true,"terminal":[{"key":"ocaml:List","symbol":"List","at":"identity"}],"checkedAt":"2026-11-08","names":["ocaml:List"],"sources":["builtin","prose"]}, + {"url":"https://ocaml.org/manual/5.5/api/Option.html#TYPEELTt.None","host":"ocaml.org","status":200,"via":"html","title":"OCaml library : Option","identity":{"via":"ocamldoc","declared":"constructor","kind":"member","path":["Option","None"]},"heading":"Option.None","fragment":"found","ok":true,"terminal":[{"key":"authored:`None`","symbol":"`None`","at":"identity"}],"checkedAt":"2026-11-09","names":["site/src/content/docs/_staged/ocaml/guides/bootstrap/index.md","site/src/data/port-guides/ocaml.json"],"sources":["authored"]}, + {"url":"https://ocaml.org/manual/5.5/api/Seq.html","host":"ocaml.org","status":200,"via":"html","title":"OCaml library : Seq","identity":{"via":"ocamldoc","declared":"module","kind":"module","path":["Seq"]},"ok":true,"terminal":[{"key":"ocaml:Seq","symbol":"Seq","at":"identity"}],"checkedAt":"2026-11-08","names":["ocaml:Seq"],"sources":["builtin","prose"]}, + {"url":"https://ocaml.org/manual/5.5/api/Seq.html#TYPEt","host":"ocaml.org","status":200,"via":"html","title":"OCaml library : Seq","identity":{"via":"ocamldoc","declared":"type","kind":"type","path":["Seq","t"]},"fragment":"found","ok":true,"terminal":[{"key":"ocaml:Seq.t","symbol":"t","at":"identity"}],"checkedAt":"2026-11-08","names":["ocaml:Seq.t"],"sources":["builtin","type"]}, + {"url":"https://ocaml.org/manual/5.5/api/Seq.html#VALfilter","host":"ocaml.org","status":200,"via":"html","title":"OCaml library : Seq","identity":{"via":"ocamldoc","declared":"val","kind":"member","path":["Seq","filter"]},"fragment":"found","ok":true,"terminal":[{"key":"ocaml:Seq.filter","symbol":"filter","at":"identity"}],"checkedAt":"2026-11-08","names":["ocaml:Seq.filter"],"sources":["builtin","prose"]}, + {"url":"https://ocaml.org/manual/5.5/api/Unix.html","host":"ocaml.org","status":200,"via":"html","title":"OCaml library : Unix","identity":{"via":"ocamldoc","declared":"module","kind":"module","path":["Unix"]},"ok":true,"terminal":[{"key":"ocaml:Unix","symbol":"Unix","at":"identity"}],"checkedAt":"2026-11-08","names":["ocaml:Unix"],"sources":["builtin","prose"]}, + {"url":"https://ocaml.org/manual/5.5/expr.html#s:value-expr","host":"ocaml.org","status":200,"via":"html","title":"OCaml - The OCaml language","heading":"7 Expressions","ok":true,"fragment":"found","terminal":[{"key":"authored:OCaml expressions","symbol":"OCaml expressions","at":"review"}],"checkedAt":"2026-11-08","names":["glossary ocaml function"],"sources":["authored"]}, + {"url":"https://ocaml.org/manual/5.5/modtypes.html#s:modtypes","host":"ocaml.org","status":200,"via":"html","title":"OCaml - The OCaml language","heading":"10 Module types (module specifications)","ok":true,"fragment":"found","terminal":[{"key":"authored:OCaml module types","symbol":"OCaml module types","at":"review"}],"checkedAt":"2026-11-08","names":["glossary ocaml constant","glossary ocaml interface","glossary ocaml module","glossary ocaml opaque"],"sources":["authored"]}, + {"url":"https://ocaml.org/manual/5.5/typedecl.html#s:tydef","host":"ocaml.org","status":200,"via":"html","title":"OCaml - The OCaml language","heading":"8 Type and exception definitions","ok":true,"fragment":"found","terminal":[{"key":"authored:OCaml type and exception definitions","symbol":"OCaml type and exception definitions","at":"review"}],"checkedAt":"2026-11-08","names":["glossary ocaml attribute","glossary ocaml enum","glossary ocaml exception","glossary ocaml struct","glossary ocaml typealias"],"sources":["authored"]}, {"url":"https://pkg.go.dev/builtin#any","host":"pkg.go.dev","status":200,"via":"html","title":"builtin package - builtin - Go Packages","identity":{"via":"godoc","declared":"type","kind":"type","path":["builtin","any"]},"fragment":"found","ok":true,"terminal":[{"key":"go:any","symbol":"any","at":"identity"}],"checkedAt":"2026-10-25","names":["go:any"],"sources":["builtin","type"]}, {"url":"https://pkg.go.dev/builtin#bool","host":"pkg.go.dev","status":200,"via":"html","title":"builtin package - builtin - Go Packages","identity":{"via":"godoc","declared":"type","kind":"type","path":["builtin","bool"]},"fragment":"found","ok":true,"terminal":[{"key":"go:bool","symbol":"bool","at":"identity"}],"checkedAt":"2026-10-25","names":["go:bool"],"sources":["builtin","doc","type"]}, {"url":"https://pkg.go.dev/builtin#byte","host":"pkg.go.dev","status":200,"via":"html","title":"builtin package - builtin - Go Packages","identity":{"via":"godoc","declared":"type","kind":"type","path":["builtin","byte"]},"fragment":"found","ok":true,"terminal":[{"key":"go:byte","symbol":"byte","at":"identity"}],"checkedAt":"2026-10-25","names":["go:byte"],"sources":["builtin","type"]}, diff --git a/site/src/data/api-link-review.json b/site/src/data/api-link-review.json index 4ad470b0a..e4cb026fb 100644 --- a/site/src/data/api-link-review.json +++ b/site/src/data/api-link-review.json @@ -189,6 +189,10 @@ {"label":"Lua class inheritance","url":"https://luals.github.io/wiki/annotations/#class","heading":"@class"}, {"label":"Lua overload annotations","url":"https://luals.github.io/wiki/annotations/#overload","heading":"@overload"}, {"label":"MCP ToolAnnotations","url":"https://modelcontextprotocol.io/specification/2025-11-25/schema#toolannotations","heading":"ToolAnnotations"}, + {"label":"OCaml libraries with Dune","url":"https://ocaml.org/docs/libraries-dune","heading":"Libraries With Dune"}, + {"label":"OCaml expressions","url":"https://ocaml.org/manual/5.5/expr.html#s:value-expr","heading":"7 Expressions"}, + {"label":"OCaml module types","url":"https://ocaml.org/manual/5.5/modtypes.html#s:modtypes","heading":"10 Module types (module specifications)"}, + {"label":"OCaml type and exception definitions","url":"https://ocaml.org/manual/5.5/typedecl.html#s:tydef","heading":"8 Type and exception definitions"}, {"label":"package reference","url":"https://pkg.go.dev/github.com/libtmux/libtmux-go/mcp","heading":"github.com/libtmux/libtmux-go/mcp"}, {"label":"pkg.go.dev","url":"https://pkg.go.dev/github.com/libtmux/libtmux-go/tmux","heading":"github.com/libtmux/libtmux-go/tmux"}, {"label":"`github.com/libtmux/libtmux-go/workspace`","url":"https://pkg.go.dev/github.com/libtmux/libtmux-go/workspace","heading":"github.com/libtmux/libtmux-go/workspace"}, diff --git a/site/src/data/api/ocaml.json b/site/src/data/api/ocaml.json new file mode 100644 index 000000000..c25256176 --- /dev/null +++ b/site/src/data/api/ocaml.json @@ -0,0 +1 @@ +{"port":"ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","repo":"libtmux/libtmux-ocaml","sources":[{"product":"core","package":"libtmux","repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},{"product":"workspace","package":"libtmux-workspace","repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},{"product":"core","package":"libtmux-json","repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},{"product":"workspace","package":"libtmux-json","repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},{"product":"core","package":"libtmux-unix","repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},{"product":"workspace","package":"libtmux-unix","repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},{"product":"core","package":"libtmux-eio","repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},{"product":"workspace","package":"libtmux-eio","repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}],"extractor":"OCaml 5.5.2 compiler-libs .cmti + odoc-parser 3.2.2","nativeProvenance":{"files":[{"path":"lib/libtmux.mli","sha256":"cde6d0a89aeb60e3bffe3df003ffba1115d3a0c1318c6361a874202580797bfb"},{"path":"_build/install/default/lib/libtmux/libtmux.cmti","sha256":"296786db1d801c4a2ed7071b942a9c785f120474a9479aafda0837e8fcb00c18"},{"path":"workspace/libtmux_workspace.mli","sha256":"7f828d52abc58665510de7cf87bc03479d85feaaca5f00e678fda58f47713a4d"},{"path":"_build/install/default/lib/libtmux-workspace/libtmux_workspace.cmti","sha256":"5a55a369dde40b8a1261089043218e0bbb245f5ea09088365b7fc3dd91b82b7f"},{"path":"json/libtmux_json.mli","sha256":"0df1e135b74307a8ef363bcd484e499c463172f6a0451a8ebbd511ec8adb57bc"},{"path":"_build/install/default/lib/libtmux-json/libtmux_json.cmti","sha256":"1a065de46eb27da42755e3bef53c4de6ca30fcdd587556a0daef9bf6a6afbd6d"},{"path":"unix/libtmux_unix.mli","sha256":"955bd588b18eb03bbeb54d5ccdb4f1b18feb312274e21b480d4b9e2e4f93c1cc"},{"path":"_build/install/default/lib/libtmux-unix/libtmux_unix.cmti","sha256":"abd62b20e1cd4ddb1f68218cccc1da6f738a55e108b3f3cf24d64334b2c156b1"},{"path":"eio/libtmux_eio.mli","sha256":"e0965c94eb356e081a3108a7836460a4417d757a05aa04a88e6678dd7983bb21"},{"path":"_build/install/default/lib/libtmux-eio/libtmux_eio.cmti","sha256":"a1cb92730c57ff79f77252dfe3f1f278353949806bc15eaae948cd7b3fad0426"}],"exporter":{"revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","baseRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","files":[{"path":"tools/api_export.ml","sha256":"34b59e728494aeed3595c5a88e1a1482d7dfa65ddcda725e43cd6c21ee131945"},{"path":"tools/api_doc.ml","sha256":"94d9b4dff3f86d570a31161019e06cea250926200b8cc4562f7d14f9f3cd0d59"},{"path":"tools/export_api.py","sha256":"5188348adc7e3ea577889e144de30da6204ec14ec6fc1577f86a732bc7625973"},{"path":"tools/api_modules.json","sha256":"233ef409440fa5015f522a11933e74f059a301aecbce5ab5126f14e8a35614cf"},{"path":"tools/dune","sha256":"777e122d729870f9f8dc6fc13485ce0eea29f0e741b9bb22cb0245d433ff9442"}],"compiler":"5.5.2","schema":"libtmux.ocaml-api/1","publicManifest":"tools/api_modules.json"}},"symbols":[{"id":"Libtmux","publicId":"Libtmux","qualifiedName":"Libtmux","name":"Libtmux","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Native captured values, typed queries and explicit command descriptions.\n\n A {!Snapshot.t} owns immutable observations. Entity accessors and query\n evaluation perform no I/O, preserve captured order and remain usable after\n client closure. Use [Libtmux_unix.Client] or [Libtmux_eio.Client] to acquire\n or mutate state.\n\n Retaining any entity retains its complete snapshot graph. Copy scalar\n summaries when captured relationships are no longer needed. Targets omit the\n graph but remain restricted to their original {!Source.t}.\n\n {1 Typical flow}\n\n Capture explicitly, traverse {!Session.window_links} and {!Window.panes},\n filter with [Seq.filter] or {!Query.matching}, establish cardinality with\n {!Query.exactly_one}, then submit a command with a bound target.\n\n The core depends only on the standard library. Its abstract observations are\n safe to share; live clients and subscriptions belong to their backend.\n\n See the\n {{:https://github.com/libtmux/libtmux-ocaml/blob/master/docs/graph.md}graph\n guide} for window links and the\n {{:https://github.com/libtmux/libtmux-ocaml/blob/master/docs/queries.md}query\n guide} for native predicates and typed expressions. "],"declarations":[{"kind":"module","text":"","source":{"file":"lib/libtmux.mli","line":1,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"doc":{"summary":"Native captured values, typed queries and explicit command descriptions.","body":"A {!Snapshot.t} owns immutable observations. Entity accessors and query evaluation perform no I/O, preserve captured order and remain usable after client closure. Use `Libtmux_unix.Client` or `Libtmux_eio.Client` to acquire or mutate state.\n\nRetaining any entity retains its complete snapshot graph. Copy scalar summaries when captured relationships are no longer needed. Targets omit the graph but remain restricted to their original {!Source.t}.\n\n## Typical flow\n\nCapture explicitly, traverse {!Session.window_links} and {!Window.panes}, filter with `Seq.filter` or {!Query.matching}, establish cardinality with {!Query.exactly_one}, then submit a command with a bound target.\n\nThe core depends only on the standard library. Its abstract observations are safe to share; live clients and subscriptions belong to their backend.\n\nSee the [graph guide](https://github.com/libtmux/libtmux-ocaml/blob/master/docs/graph.md) for window links and the [query guide](https://github.com/libtmux/libtmux-ocaml/blob/master/docs/queries.md) for native predicates and typed expressions."},"slug":"libtmux"},{"id":"Libtmux.Captured_text","publicId":"Libtmux.Captured_text","qualifiedName":"Libtmux.Captured_text","name":"Captured_text","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":712,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Captured_text : sig\n type t = {\n bytes : string;\n source : Source.t;\n pane : Pane.Id.t;\n started_at_ns : int64;\n finished_at_ns : int64;\n }\n (** Ordinary rendered rows captured over an interval. This value has no\n implied relationship to a subscription cursor. *)\nend","source":{"file":"lib/libtmux.mli","line":712,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","slug":"libtmux-captured_text"},{"id":"Libtmux.Captured_text.t","publicId":"Libtmux.Captured_text.t","qualifiedName":"Libtmux.Captured_text.t","name":"t","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":713,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Ordinary rendered rows captured over an interval. This value has no\n implied relationship to a subscription cursor. "],"declarations":[{"kind":"struct","text":"type t = {\n bytes : string;\n source : Source.t;\n pane : Pane.Id.t;\n started_at_ns : int64;\n finished_at_ns : int64;\n }","source":{"file":"lib/libtmux.mli","line":713,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Captured_text","doc":{"summary":"Ordinary rendered rows captured over an interval. This value has no implied relationship to a subscription cursor."},"signatures":[{"raw":"type t =\n {\n bytes: string ;\n source: Source.t ;\n pane: Pane.Id.t ;\n started_at_ns: int64 ;\n finished_at_ns: int64 }","params":[]}],"slug":"libtmux-captured_text-t"},{"id":"Libtmux.Captured_text.t.bytes","publicId":"Libtmux.Captured_text.t.bytes","name":"bytes","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":714,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"bytes : string;","source":{"file":"lib/libtmux.mli","line":714,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Captured_text.t","type":"string","qualifiedName":"Libtmux.Captured_text.bytes","slug":"libtmux-captured_text-t-bytes"},{"id":"Libtmux.Captured_text.t.finished_at_ns","publicId":"Libtmux.Captured_text.t.finished_at_ns","name":"finished_at_ns","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":718,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"finished_at_ns : int64;","source":{"file":"lib/libtmux.mli","line":718,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Captured_text.t","type":"int64","qualifiedName":"Libtmux.Captured_text.finished_at_ns","slug":"libtmux-captured_text-t-finished_at_ns"},{"id":"Libtmux.Captured_text.t.pane","publicId":"Libtmux.Captured_text.t.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":716,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : Pane.Id.t;","source":{"file":"lib/libtmux.mli","line":716,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Captured_text.t","type":"Pane.Id.t","qualifiedName":"Libtmux.Captured_text.pane","slug":"libtmux-captured_text-t-pane"},{"id":"Libtmux.Captured_text.t.source","publicId":"Libtmux.Captured_text.t.source","name":"source","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":715,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"source : Source.t;","source":{"file":"lib/libtmux.mli","line":715,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Captured_text.t","type":"Source.t","qualifiedName":"Libtmux.Captured_text.source","slug":"libtmux-captured_text-t-source"},{"id":"Libtmux.Captured_text.t.started_at_ns","publicId":"Libtmux.Captured_text.t.started_at_ns","name":"started_at_ns","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":717,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"started_at_ns : int64;","source":{"file":"lib/libtmux.mli","line":717,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Captured_text.t","type":"int64","qualifiedName":"Libtmux.Captured_text.started_at_ns","slug":"libtmux-captured_text-t-started_at_ns"},{"id":"Libtmux.Cardinality","publicId":"Libtmux.Cardinality","qualifiedName":"Libtmux.Cardinality","name":"Cardinality","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":685,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Cardinality : sig\n type error = No_match | Multiple_matches of { at_least : int }\n\n val pp_error : Format.formatter -> error -> unit\nend","source":{"file":"lib/libtmux.mli","line":685,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","slug":"libtmux-cardinality"},{"id":"Libtmux.Cardinality.error","publicId":"Libtmux.Cardinality.error","qualifiedName":"Libtmux.Cardinality.error","name":"error","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":686,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type error = No_match | Multiple_matches of { at_least : int }","source":{"file":"lib/libtmux.mli","line":686,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Cardinality","signatures":[{"raw":"type error =\n | No_match \n | Multiple_matches of {\n at_least: int } ","params":[]}],"slug":"libtmux-cardinality-error"},{"id":"Libtmux.Cardinality.error.Multiple_matches","publicId":"Libtmux.Cardinality.error.Multiple_matches","name":"Multiple_matches","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":686,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Multiple_matches of { at_least : int }","source":{"file":"lib/libtmux.mli","line":686,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Cardinality.error","variant":"struct","qualifiedName":"Libtmux.Cardinality.Multiple_matches","slug":"libtmux-cardinality-error-multiple_matches"},{"id":"Libtmux.Cardinality.error.Multiple_matches.at_least","publicId":"Libtmux.Cardinality.error.Multiple_matches.at_least","name":"at_least","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":686,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"at_least : int","source":{"file":"lib/libtmux.mli","line":686,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Cardinality.error.Multiple_matches","type":"int","qualifiedName":"Libtmux.Cardinality.at_least","slug":"libtmux-cardinality-error-multiple_matches-at_least"},{"id":"Libtmux.Cardinality.error.No_match","publicId":"Libtmux.Cardinality.error.No_match","name":"No_match","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":686,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"No_match","source":{"file":"lib/libtmux.mli","line":686,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Cardinality.error","variant":"unit","qualifiedName":"Libtmux.Cardinality.No_match","slug":"libtmux-cardinality-error-no_match"},{"id":"Libtmux.Cardinality.pp_error","publicId":"Libtmux.Cardinality.pp_error","qualifiedName":"Libtmux.Cardinality.pp_error","name":"pp_error","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":688,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pp_error : Format.formatter -> error -> unit","source":{"file":"lib/libtmux.mli","line":688,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Cardinality","signatures":[{"raw":"val pp_error : Format.formatter -> error -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"error"}],"returns":"unit"}],"slug":"libtmux-cardinality-pp_error"},{"id":"Libtmux.Client_name","publicId":"Libtmux.Client_name","qualifiedName":"Libtmux.Client_name","name":"Client_name","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":119,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Client_name : sig\n type t\n (** A name in one connection generation, with current-name semantics. It does\n not identify a stable client incarnation; tmux may reuse client names. *)\n\n val source : t -> Source.t\n val to_string : t -> string\nend","source":{"file":"lib/libtmux.mli","line":119,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","slug":"libtmux-client_name"},{"id":"Libtmux.Client_name.source","publicId":"Libtmux.Client_name.source","qualifiedName":"Libtmux.Client_name.source","name":"source","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":124,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val source : t -> Source.t","source":{"file":"lib/libtmux.mli","line":124,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_name","signatures":[{"raw":"val source : t -> Source.t","params":[{"name":"arg1","type":"t"}],"returns":"Source.t"}],"slug":"libtmux-client_name-source"},{"id":"Libtmux.Client_name.t","publicId":"Libtmux.Client_name.t","qualifiedName":"Libtmux.Client_name.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":120,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" A name in one connection generation, with current-name semantics. It does\n not identify a stable client incarnation; tmux may reuse client names. "],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":120,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_name","doc":{"summary":"A name in one connection generation, with current-name semantics. It does not identify a stable client incarnation; tmux may reuse client names."},"signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-client_name-t"},{"id":"Libtmux.Client_name.to_string","publicId":"Libtmux.Client_name.to_string","qualifiedName":"Libtmux.Client_name.to_string","name":"to_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":125,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val to_string : t -> string","source":{"file":"lib/libtmux.mli","line":125,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_name","signatures":[{"raw":"val to_string : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-client_name-to_string"},{"id":"Libtmux.Client_observation","publicId":"Libtmux.Client_observation","qualifiedName":"Libtmux.Client_observation","name":"Client_observation","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":365,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"and Client_observation : sig\n type t\n\n module Fields : sig\n val name : (t, string) Field.t\n val pid : (t, int) Field.t\n val width : (t, int) Field.t\n val control_mode : (t, bool) Field.t\n end\n\n module Relations : sig\n val session : (t, Session.t) Relation.Optional.t\n end\n\n val name : t -> string\n val pid : t -> int\n val width : t -> int\n\n val height : t -> int option\n (** No height is reported until the client has a started terminal. *)\n\n val control_mode : t -> bool\n val source : t -> Source.t\n\n val current_name : t -> Client_name.t\n (** Address whichever client has this name when a command executes. *)\n\n val session : t -> Session.t option\n (** [None] means the captured client has no attached session. *)\n\n val same_observation : t -> t -> bool\n (** Client names may be reused. No cross-snapshot entity equality is offered.\n *)\nend","source":{"file":"lib/libtmux.mli","line":365,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","slug":"libtmux-client_observation"},{"id":"Libtmux.Client_observation.Fields","publicId":"Libtmux.Client_observation.Fields","qualifiedName":"Libtmux.Client_observation.Fields","name":"Fields","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":368,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Fields : sig\n val name : (t, string) Field.t\n val pid : (t, int) Field.t\n val width : (t, int) Field.t\n val control_mode : (t, bool) Field.t\n end","source":{"file":"lib/libtmux.mli","line":368,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation","slug":"libtmux-client_observation-fields"},{"id":"Libtmux.Client_observation.Fields.control_mode","publicId":"Libtmux.Client_observation.Fields.control_mode","qualifiedName":"Libtmux.Client_observation.Fields.control_mode","name":"control_mode","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":372,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val control_mode : (t, bool) Field.t","source":{"file":"lib/libtmux.mli","line":372,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation.Fields","signatures":[{"raw":"val control_mode : (t, bool) Field.t","params":[],"returns":"(t, bool) Field.t"}],"slug":"libtmux-client_observation-fields-control_mode"},{"id":"Libtmux.Client_observation.Fields.name","publicId":"Libtmux.Client_observation.Fields.name","qualifiedName":"Libtmux.Client_observation.Fields.name","name":"name","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":369,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val name : (t, string) Field.t","source":{"file":"lib/libtmux.mli","line":369,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation.Fields","signatures":[{"raw":"val name : (t, string) Field.t","params":[],"returns":"(t, string) Field.t"}],"slug":"libtmux-client_observation-fields-name"},{"id":"Libtmux.Client_observation.Fields.pid","publicId":"Libtmux.Client_observation.Fields.pid","qualifiedName":"Libtmux.Client_observation.Fields.pid","name":"pid","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":370,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val pid : (t, int) Field.t","source":{"file":"lib/libtmux.mli","line":370,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation.Fields","signatures":[{"raw":"val pid : (t, int) Field.t","params":[],"returns":"(t, int) Field.t"}],"slug":"libtmux-client_observation-fields-pid"},{"id":"Libtmux.Client_observation.Fields.width","publicId":"Libtmux.Client_observation.Fields.width","qualifiedName":"Libtmux.Client_observation.Fields.width","name":"width","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":371,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val width : (t, int) Field.t","source":{"file":"lib/libtmux.mli","line":371,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation.Fields","signatures":[{"raw":"val width : (t, int) Field.t","params":[],"returns":"(t, int) Field.t"}],"slug":"libtmux-client_observation-fields-width"},{"id":"Libtmux.Client_observation.Relations","publicId":"Libtmux.Client_observation.Relations","qualifiedName":"Libtmux.Client_observation.Relations","name":"Relations","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":375,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Relations : sig\n val session : (t, Session.t) Relation.Optional.t\n end","source":{"file":"lib/libtmux.mli","line":375,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation","slug":"libtmux-client_observation-relations"},{"id":"Libtmux.Client_observation.Relations.session","publicId":"Libtmux.Client_observation.Relations.session","qualifiedName":"Libtmux.Client_observation.Relations.session","name":"session","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":376,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val session : (t, Session.t) Relation.Optional.t","source":{"file":"lib/libtmux.mli","line":376,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation.Relations","signatures":[{"raw":"val session : (t, Session.t) Relation.Optional.t","params":[],"returns":"(t, Session.t) Relation.Optional.t"}],"slug":"libtmux-client_observation-relations-session"},{"id":"Libtmux.Client_observation.control_mode","publicId":"Libtmux.Client_observation.control_mode","qualifiedName":"Libtmux.Client_observation.control_mode","name":"control_mode","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":386,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val control_mode : t -> bool","source":{"file":"lib/libtmux.mli","line":386,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation","signatures":[{"raw":"val control_mode : t -> bool","params":[{"name":"arg1","type":"t"}],"returns":"bool"}],"slug":"libtmux-client_observation-control_mode"},{"id":"Libtmux.Client_observation.current_name","publicId":"Libtmux.Client_observation.current_name","qualifiedName":"Libtmux.Client_observation.current_name","name":"current_name","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":389,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Address whichever client has this name when a command executes. "],"declarations":[{"kind":"function","text":"val current_name : t -> Client_name.t","source":{"file":"lib/libtmux.mli","line":389,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation","doc":{"summary":"Address whichever client has this name when a command executes."},"signatures":[{"raw":"val current_name : t -> Client_name.t","params":[{"name":"arg1","type":"t"}],"returns":"Client_name.t"}],"slug":"libtmux-client_observation-current_name"},{"id":"Libtmux.Client_observation.height","publicId":"Libtmux.Client_observation.height","qualifiedName":"Libtmux.Client_observation.height","name":"height","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":383,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" No height is reported until the client has a started terminal. "],"declarations":[{"kind":"function","text":"val height : t -> int option","source":{"file":"lib/libtmux.mli","line":383,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation","doc":{"summary":"No height is reported until the client has a started terminal."},"signatures":[{"raw":"val height : t -> int option","params":[{"name":"arg1","type":"t"}],"returns":"int option"}],"slug":"libtmux-client_observation-height"},{"id":"Libtmux.Client_observation.name","publicId":"Libtmux.Client_observation.name","qualifiedName":"Libtmux.Client_observation.name","name":"name","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":379,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val name : t -> string","source":{"file":"lib/libtmux.mli","line":379,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation","signatures":[{"raw":"val name : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-client_observation-name"},{"id":"Libtmux.Client_observation.pid","publicId":"Libtmux.Client_observation.pid","qualifiedName":"Libtmux.Client_observation.pid","name":"pid","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":380,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pid : t -> int","source":{"file":"lib/libtmux.mli","line":380,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation","signatures":[{"raw":"val pid : t -> int","params":[{"name":"arg1","type":"t"}],"returns":"int"}],"slug":"libtmux-client_observation-pid"},{"id":"Libtmux.Client_observation.same_observation","publicId":"Libtmux.Client_observation.same_observation","qualifiedName":"Libtmux.Client_observation.same_observation","name":"same_observation","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":395,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Client names may be reused. No cross-snapshot entity equality is offered.\n "],"declarations":[{"kind":"function","text":"val same_observation : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":395,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation","doc":{"summary":"Client names may be reused. No cross-snapshot entity equality is offered."},"signatures":[{"raw":"val same_observation : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-client_observation-same_observation"},{"id":"Libtmux.Client_observation.session","publicId":"Libtmux.Client_observation.session","qualifiedName":"Libtmux.Client_observation.session","name":"session","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":392,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" [None] means the captured client has no attached session. "],"declarations":[{"kind":"function","text":"val session : t -> Session.t option","source":{"file":"lib/libtmux.mli","line":392,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation","doc":{"summary":"`None` means the captured client has no attached session."},"signatures":[{"raw":"val session : t -> Session.t option","params":[{"name":"arg1","type":"t"}],"returns":"Session.t option"}],"slug":"libtmux-client_observation-session"},{"id":"Libtmux.Client_observation.source","publicId":"Libtmux.Client_observation.source","qualifiedName":"Libtmux.Client_observation.source","name":"source","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":387,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val source : t -> Source.t","source":{"file":"lib/libtmux.mli","line":387,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation","signatures":[{"raw":"val source : t -> Source.t","params":[{"name":"arg1","type":"t"}],"returns":"Source.t"}],"slug":"libtmux-client_observation-source"},{"id":"Libtmux.Client_observation.t","publicId":"Libtmux.Client_observation.t","qualifiedName":"Libtmux.Client_observation.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":366,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":366,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-client_observation-t"},{"id":"Libtmux.Client_observation.width","publicId":"Libtmux.Client_observation.width","qualifiedName":"Libtmux.Client_observation.width","name":"width","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":381,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val width : t -> int","source":{"file":"lib/libtmux.mli","line":381,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Client_observation","signatures":[{"raw":"val width : t -> int","params":[{"name":"arg1","type":"t"}],"returns":"int"}],"slug":"libtmux-client_observation-width"},{"id":"Libtmux.Command","publicId":"Libtmux.Command","qualifiedName":"Libtmux.Command","name":"Command","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":883,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Typed descriptions of explicit acquisition and mutation operations.\n Construction performs no I/O; a backend validates and admits the command. "],"declarations":[{"kind":"module","text":"module Command : sig\n type mutation =\n | Kill_session of Session.target\n | Kill_window of Window.target\n | Kill_pane of Pane.target\n | Select_window_at of Session.target * int\n | Unlink_window_at of {\n session : Session.target;\n index : int;\n allow_kill : bool;\n }\n | Link_window of {\n window : Window.target;\n session : Session.target;\n index : int;\n }\n | Move_window_at of {\n from_session : Session.target;\n from_index : int;\n session : Session.target;\n index : int;\n }\n | Select_pane of Pane.target\n | Set_pane_title of Pane.target * string\n | Resize_pane of {\n pane : Pane.target;\n width : int option;\n height : int option;\n }\n | Resize_window of {\n window : Window.target;\n width : int option;\n height : int option;\n }\n | Select_layout of Window.target * Layout.t\n | Cycle_layout of Window.target * [ `Next | `Previous ]\n | Move_pane of {\n pane : Pane.target;\n beside : Pane.target;\n direction : Geometry.direction;\n size : Geometry.size option;\n }\n | Swap_panes of Pane.target * Pane.target\n | Rotate_panes of Window.target * [ `Forward | `Backward ]\n | Zoom_pane of Pane.target\n | Respawn_pane of {\n pane : Pane.target;\n spawn : Spawn.t;\n kill_running : bool;\n }\n | Clear_history of Pane.target\n | Set_environment of {\n scope : Environment.scope;\n name : string;\n value : string;\n hidden : bool;\n }\n | Unset_environment of Environment.scope * string\n | Remove_environment of Environment.scope * string\n | Set_option of {\n scope : Options.scope;\n name : string;\n index : int option;\n value : Options.scalar;\n append : bool;\n }\n | Unset_option of Options.scope * string * int option\n | Clear_option_array of Options.scope * string\n | Set_hook of {\n scope : Options.scope;\n name : string;\n index : int option;\n commands : Hook.command list;\n append : bool;\n }\n | Remove_hook of Options.scope * string * int option\n | Run_hook of Options.scope * string\n | Switch_client_at of {\n client : Client_name.t;\n session : Session.target;\n update_environment : bool;\n }\n | Request_detach_client_at of Client_name.t\n | Refresh_client_at of Client_name.t * bool\n | Resize_control_client_at of {\n client : Client_name.t;\n width : int;\n height : int;\n }\n\n type 'a t\n (** An immutable description, validated by a backend before admission.\n Constructing or inspecting it performs no I/O. *)\n\n type _ view =\n | Capture : Snapshot.t view\n | Capture_text : {\n pane : Pane.t;\n start : int;\n end_ : int;\n scratch_dir : string;\n }\n -> Captured_text.t view\n | Rename_window : Window.target * string -> unit view\n | Rename_session : Session.target * string -> unit view\n | Send_text : Pane.target * string -> unit view\n | Send_keys : Pane.target * Key.t list -> unit view\n | Wait_for : string -> unit view\n | Signal : string -> unit view\n | Capture_environment : Environment.scope * bool -> Environment.t view\n | Capture_options : Options.scope * bool -> Options.t view\n | Read_option : Options.scope * string * bool -> Options.value option view\n | Capture_hooks : Options.scope -> Options.t view\n | Read_hook : Options.scope * string * bool -> Options.value option view\n | Mutate : mutation -> unit view\n | Create_session : {\n name : string;\n window_name : string option;\n width : int;\n height : int;\n spawn : Spawn.t;\n }\n -> Created.t view\n | Create_window : {\n session : Session.target;\n index : int option;\n name : string option;\n spawn : Spawn.t;\n }\n -> Created.t view\n | Split_pane : {\n pane : Pane.target;\n direction : Geometry.direction;\n size : Geometry.size option;\n spawn : Spawn.t;\n }\n -> Created.t view\n | Break_pane : {\n pane : Pane.target;\n session : Session.target;\n index : int;\n name : string option;\n }\n -> Created.t view\n\n val view : 'a t -> 'a view\n (** Read-only inspection for transport adapters. *)\nend","source":{"file":"lib/libtmux.mli","line":883,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"Typed descriptions of explicit acquisition and mutation operations. Construction performs no I/O; a backend validates and admits the command."},"slug":"libtmux-command"},{"id":"Libtmux.Command.mutation","publicId":"Libtmux.Command.mutation","qualifiedName":"Libtmux.Command.mutation","name":"mutation","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":884,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type mutation =\n | Kill_session of Session.target\n | Kill_window of Window.target\n | Kill_pane of Pane.target\n | Select_window_at of Session.target * int\n | Unlink_window_at of {\n session : Session.target;\n index : int;\n allow_kill : bool;\n }\n | Link_window of {\n window : Window.target;\n session : Session.target;\n index : int;\n }\n | Move_window_at of {\n from_session : Session.target;\n from_index : int;\n session : Session.target;\n index : int;\n }\n | Select_pane of Pane.target\n | Set_pane_title of Pane.target * string\n | Resize_pane of {\n pane : Pane.target;\n width : int option;\n height : int option;\n }\n | Resize_window of {\n window : Window.target;\n width : int option;\n height : int option;\n }\n | Select_layout of Window.target * Layout.t\n | Cycle_layout of Window.target * [ `Next | `Previous ]\n | Move_pane of {\n pane : Pane.target;\n beside : Pane.target;\n direction : Geometry.direction;\n size : Geometry.size option;\n }\n | Swap_panes of Pane.target * Pane.target\n | Rotate_panes of Window.target * [ `Forward | `Backward ]\n | Zoom_pane of Pane.target\n | Respawn_pane of {\n pane : Pane.target;\n spawn : Spawn.t;\n kill_running : bool;\n }\n | Clear_history of Pane.target\n | Set_environment of {\n scope : Environment.scope;\n name : string;\n value : string;\n hidden : bool;\n }\n | Unset_environment of Environment.scope * string\n | Remove_environment of Environment.scope * string\n | Set_option of {\n scope : Options.scope;\n name : string;\n index : int option;\n value : Options.scalar;\n append : bool;\n }\n | Unset_option of Options.scope * string * int option\n | Clear_option_array of Options.scope * string\n | Set_hook of {\n scope : Options.scope;\n name : string;\n index : int option;\n commands : Hook.command list;\n append : bool;\n }\n | Remove_hook of Options.scope * string * int option\n | Run_hook of Options.scope * string\n | Switch_client_at of {\n client : Client_name.t;\n session : Session.target;\n update_environment : bool;\n }\n | Request_detach_client_at of Client_name.t\n | Refresh_client_at of Client_name.t * bool\n | Resize_control_client_at of {\n client : Client_name.t;\n width : int;\n height : int;\n }","source":{"file":"lib/libtmux.mli","line":884,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command","signatures":[{"raw":"type mutation =\n | Kill_session of Session.target \n | Kill_window of Window.target \n | Kill_pane of Pane.target \n | Select_window_at of Session.target * int \n | Unlink_window_at of\n {\n session: Session.target ;\n index: int ;\n allow_kill: bool } \n | Link_window of\n {\n window: Window.target ;\n session: Session.target ;\n index: int } \n | Move_window_at of\n {\n from_session: Session.target ;\n from_index: int ;\n session: Session.target ;\n index: int } \n | Select_pane of Pane.target \n | Set_pane_title of Pane.target * string \n | Resize_pane of\n {\n pane: Pane.target ;\n width: int option ;\n height: int option } \n | Resize_window of\n {\n window: Window.target ;\n width: int option ;\n height: int option } \n | Select_layout of Window.target * Layout.t \n | Cycle_layout of Window.target * [ `Next | `Previous ] \n | Move_pane of\n {\n pane: Pane.target ;\n beside: Pane.target ;\n direction: Geometry.direction ;\n size: Geometry.size option } \n | Swap_panes of Pane.target * Pane.target \n | Rotate_panes of Window.target * [ `Forward | `Backward ] \n | Zoom_pane of Pane.target \n | Respawn_pane of {\n pane: Pane.target ;\n spawn: Spawn.t ;\n kill_running: bool } \n | Clear_history of Pane.target \n | Set_environment of\n {\n scope: Environment.scope ;\n name: string ;\n value: string ;\n hidden: bool } \n | Unset_environment of Environment.scope * string \n | Remove_environment of Environment.scope * string \n | Set_option of\n {\n scope: Options.scope ;\n name: string ;\n index: int option ;\n value: Options.scalar ;\n append: bool } \n | Unset_option of Options.scope * string * int option \n | Clear_option_array of Options.scope * string \n | Set_hook of\n {\n scope: Options.scope ;\n name: string ;\n index: int option ;\n commands: Hook.command list ;\n append: bool } \n | Remove_hook of Options.scope * string * int option \n | Run_hook of Options.scope * string \n | Switch_client_at of\n {\n client: Client_name.t ;\n session: Session.target ;\n update_environment: bool } \n | Request_detach_client_at of Client_name.t \n | Refresh_client_at of Client_name.t * bool \n | Resize_control_client_at of\n {\n client: Client_name.t ;\n width: int ;\n height: int } ","params":[]}],"slug":"libtmux-command-mutation"},{"id":"Libtmux.Command.mutation.Clear_history","publicId":"Libtmux.Command.mutation.Clear_history","name":"Clear_history","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":933,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Clear_history of Pane.target","source":{"file":"lib/libtmux.mli","line":933,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Clear_history","slug":"libtmux-command-mutation-clear_history"},{"id":"Libtmux.Command.mutation.Clear_option_array","publicId":"Libtmux.Command.mutation.Clear_option_array","name":"Clear_option_array","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":950,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Clear_option_array of Options.scope * string","source":{"file":"lib/libtmux.mli","line":950,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Clear_option_array","slug":"libtmux-command-mutation-clear_option_array"},{"id":"Libtmux.Command.mutation.Cycle_layout","publicId":"Libtmux.Command.mutation.Cycle_layout","name":"Cycle_layout","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":918,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Cycle_layout of Window.target * [ `Next | `Previous ]","source":{"file":"lib/libtmux.mli","line":918,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Cycle_layout","slug":"libtmux-command-mutation-cycle_layout"},{"id":"Libtmux.Command.mutation.Kill_pane","publicId":"Libtmux.Command.mutation.Kill_pane","name":"Kill_pane","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":887,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Kill_pane of Pane.target","source":{"file":"lib/libtmux.mli","line":887,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Kill_pane","slug":"libtmux-command-mutation-kill_pane"},{"id":"Libtmux.Command.mutation.Kill_session","publicId":"Libtmux.Command.mutation.Kill_session","name":"Kill_session","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":885,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Kill_session of Session.target","source":{"file":"lib/libtmux.mli","line":885,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Kill_session","slug":"libtmux-command-mutation-kill_session"},{"id":"Libtmux.Command.mutation.Kill_window","publicId":"Libtmux.Command.mutation.Kill_window","name":"Kill_window","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":886,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Kill_window of Window.target","source":{"file":"lib/libtmux.mli","line":886,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Kill_window","slug":"libtmux-command-mutation-kill_window"},{"id":"Libtmux.Command.mutation.Link_window","publicId":"Libtmux.Command.mutation.Link_window","name":"Link_window","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":894,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Link_window of {\n window : Window.target;\n session : Session.target;\n index : int;\n }","source":{"file":"lib/libtmux.mli","line":894,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"struct","qualifiedName":"Libtmux.Command.Link_window","slug":"libtmux-command-mutation-link_window"},{"id":"Libtmux.Command.mutation.Link_window.index","publicId":"Libtmux.Command.mutation.Link_window.index","name":"index","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":897,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"index : int;","source":{"file":"lib/libtmux.mli","line":897,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Link_window","type":"int","qualifiedName":"Libtmux.Command.index","slug":"libtmux-command-mutation-link_window-index"},{"id":"Libtmux.Command.mutation.Link_window.session","publicId":"Libtmux.Command.mutation.Link_window.session","name":"session","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":896,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"session : Session.target;","source":{"file":"lib/libtmux.mli","line":896,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Link_window","type":"Session.target","qualifiedName":"Libtmux.Command.session","slug":"libtmux-command-mutation-link_window-session"},{"id":"Libtmux.Command.mutation.Link_window.window","publicId":"Libtmux.Command.mutation.Link_window.window","name":"window","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":895,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window : Window.target;","source":{"file":"lib/libtmux.mli","line":895,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Link_window","type":"Window.target","qualifiedName":"Libtmux.Command.window","slug":"libtmux-command-mutation-link_window-window"},{"id":"Libtmux.Command.mutation.Move_pane","publicId":"Libtmux.Command.mutation.Move_pane","name":"Move_pane","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":919,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Move_pane of {\n pane : Pane.target;\n beside : Pane.target;\n direction : Geometry.direction;\n size : Geometry.size option;\n }","source":{"file":"lib/libtmux.mli","line":919,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"struct","qualifiedName":"Libtmux.Command.Move_pane","slug":"libtmux-command-mutation-move_pane"},{"id":"Libtmux.Command.mutation.Move_pane.beside","publicId":"Libtmux.Command.mutation.Move_pane.beside","name":"beside","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":921,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"beside : Pane.target;","source":{"file":"lib/libtmux.mli","line":921,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Move_pane","type":"Pane.target","qualifiedName":"Libtmux.Command.beside","slug":"libtmux-command-mutation-move_pane-beside"},{"id":"Libtmux.Command.mutation.Move_pane.direction","publicId":"Libtmux.Command.mutation.Move_pane.direction","name":"direction","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":922,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"direction : Geometry.direction;","source":{"file":"lib/libtmux.mli","line":922,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Move_pane","type":"Geometry.direction","qualifiedName":"Libtmux.Command.direction","slug":"libtmux-command-mutation-move_pane-direction"},{"id":"Libtmux.Command.mutation.Move_pane.pane","publicId":"Libtmux.Command.mutation.Move_pane.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":920,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : Pane.target;","source":{"file":"lib/libtmux.mli","line":920,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Move_pane","type":"Pane.target","qualifiedName":"Libtmux.Command.pane","slug":"libtmux-command-mutation-move_pane-pane"},{"id":"Libtmux.Command.mutation.Move_pane.size","publicId":"Libtmux.Command.mutation.Move_pane.size","name":"size","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":923,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"size : Geometry.size option;","source":{"file":"lib/libtmux.mli","line":923,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Move_pane","type":"Geometry.size option","qualifiedName":"Libtmux.Command.size","slug":"libtmux-command-mutation-move_pane-size"},{"id":"Libtmux.Command.mutation.Move_window_at","publicId":"Libtmux.Command.mutation.Move_window_at","name":"Move_window_at","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":899,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Move_window_at of {\n from_session : Session.target;\n from_index : int;\n session : Session.target;\n index : int;\n }","source":{"file":"lib/libtmux.mli","line":899,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"struct","qualifiedName":"Libtmux.Command.Move_window_at","slug":"libtmux-command-mutation-move_window_at"},{"id":"Libtmux.Command.mutation.Move_window_at.from_index","publicId":"Libtmux.Command.mutation.Move_window_at.from_index","name":"from_index","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":901,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"from_index : int;","source":{"file":"lib/libtmux.mli","line":901,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Move_window_at","type":"int","qualifiedName":"Libtmux.Command.from_index","slug":"libtmux-command-mutation-move_window_at-from_index"},{"id":"Libtmux.Command.mutation.Move_window_at.from_session","publicId":"Libtmux.Command.mutation.Move_window_at.from_session","name":"from_session","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":900,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"from_session : Session.target;","source":{"file":"lib/libtmux.mli","line":900,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Move_window_at","type":"Session.target","qualifiedName":"Libtmux.Command.from_session","slug":"libtmux-command-mutation-move_window_at-from_session"},{"id":"Libtmux.Command.mutation.Move_window_at.index","publicId":"Libtmux.Command.mutation.Move_window_at.index","name":"index","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":903,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"index : int;","source":{"file":"lib/libtmux.mli","line":903,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Move_window_at","type":"int","qualifiedName":"Libtmux.Command.index","slug":"libtmux-command-mutation-move_window_at-index"},{"id":"Libtmux.Command.mutation.Move_window_at.session","publicId":"Libtmux.Command.mutation.Move_window_at.session","name":"session","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":902,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"session : Session.target;","source":{"file":"lib/libtmux.mli","line":902,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Move_window_at","type":"Session.target","qualifiedName":"Libtmux.Command.session","slug":"libtmux-command-mutation-move_window_at-session"},{"id":"Libtmux.Command.mutation.Refresh_client_at","publicId":"Libtmux.Command.mutation.Refresh_client_at","name":"Refresh_client_at","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":966,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Refresh_client_at of Client_name.t * bool","source":{"file":"lib/libtmux.mli","line":966,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Refresh_client_at","slug":"libtmux-command-mutation-refresh_client_at"},{"id":"Libtmux.Command.mutation.Remove_environment","publicId":"Libtmux.Command.mutation.Remove_environment","name":"Remove_environment","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":941,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Remove_environment of Environment.scope * string","source":{"file":"lib/libtmux.mli","line":941,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Remove_environment","slug":"libtmux-command-mutation-remove_environment"},{"id":"Libtmux.Command.mutation.Remove_hook","publicId":"Libtmux.Command.mutation.Remove_hook","name":"Remove_hook","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":958,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Remove_hook of Options.scope * string * int option","source":{"file":"lib/libtmux.mli","line":958,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Remove_hook","slug":"libtmux-command-mutation-remove_hook"},{"id":"Libtmux.Command.mutation.Request_detach_client_at","publicId":"Libtmux.Command.mutation.Request_detach_client_at","name":"Request_detach_client_at","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":965,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Request_detach_client_at of Client_name.t","source":{"file":"lib/libtmux.mli","line":965,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Request_detach_client_at","slug":"libtmux-command-mutation-request_detach_client_at"},{"id":"Libtmux.Command.mutation.Resize_control_client_at","publicId":"Libtmux.Command.mutation.Resize_control_client_at","name":"Resize_control_client_at","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":967,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Resize_control_client_at of {\n client : Client_name.t;\n width : int;\n height : int;\n }","source":{"file":"lib/libtmux.mli","line":967,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"struct","qualifiedName":"Libtmux.Command.Resize_control_client_at","slug":"libtmux-command-mutation-resize_control_client_at"},{"id":"Libtmux.Command.mutation.Resize_control_client_at.client","publicId":"Libtmux.Command.mutation.Resize_control_client_at.client","name":"client","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":968,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"client : Client_name.t;","source":{"file":"lib/libtmux.mli","line":968,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Resize_control_client_at","type":"Client_name.t","qualifiedName":"Libtmux.Command.client","slug":"libtmux-command-mutation-resize_control_client_at-client"},{"id":"Libtmux.Command.mutation.Resize_control_client_at.height","publicId":"Libtmux.Command.mutation.Resize_control_client_at.height","name":"height","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":970,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"height : int;","source":{"file":"lib/libtmux.mli","line":970,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Resize_control_client_at","type":"int","qualifiedName":"Libtmux.Command.height","slug":"libtmux-command-mutation-resize_control_client_at-height"},{"id":"Libtmux.Command.mutation.Resize_control_client_at.width","publicId":"Libtmux.Command.mutation.Resize_control_client_at.width","name":"width","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":969,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"width : int;","source":{"file":"lib/libtmux.mli","line":969,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Resize_control_client_at","type":"int","qualifiedName":"Libtmux.Command.width","slug":"libtmux-command-mutation-resize_control_client_at-width"},{"id":"Libtmux.Command.mutation.Resize_pane","publicId":"Libtmux.Command.mutation.Resize_pane","name":"Resize_pane","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":907,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Resize_pane of {\n pane : Pane.target;\n width : int option;\n height : int option;\n }","source":{"file":"lib/libtmux.mli","line":907,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"struct","qualifiedName":"Libtmux.Command.Resize_pane","slug":"libtmux-command-mutation-resize_pane"},{"id":"Libtmux.Command.mutation.Resize_pane.height","publicId":"Libtmux.Command.mutation.Resize_pane.height","name":"height","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":910,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"height : int option;","source":{"file":"lib/libtmux.mli","line":910,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Resize_pane","type":"int option","qualifiedName":"Libtmux.Command.height","slug":"libtmux-command-mutation-resize_pane-height"},{"id":"Libtmux.Command.mutation.Resize_pane.pane","publicId":"Libtmux.Command.mutation.Resize_pane.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":908,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : Pane.target;","source":{"file":"lib/libtmux.mli","line":908,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Resize_pane","type":"Pane.target","qualifiedName":"Libtmux.Command.pane","slug":"libtmux-command-mutation-resize_pane-pane"},{"id":"Libtmux.Command.mutation.Resize_pane.width","publicId":"Libtmux.Command.mutation.Resize_pane.width","name":"width","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":909,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"width : int option;","source":{"file":"lib/libtmux.mli","line":909,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Resize_pane","type":"int option","qualifiedName":"Libtmux.Command.width","slug":"libtmux-command-mutation-resize_pane-width"},{"id":"Libtmux.Command.mutation.Resize_window","publicId":"Libtmux.Command.mutation.Resize_window","name":"Resize_window","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":912,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Resize_window of {\n window : Window.target;\n width : int option;\n height : int option;\n }","source":{"file":"lib/libtmux.mli","line":912,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"struct","qualifiedName":"Libtmux.Command.Resize_window","slug":"libtmux-command-mutation-resize_window"},{"id":"Libtmux.Command.mutation.Resize_window.height","publicId":"Libtmux.Command.mutation.Resize_window.height","name":"height","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":915,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"height : int option;","source":{"file":"lib/libtmux.mli","line":915,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Resize_window","type":"int option","qualifiedName":"Libtmux.Command.height","slug":"libtmux-command-mutation-resize_window-height"},{"id":"Libtmux.Command.mutation.Resize_window.width","publicId":"Libtmux.Command.mutation.Resize_window.width","name":"width","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":914,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"width : int option;","source":{"file":"lib/libtmux.mli","line":914,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Resize_window","type":"int option","qualifiedName":"Libtmux.Command.width","slug":"libtmux-command-mutation-resize_window-width"},{"id":"Libtmux.Command.mutation.Resize_window.window","publicId":"Libtmux.Command.mutation.Resize_window.window","name":"window","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":913,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window : Window.target;","source":{"file":"lib/libtmux.mli","line":913,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Resize_window","type":"Window.target","qualifiedName":"Libtmux.Command.window","slug":"libtmux-command-mutation-resize_window-window"},{"id":"Libtmux.Command.mutation.Respawn_pane","publicId":"Libtmux.Command.mutation.Respawn_pane","name":"Respawn_pane","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":928,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Respawn_pane of {\n pane : Pane.target;\n spawn : Spawn.t;\n kill_running : bool;\n }","source":{"file":"lib/libtmux.mli","line":928,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"struct","qualifiedName":"Libtmux.Command.Respawn_pane","slug":"libtmux-command-mutation-respawn_pane"},{"id":"Libtmux.Command.mutation.Respawn_pane.kill_running","publicId":"Libtmux.Command.mutation.Respawn_pane.kill_running","name":"kill_running","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":931,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"kill_running : bool;","source":{"file":"lib/libtmux.mli","line":931,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Respawn_pane","type":"bool","qualifiedName":"Libtmux.Command.kill_running","slug":"libtmux-command-mutation-respawn_pane-kill_running"},{"id":"Libtmux.Command.mutation.Respawn_pane.pane","publicId":"Libtmux.Command.mutation.Respawn_pane.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":929,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : Pane.target;","source":{"file":"lib/libtmux.mli","line":929,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Respawn_pane","type":"Pane.target","qualifiedName":"Libtmux.Command.pane","slug":"libtmux-command-mutation-respawn_pane-pane"},{"id":"Libtmux.Command.mutation.Respawn_pane.spawn","publicId":"Libtmux.Command.mutation.Respawn_pane.spawn","name":"spawn","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":930,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"spawn : Spawn.t;","source":{"file":"lib/libtmux.mli","line":930,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Respawn_pane","type":"Spawn.t","qualifiedName":"Libtmux.Command.spawn","slug":"libtmux-command-mutation-respawn_pane-spawn"},{"id":"Libtmux.Command.mutation.Rotate_panes","publicId":"Libtmux.Command.mutation.Rotate_panes","name":"Rotate_panes","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":926,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Rotate_panes of Window.target * [ `Forward | `Backward ]","source":{"file":"lib/libtmux.mli","line":926,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Rotate_panes","slug":"libtmux-command-mutation-rotate_panes"},{"id":"Libtmux.Command.mutation.Run_hook","publicId":"Libtmux.Command.mutation.Run_hook","name":"Run_hook","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":959,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Run_hook of Options.scope * string","source":{"file":"lib/libtmux.mli","line":959,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Run_hook","slug":"libtmux-command-mutation-run_hook"},{"id":"Libtmux.Command.mutation.Select_layout","publicId":"Libtmux.Command.mutation.Select_layout","name":"Select_layout","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":917,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Select_layout of Window.target * Layout.t","source":{"file":"lib/libtmux.mli","line":917,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Select_layout","slug":"libtmux-command-mutation-select_layout"},{"id":"Libtmux.Command.mutation.Select_pane","publicId":"Libtmux.Command.mutation.Select_pane","name":"Select_pane","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":905,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Select_pane of Pane.target","source":{"file":"lib/libtmux.mli","line":905,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Select_pane","slug":"libtmux-command-mutation-select_pane"},{"id":"Libtmux.Command.mutation.Select_window_at","publicId":"Libtmux.Command.mutation.Select_window_at","name":"Select_window_at","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":888,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Select_window_at of Session.target * int","source":{"file":"lib/libtmux.mli","line":888,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Select_window_at","slug":"libtmux-command-mutation-select_window_at"},{"id":"Libtmux.Command.mutation.Set_environment","publicId":"Libtmux.Command.mutation.Set_environment","name":"Set_environment","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":934,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Set_environment of {\n scope : Environment.scope;\n name : string;\n value : string;\n hidden : bool;\n }","source":{"file":"lib/libtmux.mli","line":934,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"struct","qualifiedName":"Libtmux.Command.Set_environment","slug":"libtmux-command-mutation-set_environment"},{"id":"Libtmux.Command.mutation.Set_environment.hidden","publicId":"Libtmux.Command.mutation.Set_environment.hidden","name":"hidden","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":938,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"hidden : bool;","source":{"file":"lib/libtmux.mli","line":938,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_environment","type":"bool","qualifiedName":"Libtmux.Command.hidden","slug":"libtmux-command-mutation-set_environment-hidden"},{"id":"Libtmux.Command.mutation.Set_environment.name","publicId":"Libtmux.Command.mutation.Set_environment.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":936,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"lib/libtmux.mli","line":936,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_environment","type":"string","qualifiedName":"Libtmux.Command.name","slug":"libtmux-command-mutation-set_environment-name"},{"id":"Libtmux.Command.mutation.Set_environment.scope","publicId":"Libtmux.Command.mutation.Set_environment.scope","name":"scope","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":935,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"scope : Environment.scope;","source":{"file":"lib/libtmux.mli","line":935,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_environment","type":"Environment.scope","qualifiedName":"Libtmux.Command.scope","slug":"libtmux-command-mutation-set_environment-scope"},{"id":"Libtmux.Command.mutation.Set_environment.value","publicId":"Libtmux.Command.mutation.Set_environment.value","name":"value","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":937,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"value : string;","source":{"file":"lib/libtmux.mli","line":937,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_environment","type":"string","qualifiedName":"Libtmux.Command.value","slug":"libtmux-command-mutation-set_environment-value"},{"id":"Libtmux.Command.mutation.Set_hook","publicId":"Libtmux.Command.mutation.Set_hook","name":"Set_hook","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":951,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Set_hook of {\n scope : Options.scope;\n name : string;\n index : int option;\n commands : Hook.command list;\n append : bool;\n }","source":{"file":"lib/libtmux.mli","line":951,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"struct","qualifiedName":"Libtmux.Command.Set_hook","slug":"libtmux-command-mutation-set_hook"},{"id":"Libtmux.Command.mutation.Set_hook.append","publicId":"Libtmux.Command.mutation.Set_hook.append","name":"append","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":956,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"append : bool;","source":{"file":"lib/libtmux.mli","line":956,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_hook","type":"bool","qualifiedName":"Libtmux.Command.append","slug":"libtmux-command-mutation-set_hook-append"},{"id":"Libtmux.Command.mutation.Set_hook.commands","publicId":"Libtmux.Command.mutation.Set_hook.commands","name":"commands","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":955,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"commands : Hook.command list;","source":{"file":"lib/libtmux.mli","line":955,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_hook","type":"Hook.command list","qualifiedName":"Libtmux.Command.commands","slug":"libtmux-command-mutation-set_hook-commands"},{"id":"Libtmux.Command.mutation.Set_hook.index","publicId":"Libtmux.Command.mutation.Set_hook.index","name":"index","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":954,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"index : int option;","source":{"file":"lib/libtmux.mli","line":954,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_hook","type":"int option","qualifiedName":"Libtmux.Command.index","slug":"libtmux-command-mutation-set_hook-index"},{"id":"Libtmux.Command.mutation.Set_hook.name","publicId":"Libtmux.Command.mutation.Set_hook.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":953,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"lib/libtmux.mli","line":953,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_hook","type":"string","qualifiedName":"Libtmux.Command.name","slug":"libtmux-command-mutation-set_hook-name"},{"id":"Libtmux.Command.mutation.Set_hook.scope","publicId":"Libtmux.Command.mutation.Set_hook.scope","name":"scope","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":952,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"scope : Options.scope;","source":{"file":"lib/libtmux.mli","line":952,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_hook","type":"Options.scope","qualifiedName":"Libtmux.Command.scope","slug":"libtmux-command-mutation-set_hook-scope"},{"id":"Libtmux.Command.mutation.Set_option","publicId":"Libtmux.Command.mutation.Set_option","name":"Set_option","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":942,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Set_option of {\n scope : Options.scope;\n name : string;\n index : int option;\n value : Options.scalar;\n append : bool;\n }","source":{"file":"lib/libtmux.mli","line":942,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"struct","qualifiedName":"Libtmux.Command.Set_option","slug":"libtmux-command-mutation-set_option"},{"id":"Libtmux.Command.mutation.Set_option.append","publicId":"Libtmux.Command.mutation.Set_option.append","name":"append","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":947,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"append : bool;","source":{"file":"lib/libtmux.mli","line":947,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_option","type":"bool","qualifiedName":"Libtmux.Command.append","slug":"libtmux-command-mutation-set_option-append"},{"id":"Libtmux.Command.mutation.Set_option.index","publicId":"Libtmux.Command.mutation.Set_option.index","name":"index","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":945,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"index : int option;","source":{"file":"lib/libtmux.mli","line":945,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_option","type":"int option","qualifiedName":"Libtmux.Command.index","slug":"libtmux-command-mutation-set_option-index"},{"id":"Libtmux.Command.mutation.Set_option.name","publicId":"Libtmux.Command.mutation.Set_option.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":944,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"lib/libtmux.mli","line":944,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_option","type":"string","qualifiedName":"Libtmux.Command.name","slug":"libtmux-command-mutation-set_option-name"},{"id":"Libtmux.Command.mutation.Set_option.scope","publicId":"Libtmux.Command.mutation.Set_option.scope","name":"scope","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":943,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"scope : Options.scope;","source":{"file":"lib/libtmux.mli","line":943,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_option","type":"Options.scope","qualifiedName":"Libtmux.Command.scope","slug":"libtmux-command-mutation-set_option-scope"},{"id":"Libtmux.Command.mutation.Set_option.value","publicId":"Libtmux.Command.mutation.Set_option.value","name":"value","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":946,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"value : Options.scalar;","source":{"file":"lib/libtmux.mli","line":946,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Set_option","type":"Options.scalar","qualifiedName":"Libtmux.Command.value","slug":"libtmux-command-mutation-set_option-value"},{"id":"Libtmux.Command.mutation.Set_pane_title","publicId":"Libtmux.Command.mutation.Set_pane_title","name":"Set_pane_title","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":906,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Set_pane_title of Pane.target * string","source":{"file":"lib/libtmux.mli","line":906,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Set_pane_title","slug":"libtmux-command-mutation-set_pane_title"},{"id":"Libtmux.Command.mutation.Swap_panes","publicId":"Libtmux.Command.mutation.Swap_panes","name":"Swap_panes","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":925,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Swap_panes of Pane.target * Pane.target","source":{"file":"lib/libtmux.mli","line":925,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Swap_panes","slug":"libtmux-command-mutation-swap_panes"},{"id":"Libtmux.Command.mutation.Switch_client_at","publicId":"Libtmux.Command.mutation.Switch_client_at","name":"Switch_client_at","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":960,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Switch_client_at of {\n client : Client_name.t;\n session : Session.target;\n update_environment : bool;\n }","source":{"file":"lib/libtmux.mli","line":960,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"struct","qualifiedName":"Libtmux.Command.Switch_client_at","slug":"libtmux-command-mutation-switch_client_at"},{"id":"Libtmux.Command.mutation.Switch_client_at.client","publicId":"Libtmux.Command.mutation.Switch_client_at.client","name":"client","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":961,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"client : Client_name.t;","source":{"file":"lib/libtmux.mli","line":961,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Switch_client_at","type":"Client_name.t","qualifiedName":"Libtmux.Command.client","slug":"libtmux-command-mutation-switch_client_at-client"},{"id":"Libtmux.Command.mutation.Switch_client_at.session","publicId":"Libtmux.Command.mutation.Switch_client_at.session","name":"session","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":962,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"session : Session.target;","source":{"file":"lib/libtmux.mli","line":962,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Switch_client_at","type":"Session.target","qualifiedName":"Libtmux.Command.session","slug":"libtmux-command-mutation-switch_client_at-session"},{"id":"Libtmux.Command.mutation.Switch_client_at.update_environment","publicId":"Libtmux.Command.mutation.Switch_client_at.update_environment","name":"update_environment","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":963,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"update_environment : bool;","source":{"file":"lib/libtmux.mli","line":963,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Switch_client_at","type":"bool","qualifiedName":"Libtmux.Command.update_environment","slug":"libtmux-command-mutation-switch_client_at-update_environment"},{"id":"Libtmux.Command.mutation.Unlink_window_at","publicId":"Libtmux.Command.mutation.Unlink_window_at","name":"Unlink_window_at","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":889,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unlink_window_at of {\n session : Session.target;\n index : int;\n allow_kill : bool;\n }","source":{"file":"lib/libtmux.mli","line":889,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"struct","qualifiedName":"Libtmux.Command.Unlink_window_at","slug":"libtmux-command-mutation-unlink_window_at"},{"id":"Libtmux.Command.mutation.Unlink_window_at.allow_kill","publicId":"Libtmux.Command.mutation.Unlink_window_at.allow_kill","name":"allow_kill","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":892,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"allow_kill : bool;","source":{"file":"lib/libtmux.mli","line":892,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Unlink_window_at","type":"bool","qualifiedName":"Libtmux.Command.allow_kill","slug":"libtmux-command-mutation-unlink_window_at-allow_kill"},{"id":"Libtmux.Command.mutation.Unlink_window_at.index","publicId":"Libtmux.Command.mutation.Unlink_window_at.index","name":"index","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":891,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"index : int;","source":{"file":"lib/libtmux.mli","line":891,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Unlink_window_at","type":"int","qualifiedName":"Libtmux.Command.index","slug":"libtmux-command-mutation-unlink_window_at-index"},{"id":"Libtmux.Command.mutation.Unlink_window_at.session","publicId":"Libtmux.Command.mutation.Unlink_window_at.session","name":"session","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":890,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"session : Session.target;","source":{"file":"lib/libtmux.mli","line":890,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation.Unlink_window_at","type":"Session.target","qualifiedName":"Libtmux.Command.session","slug":"libtmux-command-mutation-unlink_window_at-session"},{"id":"Libtmux.Command.mutation.Unset_environment","publicId":"Libtmux.Command.mutation.Unset_environment","name":"Unset_environment","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":940,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unset_environment of Environment.scope * string","source":{"file":"lib/libtmux.mli","line":940,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Unset_environment","slug":"libtmux-command-mutation-unset_environment"},{"id":"Libtmux.Command.mutation.Unset_option","publicId":"Libtmux.Command.mutation.Unset_option","name":"Unset_option","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":949,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unset_option of Options.scope * string * int option","source":{"file":"lib/libtmux.mli","line":949,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Unset_option","slug":"libtmux-command-mutation-unset_option"},{"id":"Libtmux.Command.mutation.Zoom_pane","publicId":"Libtmux.Command.mutation.Zoom_pane","name":"Zoom_pane","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":927,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Zoom_pane of Pane.target","source":{"file":"lib/libtmux.mli","line":927,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.mutation","variant":"tuple","qualifiedName":"Libtmux.Command.Zoom_pane","slug":"libtmux-command-mutation-zoom_pane"},{"id":"Libtmux.Command.t","publicId":"Libtmux.Command.t","qualifiedName":"Libtmux.Command.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":973,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" An immutable description, validated by a backend before admission.\n Constructing or inspecting it performs no I/O. "],"declarations":[{"kind":"typealias","text":"type 'a t","source":{"file":"lib/libtmux.mli","line":973,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command","doc":{"summary":"An immutable description, validated by a backend before admission. Constructing or inspecting it performs no I/O."},"signatures":[{"raw":"type 'a t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-command-t"},{"id":"Libtmux.Command.view","publicId":"Libtmux.Command.view","qualifiedName":"Libtmux.Command.view","name":"view","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1028,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read-only inspection for transport adapters. "],"declarations":[{"kind":"function","text":"val view : 'a t -> 'a view","source":{"file":"lib/libtmux.mli","line":1028,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command","doc":{"summary":"Read-only inspection for transport adapters."},"signatures":[{"raw":"val view : 'a t -> 'a view","params":[{"name":"arg1","type":"'a t"}],"returns":"'a view"}],"slug":"libtmux-command-view"},{"id":"Libtmux.Command.view:type","publicId":"Libtmux.Command.view:type","qualifiedName":"Libtmux.Command.view","name":"view","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":977,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type _ view =\n | Capture : Snapshot.t view\n | Capture_text : {\n pane : Pane.t;\n start : int;\n end_ : int;\n scratch_dir : string;\n }\n -> Captured_text.t view\n | Rename_window : Window.target * string -> unit view\n | Rename_session : Session.target * string -> unit view\n | Send_text : Pane.target * string -> unit view\n | Send_keys : Pane.target * Key.t list -> unit view\n | Wait_for : string -> unit view\n | Signal : string -> unit view\n | Capture_environment : Environment.scope * bool -> Environment.t view\n | Capture_options : Options.scope * bool -> Options.t view\n | Read_option : Options.scope * string * bool -> Options.value option view\n | Capture_hooks : Options.scope -> Options.t view\n | Read_hook : Options.scope * string * bool -> Options.value option view\n | Mutate : mutation -> unit view\n | Create_session : {\n name : string;\n window_name : string option;\n width : int;\n height : int;\n spawn : Spawn.t;\n }\n -> Created.t view\n | Create_window : {\n session : Session.target;\n index : int option;\n name : string option;\n spawn : Spawn.t;\n }\n -> Created.t view\n | Split_pane : {\n pane : Pane.target;\n direction : Geometry.direction;\n size : Geometry.size option;\n spawn : Spawn.t;\n }\n -> Created.t view\n | Break_pane : {\n pane : Pane.target;\n session : Session.target;\n index : int;\n name : string option;\n }\n -> Created.t view","source":{"file":"lib/libtmux.mli","line":977,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command","signatures":[{"raw":"type _ view =\n | Capture: Snapshot.t view \n | Capture_text: {\n pane: Pane.t ;\n start: int ;\n end_: int ;\n scratch_dir: string } -> Captured_text.t view \n | Rename_window: Window.target * string -> unit view \n | Rename_session: Session.target * string -> unit view \n | Send_text: Pane.target * string -> unit view \n | Send_keys: Pane.target * Key.t list -> unit view \n | Wait_for: string -> unit view \n | Signal: string -> unit view \n | Capture_environment: Environment.scope * bool -> Environment.t view \n | Capture_options: Options.scope * bool -> Options.t view \n | Read_option: Options.scope * string * bool -> Options.value option view \n | Capture_hooks: Options.scope -> Options.t view \n | Read_hook: Options.scope * string * bool -> Options.value option view \n | Mutate: mutation -> unit view \n | Create_session:\n {\n name: string ;\n window_name: string option ;\n width: int ;\n height: int ;\n spawn: Spawn.t } -> Created.t view \n | Create_window:\n {\n session: Session.target ;\n index: int option ;\n name: string option ;\n spawn: Spawn.t } -> Created.t view \n | Split_pane:\n {\n pane: Pane.target ;\n direction: Geometry.direction ;\n size: Geometry.size option ;\n spawn: Spawn.t } -> Created.t view \n | Break_pane:\n {\n pane: Pane.target ;\n session: Session.target ;\n index: int ;\n name: string option } -> Created.t view ","params":[]}],"slug":"libtmux-command-view-type"},{"id":"Libtmux.Command.view:type.Break_pane","publicId":"Libtmux.Command.view:type.Break_pane","name":"Break_pane","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1020,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Break_pane : {\n pane : Pane.target;\n session : Session.target;\n index : int;\n name : string option;\n }\n -> Created.t view","source":{"file":"lib/libtmux.mli","line":1020,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"struct","qualifiedName":"Libtmux.Command.Break_pane","slug":"libtmux-command-view-type-break_pane"},{"id":"Libtmux.Command.view:type.Break_pane.index","publicId":"Libtmux.Command.view:type.Break_pane.index","name":"index","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1023,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"index : int;","source":{"file":"lib/libtmux.mli","line":1023,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Break_pane","type":"int","qualifiedName":"Libtmux.Command.index","slug":"libtmux-command-view-type-break_pane-index"},{"id":"Libtmux.Command.view:type.Break_pane.name","publicId":"Libtmux.Command.view:type.Break_pane.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1024,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string option;","source":{"file":"lib/libtmux.mli","line":1024,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Break_pane","type":"string option","qualifiedName":"Libtmux.Command.name","slug":"libtmux-command-view-type-break_pane-name"},{"id":"Libtmux.Command.view:type.Break_pane.pane","publicId":"Libtmux.Command.view:type.Break_pane.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1021,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : Pane.target;","source":{"file":"lib/libtmux.mli","line":1021,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Break_pane","type":"Pane.target","qualifiedName":"Libtmux.Command.pane","slug":"libtmux-command-view-type-break_pane-pane"},{"id":"Libtmux.Command.view:type.Break_pane.session","publicId":"Libtmux.Command.view:type.Break_pane.session","name":"session","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1022,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"session : Session.target;","source":{"file":"lib/libtmux.mli","line":1022,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Break_pane","type":"Session.target","qualifiedName":"Libtmux.Command.session","slug":"libtmux-command-view-type-break_pane-session"},{"id":"Libtmux.Command.view:type.Capture","publicId":"Libtmux.Command.view:type.Capture","name":"Capture","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":978,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Capture : Snapshot.t view","source":{"file":"lib/libtmux.mli","line":978,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"unit","qualifiedName":"Libtmux.Command.Capture","slug":"libtmux-command-view-type-capture"},{"id":"Libtmux.Command.view:type.Capture_environment","publicId":"Libtmux.Command.view:type.Capture_environment","name":"Capture_environment","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":992,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Capture_environment : Environment.scope * bool -> Environment.t view","source":{"file":"lib/libtmux.mli","line":992,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"tuple","qualifiedName":"Libtmux.Command.Capture_environment","slug":"libtmux-command-view-type-capture_environment"},{"id":"Libtmux.Command.view:type.Capture_hooks","publicId":"Libtmux.Command.view:type.Capture_hooks","name":"Capture_hooks","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":995,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Capture_hooks : Options.scope -> Options.t view","source":{"file":"lib/libtmux.mli","line":995,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"tuple","qualifiedName":"Libtmux.Command.Capture_hooks","slug":"libtmux-command-view-type-capture_hooks"},{"id":"Libtmux.Command.view:type.Capture_options","publicId":"Libtmux.Command.view:type.Capture_options","name":"Capture_options","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":993,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Capture_options : Options.scope * bool -> Options.t view","source":{"file":"lib/libtmux.mli","line":993,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"tuple","qualifiedName":"Libtmux.Command.Capture_options","slug":"libtmux-command-view-type-capture_options"},{"id":"Libtmux.Command.view:type.Capture_text","publicId":"Libtmux.Command.view:type.Capture_text","name":"Capture_text","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":979,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Capture_text : {\n pane : Pane.t;\n start : int;\n end_ : int;\n scratch_dir : string;\n }\n -> Captured_text.t view","source":{"file":"lib/libtmux.mli","line":979,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"struct","qualifiedName":"Libtmux.Command.Capture_text","slug":"libtmux-command-view-type-capture_text"},{"id":"Libtmux.Command.view:type.Capture_text.end_","publicId":"Libtmux.Command.view:type.Capture_text.end_","name":"end_","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":982,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"end_ : int;","source":{"file":"lib/libtmux.mli","line":982,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Capture_text","type":"int","qualifiedName":"Libtmux.Command.end_","slug":"libtmux-command-view-type-capture_text-end_"},{"id":"Libtmux.Command.view:type.Capture_text.pane","publicId":"Libtmux.Command.view:type.Capture_text.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":980,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : Pane.t;","source":{"file":"lib/libtmux.mli","line":980,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Capture_text","type":"Pane.t","qualifiedName":"Libtmux.Command.pane","slug":"libtmux-command-view-type-capture_text-pane"},{"id":"Libtmux.Command.view:type.Capture_text.scratch_dir","publicId":"Libtmux.Command.view:type.Capture_text.scratch_dir","name":"scratch_dir","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":983,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"scratch_dir : string;","source":{"file":"lib/libtmux.mli","line":983,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Capture_text","type":"string","qualifiedName":"Libtmux.Command.scratch_dir","slug":"libtmux-command-view-type-capture_text-scratch_dir"},{"id":"Libtmux.Command.view:type.Capture_text.start","publicId":"Libtmux.Command.view:type.Capture_text.start","name":"start","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":981,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"start : int;","source":{"file":"lib/libtmux.mli","line":981,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Capture_text","type":"int","qualifiedName":"Libtmux.Command.start","slug":"libtmux-command-view-type-capture_text-start"},{"id":"Libtmux.Command.view:type.Create_session","publicId":"Libtmux.Command.view:type.Create_session","name":"Create_session","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":998,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Create_session : {\n name : string;\n window_name : string option;\n width : int;\n height : int;\n spawn : Spawn.t;\n }\n -> Created.t view","source":{"file":"lib/libtmux.mli","line":998,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"struct","qualifiedName":"Libtmux.Command.Create_session","slug":"libtmux-command-view-type-create_session"},{"id":"Libtmux.Command.view:type.Create_session.height","publicId":"Libtmux.Command.view:type.Create_session.height","name":"height","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1002,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"height : int;","source":{"file":"lib/libtmux.mli","line":1002,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Create_session","type":"int","qualifiedName":"Libtmux.Command.height","slug":"libtmux-command-view-type-create_session-height"},{"id":"Libtmux.Command.view:type.Create_session.name","publicId":"Libtmux.Command.view:type.Create_session.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":999,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"lib/libtmux.mli","line":999,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Create_session","type":"string","qualifiedName":"Libtmux.Command.name","slug":"libtmux-command-view-type-create_session-name"},{"id":"Libtmux.Command.view:type.Create_session.spawn","publicId":"Libtmux.Command.view:type.Create_session.spawn","name":"spawn","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1003,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"spawn : Spawn.t;","source":{"file":"lib/libtmux.mli","line":1003,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Create_session","type":"Spawn.t","qualifiedName":"Libtmux.Command.spawn","slug":"libtmux-command-view-type-create_session-spawn"},{"id":"Libtmux.Command.view:type.Create_session.width","publicId":"Libtmux.Command.view:type.Create_session.width","name":"width","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1001,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"width : int;","source":{"file":"lib/libtmux.mli","line":1001,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Create_session","type":"int","qualifiedName":"Libtmux.Command.width","slug":"libtmux-command-view-type-create_session-width"},{"id":"Libtmux.Command.view:type.Create_session.window_name","publicId":"Libtmux.Command.view:type.Create_session.window_name","name":"window_name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1000,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window_name : string option;","source":{"file":"lib/libtmux.mli","line":1000,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Create_session","type":"string option","qualifiedName":"Libtmux.Command.window_name","slug":"libtmux-command-view-type-create_session-window_name"},{"id":"Libtmux.Command.view:type.Create_window","publicId":"Libtmux.Command.view:type.Create_window","name":"Create_window","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1006,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Create_window : {\n session : Session.target;\n index : int option;\n name : string option;\n spawn : Spawn.t;\n }\n -> Created.t view","source":{"file":"lib/libtmux.mli","line":1006,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"struct","qualifiedName":"Libtmux.Command.Create_window","slug":"libtmux-command-view-type-create_window"},{"id":"Libtmux.Command.view:type.Create_window.index","publicId":"Libtmux.Command.view:type.Create_window.index","name":"index","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1008,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"index : int option;","source":{"file":"lib/libtmux.mli","line":1008,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Create_window","type":"int option","qualifiedName":"Libtmux.Command.index","slug":"libtmux-command-view-type-create_window-index"},{"id":"Libtmux.Command.view:type.Create_window.name","publicId":"Libtmux.Command.view:type.Create_window.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1009,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string option;","source":{"file":"lib/libtmux.mli","line":1009,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Create_window","type":"string option","qualifiedName":"Libtmux.Command.name","slug":"libtmux-command-view-type-create_window-name"},{"id":"Libtmux.Command.view:type.Create_window.session","publicId":"Libtmux.Command.view:type.Create_window.session","name":"session","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1007,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"session : Session.target;","source":{"file":"lib/libtmux.mli","line":1007,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Create_window","type":"Session.target","qualifiedName":"Libtmux.Command.session","slug":"libtmux-command-view-type-create_window-session"},{"id":"Libtmux.Command.view:type.Create_window.spawn","publicId":"Libtmux.Command.view:type.Create_window.spawn","name":"spawn","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1010,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"spawn : Spawn.t;","source":{"file":"lib/libtmux.mli","line":1010,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Create_window","type":"Spawn.t","qualifiedName":"Libtmux.Command.spawn","slug":"libtmux-command-view-type-create_window-spawn"},{"id":"Libtmux.Command.view:type.Mutate","publicId":"Libtmux.Command.view:type.Mutate","name":"Mutate","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":997,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Mutate : mutation -> unit view","source":{"file":"lib/libtmux.mli","line":997,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"tuple","qualifiedName":"Libtmux.Command.Mutate","slug":"libtmux-command-view-type-mutate"},{"id":"Libtmux.Command.view:type.Read_hook","publicId":"Libtmux.Command.view:type.Read_hook","name":"Read_hook","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":996,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Read_hook : Options.scope * string * bool -> Options.value option view","source":{"file":"lib/libtmux.mli","line":996,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"tuple","qualifiedName":"Libtmux.Command.Read_hook","slug":"libtmux-command-view-type-read_hook"},{"id":"Libtmux.Command.view:type.Read_option","publicId":"Libtmux.Command.view:type.Read_option","name":"Read_option","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":994,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Read_option : Options.scope * string * bool -> Options.value option view","source":{"file":"lib/libtmux.mli","line":994,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"tuple","qualifiedName":"Libtmux.Command.Read_option","slug":"libtmux-command-view-type-read_option"},{"id":"Libtmux.Command.view:type.Rename_session","publicId":"Libtmux.Command.view:type.Rename_session","name":"Rename_session","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":987,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Rename_session : Session.target * string -> unit view","source":{"file":"lib/libtmux.mli","line":987,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"tuple","qualifiedName":"Libtmux.Command.Rename_session","slug":"libtmux-command-view-type-rename_session"},{"id":"Libtmux.Command.view:type.Rename_window","publicId":"Libtmux.Command.view:type.Rename_window","name":"Rename_window","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":986,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Rename_window : Window.target * string -> unit view","source":{"file":"lib/libtmux.mli","line":986,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"tuple","qualifiedName":"Libtmux.Command.Rename_window","slug":"libtmux-command-view-type-rename_window"},{"id":"Libtmux.Command.view:type.Send_keys","publicId":"Libtmux.Command.view:type.Send_keys","name":"Send_keys","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":989,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Send_keys : Pane.target * Key.t list -> unit view","source":{"file":"lib/libtmux.mli","line":989,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"tuple","qualifiedName":"Libtmux.Command.Send_keys","slug":"libtmux-command-view-type-send_keys"},{"id":"Libtmux.Command.view:type.Send_text","publicId":"Libtmux.Command.view:type.Send_text","name":"Send_text","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":988,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Send_text : Pane.target * string -> unit view","source":{"file":"lib/libtmux.mli","line":988,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"tuple","qualifiedName":"Libtmux.Command.Send_text","slug":"libtmux-command-view-type-send_text"},{"id":"Libtmux.Command.view:type.Signal","publicId":"Libtmux.Command.view:type.Signal","name":"Signal","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":991,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Signal : string -> unit view","source":{"file":"lib/libtmux.mli","line":991,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"tuple","qualifiedName":"Libtmux.Command.Signal","slug":"libtmux-command-view-type-signal"},{"id":"Libtmux.Command.view:type.Split_pane","publicId":"Libtmux.Command.view:type.Split_pane","name":"Split_pane","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1013,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Split_pane : {\n pane : Pane.target;\n direction : Geometry.direction;\n size : Geometry.size option;\n spawn : Spawn.t;\n }\n -> Created.t view","source":{"file":"lib/libtmux.mli","line":1013,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"struct","qualifiedName":"Libtmux.Command.Split_pane","slug":"libtmux-command-view-type-split_pane"},{"id":"Libtmux.Command.view:type.Split_pane.direction","publicId":"Libtmux.Command.view:type.Split_pane.direction","name":"direction","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1015,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"direction : Geometry.direction;","source":{"file":"lib/libtmux.mli","line":1015,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Split_pane","type":"Geometry.direction","qualifiedName":"Libtmux.Command.direction","slug":"libtmux-command-view-type-split_pane-direction"},{"id":"Libtmux.Command.view:type.Split_pane.pane","publicId":"Libtmux.Command.view:type.Split_pane.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1014,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : Pane.target;","source":{"file":"lib/libtmux.mli","line":1014,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Split_pane","type":"Pane.target","qualifiedName":"Libtmux.Command.pane","slug":"libtmux-command-view-type-split_pane-pane"},{"id":"Libtmux.Command.view:type.Split_pane.size","publicId":"Libtmux.Command.view:type.Split_pane.size","name":"size","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1016,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"size : Geometry.size option;","source":{"file":"lib/libtmux.mli","line":1016,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Split_pane","type":"Geometry.size option","qualifiedName":"Libtmux.Command.size","slug":"libtmux-command-view-type-split_pane-size"},{"id":"Libtmux.Command.view:type.Split_pane.spawn","publicId":"Libtmux.Command.view:type.Split_pane.spawn","name":"spawn","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1017,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"spawn : Spawn.t;","source":{"file":"lib/libtmux.mli","line":1017,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type.Split_pane","type":"Spawn.t","qualifiedName":"Libtmux.Command.spawn","slug":"libtmux-command-view-type-split_pane-spawn"},{"id":"Libtmux.Command.view:type.Wait_for","publicId":"Libtmux.Command.view:type.Wait_for","name":"Wait_for","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":990,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Wait_for : string -> unit view","source":{"file":"lib/libtmux.mli","line":990,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Command.view:type","variant":"tuple","qualifiedName":"Libtmux.Command.Wait_for","slug":"libtmux-command-view-type-wait_for"},{"id":"Libtmux.Created","publicId":"Libtmux.Created","qualifiedName":"Libtmux.Created","name":"Created","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":779,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" IDs reported by a successful creation reply. Only the requested kind is\n newly created; the other fields can describe existing containers. "],"declarations":[{"kind":"module","text":"module Created : sig\n type t = {\n session : Session.target;\n window : Window.target;\n pane : Pane.target;\n window_index : int;\n pane_index : int;\n }\n (** IDs returned by the creation command, without a second capture. Indexes\n describe the creation response and may change afterward. Only the resource\n requested by the command is newly created: splitting a pane does not\n create the reported session or window. *)\nend","source":{"file":"lib/libtmux.mli","line":779,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"IDs reported by a successful creation reply. Only the requested kind is newly created; the other fields can describe existing containers."},"slug":"libtmux-created"},{"id":"Libtmux.Created.t","publicId":"Libtmux.Created.t","qualifiedName":"Libtmux.Created.t","name":"t","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":780,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" IDs returned by the creation command, without a second capture. Indexes\n describe the creation response and may change afterward. Only the resource\n requested by the command is newly created: splitting a pane does not\n create the reported session or window. "],"declarations":[{"kind":"struct","text":"type t = {\n session : Session.target;\n window : Window.target;\n pane : Pane.target;\n window_index : int;\n pane_index : int;\n }","source":{"file":"lib/libtmux.mli","line":780,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Created","doc":{"summary":"IDs returned by the creation command, without a second capture. Indexes describe the creation response and may change afterward. Only the resource requested by the command is newly created: splitting a pane does not create the reported session or window."},"signatures":[{"raw":"type t =\n {\n session: Session.target ;\n window: Window.target ;\n pane: Pane.target ;\n window_index: int ;\n pane_index: int }","params":[]}],"slug":"libtmux-created-t"},{"id":"Libtmux.Created.t.pane","publicId":"Libtmux.Created.t.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":783,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : Pane.target;","source":{"file":"lib/libtmux.mli","line":783,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Created.t","type":"Pane.target","qualifiedName":"Libtmux.Created.pane","slug":"libtmux-created-t-pane"},{"id":"Libtmux.Created.t.pane_index","publicId":"Libtmux.Created.t.pane_index","name":"pane_index","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":785,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane_index : int;","source":{"file":"lib/libtmux.mli","line":785,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Created.t","type":"int","qualifiedName":"Libtmux.Created.pane_index","slug":"libtmux-created-t-pane_index"},{"id":"Libtmux.Created.t.session","publicId":"Libtmux.Created.t.session","name":"session","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":781,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"session : Session.target;","source":{"file":"lib/libtmux.mli","line":781,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Created.t","type":"Session.target","qualifiedName":"Libtmux.Created.session","slug":"libtmux-created-t-session"},{"id":"Libtmux.Created.t.window","publicId":"Libtmux.Created.t.window","name":"window","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":782,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window : Window.target;","source":{"file":"lib/libtmux.mli","line":782,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Created.t","type":"Window.target","qualifiedName":"Libtmux.Created.window","slug":"libtmux-created-t-window"},{"id":"Libtmux.Created.t.window_index","publicId":"Libtmux.Created.t.window_index","name":"window_index","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":784,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window_index : int;","source":{"file":"lib/libtmux.mli","line":784,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Created.t","type":"int","qualifiedName":"Libtmux.Created.window_index","slug":"libtmux-created-t-window_index"},{"id":"Libtmux.Endpoint","publicId":"Libtmux.Endpoint","qualifiedName":"Libtmux.Endpoint","name":"Endpoint","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":30,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" An explicit socket description. Constructing an endpoint neither reads the\n environment nor starts a daemon. {!Source.t} adds the observed daemon and\n connection generation. "],"declarations":[{"kind":"module","text":"module Endpoint : sig\n type t\n (** An explicit socket description, independent of the environment. *)\n\n type kind = Named_socket of string | Socket_path of string\n\n val named_socket : string -> t\n (** [named_socket name] describes tmux's [-L name] endpoint. Raises\n [Invalid_argument] if [name] is empty or contains NUL or [/]. *)\n\n val socket_path : string -> t\n (** [socket_path path] describes an absolute [-S path] endpoint. It does not\n check existence or resolve symbolic links. Raises [Invalid_argument] if\n [path] is relative, empty or contains NUL. *)\n\n val kind : t -> kind\n\n val equal : t -> t -> bool\n (** Equality compares descriptions, not server instances or resolved paths. *)\n\n val pp : Format.formatter -> t -> unit\nend","source":{"file":"lib/libtmux.mli","line":30,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"An explicit socket description. Constructing an endpoint neither reads the environment nor starts a daemon. {!Source.t} adds the observed daemon and connection generation."},"slug":"libtmux-endpoint"},{"id":"Libtmux.Endpoint.equal","publicId":"Libtmux.Endpoint.equal","qualifiedName":"Libtmux.Endpoint.equal","name":"equal","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":47,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Equality compares descriptions, not server instances or resolved paths. "],"declarations":[{"kind":"function","text":"val equal : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":47,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Endpoint","doc":{"summary":"Equality compares descriptions, not server instances or resolved paths."},"signatures":[{"raw":"val equal : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-endpoint-equal"},{"id":"Libtmux.Endpoint.kind","publicId":"Libtmux.Endpoint.kind","qualifiedName":"Libtmux.Endpoint.kind","name":"kind","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":45,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val kind : t -> kind","source":{"file":"lib/libtmux.mli","line":45,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Endpoint","signatures":[{"raw":"val kind : t -> kind","params":[{"name":"arg1","type":"t"}],"returns":"kind"}],"slug":"libtmux-endpoint-kind"},{"id":"Libtmux.Endpoint.kind:type","publicId":"Libtmux.Endpoint.kind:type","qualifiedName":"Libtmux.Endpoint.kind","name":"kind","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":34,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type kind = Named_socket of string | Socket_path of string","source":{"file":"lib/libtmux.mli","line":34,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Endpoint","signatures":[{"raw":"type kind =\n | Named_socket of string \n | Socket_path of string ","params":[]}],"slug":"libtmux-endpoint-kind-type"},{"id":"Libtmux.Endpoint.kind:type.Named_socket","publicId":"Libtmux.Endpoint.kind:type.Named_socket","name":"Named_socket","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":34,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Named_socket of string","source":{"file":"lib/libtmux.mli","line":34,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Endpoint.kind:type","variant":"tuple","qualifiedName":"Libtmux.Endpoint.Named_socket","slug":"libtmux-endpoint-kind-type-named_socket"},{"id":"Libtmux.Endpoint.kind:type.Socket_path","publicId":"Libtmux.Endpoint.kind:type.Socket_path","name":"Socket_path","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":34,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Socket_path of string","source":{"file":"lib/libtmux.mli","line":34,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Endpoint.kind:type","variant":"tuple","qualifiedName":"Libtmux.Endpoint.Socket_path","slug":"libtmux-endpoint-kind-type-socket_path"},{"id":"Libtmux.Endpoint.named_socket","publicId":"Libtmux.Endpoint.named_socket","qualifiedName":"Libtmux.Endpoint.named_socket","name":"named_socket","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":36,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" [named_socket name] describes tmux's [-L name] endpoint. Raises\n [Invalid_argument] if [name] is empty or contains NUL or [/]. "],"declarations":[{"kind":"function","text":"val named_socket : string -> t","source":{"file":"lib/libtmux.mli","line":36,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Endpoint","doc":{"summary":"`named_socket name` describes tmux's `-L name` endpoint. Raises `Invalid_argument` if `name` is empty or contains NUL or `/`."},"signatures":[{"raw":"val named_socket : string -> t","params":[{"name":"arg1","type":"string"}],"returns":"t"}],"slug":"libtmux-endpoint-named_socket"},{"id":"Libtmux.Endpoint.pp","publicId":"Libtmux.Endpoint.pp","qualifiedName":"Libtmux.Endpoint.pp","name":"pp","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":50,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pp : Format.formatter -> t -> unit","source":{"file":"lib/libtmux.mli","line":50,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Endpoint","signatures":[{"raw":"val pp : Format.formatter -> t -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"t"}],"returns":"unit"}],"slug":"libtmux-endpoint-pp"},{"id":"Libtmux.Endpoint.socket_path","publicId":"Libtmux.Endpoint.socket_path","qualifiedName":"Libtmux.Endpoint.socket_path","name":"socket_path","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":40,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" [socket_path path] describes an absolute [-S path] endpoint. It does not\n check existence or resolve symbolic links. Raises [Invalid_argument] if\n [path] is relative, empty or contains NUL. "],"declarations":[{"kind":"function","text":"val socket_path : string -> t","source":{"file":"lib/libtmux.mli","line":40,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Endpoint","doc":{"summary":"`socket_path path` describes an absolute `-S path` endpoint. It does not check existence or resolve symbolic links. Raises `Invalid_argument` if `path` is relative, empty or contains NUL."},"signatures":[{"raw":"val socket_path : string -> t","params":[{"name":"arg1","type":"string"}],"returns":"t"}],"slug":"libtmux-endpoint-socket_path"},{"id":"Libtmux.Endpoint.t","publicId":"Libtmux.Endpoint.t","qualifiedName":"Libtmux.Endpoint.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":31,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" An explicit socket description, independent of the environment. "],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":31,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Endpoint","doc":{"summary":"An explicit socket description, independent of the environment."},"signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-endpoint-t"},{"id":"Libtmux.Environment","publicId":"Libtmux.Environment","qualifiedName":"Libtmux.Environment","name":"Environment","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":793,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Environment : sig\n type scope = Global | Session of Session.target\n type value = Value of string | Removed\n type entry = { name : string; value : value }\n\n type t = {\n source : Source.t;\n scope : scope;\n hidden : bool;\n entries : entry Iarray.t;\n started_at_ns : int64;\n finished_at_ns : int64;\n }\n (** One captured environment table, in tmux order. [hidden] selects hidden\n variables exclusively. Session tables contain local entries, including\n removal markers; they do not merge the global environment. *)\n\n val lookup : t -> string -> value option\n (** No I/O. [None] means absent from the selected table and visibility.\n [Removed] masks a global value; [Value \"\"] is an explicitly empty value.\n Names must be ASCII identifiers; values preserve non-NUL bytes. *)\nend","source":{"file":"lib/libtmux.mli","line":793,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","slug":"libtmux-environment"},{"id":"Libtmux.Environment.entry","publicId":"Libtmux.Environment.entry","qualifiedName":"Libtmux.Environment.entry","name":"entry","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":796,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type entry = { name : string; value : value }","source":{"file":"lib/libtmux.mli","line":796,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment","signatures":[{"raw":"type entry = {\n name: string ;\n value: value }","params":[]}],"slug":"libtmux-environment-entry"},{"id":"Libtmux.Environment.entry.name","publicId":"Libtmux.Environment.entry.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":796,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"lib/libtmux.mli","line":796,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment.entry","type":"string","qualifiedName":"Libtmux.Environment.name","slug":"libtmux-environment-entry-name"},{"id":"Libtmux.Environment.entry.value","publicId":"Libtmux.Environment.entry.value","name":"value","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":796,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"value : value","source":{"file":"lib/libtmux.mli","line":796,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment.entry","type":"value","qualifiedName":"Libtmux.Environment.value","slug":"libtmux-environment-entry-value"},{"id":"Libtmux.Environment.lookup","publicId":"Libtmux.Environment.lookup","qualifiedName":"Libtmux.Environment.lookup","name":"lookup","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":810,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" No I/O. [None] means absent from the selected table and visibility.\n [Removed] masks a global value; [Value \"\"] is an explicitly empty value.\n Names must be ASCII identifiers; values preserve non-NUL bytes. "],"declarations":[{"kind":"function","text":"val lookup : t -> string -> value option","source":{"file":"lib/libtmux.mli","line":810,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment","doc":{"summary":"No I/O. `None` means absent from the selected table and visibility. `Removed` masks a global value; `Value \"\"` is an explicitly empty value. Names must be ASCII identifiers; values preserve non-NUL bytes."},"signatures":[{"raw":"val lookup : t -> string -> value option","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"string"}],"returns":"value option"}],"slug":"libtmux-environment-lookup"},{"id":"Libtmux.Environment.scope","publicId":"Libtmux.Environment.scope","qualifiedName":"Libtmux.Environment.scope","name":"scope","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":794,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type scope = Global | Session of Session.target","source":{"file":"lib/libtmux.mli","line":794,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment","signatures":[{"raw":"type scope =\n | Global \n | Session of Session.target ","params":[]}],"slug":"libtmux-environment-scope"},{"id":"Libtmux.Environment.scope.Global","publicId":"Libtmux.Environment.scope.Global","name":"Global","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":794,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Global","source":{"file":"lib/libtmux.mli","line":794,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment.scope","variant":"unit","qualifiedName":"Libtmux.Environment.Global","slug":"libtmux-environment-scope-global"},{"id":"Libtmux.Environment.scope.Session","publicId":"Libtmux.Environment.scope.Session","name":"Session","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":794,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Session of Session.target","source":{"file":"lib/libtmux.mli","line":794,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment.scope","variant":"tuple","qualifiedName":"Libtmux.Environment.Session","slug":"libtmux-environment-scope-session"},{"id":"Libtmux.Environment.t","publicId":"Libtmux.Environment.t","qualifiedName":"Libtmux.Environment.t","name":"t","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":798,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" One captured environment table, in tmux order. [hidden] selects hidden\n variables exclusively. Session tables contain local entries, including\n removal markers; they do not merge the global environment. "],"declarations":[{"kind":"struct","text":"type t = {\n source : Source.t;\n scope : scope;\n hidden : bool;\n entries : entry Iarray.t;\n started_at_ns : int64;\n finished_at_ns : int64;\n }","source":{"file":"lib/libtmux.mli","line":798,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment","doc":{"summary":"One captured environment table, in tmux order. `hidden` selects hidden variables exclusively. Session tables contain local entries, including removal markers; they do not merge the global environment."},"signatures":[{"raw":"type t =\n {\n source: Source.t ;\n scope: scope ;\n hidden: bool ;\n entries: entry Iarray.t ;\n started_at_ns: int64 ;\n finished_at_ns: int64 }","params":[]}],"slug":"libtmux-environment-t"},{"id":"Libtmux.Environment.t.entries","publicId":"Libtmux.Environment.t.entries","name":"entries","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":802,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"entries : entry Iarray.t;","source":{"file":"lib/libtmux.mli","line":802,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment.t","type":"entry Iarray.t","qualifiedName":"Libtmux.Environment.entries","slug":"libtmux-environment-t-entries"},{"id":"Libtmux.Environment.t.finished_at_ns","publicId":"Libtmux.Environment.t.finished_at_ns","name":"finished_at_ns","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":804,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"finished_at_ns : int64;","source":{"file":"lib/libtmux.mli","line":804,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment.t","type":"int64","qualifiedName":"Libtmux.Environment.finished_at_ns","slug":"libtmux-environment-t-finished_at_ns"},{"id":"Libtmux.Environment.t.hidden","publicId":"Libtmux.Environment.t.hidden","name":"hidden","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":801,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"hidden : bool;","source":{"file":"lib/libtmux.mli","line":801,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment.t","type":"bool","qualifiedName":"Libtmux.Environment.hidden","slug":"libtmux-environment-t-hidden"},{"id":"Libtmux.Environment.t.scope","publicId":"Libtmux.Environment.t.scope","name":"scope","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":800,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"scope : scope;","source":{"file":"lib/libtmux.mli","line":800,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment.t","type":"scope","qualifiedName":"Libtmux.Environment.scope","slug":"libtmux-environment-t-scope"},{"id":"Libtmux.Environment.t.source","publicId":"Libtmux.Environment.t.source","name":"source","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":799,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"source : Source.t;","source":{"file":"lib/libtmux.mli","line":799,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment.t","type":"Source.t","qualifiedName":"Libtmux.Environment.source","slug":"libtmux-environment-t-source"},{"id":"Libtmux.Environment.t.started_at_ns","publicId":"Libtmux.Environment.t.started_at_ns","name":"started_at_ns","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":803,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"started_at_ns : int64;","source":{"file":"lib/libtmux.mli","line":803,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment.t","type":"int64","qualifiedName":"Libtmux.Environment.started_at_ns","slug":"libtmux-environment-t-started_at_ns"},{"id":"Libtmux.Environment.value","publicId":"Libtmux.Environment.value","qualifiedName":"Libtmux.Environment.value","name":"value","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":795,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type value = Value of string | Removed","source":{"file":"lib/libtmux.mli","line":795,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment","signatures":[{"raw":"type value =\n | Value of string \n | Removed ","params":[]}],"slug":"libtmux-environment-value"},{"id":"Libtmux.Environment.value.Removed","publicId":"Libtmux.Environment.value.Removed","name":"Removed","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":795,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Removed","source":{"file":"lib/libtmux.mli","line":795,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment.value","variant":"unit","qualifiedName":"Libtmux.Environment.Removed","slug":"libtmux-environment-value-removed"},{"id":"Libtmux.Environment.value.Value","publicId":"Libtmux.Environment.value.Value","name":"Value","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":795,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Value of string","source":{"file":"lib/libtmux.mli","line":795,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Environment.value","variant":"tuple","qualifiedName":"Libtmux.Environment.Value","slug":"libtmux-environment-value-value"},{"id":"Libtmux.Error","publicId":"Libtmux.Error","qualifiedName":"Libtmux.Error","name":"Error","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":56,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Expected input, capture, capability and transport failures. Cancellation\n belongs to the chosen backend and is not converted into an ordinary error.\n"],"declarations":[{"kind":"module","text":"module Error : sig\n type t =\n | Invalid_input of string\n | Malformed_data of string\n | Capture_raced of string\n | Unsupported_version of string\n | Unsupported_binding of string\n | Unsupported_capture_hooks\n | Unsupported of string\n | Closed\n | Disconnected of string\n | Filesystem of { operation : string; message : string }\n | Wrong_domain\n | Busy\n | Capacity of { resource : string; limit : int }\n | Stale_target\n | No_such_entity of { kind : string; id : string }\n | Command_failed of { command : string; message : string }\n | Deadline_exceeded\n | Not_started\n | Outcome_unknown of string\n\n val pp : Format.formatter -> t -> unit\nend","source":{"file":"lib/libtmux.mli","line":56,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"Expected input, capture, capability and transport failures. Cancellation belongs to the chosen backend and is not converted into an ordinary error."},"slug":"libtmux-error"},{"id":"Libtmux.Error.pp","publicId":"Libtmux.Error.pp","qualifiedName":"Libtmux.Error.pp","name":"pp","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":78,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pp : Format.formatter -> t -> unit","source":{"file":"lib/libtmux.mli","line":78,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error","signatures":[{"raw":"val pp : Format.formatter -> t -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"t"}],"returns":"unit"}],"slug":"libtmux-error-pp"},{"id":"Libtmux.Error.t","publicId":"Libtmux.Error.t","qualifiedName":"Libtmux.Error.t","name":"t","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":57,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type t =\n | Invalid_input of string\n | Malformed_data of string\n | Capture_raced of string\n | Unsupported_version of string\n | Unsupported_binding of string\n | Unsupported_capture_hooks\n | Unsupported of string\n | Closed\n | Disconnected of string\n | Filesystem of { operation : string; message : string }\n | Wrong_domain\n | Busy\n | Capacity of { resource : string; limit : int }\n | Stale_target\n | No_such_entity of { kind : string; id : string }\n | Command_failed of { command : string; message : string }\n | Deadline_exceeded\n | Not_started\n | Outcome_unknown of string","source":{"file":"lib/libtmux.mli","line":57,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error","signatures":[{"raw":"type t =\n | Invalid_input of string \n | Malformed_data of string \n | Capture_raced of string \n | Unsupported_version of string \n | Unsupported_binding of string \n | Unsupported_capture_hooks \n | Unsupported of string \n | Closed \n | Disconnected of string \n | Filesystem of {\n operation: string ;\n message: string } \n | Wrong_domain \n | Busy \n | Capacity of {\n resource: string ;\n limit: int } \n | Stale_target \n | No_such_entity of {\n kind: string ;\n id: string } \n | Command_failed of {\n command: string ;\n message: string } \n | Deadline_exceeded \n | Not_started \n | Outcome_unknown of string ","params":[]}],"slug":"libtmux-error-t"},{"id":"Libtmux.Error.t.Busy","publicId":"Libtmux.Error.t.Busy","name":"Busy","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":69,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Busy","source":{"file":"lib/libtmux.mli","line":69,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"unit","qualifiedName":"Libtmux.Error.Busy","slug":"libtmux-error-t-busy"},{"id":"Libtmux.Error.t.Capacity","publicId":"Libtmux.Error.t.Capacity","name":"Capacity","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":70,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Capacity of { resource : string; limit : int }","source":{"file":"lib/libtmux.mli","line":70,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"struct","qualifiedName":"Libtmux.Error.Capacity","slug":"libtmux-error-t-capacity"},{"id":"Libtmux.Error.t.Capacity.limit","publicId":"Libtmux.Error.t.Capacity.limit","name":"limit","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":70,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"limit : int","source":{"file":"lib/libtmux.mli","line":70,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t.Capacity","type":"int","qualifiedName":"Libtmux.Error.limit","slug":"libtmux-error-t-capacity-limit"},{"id":"Libtmux.Error.t.Capacity.resource","publicId":"Libtmux.Error.t.Capacity.resource","name":"resource","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":70,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"resource : string;","source":{"file":"lib/libtmux.mli","line":70,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t.Capacity","type":"string","qualifiedName":"Libtmux.Error.resource","slug":"libtmux-error-t-capacity-resource"},{"id":"Libtmux.Error.t.Capture_raced","publicId":"Libtmux.Error.t.Capture_raced","name":"Capture_raced","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":60,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Capture_raced of string","source":{"file":"lib/libtmux.mli","line":60,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"tuple","qualifiedName":"Libtmux.Error.Capture_raced","slug":"libtmux-error-t-capture_raced"},{"id":"Libtmux.Error.t.Closed","publicId":"Libtmux.Error.t.Closed","name":"Closed","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":65,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Closed","source":{"file":"lib/libtmux.mli","line":65,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"unit","qualifiedName":"Libtmux.Error.Closed","slug":"libtmux-error-t-closed"},{"id":"Libtmux.Error.t.Command_failed","publicId":"Libtmux.Error.t.Command_failed","name":"Command_failed","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":73,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Command_failed of { command : string; message : string }","source":{"file":"lib/libtmux.mli","line":73,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"struct","qualifiedName":"Libtmux.Error.Command_failed","slug":"libtmux-error-t-command_failed"},{"id":"Libtmux.Error.t.Command_failed.command","publicId":"Libtmux.Error.t.Command_failed.command","name":"command","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":73,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"command : string;","source":{"file":"lib/libtmux.mli","line":73,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t.Command_failed","type":"string","qualifiedName":"Libtmux.Error.command","slug":"libtmux-error-t-command_failed-command"},{"id":"Libtmux.Error.t.Command_failed.message","publicId":"Libtmux.Error.t.Command_failed.message","name":"message","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":73,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"message : string","source":{"file":"lib/libtmux.mli","line":73,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t.Command_failed","type":"string","qualifiedName":"Libtmux.Error.message","slug":"libtmux-error-t-command_failed-message"},{"id":"Libtmux.Error.t.Deadline_exceeded","publicId":"Libtmux.Error.t.Deadline_exceeded","name":"Deadline_exceeded","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":74,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Deadline_exceeded","source":{"file":"lib/libtmux.mli","line":74,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"unit","qualifiedName":"Libtmux.Error.Deadline_exceeded","slug":"libtmux-error-t-deadline_exceeded"},{"id":"Libtmux.Error.t.Disconnected","publicId":"Libtmux.Error.t.Disconnected","name":"Disconnected","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":66,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Disconnected of string","source":{"file":"lib/libtmux.mli","line":66,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"tuple","qualifiedName":"Libtmux.Error.Disconnected","slug":"libtmux-error-t-disconnected"},{"id":"Libtmux.Error.t.Filesystem","publicId":"Libtmux.Error.t.Filesystem","name":"Filesystem","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":67,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Filesystem of { operation : string; message : string }","source":{"file":"lib/libtmux.mli","line":67,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"struct","qualifiedName":"Libtmux.Error.Filesystem","slug":"libtmux-error-t-filesystem"},{"id":"Libtmux.Error.t.Filesystem.message","publicId":"Libtmux.Error.t.Filesystem.message","name":"message","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":67,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"message : string","source":{"file":"lib/libtmux.mli","line":67,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t.Filesystem","type":"string","qualifiedName":"Libtmux.Error.message","slug":"libtmux-error-t-filesystem-message"},{"id":"Libtmux.Error.t.Filesystem.operation","publicId":"Libtmux.Error.t.Filesystem.operation","name":"operation","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":67,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"operation : string;","source":{"file":"lib/libtmux.mli","line":67,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t.Filesystem","type":"string","qualifiedName":"Libtmux.Error.operation","slug":"libtmux-error-t-filesystem-operation"},{"id":"Libtmux.Error.t.Invalid_input","publicId":"Libtmux.Error.t.Invalid_input","name":"Invalid_input","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":58,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Invalid_input of string","source":{"file":"lib/libtmux.mli","line":58,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"tuple","qualifiedName":"Libtmux.Error.Invalid_input","slug":"libtmux-error-t-invalid_input"},{"id":"Libtmux.Error.t.Malformed_data","publicId":"Libtmux.Error.t.Malformed_data","name":"Malformed_data","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":59,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Malformed_data of string","source":{"file":"lib/libtmux.mli","line":59,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"tuple","qualifiedName":"Libtmux.Error.Malformed_data","slug":"libtmux-error-t-malformed_data"},{"id":"Libtmux.Error.t.No_such_entity","publicId":"Libtmux.Error.t.No_such_entity","name":"No_such_entity","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":72,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| No_such_entity of { kind : string; id : string }","source":{"file":"lib/libtmux.mli","line":72,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"struct","qualifiedName":"Libtmux.Error.No_such_entity","slug":"libtmux-error-t-no_such_entity"},{"id":"Libtmux.Error.t.No_such_entity.id","publicId":"Libtmux.Error.t.No_such_entity.id","name":"id","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":72,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"id : string","source":{"file":"lib/libtmux.mli","line":72,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t.No_such_entity","type":"string","qualifiedName":"Libtmux.Error.id","slug":"libtmux-error-t-no_such_entity-id"},{"id":"Libtmux.Error.t.No_such_entity.kind","publicId":"Libtmux.Error.t.No_such_entity.kind","name":"kind","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":72,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"kind : string;","source":{"file":"lib/libtmux.mli","line":72,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t.No_such_entity","type":"string","qualifiedName":"Libtmux.Error.kind","slug":"libtmux-error-t-no_such_entity-kind"},{"id":"Libtmux.Error.t.Not_started","publicId":"Libtmux.Error.t.Not_started","name":"Not_started","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":75,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Not_started","source":{"file":"lib/libtmux.mli","line":75,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"unit","qualifiedName":"Libtmux.Error.Not_started","slug":"libtmux-error-t-not_started"},{"id":"Libtmux.Error.t.Outcome_unknown","publicId":"Libtmux.Error.t.Outcome_unknown","name":"Outcome_unknown","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":76,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Outcome_unknown of string","source":{"file":"lib/libtmux.mli","line":76,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"tuple","qualifiedName":"Libtmux.Error.Outcome_unknown","slug":"libtmux-error-t-outcome_unknown"},{"id":"Libtmux.Error.t.Stale_target","publicId":"Libtmux.Error.t.Stale_target","name":"Stale_target","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":71,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Stale_target","source":{"file":"lib/libtmux.mli","line":71,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"unit","qualifiedName":"Libtmux.Error.Stale_target","slug":"libtmux-error-t-stale_target"},{"id":"Libtmux.Error.t.Unsupported","publicId":"Libtmux.Error.t.Unsupported","name":"Unsupported","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":64,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unsupported of string","source":{"file":"lib/libtmux.mli","line":64,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"tuple","qualifiedName":"Libtmux.Error.Unsupported","slug":"libtmux-error-t-unsupported"},{"id":"Libtmux.Error.t.Unsupported_binding","publicId":"Libtmux.Error.t.Unsupported_binding","name":"Unsupported_binding","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":62,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unsupported_binding of string","source":{"file":"lib/libtmux.mli","line":62,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"tuple","qualifiedName":"Libtmux.Error.Unsupported_binding","slug":"libtmux-error-t-unsupported_binding"},{"id":"Libtmux.Error.t.Unsupported_capture_hooks","publicId":"Libtmux.Error.t.Unsupported_capture_hooks","name":"Unsupported_capture_hooks","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":63,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unsupported_capture_hooks","source":{"file":"lib/libtmux.mli","line":63,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"unit","qualifiedName":"Libtmux.Error.Unsupported_capture_hooks","slug":"libtmux-error-t-unsupported_capture_hooks"},{"id":"Libtmux.Error.t.Unsupported_version","publicId":"Libtmux.Error.t.Unsupported_version","name":"Unsupported_version","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":61,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unsupported_version of string","source":{"file":"lib/libtmux.mli","line":61,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"tuple","qualifiedName":"Libtmux.Error.Unsupported_version","slug":"libtmux-error-t-unsupported_version"},{"id":"Libtmux.Error.t.Wrong_domain","publicId":"Libtmux.Error.t.Wrong_domain","name":"Wrong_domain","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":68,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Wrong_domain","source":{"file":"lib/libtmux.mli","line":68,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Error.t","variant":"unit","qualifiedName":"Libtmux.Error.Wrong_domain","slug":"libtmux-error-t-wrong_domain"},{"id":"Libtmux.Expr","publicId":"Libtmux.Expr","qualifiedName":"Libtmux.Expr","name":"Expr","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":574,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Inspectable predicates whose entity and operand types are checked by the\n compiler. Combine native closures separately with [Seq.filter]. Evaluation\n follows captured relationships without acquisition or hidden caches. "],"declarations":[{"kind":"module","text":"module Expr : sig\n type 'entity t\n\n val all : 'a t list -> 'a t\n (** Boolean conjunction; the empty conjunction is true. *)\n\n val any : 'a t list -> 'a t\n (** Boolean disjunction; the empty disjunction is false. *)\n\n val not_ : 'a t -> 'a t\n\n module Bool : sig\n val equal : ('a, bool) Field.t -> bool -> 'a t\n val is_true : ('a, bool) Field.t -> 'a t\n val is_false : ('a, bool) Field.t -> 'a t\n end\n\n module Int : sig\n val equal : ('a, int) Field.t -> int -> 'a t\n val lt : ('a, int) Field.t -> int -> 'a t\n val le : ('a, int) Field.t -> int -> 'a t\n val gt : ('a, int) Field.t -> int -> 'a t\n val ge : ('a, int) Field.t -> int -> 'a t\n val is_in : ('a, int) Field.t -> int list -> 'a t\n end\n\n module Text : sig\n val equal : ('a, string) Field.t -> string -> 'a t\n val starts_with : ('a, string) Field.t -> string -> 'a t\n val ends_with : ('a, string) Field.t -> string -> 'a t\n val contains : ('a, string) Field.t -> string -> 'a t\n\n val is_in : ('a, string) Field.t -> string list -> 'a t\n (** Comparisons use exact bytes, without case folding or normalization. The\n empty substring matches every string. *)\n end\n\n module Rel : sig\n val any : ('a, 'b) Relation.Many.t -> 'b t -> 'a t\n val all : ('a, 'b) Relation.Many.t -> 'b t -> 'a t\n\n val none : ('a, 'b) Relation.Many.t -> 'b t -> 'a t\n (** On empty relations, [any] is false; [all] and [none] are true. One child\n must satisfy the complete nested expression. *)\n\n val is : ('a, 'b) Relation.One.t -> 'b t -> 'a t\n val exists : ('a, 'b) Relation.Optional.t -> 'b t -> 'a t\n val is_absent : ('a, 'b) Relation.Optional.t -> 'a t\n end\n\n val compile : 'a t -> 'a -> bool\n (** Prepare a reusable predicate. Compilation and evaluation perform no I/O.\n *)\n\n val pp : Format.formatter -> 'a t -> unit\n val describe : 'a t -> string\n\n type _ comparison =\n | Bool_equal : bool -> bool comparison\n | Int_equal : int -> int comparison\n | Int_lt : int -> int comparison\n | Int_le : int -> int comparison\n | Int_gt : int -> int comparison\n | Int_ge : int -> int comparison\n | Int_in : int list -> int comparison\n | Text_equal : string -> string comparison\n | Text_starts_with : string -> string comparison\n | Text_ends_with : string -> string comparison\n | Text_contains : string -> string comparison\n | Text_in : string list -> string comparison\n\n type 'a view =\n | Compare : ('a, 'v) Field.t * 'v comparison -> 'a view\n | All of 'a t list\n | Any of 'a t list\n | Not of 'a t\n | Related_any : ('a, 'b) Relation.Many.t * 'b t -> 'a view\n | Related_all : ('a, 'b) Relation.Many.t * 'b t -> 'a view\n | Related_none : ('a, 'b) Relation.Many.t * 'b t -> 'a view\n | Related_one : ('a, 'b) Relation.One.t * 'b t -> 'a view\n | Related_optional : ('a, 'b) Relation.Optional.t * 'b t -> 'a view\n | Absent : ('a, 'b) Relation.Optional.t -> 'a view\n\n val view : 'a t -> 'a view\n (** Typed read-only inspection for codecs and planners. A view cannot add\n custom accessors or closures to an expression. *)\nend","source":{"file":"lib/libtmux.mli","line":574,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"Inspectable predicates whose entity and operand types are checked by the compiler. Combine native closures separately with `Seq.filter`. Evaluation follows captured relationships without acquisition or hidden caches."},"slug":"libtmux-expr"},{"id":"Libtmux.Expr.Bool","publicId":"Libtmux.Expr.Bool","qualifiedName":"Libtmux.Expr.Bool","name":"Bool","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":585,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Bool : sig\n val equal : ('a, bool) Field.t -> bool -> 'a t\n val is_true : ('a, bool) Field.t -> 'a t\n val is_false : ('a, bool) Field.t -> 'a t\n end","source":{"file":"lib/libtmux.mli","line":585,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","slug":"libtmux-expr-bool"},{"id":"Libtmux.Expr.Bool.equal","publicId":"Libtmux.Expr.Bool.equal","qualifiedName":"Libtmux.Expr.Bool.equal","name":"equal","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":586,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val equal : ('a, bool) Field.t -> bool -> 'a t","source":{"file":"lib/libtmux.mli","line":586,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Bool","signatures":[{"raw":"val equal : ('a, bool) Field.t -> bool -> 'a t","params":[{"name":"arg1","type":"('a, bool) Field.t"},{"name":"arg2","type":"bool"}],"returns":"'a t"}],"slug":"libtmux-expr-bool-equal"},{"id":"Libtmux.Expr.Bool.is_false","publicId":"Libtmux.Expr.Bool.is_false","qualifiedName":"Libtmux.Expr.Bool.is_false","name":"is_false","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":588,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val is_false : ('a, bool) Field.t -> 'a t","source":{"file":"lib/libtmux.mli","line":588,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Bool","signatures":[{"raw":"val is_false : ('a, bool) Field.t -> 'a t","params":[{"name":"arg1","type":"('a, bool) Field.t"}],"returns":"'a t"}],"slug":"libtmux-expr-bool-is_false"},{"id":"Libtmux.Expr.Bool.is_true","publicId":"Libtmux.Expr.Bool.is_true","qualifiedName":"Libtmux.Expr.Bool.is_true","name":"is_true","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":587,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val is_true : ('a, bool) Field.t -> 'a t","source":{"file":"lib/libtmux.mli","line":587,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Bool","signatures":[{"raw":"val is_true : ('a, bool) Field.t -> 'a t","params":[{"name":"arg1","type":"('a, bool) Field.t"}],"returns":"'a t"}],"slug":"libtmux-expr-bool-is_true"},{"id":"Libtmux.Expr.Int","publicId":"Libtmux.Expr.Int","qualifiedName":"Libtmux.Expr.Int","name":"Int","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":591,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Int : sig\n val equal : ('a, int) Field.t -> int -> 'a t\n val lt : ('a, int) Field.t -> int -> 'a t\n val le : ('a, int) Field.t -> int -> 'a t\n val gt : ('a, int) Field.t -> int -> 'a t\n val ge : ('a, int) Field.t -> int -> 'a t\n val is_in : ('a, int) Field.t -> int list -> 'a t\n end","source":{"file":"lib/libtmux.mli","line":591,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","slug":"libtmux-expr-int"},{"id":"Libtmux.Expr.Int.equal","publicId":"Libtmux.Expr.Int.equal","qualifiedName":"Libtmux.Expr.Int.equal","name":"equal","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":592,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val equal : ('a, int) Field.t -> int -> 'a t","source":{"file":"lib/libtmux.mli","line":592,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Int","signatures":[{"raw":"val equal : ('a, int) Field.t -> int -> 'a t","params":[{"name":"arg1","type":"('a, int) Field.t"},{"name":"arg2","type":"int"}],"returns":"'a t"}],"slug":"libtmux-expr-int-equal"},{"id":"Libtmux.Expr.Int.ge","publicId":"Libtmux.Expr.Int.ge","qualifiedName":"Libtmux.Expr.Int.ge","name":"ge","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":596,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val ge : ('a, int) Field.t -> int -> 'a t","source":{"file":"lib/libtmux.mli","line":596,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Int","signatures":[{"raw":"val ge : ('a, int) Field.t -> int -> 'a t","params":[{"name":"arg1","type":"('a, int) Field.t"},{"name":"arg2","type":"int"}],"returns":"'a t"}],"slug":"libtmux-expr-int-ge"},{"id":"Libtmux.Expr.Int.gt","publicId":"Libtmux.Expr.Int.gt","qualifiedName":"Libtmux.Expr.Int.gt","name":"gt","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":595,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val gt : ('a, int) Field.t -> int -> 'a t","source":{"file":"lib/libtmux.mli","line":595,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Int","signatures":[{"raw":"val gt : ('a, int) Field.t -> int -> 'a t","params":[{"name":"arg1","type":"('a, int) Field.t"},{"name":"arg2","type":"int"}],"returns":"'a t"}],"slug":"libtmux-expr-int-gt"},{"id":"Libtmux.Expr.Int.is_in","publicId":"Libtmux.Expr.Int.is_in","qualifiedName":"Libtmux.Expr.Int.is_in","name":"is_in","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":597,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val is_in : ('a, int) Field.t -> int list -> 'a t","source":{"file":"lib/libtmux.mli","line":597,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Int","signatures":[{"raw":"val is_in : ('a, int) Field.t -> int list -> 'a t","params":[{"name":"arg1","type":"('a, int) Field.t"},{"name":"arg2","type":"int list"}],"returns":"'a t"}],"slug":"libtmux-expr-int-is_in"},{"id":"Libtmux.Expr.Int.le","publicId":"Libtmux.Expr.Int.le","qualifiedName":"Libtmux.Expr.Int.le","name":"le","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":594,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val le : ('a, int) Field.t -> int -> 'a t","source":{"file":"lib/libtmux.mli","line":594,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Int","signatures":[{"raw":"val le : ('a, int) Field.t -> int -> 'a t","params":[{"name":"arg1","type":"('a, int) Field.t"},{"name":"arg2","type":"int"}],"returns":"'a t"}],"slug":"libtmux-expr-int-le"},{"id":"Libtmux.Expr.Int.lt","publicId":"Libtmux.Expr.Int.lt","qualifiedName":"Libtmux.Expr.Int.lt","name":"lt","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":593,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val lt : ('a, int) Field.t -> int -> 'a t","source":{"file":"lib/libtmux.mli","line":593,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Int","signatures":[{"raw":"val lt : ('a, int) Field.t -> int -> 'a t","params":[{"name":"arg1","type":"('a, int) Field.t"},{"name":"arg2","type":"int"}],"returns":"'a t"}],"slug":"libtmux-expr-int-lt"},{"id":"Libtmux.Expr.Rel","publicId":"Libtmux.Expr.Rel","qualifiedName":"Libtmux.Expr.Rel","name":"Rel","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":611,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Rel : sig\n val any : ('a, 'b) Relation.Many.t -> 'b t -> 'a t\n val all : ('a, 'b) Relation.Many.t -> 'b t -> 'a t\n\n val none : ('a, 'b) Relation.Many.t -> 'b t -> 'a t\n (** On empty relations, [any] is false; [all] and [none] are true. One child\n must satisfy the complete nested expression. *)\n\n val is : ('a, 'b) Relation.One.t -> 'b t -> 'a t\n val exists : ('a, 'b) Relation.Optional.t -> 'b t -> 'a t\n val is_absent : ('a, 'b) Relation.Optional.t -> 'a t\n end","source":{"file":"lib/libtmux.mli","line":611,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","slug":"libtmux-expr-rel"},{"id":"Libtmux.Expr.Rel.all","publicId":"Libtmux.Expr.Rel.all","qualifiedName":"Libtmux.Expr.Rel.all","name":"all","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":613,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val all : ('a, 'b) Relation.Many.t -> 'b t -> 'a t","source":{"file":"lib/libtmux.mli","line":613,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Rel","signatures":[{"raw":"val all : ('a, 'b) Relation.Many.t -> 'b t -> 'a t","params":[{"name":"arg1","type":"('a, 'b) Relation.Many.t"},{"name":"arg2","type":"'b t"}],"returns":"'a t"}],"slug":"libtmux-expr-rel-all"},{"id":"Libtmux.Expr.Rel.any","publicId":"Libtmux.Expr.Rel.any","qualifiedName":"Libtmux.Expr.Rel.any","name":"any","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":612,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val any : ('a, 'b) Relation.Many.t -> 'b t -> 'a t","source":{"file":"lib/libtmux.mli","line":612,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Rel","signatures":[{"raw":"val any : ('a, 'b) Relation.Many.t -> 'b t -> 'a t","params":[{"name":"arg1","type":"('a, 'b) Relation.Many.t"},{"name":"arg2","type":"'b t"}],"returns":"'a t"}],"slug":"libtmux-expr-rel-any"},{"id":"Libtmux.Expr.Rel.exists","publicId":"Libtmux.Expr.Rel.exists","qualifiedName":"Libtmux.Expr.Rel.exists","name":"exists","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":620,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val exists : ('a, 'b) Relation.Optional.t -> 'b t -> 'a t","source":{"file":"lib/libtmux.mli","line":620,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Rel","signatures":[{"raw":"val exists : ('a, 'b) Relation.Optional.t -> 'b t -> 'a t","params":[{"name":"arg1","type":"('a, 'b) Relation.Optional.t"},{"name":"arg2","type":"'b t"}],"returns":"'a t"}],"slug":"libtmux-expr-rel-exists"},{"id":"Libtmux.Expr.Rel.is","publicId":"Libtmux.Expr.Rel.is","qualifiedName":"Libtmux.Expr.Rel.is","name":"is","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":619,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val is : ('a, 'b) Relation.One.t -> 'b t -> 'a t","source":{"file":"lib/libtmux.mli","line":619,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Rel","signatures":[{"raw":"val is : ('a, 'b) Relation.One.t -> 'b t -> 'a t","params":[{"name":"arg1","type":"('a, 'b) Relation.One.t"},{"name":"arg2","type":"'b t"}],"returns":"'a t"}],"slug":"libtmux-expr-rel-is"},{"id":"Libtmux.Expr.Rel.is_absent","publicId":"Libtmux.Expr.Rel.is_absent","qualifiedName":"Libtmux.Expr.Rel.is_absent","name":"is_absent","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":621,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val is_absent : ('a, 'b) Relation.Optional.t -> 'a t","source":{"file":"lib/libtmux.mli","line":621,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Rel","signatures":[{"raw":"val is_absent : ('a, 'b) Relation.Optional.t -> 'a t","params":[{"name":"arg1","type":"('a, 'b) Relation.Optional.t"}],"returns":"'a t"}],"slug":"libtmux-expr-rel-is_absent"},{"id":"Libtmux.Expr.Rel.none","publicId":"Libtmux.Expr.Rel.none","qualifiedName":"Libtmux.Expr.Rel.none","name":"none","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":615,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" On empty relations, [any] is false; [all] and [none] are true. One child\n must satisfy the complete nested expression. "],"declarations":[{"kind":"function","text":"val none : ('a, 'b) Relation.Many.t -> 'b t -> 'a t","source":{"file":"lib/libtmux.mli","line":615,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Rel","doc":{"summary":"On empty relations, `any` is false; `all` and `none` are true. One child must satisfy the complete nested expression."},"signatures":[{"raw":"val none : ('a, 'b) Relation.Many.t -> 'b t -> 'a t","params":[{"name":"arg1","type":"('a, 'b) Relation.Many.t"},{"name":"arg2","type":"'b t"}],"returns":"'a t"}],"slug":"libtmux-expr-rel-none"},{"id":"Libtmux.Expr.Text","publicId":"Libtmux.Expr.Text","qualifiedName":"Libtmux.Expr.Text","name":"Text","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":600,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Text : sig\n val equal : ('a, string) Field.t -> string -> 'a t\n val starts_with : ('a, string) Field.t -> string -> 'a t\n val ends_with : ('a, string) Field.t -> string -> 'a t\n val contains : ('a, string) Field.t -> string -> 'a t\n\n val is_in : ('a, string) Field.t -> string list -> 'a t\n (** Comparisons use exact bytes, without case folding or normalization. The\n empty substring matches every string. *)\n end","source":{"file":"lib/libtmux.mli","line":600,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","slug":"libtmux-expr-text"},{"id":"Libtmux.Expr.Text.contains","publicId":"Libtmux.Expr.Text.contains","qualifiedName":"Libtmux.Expr.Text.contains","name":"contains","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":604,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val contains : ('a, string) Field.t -> string -> 'a t","source":{"file":"lib/libtmux.mli","line":604,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Text","signatures":[{"raw":"val contains : ('a, string) Field.t -> string -> 'a t","params":[{"name":"arg1","type":"('a, string) Field.t"},{"name":"arg2","type":"string"}],"returns":"'a t"}],"slug":"libtmux-expr-text-contains"},{"id":"Libtmux.Expr.Text.ends_with","publicId":"Libtmux.Expr.Text.ends_with","qualifiedName":"Libtmux.Expr.Text.ends_with","name":"ends_with","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":603,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val ends_with : ('a, string) Field.t -> string -> 'a t","source":{"file":"lib/libtmux.mli","line":603,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Text","signatures":[{"raw":"val ends_with : ('a, string) Field.t -> string -> 'a t","params":[{"name":"arg1","type":"('a, string) Field.t"},{"name":"arg2","type":"string"}],"returns":"'a t"}],"slug":"libtmux-expr-text-ends_with"},{"id":"Libtmux.Expr.Text.equal","publicId":"Libtmux.Expr.Text.equal","qualifiedName":"Libtmux.Expr.Text.equal","name":"equal","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":601,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val equal : ('a, string) Field.t -> string -> 'a t","source":{"file":"lib/libtmux.mli","line":601,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Text","signatures":[{"raw":"val equal : ('a, string) Field.t -> string -> 'a t","params":[{"name":"arg1","type":"('a, string) Field.t"},{"name":"arg2","type":"string"}],"returns":"'a t"}],"slug":"libtmux-expr-text-equal"},{"id":"Libtmux.Expr.Text.is_in","publicId":"Libtmux.Expr.Text.is_in","qualifiedName":"Libtmux.Expr.Text.is_in","name":"is_in","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":606,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Comparisons use exact bytes, without case folding or normalization. The\n empty substring matches every string. "],"declarations":[{"kind":"function","text":"val is_in : ('a, string) Field.t -> string list -> 'a t","source":{"file":"lib/libtmux.mli","line":606,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Text","doc":{"summary":"Comparisons use exact bytes, without case folding or normalization. The empty substring matches every string."},"signatures":[{"raw":"val is_in : ('a, string) Field.t -> string list -> 'a t","params":[{"name":"arg1","type":"('a, string) Field.t"},{"name":"arg2","type":"string list"}],"returns":"'a t"}],"slug":"libtmux-expr-text-is_in"},{"id":"Libtmux.Expr.Text.starts_with","publicId":"Libtmux.Expr.Text.starts_with","qualifiedName":"Libtmux.Expr.Text.starts_with","name":"starts_with","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":602,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val starts_with : ('a, string) Field.t -> string -> 'a t","source":{"file":"lib/libtmux.mli","line":602,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.Text","signatures":[{"raw":"val starts_with : ('a, string) Field.t -> string -> 'a t","params":[{"name":"arg1","type":"('a, string) Field.t"},{"name":"arg2","type":"string"}],"returns":"'a t"}],"slug":"libtmux-expr-text-starts_with"},{"id":"Libtmux.Expr.all","publicId":"Libtmux.Expr.all","qualifiedName":"Libtmux.Expr.all","name":"all","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":577,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Boolean conjunction; the empty conjunction is true. "],"declarations":[{"kind":"function","text":"val all : 'a t list -> 'a t","source":{"file":"lib/libtmux.mli","line":577,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","doc":{"summary":"Boolean conjunction; the empty conjunction is true."},"signatures":[{"raw":"val all : 'a t list -> 'a t","params":[{"name":"arg1","type":"'a t list"}],"returns":"'a t"}],"slug":"libtmux-expr-all"},{"id":"Libtmux.Expr.any","publicId":"Libtmux.Expr.any","qualifiedName":"Libtmux.Expr.any","name":"any","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":580,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Boolean disjunction; the empty disjunction is false. "],"declarations":[{"kind":"function","text":"val any : 'a t list -> 'a t","source":{"file":"lib/libtmux.mli","line":580,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","doc":{"summary":"Boolean disjunction; the empty disjunction is false."},"signatures":[{"raw":"val any : 'a t list -> 'a t","params":[{"name":"arg1","type":"'a t list"}],"returns":"'a t"}],"slug":"libtmux-expr-any"},{"id":"Libtmux.Expr.comparison","publicId":"Libtmux.Expr.comparison","qualifiedName":"Libtmux.Expr.comparison","name":"comparison","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":631,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type _ comparison =\n | Bool_equal : bool -> bool comparison\n | Int_equal : int -> int comparison\n | Int_lt : int -> int comparison\n | Int_le : int -> int comparison\n | Int_gt : int -> int comparison\n | Int_ge : int -> int comparison\n | Int_in : int list -> int comparison\n | Text_equal : string -> string comparison\n | Text_starts_with : string -> string comparison\n | Text_ends_with : string -> string comparison\n | Text_contains : string -> string comparison\n | Text_in : string list -> string comparison","source":{"file":"lib/libtmux.mli","line":631,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","signatures":[{"raw":"type _ comparison =\n | Bool_equal: bool -> bool comparison \n | Int_equal: int -> int comparison \n | Int_lt: int -> int comparison \n | Int_le: int -> int comparison \n | Int_gt: int -> int comparison \n | Int_ge: int -> int comparison \n | Int_in: int list -> int comparison \n | Text_equal: string -> string comparison \n | Text_starts_with: string -> string comparison \n | Text_ends_with: string -> string comparison \n | Text_contains: string -> string comparison \n | Text_in: string list -> string comparison ","params":[]}],"slug":"libtmux-expr-comparison"},{"id":"Libtmux.Expr.comparison.Bool_equal","publicId":"Libtmux.Expr.comparison.Bool_equal","name":"Bool_equal","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":632,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Bool_equal : bool -> bool comparison","source":{"file":"lib/libtmux.mli","line":632,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.comparison","variant":"tuple","qualifiedName":"Libtmux.Expr.Bool_equal","slug":"libtmux-expr-comparison-bool_equal"},{"id":"Libtmux.Expr.comparison.Int_equal","publicId":"Libtmux.Expr.comparison.Int_equal","name":"Int_equal","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":633,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Int_equal : int -> int comparison","source":{"file":"lib/libtmux.mli","line":633,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.comparison","variant":"tuple","qualifiedName":"Libtmux.Expr.Int_equal","slug":"libtmux-expr-comparison-int_equal"},{"id":"Libtmux.Expr.comparison.Int_ge","publicId":"Libtmux.Expr.comparison.Int_ge","name":"Int_ge","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":637,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Int_ge : int -> int comparison","source":{"file":"lib/libtmux.mli","line":637,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.comparison","variant":"tuple","qualifiedName":"Libtmux.Expr.Int_ge","slug":"libtmux-expr-comparison-int_ge"},{"id":"Libtmux.Expr.comparison.Int_gt","publicId":"Libtmux.Expr.comparison.Int_gt","name":"Int_gt","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":636,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Int_gt : int -> int comparison","source":{"file":"lib/libtmux.mli","line":636,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.comparison","variant":"tuple","qualifiedName":"Libtmux.Expr.Int_gt","slug":"libtmux-expr-comparison-int_gt"},{"id":"Libtmux.Expr.comparison.Int_in","publicId":"Libtmux.Expr.comparison.Int_in","name":"Int_in","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":638,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Int_in : int list -> int comparison","source":{"file":"lib/libtmux.mli","line":638,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.comparison","variant":"tuple","qualifiedName":"Libtmux.Expr.Int_in","slug":"libtmux-expr-comparison-int_in"},{"id":"Libtmux.Expr.comparison.Int_le","publicId":"Libtmux.Expr.comparison.Int_le","name":"Int_le","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":635,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Int_le : int -> int comparison","source":{"file":"lib/libtmux.mli","line":635,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.comparison","variant":"tuple","qualifiedName":"Libtmux.Expr.Int_le","slug":"libtmux-expr-comparison-int_le"},{"id":"Libtmux.Expr.comparison.Int_lt","publicId":"Libtmux.Expr.comparison.Int_lt","name":"Int_lt","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":634,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Int_lt : int -> int comparison","source":{"file":"lib/libtmux.mli","line":634,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.comparison","variant":"tuple","qualifiedName":"Libtmux.Expr.Int_lt","slug":"libtmux-expr-comparison-int_lt"},{"id":"Libtmux.Expr.comparison.Text_contains","publicId":"Libtmux.Expr.comparison.Text_contains","name":"Text_contains","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":642,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Text_contains : string -> string comparison","source":{"file":"lib/libtmux.mli","line":642,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.comparison","variant":"tuple","qualifiedName":"Libtmux.Expr.Text_contains","slug":"libtmux-expr-comparison-text_contains"},{"id":"Libtmux.Expr.comparison.Text_ends_with","publicId":"Libtmux.Expr.comparison.Text_ends_with","name":"Text_ends_with","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":641,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Text_ends_with : string -> string comparison","source":{"file":"lib/libtmux.mli","line":641,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.comparison","variant":"tuple","qualifiedName":"Libtmux.Expr.Text_ends_with","slug":"libtmux-expr-comparison-text_ends_with"},{"id":"Libtmux.Expr.comparison.Text_equal","publicId":"Libtmux.Expr.comparison.Text_equal","name":"Text_equal","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":639,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Text_equal : string -> string comparison","source":{"file":"lib/libtmux.mli","line":639,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.comparison","variant":"tuple","qualifiedName":"Libtmux.Expr.Text_equal","slug":"libtmux-expr-comparison-text_equal"},{"id":"Libtmux.Expr.comparison.Text_in","publicId":"Libtmux.Expr.comparison.Text_in","name":"Text_in","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":643,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Text_in : string list -> string comparison","source":{"file":"lib/libtmux.mli","line":643,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.comparison","variant":"tuple","qualifiedName":"Libtmux.Expr.Text_in","slug":"libtmux-expr-comparison-text_in"},{"id":"Libtmux.Expr.comparison.Text_starts_with","publicId":"Libtmux.Expr.comparison.Text_starts_with","name":"Text_starts_with","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":640,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Text_starts_with : string -> string comparison","source":{"file":"lib/libtmux.mli","line":640,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.comparison","variant":"tuple","qualifiedName":"Libtmux.Expr.Text_starts_with","slug":"libtmux-expr-comparison-text_starts_with"},{"id":"Libtmux.Expr.compile","publicId":"Libtmux.Expr.compile","qualifiedName":"Libtmux.Expr.compile","name":"compile","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":624,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Prepare a reusable predicate. Compilation and evaluation perform no I/O.\n "],"declarations":[{"kind":"function","text":"val compile : 'a t -> 'a -> bool","source":{"file":"lib/libtmux.mli","line":624,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","doc":{"summary":"Prepare a reusable predicate. Compilation and evaluation perform no I/O."},"signatures":[{"raw":"val compile : 'a t -> 'a -> bool","params":[{"name":"arg1","type":"'a t"},{"name":"arg2","type":"'a"}],"returns":"bool"}],"slug":"libtmux-expr-compile"},{"id":"Libtmux.Expr.describe","publicId":"Libtmux.Expr.describe","qualifiedName":"Libtmux.Expr.describe","name":"describe","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":629,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val describe : 'a t -> string","source":{"file":"lib/libtmux.mli","line":629,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","signatures":[{"raw":"val describe : 'a t -> string","params":[{"name":"arg1","type":"'a t"}],"returns":"string"}],"slug":"libtmux-expr-describe"},{"id":"Libtmux.Expr.not_","publicId":"Libtmux.Expr.not_","qualifiedName":"Libtmux.Expr.not_","name":"not_","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":583,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val not_ : 'a t -> 'a t","source":{"file":"lib/libtmux.mli","line":583,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","signatures":[{"raw":"val not_ : 'a t -> 'a t","params":[{"name":"arg1","type":"'a t"}],"returns":"'a t"}],"slug":"libtmux-expr-not_"},{"id":"Libtmux.Expr.pp","publicId":"Libtmux.Expr.pp","qualifiedName":"Libtmux.Expr.pp","name":"pp","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":628,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pp : Format.formatter -> 'a t -> unit","source":{"file":"lib/libtmux.mli","line":628,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","signatures":[{"raw":"val pp : Format.formatter -> 'a t -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"'a t"}],"returns":"unit"}],"slug":"libtmux-expr-pp"},{"id":"Libtmux.Expr.t","publicId":"Libtmux.Expr.t","qualifiedName":"Libtmux.Expr.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":575,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type 'entity t","source":{"file":"lib/libtmux.mli","line":575,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","signatures":[{"raw":"type 'entity t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-expr-t"},{"id":"Libtmux.Expr.view","publicId":"Libtmux.Expr.view","qualifiedName":"Libtmux.Expr.view","name":"view","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":657,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Typed read-only inspection for codecs and planners. A view cannot add\n custom accessors or closures to an expression. "],"declarations":[{"kind":"function","text":"val view : 'a t -> 'a view","source":{"file":"lib/libtmux.mli","line":657,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","doc":{"summary":"Typed read-only inspection for codecs and planners. A view cannot add custom accessors or closures to an expression."},"signatures":[{"raw":"val view : 'a t -> 'a view","params":[{"name":"arg1","type":"'a t"}],"returns":"'a view"}],"slug":"libtmux-expr-view"},{"id":"Libtmux.Expr.view:type","publicId":"Libtmux.Expr.view:type","qualifiedName":"Libtmux.Expr.view","name":"view","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":645,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type 'a view =\n | Compare : ('a, 'v) Field.t * 'v comparison -> 'a view\n | All of 'a t list\n | Any of 'a t list\n | Not of 'a t\n | Related_any : ('a, 'b) Relation.Many.t * 'b t -> 'a view\n | Related_all : ('a, 'b) Relation.Many.t * 'b t -> 'a view\n | Related_none : ('a, 'b) Relation.Many.t * 'b t -> 'a view\n | Related_one : ('a, 'b) Relation.One.t * 'b t -> 'a view\n | Related_optional : ('a, 'b) Relation.Optional.t * 'b t -> 'a view\n | Absent : ('a, 'b) Relation.Optional.t -> 'a view","source":{"file":"lib/libtmux.mli","line":645,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr","signatures":[{"raw":"type 'a view =\n | Compare: ('a, 'v) Field.t * 'v comparison -> 'a view \n | All of 'a t list \n | Any of 'a t list \n | Not of 'a t \n | Related_any: ('a, 'b) Relation.Many.t * 'b t -> 'a view \n | Related_all: ('a, 'b) Relation.Many.t * 'b t -> 'a view \n | Related_none: ('a, 'b) Relation.Many.t * 'b t -> 'a view \n | Related_one: ('a, 'b) Relation.One.t * 'b t -> 'a view \n | Related_optional: ('a, 'b) Relation.Optional.t * 'b t -> 'a view \n | Absent: ('a, 'b) Relation.Optional.t -> 'a view ","params":[]}],"slug":"libtmux-expr-view-type"},{"id":"Libtmux.Expr.view:type.Absent","publicId":"Libtmux.Expr.view:type.Absent","name":"Absent","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":655,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Absent : ('a, 'b) Relation.Optional.t -> 'a view","source":{"file":"lib/libtmux.mli","line":655,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.view:type","variant":"tuple","qualifiedName":"Libtmux.Expr.Absent","slug":"libtmux-expr-view-type-absent"},{"id":"Libtmux.Expr.view:type.All","publicId":"Libtmux.Expr.view:type.All","name":"All","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":647,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| All of 'a t list","source":{"file":"lib/libtmux.mli","line":647,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.view:type","variant":"tuple","qualifiedName":"Libtmux.Expr.All","slug":"libtmux-expr-view-type-all"},{"id":"Libtmux.Expr.view:type.Any","publicId":"Libtmux.Expr.view:type.Any","name":"Any","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":648,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Any of 'a t list","source":{"file":"lib/libtmux.mli","line":648,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.view:type","variant":"tuple","qualifiedName":"Libtmux.Expr.Any","slug":"libtmux-expr-view-type-any"},{"id":"Libtmux.Expr.view:type.Compare","publicId":"Libtmux.Expr.view:type.Compare","name":"Compare","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":646,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Compare : ('a, 'v) Field.t * 'v comparison -> 'a view","source":{"file":"lib/libtmux.mli","line":646,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.view:type","variant":"tuple","qualifiedName":"Libtmux.Expr.Compare","slug":"libtmux-expr-view-type-compare"},{"id":"Libtmux.Expr.view:type.Not","publicId":"Libtmux.Expr.view:type.Not","name":"Not","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":649,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Not of 'a t","source":{"file":"lib/libtmux.mli","line":649,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.view:type","variant":"tuple","qualifiedName":"Libtmux.Expr.Not","slug":"libtmux-expr-view-type-not"},{"id":"Libtmux.Expr.view:type.Related_all","publicId":"Libtmux.Expr.view:type.Related_all","name":"Related_all","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":651,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Related_all : ('a, 'b) Relation.Many.t * 'b t -> 'a view","source":{"file":"lib/libtmux.mli","line":651,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.view:type","variant":"tuple","qualifiedName":"Libtmux.Expr.Related_all","slug":"libtmux-expr-view-type-related_all"},{"id":"Libtmux.Expr.view:type.Related_any","publicId":"Libtmux.Expr.view:type.Related_any","name":"Related_any","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":650,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Related_any : ('a, 'b) Relation.Many.t * 'b t -> 'a view","source":{"file":"lib/libtmux.mli","line":650,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.view:type","variant":"tuple","qualifiedName":"Libtmux.Expr.Related_any","slug":"libtmux-expr-view-type-related_any"},{"id":"Libtmux.Expr.view:type.Related_none","publicId":"Libtmux.Expr.view:type.Related_none","name":"Related_none","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":652,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Related_none : ('a, 'b) Relation.Many.t * 'b t -> 'a view","source":{"file":"lib/libtmux.mli","line":652,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.view:type","variant":"tuple","qualifiedName":"Libtmux.Expr.Related_none","slug":"libtmux-expr-view-type-related_none"},{"id":"Libtmux.Expr.view:type.Related_one","publicId":"Libtmux.Expr.view:type.Related_one","name":"Related_one","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":653,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Related_one : ('a, 'b) Relation.One.t * 'b t -> 'a view","source":{"file":"lib/libtmux.mli","line":653,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.view:type","variant":"tuple","qualifiedName":"Libtmux.Expr.Related_one","slug":"libtmux-expr-view-type-related_one"},{"id":"Libtmux.Expr.view:type.Related_optional","publicId":"Libtmux.Expr.view:type.Related_optional","name":"Related_optional","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":654,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Related_optional : ('a, 'b) Relation.Optional.t * 'b t -> 'a view","source":{"file":"lib/libtmux.mli","line":654,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Expr.view:type","variant":"tuple","qualifiedName":"Libtmux.Expr.Related_optional","slug":"libtmux-expr-view-type-related_optional"},{"id":"Libtmux.Field","publicId":"Libtmux.Field","qualifiedName":"Libtmux.Field","name":"Field","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":143,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Sealed scalar descriptors carrying entity and value types. Descriptors read\n captured data and provide trusted identities for {!Expr} values. Use\n {!Relation} for graph edges. "],"declarations":[{"kind":"module","text":"module Field : sig\n type _ kind = Bool : bool kind | Int : int kind | Text : string kind\n type ('entity, 'value) t\n type 'entity packed = Pack : ('entity, 'value) t -> 'entity packed\n\n val name : ('entity, 'value) t -> string\n val kind : ('entity, 'value) t -> 'value kind\n\n val get : ('entity, 'value) t -> 'entity -> 'value\n (** Canonical descriptors are sealed. Accessing a field reads captured data.\n *)\nend","source":{"file":"lib/libtmux.mli","line":143,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"Sealed scalar descriptors carrying entity and value types. Descriptors read captured data and provide trusted identities for {!Expr} values. Use {!Relation} for graph edges."},"slug":"libtmux-field"},{"id":"Libtmux.Field.get","publicId":"Libtmux.Field.get","qualifiedName":"Libtmux.Field.get","name":"get","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":151,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Canonical descriptors are sealed. Accessing a field reads captured data.\n "],"declarations":[{"kind":"function","text":"val get : ('entity, 'value) t -> 'entity -> 'value","source":{"file":"lib/libtmux.mli","line":151,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Field","doc":{"summary":"Canonical descriptors are sealed. Accessing a field reads captured data."},"signatures":[{"raw":"val get : ('entity, 'value) t -> 'entity -> 'value","params":[{"name":"arg1","type":"('entity, 'value) t"},{"name":"arg2","type":"'entity"}],"returns":"'value"}],"slug":"libtmux-field-get"},{"id":"Libtmux.Field.kind","publicId":"Libtmux.Field.kind","qualifiedName":"Libtmux.Field.kind","name":"kind","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":149,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val kind : ('entity, 'value) t -> 'value kind","source":{"file":"lib/libtmux.mli","line":149,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Field","signatures":[{"raw":"val kind : ('entity, 'value) t -> 'value kind","params":[{"name":"arg1","type":"('entity, 'value) t"}],"returns":"'value kind"}],"slug":"libtmux-field-kind"},{"id":"Libtmux.Field.kind:type","publicId":"Libtmux.Field.kind:type","qualifiedName":"Libtmux.Field.kind","name":"kind","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":144,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type _ kind = Bool : bool kind | Int : int kind | Text : string kind","source":{"file":"lib/libtmux.mli","line":144,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Field","signatures":[{"raw":"type _ kind =\n | Bool: bool kind \n | Int: int kind \n | Text: string kind ","params":[]}],"slug":"libtmux-field-kind-type"},{"id":"Libtmux.Field.kind:type.Bool","publicId":"Libtmux.Field.kind:type.Bool","name":"Bool","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":144,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Bool : bool kind","source":{"file":"lib/libtmux.mli","line":144,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Field.kind:type","variant":"unit","qualifiedName":"Libtmux.Field.Bool","slug":"libtmux-field-kind-type-bool"},{"id":"Libtmux.Field.kind:type.Int","publicId":"Libtmux.Field.kind:type.Int","name":"Int","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":144,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Int : int kind","source":{"file":"lib/libtmux.mli","line":144,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Field.kind:type","variant":"unit","qualifiedName":"Libtmux.Field.Int","slug":"libtmux-field-kind-type-int"},{"id":"Libtmux.Field.kind:type.Text","publicId":"Libtmux.Field.kind:type.Text","name":"Text","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":144,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Text : string kind","source":{"file":"lib/libtmux.mli","line":144,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Field.kind:type","variant":"unit","qualifiedName":"Libtmux.Field.Text","slug":"libtmux-field-kind-type-text"},{"id":"Libtmux.Field.name","publicId":"Libtmux.Field.name","qualifiedName":"Libtmux.Field.name","name":"name","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":148,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val name : ('entity, 'value) t -> string","source":{"file":"lib/libtmux.mli","line":148,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Field","signatures":[{"raw":"val name : ('entity, 'value) t -> string","params":[{"name":"arg1","type":"('entity, 'value) t"}],"returns":"string"}],"slug":"libtmux-field-name"},{"id":"Libtmux.Field.packed","publicId":"Libtmux.Field.packed","qualifiedName":"Libtmux.Field.packed","name":"packed","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":146,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type 'entity packed = Pack : ('entity, 'value) t -> 'entity packed","source":{"file":"lib/libtmux.mli","line":146,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Field","signatures":[{"raw":"type 'entity packed =\n | Pack: ('entity, 'value) t -> 'entity packed ","params":[]}],"slug":"libtmux-field-packed"},{"id":"Libtmux.Field.packed.Pack","publicId":"Libtmux.Field.packed.Pack","name":"Pack","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":146,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Pack : ('entity, 'value) t -> 'entity packed","source":{"file":"lib/libtmux.mli","line":146,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Field.packed","variant":"tuple","qualifiedName":"Libtmux.Field.Pack","slug":"libtmux-field-packed-pack"},{"id":"Libtmux.Field.t","publicId":"Libtmux.Field.t","qualifiedName":"Libtmux.Field.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":145,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type ('entity, 'value) t","source":{"file":"lib/libtmux.mli","line":145,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Field","signatures":[{"raw":"type ('entity, 'value) t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-field-t"},{"id":"Libtmux.Formats","publicId":"Libtmux.Formats","qualifiedName":"Libtmux.Formats","name":"Formats","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":495,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Formats : sig\n module Kind : sig\n type t = Text | Timestamp\n end\n\n module Context : sig\n type t =\n | Server\n | Connection\n | Session\n | Window\n | Window_link\n | Pane\n | Client\n | Buffer\n | Mouse\n | Command\n end\n\n type descriptor = {\n name : string;\n kind : Kind.t;\n contexts : Context.t list;\n versions : string list;\n }\n (** Metadata generated from pinned tmux format callbacks. [contexts] lists\n direct context dependencies, not a promise that a value exists. Caller\n variables from hooks and menus are outside this built-in catalog. *)\n\n type observation =\n | Snapshot of Snapshot.t\n | Session of Session.t\n | Window of Window.t\n | Window_link of Window_link.t\n | Pane of Pane.t\n | Client of Client_observation.t\n\n type scalar = Bool of bool | Int of int | Text of string\n\n type state =\n | Value of scalar\n | Missing\n | Unacquired\n | Unsupported\n (** [Missing] is an absence explicitly recorded in the observation, such\n as a client without terminal height. [Unacquired] means no captured\n value for this observation, including ambiguous session context for\n a pane. [Unsupported] means the name is outside the selected\n release's catalog. [Value (Text \"\")] is a captured empty string,\n never inferred absence. *)\n\n val catalog : version:string -> (descriptor Iarray.t, Error.t) result\n val describe : version:string -> string -> (descriptor option, Error.t) result\n\n val lookup :\n version:string -> observation -> string -> (state, Error.t) result\n (** No I/O. Supply the version recorded by the acquiring client's [version]\n accessor. Unsupported catalog versions return an error. Native typed\n accessors remain the primary API; lookup does not acquire extra fields. *)\nend","source":{"file":"lib/libtmux.mli","line":495,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","slug":"libtmux-formats"},{"id":"Libtmux.Formats.Context","publicId":"Libtmux.Formats.Context","qualifiedName":"Libtmux.Formats.Context","name":"Context","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":500,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Context : sig\n type t =\n | Server\n | Connection\n | Session\n | Window\n | Window_link\n | Pane\n | Client\n | Buffer\n | Mouse\n | Command\n end","source":{"file":"lib/libtmux.mli","line":500,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats","slug":"libtmux-formats-context"},{"id":"Libtmux.Formats.Context.t","publicId":"Libtmux.Formats.Context.t","qualifiedName":"Libtmux.Formats.Context.t","name":"t","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":501,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type t =\n | Server\n | Connection\n | Session\n | Window\n | Window_link\n | Pane\n | Client\n | Buffer\n | Mouse\n | Command","source":{"file":"lib/libtmux.mli","line":501,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Context","signatures":[{"raw":"type t =\n | Server \n | Connection \n | Session \n | Window \n | Window_link \n | Pane \n | Client \n | Buffer \n | Mouse \n | Command ","params":[]}],"slug":"libtmux-formats-context-t"},{"id":"Libtmux.Formats.Context.t.Buffer","publicId":"Libtmux.Formats.Context.t.Buffer","name":"Buffer","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":509,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Buffer","source":{"file":"lib/libtmux.mli","line":509,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Context.t","variant":"unit","qualifiedName":"Libtmux.Formats.Context.Buffer","slug":"libtmux-formats-context-t-buffer"},{"id":"Libtmux.Formats.Context.t.Client","publicId":"Libtmux.Formats.Context.t.Client","name":"Client","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":508,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Client","source":{"file":"lib/libtmux.mli","line":508,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Context.t","variant":"unit","qualifiedName":"Libtmux.Formats.Context.Client","slug":"libtmux-formats-context-t-client"},{"id":"Libtmux.Formats.Context.t.Command","publicId":"Libtmux.Formats.Context.t.Command","name":"Command","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":511,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Command","source":{"file":"lib/libtmux.mli","line":511,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Context.t","variant":"unit","qualifiedName":"Libtmux.Formats.Context.Command","slug":"libtmux-formats-context-t-command"},{"id":"Libtmux.Formats.Context.t.Connection","publicId":"Libtmux.Formats.Context.t.Connection","name":"Connection","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":503,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Connection","source":{"file":"lib/libtmux.mli","line":503,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Context.t","variant":"unit","qualifiedName":"Libtmux.Formats.Context.Connection","slug":"libtmux-formats-context-t-connection"},{"id":"Libtmux.Formats.Context.t.Mouse","publicId":"Libtmux.Formats.Context.t.Mouse","name":"Mouse","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":510,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Mouse","source":{"file":"lib/libtmux.mli","line":510,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Context.t","variant":"unit","qualifiedName":"Libtmux.Formats.Context.Mouse","slug":"libtmux-formats-context-t-mouse"},{"id":"Libtmux.Formats.Context.t.Pane","publicId":"Libtmux.Formats.Context.t.Pane","name":"Pane","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":507,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Pane","source":{"file":"lib/libtmux.mli","line":507,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Context.t","variant":"unit","qualifiedName":"Libtmux.Formats.Context.Pane","slug":"libtmux-formats-context-t-pane"},{"id":"Libtmux.Formats.Context.t.Server","publicId":"Libtmux.Formats.Context.t.Server","name":"Server","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":502,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Server","source":{"file":"lib/libtmux.mli","line":502,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Context.t","variant":"unit","qualifiedName":"Libtmux.Formats.Context.Server","slug":"libtmux-formats-context-t-server"},{"id":"Libtmux.Formats.Context.t.Session","publicId":"Libtmux.Formats.Context.t.Session","name":"Session","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":504,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Session","source":{"file":"lib/libtmux.mli","line":504,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Context.t","variant":"unit","qualifiedName":"Libtmux.Formats.Context.Session","slug":"libtmux-formats-context-t-session"},{"id":"Libtmux.Formats.Context.t.Window","publicId":"Libtmux.Formats.Context.t.Window","name":"Window","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":505,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Window","source":{"file":"lib/libtmux.mli","line":505,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Context.t","variant":"unit","qualifiedName":"Libtmux.Formats.Context.Window","slug":"libtmux-formats-context-t-window"},{"id":"Libtmux.Formats.Context.t.Window_link","publicId":"Libtmux.Formats.Context.t.Window_link","name":"Window_link","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":506,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Window_link","source":{"file":"lib/libtmux.mli","line":506,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Context.t","variant":"unit","qualifiedName":"Libtmux.Formats.Context.Window_link","slug":"libtmux-formats-context-t-window_link"},{"id":"Libtmux.Formats.Kind","publicId":"Libtmux.Formats.Kind","qualifiedName":"Libtmux.Formats.Kind","name":"Kind","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":496,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Kind : sig\n type t = Text | Timestamp\n end","source":{"file":"lib/libtmux.mli","line":496,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats","slug":"libtmux-formats-kind"},{"id":"Libtmux.Formats.Kind.t","publicId":"Libtmux.Formats.Kind.t","qualifiedName":"Libtmux.Formats.Kind.t","name":"t","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":497,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type t = Text | Timestamp","source":{"file":"lib/libtmux.mli","line":497,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Kind","signatures":[{"raw":"type t =\n | Text \n | Timestamp ","params":[]}],"slug":"libtmux-formats-kind-t"},{"id":"Libtmux.Formats.Kind.t.Text","publicId":"Libtmux.Formats.Kind.t.Text","name":"Text","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":497,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Text","source":{"file":"lib/libtmux.mli","line":497,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Kind.t","variant":"unit","qualifiedName":"Libtmux.Formats.Kind.Text","slug":"libtmux-formats-kind-t-text"},{"id":"Libtmux.Formats.Kind.t.Timestamp","publicId":"Libtmux.Formats.Kind.t.Timestamp","name":"Timestamp","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":497,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Timestamp","source":{"file":"lib/libtmux.mli","line":497,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.Kind.t","variant":"unit","qualifiedName":"Libtmux.Formats.Kind.Timestamp","slug":"libtmux-formats-kind-t-timestamp"},{"id":"Libtmux.Formats.catalog","publicId":"Libtmux.Formats.catalog","qualifiedName":"Libtmux.Formats.catalog","name":"catalog","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":546,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val catalog : version:string -> (descriptor Iarray.t, Error.t) result","source":{"file":"lib/libtmux.mli","line":546,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats","signatures":[{"raw":"val catalog : version:string -> (descriptor Iarray.t, Error.t) result","params":[{"name":"version","type":"string","keywordOnly":true}],"returns":"(descriptor Iarray.t, Error.t) result"}],"slug":"libtmux-formats-catalog"},{"id":"Libtmux.Formats.describe","publicId":"Libtmux.Formats.describe","qualifiedName":"Libtmux.Formats.describe","name":"describe","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":547,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val describe : version:string -> string -> (descriptor option, Error.t) result","source":{"file":"lib/libtmux.mli","line":547,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats","signatures":[{"raw":"val describe :\n version:string -> string -> (descriptor option, Error.t) result","params":[{"name":"version","type":"string","keywordOnly":true},{"name":"arg1","type":"string"}],"returns":"(descriptor option, Error.t) result"}],"slug":"libtmux-formats-describe"},{"id":"Libtmux.Formats.descriptor","publicId":"Libtmux.Formats.descriptor","qualifiedName":"Libtmux.Formats.descriptor","name":"descriptor","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":514,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Metadata generated from pinned tmux format callbacks. [contexts] lists\n direct context dependencies, not a promise that a value exists. Caller\n variables from hooks and menus are outside this built-in catalog. "],"declarations":[{"kind":"struct","text":"type descriptor = {\n name : string;\n kind : Kind.t;\n contexts : Context.t list;\n versions : string list;\n }","source":{"file":"lib/libtmux.mli","line":514,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats","doc":{"summary":"Metadata generated from pinned tmux format callbacks. `contexts` lists direct context dependencies, not a promise that a value exists. Caller variables from hooks and menus are outside this built-in catalog."},"signatures":[{"raw":"type descriptor =\n {\n name: string ;\n kind: Kind.t ;\n contexts: Context.t list ;\n versions: string list }","params":[]}],"slug":"libtmux-formats-descriptor"},{"id":"Libtmux.Formats.descriptor.contexts","publicId":"Libtmux.Formats.descriptor.contexts","name":"contexts","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":517,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"contexts : Context.t list;","source":{"file":"lib/libtmux.mli","line":517,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.descriptor","type":"Context.t list","qualifiedName":"Libtmux.Formats.contexts","slug":"libtmux-formats-descriptor-contexts"},{"id":"Libtmux.Formats.descriptor.kind","publicId":"Libtmux.Formats.descriptor.kind","name":"kind","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":516,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"kind : Kind.t;","source":{"file":"lib/libtmux.mli","line":516,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.descriptor","type":"Kind.t","qualifiedName":"Libtmux.Formats.kind","slug":"libtmux-formats-descriptor-kind"},{"id":"Libtmux.Formats.descriptor.name","publicId":"Libtmux.Formats.descriptor.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":515,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"lib/libtmux.mli","line":515,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.descriptor","type":"string","qualifiedName":"Libtmux.Formats.name","slug":"libtmux-formats-descriptor-name"},{"id":"Libtmux.Formats.descriptor.versions","publicId":"Libtmux.Formats.descriptor.versions","name":"versions","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":518,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"versions : string list;","source":{"file":"lib/libtmux.mli","line":518,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.descriptor","type":"string list","qualifiedName":"Libtmux.Formats.versions","slug":"libtmux-formats-descriptor-versions"},{"id":"Libtmux.Formats.lookup","publicId":"Libtmux.Formats.lookup","qualifiedName":"Libtmux.Formats.lookup","name":"lookup","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":549,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" No I/O. Supply the version recorded by the acquiring client's [version]\n accessor. Unsupported catalog versions return an error. Native typed\n accessors remain the primary API; lookup does not acquire extra fields. "],"declarations":[{"kind":"function","text":"val lookup :\n version:string -> observation -> string -> (state, Error.t) result","source":{"file":"lib/libtmux.mli","line":549,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats","doc":{"summary":"No I/O. Supply the version recorded by the acquiring client's `version` accessor. Unsupported catalog versions return an error. Native typed accessors remain the primary API; lookup does not acquire extra fields."},"signatures":[{"raw":"val lookup :\n version:string -> observation -> string -> (state, Error.t) result","params":[{"name":"version","type":"string","keywordOnly":true},{"name":"arg1","type":"observation"},{"name":"arg2","type":"string"}],"returns":"(state, Error.t) result"}],"slug":"libtmux-formats-lookup"},{"id":"Libtmux.Formats.observation","publicId":"Libtmux.Formats.observation","qualifiedName":"Libtmux.Formats.observation","name":"observation","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":524,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type observation =\n | Snapshot of Snapshot.t\n | Session of Session.t\n | Window of Window.t\n | Window_link of Window_link.t\n | Pane of Pane.t\n | Client of Client_observation.t","source":{"file":"lib/libtmux.mli","line":524,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats","signatures":[{"raw":"type observation =\n | Snapshot of Snapshot.t \n | Session of Session.t \n | Window of Window.t \n | Window_link of Window_link.t \n | Pane of Pane.t \n | Client of Client_observation.t ","params":[]}],"slug":"libtmux-formats-observation"},{"id":"Libtmux.Formats.observation.Client","publicId":"Libtmux.Formats.observation.Client","name":"Client","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":530,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Client of Client_observation.t","source":{"file":"lib/libtmux.mli","line":530,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.observation","variant":"tuple","qualifiedName":"Libtmux.Formats.Client","slug":"libtmux-formats-observation-client"},{"id":"Libtmux.Formats.observation.Pane","publicId":"Libtmux.Formats.observation.Pane","name":"Pane","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":529,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Pane of Pane.t","source":{"file":"lib/libtmux.mli","line":529,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.observation","variant":"tuple","qualifiedName":"Libtmux.Formats.Pane","slug":"libtmux-formats-observation-pane"},{"id":"Libtmux.Formats.observation.Session","publicId":"Libtmux.Formats.observation.Session","name":"Session","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":526,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Session of Session.t","source":{"file":"lib/libtmux.mli","line":526,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.observation","variant":"tuple","qualifiedName":"Libtmux.Formats.Session","slug":"libtmux-formats-observation-session"},{"id":"Libtmux.Formats.observation.Snapshot","publicId":"Libtmux.Formats.observation.Snapshot","name":"Snapshot","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":525,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Snapshot of Snapshot.t","source":{"file":"lib/libtmux.mli","line":525,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.observation","variant":"tuple","qualifiedName":"Libtmux.Formats.Snapshot","slug":"libtmux-formats-observation-snapshot"},{"id":"Libtmux.Formats.observation.Window","publicId":"Libtmux.Formats.observation.Window","name":"Window","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":527,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Window of Window.t","source":{"file":"lib/libtmux.mli","line":527,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.observation","variant":"tuple","qualifiedName":"Libtmux.Formats.Window","slug":"libtmux-formats-observation-window"},{"id":"Libtmux.Formats.observation.Window_link","publicId":"Libtmux.Formats.observation.Window_link","name":"Window_link","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":528,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Window_link of Window_link.t","source":{"file":"lib/libtmux.mli","line":528,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.observation","variant":"tuple","qualifiedName":"Libtmux.Formats.Window_link","slug":"libtmux-formats-observation-window_link"},{"id":"Libtmux.Formats.scalar","publicId":"Libtmux.Formats.scalar","qualifiedName":"Libtmux.Formats.scalar","name":"scalar","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":532,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type scalar = Bool of bool | Int of int | Text of string","source":{"file":"lib/libtmux.mli","line":532,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats","signatures":[{"raw":"type scalar =\n | Bool of bool \n | Int of int \n | Text of string ","params":[]}],"slug":"libtmux-formats-scalar"},{"id":"Libtmux.Formats.scalar.Bool","publicId":"Libtmux.Formats.scalar.Bool","name":"Bool","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":532,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Bool of bool","source":{"file":"lib/libtmux.mli","line":532,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.scalar","variant":"tuple","qualifiedName":"Libtmux.Formats.Bool","slug":"libtmux-formats-scalar-bool"},{"id":"Libtmux.Formats.scalar.Int","publicId":"Libtmux.Formats.scalar.Int","name":"Int","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":532,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Int of int","source":{"file":"lib/libtmux.mli","line":532,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.scalar","variant":"tuple","qualifiedName":"Libtmux.Formats.Int","slug":"libtmux-formats-scalar-int"},{"id":"Libtmux.Formats.scalar.Text","publicId":"Libtmux.Formats.scalar.Text","name":"Text","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":532,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Text of string","source":{"file":"lib/libtmux.mli","line":532,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.scalar","variant":"tuple","qualifiedName":"Libtmux.Formats.Text","slug":"libtmux-formats-scalar-text"},{"id":"Libtmux.Formats.state","publicId":"Libtmux.Formats.state","qualifiedName":"Libtmux.Formats.state","name":"state","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":534,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type state =\n | Value of scalar\n | Missing\n | Unacquired\n | Unsupported","source":{"file":"lib/libtmux.mli","line":534,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats","signatures":[{"raw":"type state =\n | Value of scalar \n | Missing \n | Unacquired \n | Unsupported ","params":[]}],"slug":"libtmux-formats-state"},{"id":"Libtmux.Formats.state.Missing","publicId":"Libtmux.Formats.state.Missing","name":"Missing","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":536,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Missing","source":{"file":"lib/libtmux.mli","line":536,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.state","variant":"unit","qualifiedName":"Libtmux.Formats.Missing","slug":"libtmux-formats-state-missing"},{"id":"Libtmux.Formats.state.Unacquired","publicId":"Libtmux.Formats.state.Unacquired","name":"Unacquired","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":537,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unacquired","source":{"file":"lib/libtmux.mli","line":537,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.state","variant":"unit","qualifiedName":"Libtmux.Formats.Unacquired","slug":"libtmux-formats-state-unacquired"},{"id":"Libtmux.Formats.state.Unsupported","publicId":"Libtmux.Formats.state.Unsupported","name":"Unsupported","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":538,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" [Missing] is an absence explicitly recorded in the observation, such\n as a client without terminal height. [Unacquired] means no captured\n value for this observation, including ambiguous session context for\n a pane. [Unsupported] means the name is outside the selected\n release's catalog. [Value (Text \"\")] is a captured empty string,\n never inferred absence. "],"declarations":[{"kind":"constant","text":"| Unsupported","source":{"file":"lib/libtmux.mli","line":538,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.state","doc":{"summary":"`Missing` is an absence explicitly recorded in the observation, such as a client without terminal height. `Unacquired` means no captured value for this observation, including ambiguous session context for a pane. `Unsupported` means the name is outside the selected release's catalog. `Value (Text \"\")` is a captured empty string, never inferred absence."},"variant":"unit","qualifiedName":"Libtmux.Formats.Unsupported","slug":"libtmux-formats-state-unsupported"},{"id":"Libtmux.Formats.state.Value","publicId":"Libtmux.Formats.state.Value","name":"Value","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":535,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Value of scalar","source":{"file":"lib/libtmux.mli","line":535,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Formats.state","variant":"tuple","qualifiedName":"Libtmux.Formats.Value","slug":"libtmux-formats-state-value"},{"id":"Libtmux.Generation","publicId":"Libtmux.Generation","qualifiedName":"Libtmux.Generation","name":"Generation","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":83,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" A random connection-generation identifier. Reconnecting creates a new\n generation even when the socket and server PID are unchanged. "],"declarations":[{"kind":"module","text":"module Generation : sig\n type t\n\n val of_string : string -> (t, Error.t) result\n (** Import a 256-bit connection nonce as 64 lowercase hexadecimal characters.\n Backends generate a fresh random nonce for each connection. *)\n\n val to_string : t -> string\n val equal : t -> t -> bool\nend","source":{"file":"lib/libtmux.mli","line":83,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"A random connection-generation identifier. Reconnecting creates a new generation even when the socket and server PID are unchanged."},"slug":"libtmux-generation"},{"id":"Libtmux.Generation.equal","publicId":"Libtmux.Generation.equal","qualifiedName":"Libtmux.Generation.equal","name":"equal","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":91,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val equal : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":91,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Generation","signatures":[{"raw":"val equal : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-generation-equal"},{"id":"Libtmux.Generation.of_string","publicId":"Libtmux.Generation.of_string","qualifiedName":"Libtmux.Generation.of_string","name":"of_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":86,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Import a 256-bit connection nonce as 64 lowercase hexadecimal characters.\n Backends generate a fresh random nonce for each connection. "],"declarations":[{"kind":"function","text":"val of_string : string -> (t, Error.t) result","source":{"file":"lib/libtmux.mli","line":86,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Generation","doc":{"summary":"Import a 256-bit connection nonce as 64 lowercase hexadecimal characters. Backends generate a fresh random nonce for each connection."},"signatures":[{"raw":"val of_string : string -> (t, Error.t) result","params":[{"name":"arg1","type":"string"}],"returns":"(t, Error.t) result"}],"slug":"libtmux-generation-of_string"},{"id":"Libtmux.Generation.t","publicId":"Libtmux.Generation.t","qualifiedName":"Libtmux.Generation.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":84,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":84,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Generation","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-generation-t"},{"id":"Libtmux.Generation.to_string","publicId":"Libtmux.Generation.to_string","qualifiedName":"Libtmux.Generation.to_string","name":"to_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":90,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val to_string : t -> string","source":{"file":"lib/libtmux.mli","line":90,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Generation","signatures":[{"raw":"val to_string : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-generation-to_string"},{"id":"Libtmux.Geometry","publicId":"Libtmux.Geometry","qualifiedName":"Libtmux.Geometry","name":"Geometry","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":762,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Geometry : sig\n type direction = Left | Right | Above | Below\n type size = Cells of int | Percent of int\nend","source":{"file":"lib/libtmux.mli","line":762,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","slug":"libtmux-geometry"},{"id":"Libtmux.Geometry.direction","publicId":"Libtmux.Geometry.direction","qualifiedName":"Libtmux.Geometry.direction","name":"direction","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":763,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type direction = Left | Right | Above | Below","source":{"file":"lib/libtmux.mli","line":763,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Geometry","signatures":[{"raw":"type direction =\n | Left \n | Right \n | Above \n | Below ","params":[]}],"slug":"libtmux-geometry-direction"},{"id":"Libtmux.Geometry.direction.Above","publicId":"Libtmux.Geometry.direction.Above","name":"Above","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":763,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Above","source":{"file":"lib/libtmux.mli","line":763,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Geometry.direction","variant":"unit","qualifiedName":"Libtmux.Geometry.Above","slug":"libtmux-geometry-direction-above"},{"id":"Libtmux.Geometry.direction.Below","publicId":"Libtmux.Geometry.direction.Below","name":"Below","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":763,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Below","source":{"file":"lib/libtmux.mli","line":763,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Geometry.direction","variant":"unit","qualifiedName":"Libtmux.Geometry.Below","slug":"libtmux-geometry-direction-below"},{"id":"Libtmux.Geometry.direction.Left","publicId":"Libtmux.Geometry.direction.Left","name":"Left","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":763,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Left","source":{"file":"lib/libtmux.mli","line":763,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Geometry.direction","variant":"unit","qualifiedName":"Libtmux.Geometry.Left","slug":"libtmux-geometry-direction-left"},{"id":"Libtmux.Geometry.direction.Right","publicId":"Libtmux.Geometry.direction.Right","name":"Right","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":763,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Right","source":{"file":"lib/libtmux.mli","line":763,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Geometry.direction","variant":"unit","qualifiedName":"Libtmux.Geometry.Right","slug":"libtmux-geometry-direction-right"},{"id":"Libtmux.Geometry.size","publicId":"Libtmux.Geometry.size","qualifiedName":"Libtmux.Geometry.size","name":"size","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":764,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type size = Cells of int | Percent of int","source":{"file":"lib/libtmux.mli","line":764,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Geometry","signatures":[{"raw":"type size =\n | Cells of int \n | Percent of int ","params":[]}],"slug":"libtmux-geometry-size"},{"id":"Libtmux.Geometry.size.Cells","publicId":"Libtmux.Geometry.size.Cells","name":"Cells","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":764,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Cells of int","source":{"file":"lib/libtmux.mli","line":764,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Geometry.size","variant":"tuple","qualifiedName":"Libtmux.Geometry.Cells","slug":"libtmux-geometry-size-cells"},{"id":"Libtmux.Geometry.size.Percent","publicId":"Libtmux.Geometry.size.Percent","name":"Percent","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":764,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Percent of int","source":{"file":"lib/libtmux.mli","line":764,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Geometry.size","variant":"tuple","qualifiedName":"Libtmux.Geometry.Percent","slug":"libtmux-geometry-size-percent"},{"id":"Libtmux.Hook","publicId":"Libtmux.Hook","qualifiedName":"Libtmux.Hook","name":"Hook","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":873,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Hook : sig\n type command = { name : string; arguments : string list }\n (** A tmux command and its distinct arguments. Setting a hook encodes these as\n command data; it does not concatenate arguments into shell code.\n Argument-specific tmux behavior, including format expansion, still applies\n when the hook runs. *)\nend","source":{"file":"lib/libtmux.mli","line":873,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","slug":"libtmux-hook"},{"id":"Libtmux.Hook.command","publicId":"Libtmux.Hook.command","qualifiedName":"Libtmux.Hook.command","name":"command","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":874,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" A tmux command and its distinct arguments. Setting a hook encodes these as\n command data; it does not concatenate arguments into shell code.\n Argument-specific tmux behavior, including format expansion, still applies\n when the hook runs. "],"declarations":[{"kind":"struct","text":"type command = { name : string; arguments : string list }","source":{"file":"lib/libtmux.mli","line":874,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Hook","doc":{"summary":"A tmux command and its distinct arguments. Setting a hook encodes these as command data; it does not concatenate arguments into shell code. Argument-specific tmux behavior, including format expansion, still applies when the hook runs."},"signatures":[{"raw":"type command = {\n name: string ;\n arguments: string list }","params":[]}],"slug":"libtmux-hook-command"},{"id":"Libtmux.Hook.command.arguments","publicId":"Libtmux.Hook.command.arguments","name":"arguments","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":874,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"arguments : string list","source":{"file":"lib/libtmux.mli","line":874,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Hook.command","type":"string list","qualifiedName":"Libtmux.Hook.arguments","slug":"libtmux-hook-command-arguments"},{"id":"Libtmux.Hook.command.name","publicId":"Libtmux.Hook.command.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":874,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"lib/libtmux.mli","line":874,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Hook.command","type":"string","qualifiedName":"Libtmux.Hook.name","slug":"libtmux-hook-command-name"},{"id":"Libtmux.ID","publicId":"Libtmux.ID","qualifiedName":"Libtmux.ID","name":"ID","kind":"interface","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":128,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"interface","text":"module type ID = sig\n type t\n\n val of_string : string -> (t, Error.t) result\n (** Accept a canonical prefixed decimal tmux ID in the uint32 range. *)\n\n val to_string : t -> string\n val equal : t -> t -> bool\n val compare : t -> t -> int\n val pp : Format.formatter -> t -> unit\nend","source":{"file":"lib/libtmux.mli","line":128,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","slug":"libtmux-id"},{"id":"Libtmux.ID.compare","publicId":"Libtmux.ID.compare","qualifiedName":"Libtmux.ID.compare","name":"compare","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":136,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val compare : t -> t -> int","source":{"file":"lib/libtmux.mli","line":136,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.ID","signatures":[{"raw":"val compare : t -> t -> int","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"int"}],"slug":"libtmux-id-compare"},{"id":"Libtmux.ID.equal","publicId":"Libtmux.ID.equal","qualifiedName":"Libtmux.ID.equal","name":"equal","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":135,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val equal : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":135,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.ID","signatures":[{"raw":"val equal : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-id-equal"},{"id":"Libtmux.ID.of_string","publicId":"Libtmux.ID.of_string","qualifiedName":"Libtmux.ID.of_string","name":"of_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":131,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Accept a canonical prefixed decimal tmux ID in the uint32 range. "],"declarations":[{"kind":"function","text":"val of_string : string -> (t, Error.t) result","source":{"file":"lib/libtmux.mli","line":131,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.ID","doc":{"summary":"Accept a canonical prefixed decimal tmux ID in the uint32 range."},"signatures":[{"raw":"val of_string : string -> (t, Error.t) result","params":[{"name":"arg1","type":"string"}],"returns":"(t, Error.t) result"}],"slug":"libtmux-id-of_string"},{"id":"Libtmux.ID.pp","publicId":"Libtmux.ID.pp","qualifiedName":"Libtmux.ID.pp","name":"pp","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":137,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pp : Format.formatter -> t -> unit","source":{"file":"lib/libtmux.mli","line":137,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.ID","signatures":[{"raw":"val pp : Format.formatter -> t -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"t"}],"returns":"unit"}],"slug":"libtmux-id-pp"},{"id":"Libtmux.ID.t","publicId":"Libtmux.ID.t","qualifiedName":"Libtmux.ID.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":129,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":129,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.ID","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-id-t"},{"id":"Libtmux.ID.to_string","publicId":"Libtmux.ID.to_string","qualifiedName":"Libtmux.ID.to_string","name":"to_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":134,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val to_string : t -> string","source":{"file":"lib/libtmux.mli","line":134,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.ID","signatures":[{"raw":"val to_string : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-id-to_string"},{"id":"Libtmux.Key","publicId":"Libtmux.Key","qualifiedName":"Libtmux.Key","name":"Key","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":724,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Key : sig\n type t =\n | Enter\n | Tab\n | Escape\n | Backspace\n | Up\n | Down\n | Left\n | Right\n | Control of char\nend","source":{"file":"lib/libtmux.mli","line":724,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","slug":"libtmux-key"},{"id":"Libtmux.Key.t","publicId":"Libtmux.Key.t","qualifiedName":"Libtmux.Key.t","name":"t","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":725,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type t =\n | Enter\n | Tab\n | Escape\n | Backspace\n | Up\n | Down\n | Left\n | Right\n | Control of char","source":{"file":"lib/libtmux.mli","line":725,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Key","signatures":[{"raw":"type t =\n | Enter \n | Tab \n | Escape \n | Backspace \n | Up \n | Down \n | Left \n | Right \n | Control of char ","params":[]}],"slug":"libtmux-key-t"},{"id":"Libtmux.Key.t.Backspace","publicId":"Libtmux.Key.t.Backspace","name":"Backspace","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":729,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Backspace","source":{"file":"lib/libtmux.mli","line":729,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Key.t","variant":"unit","qualifiedName":"Libtmux.Key.Backspace","slug":"libtmux-key-t-backspace"},{"id":"Libtmux.Key.t.Control","publicId":"Libtmux.Key.t.Control","name":"Control","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":734,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Control of char","source":{"file":"lib/libtmux.mli","line":734,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Key.t","variant":"tuple","qualifiedName":"Libtmux.Key.Control","slug":"libtmux-key-t-control"},{"id":"Libtmux.Key.t.Down","publicId":"Libtmux.Key.t.Down","name":"Down","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":731,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Down","source":{"file":"lib/libtmux.mli","line":731,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Key.t","variant":"unit","qualifiedName":"Libtmux.Key.Down","slug":"libtmux-key-t-down"},{"id":"Libtmux.Key.t.Enter","publicId":"Libtmux.Key.t.Enter","name":"Enter","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":726,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Enter","source":{"file":"lib/libtmux.mli","line":726,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Key.t","variant":"unit","qualifiedName":"Libtmux.Key.Enter","slug":"libtmux-key-t-enter"},{"id":"Libtmux.Key.t.Escape","publicId":"Libtmux.Key.t.Escape","name":"Escape","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":728,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Escape","source":{"file":"lib/libtmux.mli","line":728,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Key.t","variant":"unit","qualifiedName":"Libtmux.Key.Escape","slug":"libtmux-key-t-escape"},{"id":"Libtmux.Key.t.Left","publicId":"Libtmux.Key.t.Left","name":"Left","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":732,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Left","source":{"file":"lib/libtmux.mli","line":732,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Key.t","variant":"unit","qualifiedName":"Libtmux.Key.Left","slug":"libtmux-key-t-left"},{"id":"Libtmux.Key.t.Right","publicId":"Libtmux.Key.t.Right","name":"Right","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":733,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Right","source":{"file":"lib/libtmux.mli","line":733,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Key.t","variant":"unit","qualifiedName":"Libtmux.Key.Right","slug":"libtmux-key-t-right"},{"id":"Libtmux.Key.t.Tab","publicId":"Libtmux.Key.t.Tab","name":"Tab","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":727,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Tab","source":{"file":"lib/libtmux.mli","line":727,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Key.t","variant":"unit","qualifiedName":"Libtmux.Key.Tab","slug":"libtmux-key-t-tab"},{"id":"Libtmux.Key.t.Up","publicId":"Libtmux.Key.t.Up","name":"Up","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":730,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Up","source":{"file":"lib/libtmux.mli","line":730,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Key.t","variant":"unit","qualifiedName":"Libtmux.Key.Up","slug":"libtmux-key-t-up"},{"id":"Libtmux.Layout","publicId":"Libtmux.Layout","qualifiedName":"Libtmux.Layout","name":"Layout","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":767,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Layout : sig\n type t =\n | Even_horizontal\n | Even_vertical\n | Main_horizontal\n | Main_vertical\n | Tiled\n | Custom of string\nend","source":{"file":"lib/libtmux.mli","line":767,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","slug":"libtmux-layout"},{"id":"Libtmux.Layout.t","publicId":"Libtmux.Layout.t","qualifiedName":"Libtmux.Layout.t","name":"t","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":768,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type t =\n | Even_horizontal\n | Even_vertical\n | Main_horizontal\n | Main_vertical\n | Tiled\n | Custom of string","source":{"file":"lib/libtmux.mli","line":768,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Layout","signatures":[{"raw":"type t =\n | Even_horizontal \n | Even_vertical \n | Main_horizontal \n | Main_vertical \n | Tiled \n | Custom of string ","params":[]}],"slug":"libtmux-layout-t"},{"id":"Libtmux.Layout.t.Custom","publicId":"Libtmux.Layout.t.Custom","name":"Custom","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":774,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Custom of string","source":{"file":"lib/libtmux.mli","line":774,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Layout.t","variant":"tuple","qualifiedName":"Libtmux.Layout.Custom","slug":"libtmux-layout-t-custom"},{"id":"Libtmux.Layout.t.Even_horizontal","publicId":"Libtmux.Layout.t.Even_horizontal","name":"Even_horizontal","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":769,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Even_horizontal","source":{"file":"lib/libtmux.mli","line":769,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Layout.t","variant":"unit","qualifiedName":"Libtmux.Layout.Even_horizontal","slug":"libtmux-layout-t-even_horizontal"},{"id":"Libtmux.Layout.t.Even_vertical","publicId":"Libtmux.Layout.t.Even_vertical","name":"Even_vertical","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":770,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Even_vertical","source":{"file":"lib/libtmux.mli","line":770,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Layout.t","variant":"unit","qualifiedName":"Libtmux.Layout.Even_vertical","slug":"libtmux-layout-t-even_vertical"},{"id":"Libtmux.Layout.t.Main_horizontal","publicId":"Libtmux.Layout.t.Main_horizontal","name":"Main_horizontal","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":771,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Main_horizontal","source":{"file":"lib/libtmux.mli","line":771,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Layout.t","variant":"unit","qualifiedName":"Libtmux.Layout.Main_horizontal","slug":"libtmux-layout-t-main_horizontal"},{"id":"Libtmux.Layout.t.Main_vertical","publicId":"Libtmux.Layout.t.Main_vertical","name":"Main_vertical","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":772,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Main_vertical","source":{"file":"lib/libtmux.mli","line":772,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Layout.t","variant":"unit","qualifiedName":"Libtmux.Layout.Main_vertical","slug":"libtmux-layout-t-main_vertical"},{"id":"Libtmux.Layout.t.Tiled","publicId":"Libtmux.Layout.t.Tiled","name":"Tiled","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":773,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Tiled","source":{"file":"lib/libtmux.mli","line":773,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Layout.t","variant":"unit","qualifiedName":"Libtmux.Layout.Tiled","slug":"libtmux-layout-t-tiled"},{"id":"Libtmux.Model","publicId":"Libtmux.Model","qualifiedName":"Libtmux.Model","name":"Model","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":558,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Built-in model witnesses and canonical field lookup for typed codecs.\n Untrusted field names must resolve against the selected model. "],"declarations":[{"kind":"module","text":"module Model : sig\n type 'a t\n\n val session : Session.t t\n val window : Window.t t\n val window_link : Window_link.t t\n val pane : Pane.t t\n val client : Client_observation.t t\n val name : 'a t -> string\n val fields : 'a t -> 'a Field.packed list\n val find_field : 'a t -> string -> 'a Field.packed option\nend","source":{"file":"lib/libtmux.mli","line":558,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"Built-in model witnesses and canonical field lookup for typed codecs. Untrusted field names must resolve against the selected model."},"slug":"libtmux-model"},{"id":"Libtmux.Model.client","publicId":"Libtmux.Model.client","qualifiedName":"Libtmux.Model.client","name":"client","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":565,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val client : Client_observation.t t","source":{"file":"lib/libtmux.mli","line":565,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Model","signatures":[{"raw":"val client : Client_observation.t t","params":[],"returns":"Client_observation.t t"}],"slug":"libtmux-model-client"},{"id":"Libtmux.Model.fields","publicId":"Libtmux.Model.fields","qualifiedName":"Libtmux.Model.fields","name":"fields","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":567,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val fields : 'a t -> 'a Field.packed list","source":{"file":"lib/libtmux.mli","line":567,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Model","signatures":[{"raw":"val fields : 'a t -> 'a Field.packed list","params":[{"name":"arg1","type":"'a t"}],"returns":"'a Field.packed list"}],"slug":"libtmux-model-fields"},{"id":"Libtmux.Model.find_field","publicId":"Libtmux.Model.find_field","qualifiedName":"Libtmux.Model.find_field","name":"find_field","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":568,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val find_field : 'a t -> string -> 'a Field.packed option","source":{"file":"lib/libtmux.mli","line":568,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Model","signatures":[{"raw":"val find_field : 'a t -> string -> 'a Field.packed option","params":[{"name":"arg1","type":"'a t"},{"name":"arg2","type":"string"}],"returns":"'a Field.packed option"}],"slug":"libtmux-model-find_field"},{"id":"Libtmux.Model.name","publicId":"Libtmux.Model.name","qualifiedName":"Libtmux.Model.name","name":"name","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":566,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val name : 'a t -> string","source":{"file":"lib/libtmux.mli","line":566,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Model","signatures":[{"raw":"val name : 'a t -> string","params":[{"name":"arg1","type":"'a t"}],"returns":"string"}],"slug":"libtmux-model-name"},{"id":"Libtmux.Model.pane","publicId":"Libtmux.Model.pane","qualifiedName":"Libtmux.Model.pane","name":"pane","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":564,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val pane : Pane.t t","source":{"file":"lib/libtmux.mli","line":564,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Model","signatures":[{"raw":"val pane : Pane.t t","params":[],"returns":"Pane.t t"}],"slug":"libtmux-model-pane"},{"id":"Libtmux.Model.session","publicId":"Libtmux.Model.session","qualifiedName":"Libtmux.Model.session","name":"session","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":561,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val session : Session.t t","source":{"file":"lib/libtmux.mli","line":561,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Model","signatures":[{"raw":"val session : Session.t t","params":[],"returns":"Session.t t"}],"slug":"libtmux-model-session"},{"id":"Libtmux.Model.t","publicId":"Libtmux.Model.t","qualifiedName":"Libtmux.Model.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":559,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type 'a t","source":{"file":"lib/libtmux.mli","line":559,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Model","signatures":[{"raw":"type 'a t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-model-t"},{"id":"Libtmux.Model.window","publicId":"Libtmux.Model.window","qualifiedName":"Libtmux.Model.window","name":"window","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":562,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val window : Window.t t","source":{"file":"lib/libtmux.mli","line":562,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Model","signatures":[{"raw":"val window : Window.t t","params":[],"returns":"Window.t t"}],"slug":"libtmux-model-window"},{"id":"Libtmux.Model.window_link","publicId":"Libtmux.Model.window_link","qualifiedName":"Libtmux.Model.window_link","name":"window_link","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":563,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val window_link : Window_link.t t","source":{"file":"lib/libtmux.mli","line":563,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Model","signatures":[{"raw":"val window_link : Window_link.t t","params":[],"returns":"Window_link.t t"}],"slug":"libtmux-model-window_link"},{"id":"Libtmux.Operations","publicId":"Libtmux.Operations","qualifiedName":"Libtmux.Operations","name":"Operations","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1073,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Construct typed tmux operations for a backend client. Observations are\n immutable, mutations use explicit targets, and no command retries a mutation\n against another connection generation. Construction performs no I/O; the\n descriptions below state what execution does. "],"declarations":[{"kind":"module","text":"module Operations : sig\n val capture : unit -> Snapshot.t Command.t\n (** Capture and validate the complete session/window-link/pane graph. The\n result records an acquisition interval, not an atomic server instant. *)\n\n val capture_text :\n ?scratch_dir:string ->\n Pane.t ->\n start:int ->\n end_:int ->\n Captured_text.t Command.t\n (** Capture inclusive visible rows through an operation-owned temporary file.\n Require [0 <= start <= end_ < Pane.height pane]; scrollback is excluded.\n Retained bytes survive client close. The scratch directory must share the\n daemon filesystem. *)\n\n val rename_window : Window.target -> name:string -> unit Command.t\n (** Set the global window name. Every session link observes the new name on\n its next capture; existing snapshots retain the old value. *)\n\n val rename_session : Session.target -> name:string -> unit Command.t\n (** Set the session name, rejecting a conflicting existing name. Bound IDs\n remain usable; existing snapshots retain their captured names. *)\n\n val switch_client_at :\n ?update_environment:bool ->\n Client_name.t ->\n session:Session.target ->\n unit Command.t\n (** Switch the client currently bearing this name to the bound session.\n Environment updates are disabled by default. This can move either a\n terminal client or a control client; it does not open a new terminal. *)\n\n val request_detach_client_at : Client_name.t -> unit Command.t\n (** Request detachment of the client currently bearing this name. Success\n confirms request processing, not peer exit. Detaching the library's own\n primary lane can lose the response and retire its generation. *)\n\n val refresh_client_at : ?status_only:bool -> Client_name.t -> unit Command.t\n (** Request a redraw; no terminal-rendering completion is implied. *)\n\n val resize_control_client_at :\n Client_name.t -> width:int -> height:int -> unit Command.t\n (** Set a control client's reported size. tmux rejects terminal clients. *)\n\n val send_text : Pane.target -> text:string -> unit Command.t\n (** Literal bytes, without an implicit Enter. NUL is rejected at admission. *)\n\n val send_keys : Pane.target -> Key.t list -> unit Command.t\n (** Send named tmux keys in order, without an implicit Enter. Use {!send_text}\n for literal bytes rather than key interpretation. *)\n\n val wait_for : string -> unit Command.t\n (** Wait on a named tmux semaphore using a dedicated bound lane. *)\n\n val signal : string -> unit Command.t\n (** Signal a named tmux semaphore, releasing a waiter or retaining the signal\n for a later {!wait_for}. This does not signal an OS process. *)\n\n val capture_environment :\n ?hidden:bool -> Environment.scope -> Environment.t Command.t\n (** Acquire a bounded table through a read-only command process. Its response\n must identify the bound daemon while the original pidfd remains live.\n Unsupported external variable names fail decoding; they are not omitted.\n *)\n\n val set_environment :\n ?hidden:bool -> Environment.scope -> name:string -> string -> unit Command.t\n (** Set a local environment value for future pane processes. [hidden] defaults\n to false; hidden values remain internal to tmux. Existing processes keep\n their environment. *)\n\n val unset_environment : Environment.scope -> string -> unit Command.t\n (** Remove the local entry, allowing a global value to apply to future panes.\n *)\n\n val remove_environment : Environment.scope -> string -> unit Command.t\n (** Store a removal marker, excluding the variable from future panes. *)\n\n val capture_options :\n ?include_inherited:bool -> Options.scope -> Options.t Command.t\n (** Acquire one bounded option table, excluding hooks. The default includes\n only local entries. Inherited table enumeration includes built-ins;\n inherited user options require [read_option] with their explicit name.\n Built-in descriptors cover every supported release from tmux 3.3a through\n 3.8; other versions return {!Error.Unsupported}. *)\n\n val read_option :\n ?include_inherited:bool ->\n Options.scope ->\n string ->\n Options.value option Command.t\n (** Read one exact name, including user-option inheritance. [None] means no\n entry under the selected policy. An invalid target remains an error. The\n default follows inheritance; this does not identify the defining parent\n scope. *)\n\n val set_option :\n ?index:int ->\n ?append:bool ->\n Options.scope ->\n name:string ->\n Options.scalar ->\n unit Command.t\n (** Validate the scope and scalar kind before admission. Array values require\n an index, or [append:true]. Without an index, tmux splits appended text\n using the option's separator and fills the lowest unused indexes. Text is\n literal; tmux format expansion is disabled. Hooks use a separate\n operation. *)\n\n val unset_option : ?index:int -> Options.scope -> string -> unit Command.t\n (** Remove a local override or one array element. Global built-ins reset to\n their tmux defaults; this does not recursively unset child overrides. *)\n\n val clear_option_array : Options.scope -> string -> unit Command.t\n (** Set a local empty array, masking inheritance. *)\n\n val capture_hooks : Options.scope -> Options.t Command.t\n (** Capture locally configured built-in hooks. Command values are tmux's\n printed representation, retained as data. *)\n\n val read_hook :\n ?include_inherited:bool ->\n Options.scope ->\n string ->\n Options.value option Command.t\n (** Read an exact hook name. Inheritance is included by default; [None] means\n no entry under the selected policy. Missing targets remain errors. *)\n\n val set_hook :\n ?index:int ->\n ?append:bool ->\n Options.scope ->\n name:string ->\n Hook.command list ->\n unit Command.t\n (** Set a hook to a nonempty command list. Without an index, replace the whole\n hook array, or fill the lowest free index when appending. An explicit\n [@name] custom hook stores command text as a user option; it requires\n complete replacement and has no array indexes. [read_hook] returns its\n [Options.Text] value; bulk hook capture includes built-ins. Commands may\n cause arbitrary tmux effects when triggered. Hooks that print output are\n outside the supported control transport contract. *)\n\n val remove_hook : ?index:int -> Options.scope -> string -> unit Command.t\n (** Remove the local hook or one indexed array entry. An inherited hook may\n become effective again; this does not stop work it already started. *)\n\n val run_hook : Options.scope -> string -> unit Command.t\n (** Run the effective hook in an explicit session, window or pane context. A\n successful result follows completion of its synchronous command queue.\n Background work started by a hook has its own lifetime. A later hook\n failure returns an uncertain outcome; preceding effects remain. Named [@]\n hooks return [Unsupported] because tmux can hide their parse failures in\n the server log. Configuration and inspection remain available. *)\n\n val create_session :\n ?window_name:string ->\n ?width:int ->\n ?height:int ->\n ?spawn:Spawn.t ->\n name:string ->\n unit ->\n Created.t Command.t\n (** Create a detached session on the bound daemon. Name collisions fail. *)\n\n val create_window :\n ?index:int ->\n ?name:string ->\n ?spawn:Spawn.t ->\n Session.target ->\n Created.t Command.t\n (** Create detached, rejecting an occupied explicit index. *)\n\n val split_pane :\n ?size:Geometry.size ->\n ?spawn:Spawn.t ->\n Pane.target ->\n direction:Geometry.direction ->\n Created.t Command.t\n (** Create a detached pane beside the target and return the IDs reported by\n tmux. Omitted [size] lets tmux choose the split; tmux rejects splits when\n no space remains. *)\n\n val break_pane :\n ?name:string ->\n Pane.target ->\n session:Session.target ->\n index:int ->\n Created.t Command.t\n (** Move the pane into a new window at an explicit session index. An occupied\n destination fails. The returned IDs describe the resulting context; the\n pane itself already existed. *)\n\n val kill_session : Session.target -> unit Command.t\n (** Remove the session and its window links. Windows with no other links and\n their panes are destroyed. Removing the last session may stop tmux. *)\n\n val kill_window : Window.target -> unit Command.t\n (** Destroy the window, all its session links and every contained pane. This\n acts on the global window, not a single contextual link. *)\n\n val kill_pane : Pane.target -> unit Command.t\n (** Destroy the target pane and its running process. tmux removes a window\n that becomes empty and may remove its now-empty sessions. *)\n\n val select_window_at : Session.target -> index:int -> unit Command.t\n (** Operate on the session's current index at execution, not an old link\n incarnation. *)\n\n val unlink_window_at :\n ?allow_kill:bool -> Session.target -> index:int -> unit Command.t\n (** Without [allow_kill], tmux rejects removal of the last link to a window.\n *)\n\n val link_window :\n Window.target -> session:Session.target -> index:int -> unit Command.t\n (** Add a session-specific link to the global window at [index], rejecting an\n occupied index. The source window and its panes stay shared. *)\n\n val move_window_at :\n Session.target ->\n from_index:int ->\n session:Session.target ->\n index:int ->\n unit Command.t\n (** Move the source session's current link at [from_index]. Destination\n collisions fail. *)\n\n val select_pane : Pane.target -> unit Command.t\n (** Make the pane active in its containing window. This does not open or\n attach a terminal client. *)\n\n val set_pane_title : Pane.target -> title:string -> unit Command.t\n (** Set the pane title as literal text, without tmux format expansion. A\n running terminal application can subsequently replace the title. *)\n\n val resize_pane : ?width:int -> ?height:int -> Pane.target -> unit Command.t\n (** Request positive cell dimensions, supplying at least one dimension. Omit\n either dimension to retain it. tmux can constrain the result to the\n available layout. Capture again to observe the actual dimensions. *)\n\n val resize_window :\n ?width:int -> ?height:int -> Window.target -> unit Command.t\n (** Request positive cell dimensions, supplying at least one dimension. Omit\n either dimension to retain it. Client-size and window-size policies can\n affect subsequent sizing. *)\n\n val select_layout : Window.target -> Layout.t -> unit Command.t\n (** Apply a preset or validated custom layout to the window. Pane geometry\n follows tmux layout rules; capture again to observe the result. *)\n\n val cycle_layout : Window.target -> [ `Next | `Previous ] -> unit Command.t\n (** Select the next or previous tmux preset layout for this window. *)\n\n val move_pane :\n ?size:Geometry.size ->\n Pane.target ->\n beside:Pane.target ->\n direction:Geometry.direction ->\n unit Command.t\n (** Move the source pane beside another pane, optionally setting the split\n size. Both targets must belong to the same bound generation. An emptied\n source window is removed by tmux. *)\n\n val swap_panes : Pane.target -> Pane.target -> unit Command.t\n (** Exchange pane positions without exchanging their identities or running\n processes. Both targets must belong to the same bound generation. *)\n\n val rotate_panes : Window.target -> [ `Forward | `Backward ] -> unit Command.t\n (** Rotate pane positions in the selected direction. Pane identities and\n running processes remain attached to their panes. *)\n\n val zoom_pane : Pane.target -> unit Command.t\n (** Toggle the window's zoom state around this pane. *)\n\n val respawn_pane :\n ?kill_running:bool -> Pane.target -> Spawn.t -> unit Command.t\n (** Start the supplied command in the existing pane. A running process causes\n failure unless [kill_running:true] explicitly replaces it. The pane ID\n remains unchanged. *)\n\n val clear_history : Pane.target -> unit Command.t\n (** Clear stored scrollback for this pane. The visible screen and running\n process remain; later captures cannot recover discarded history. *)\nend","source":{"file":"lib/libtmux.mli","line":1073,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"Construct typed tmux operations for a backend client. Observations are immutable, mutations use explicit targets, and no command retries a mutation against another connection generation. Construction performs no I/O; the descriptions below state what execution does."},"slug":"libtmux-operations"},{"id":"Libtmux.Operations.break_pane","publicId":"Libtmux.Operations.break_pane","qualifiedName":"Libtmux.Operations.break_pane","name":"break_pane","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1257,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Move the pane into a new window at an explicit session index. An occupied\n destination fails. The returned IDs describe the resulting context; the\n pane itself already existed. "],"declarations":[{"kind":"function","text":"val break_pane :\n ?name:string ->\n Pane.target ->\n session:Session.target ->\n index:int ->\n Created.t Command.t","source":{"file":"lib/libtmux.mli","line":1257,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Move the pane into a new window at an explicit session index. An occupied destination fails. The returned IDs describe the resulting context; the pane itself already existed."},"signatures":[{"raw":"val break_pane :\n ?name:string ->\n Pane.target -> session:Session.target -> index:int -> Created.t Command.t","params":[{"name":"name","type":"string","optional":true,"keywordOnly":true},{"name":"arg1","type":"Pane.target"},{"name":"session","type":"Session.target","keywordOnly":true},{"name":"index","type":"int","keywordOnly":true}],"returns":"Created.t Command.t"}],"slug":"libtmux-operations-break_pane"},{"id":"Libtmux.Operations.capture","publicId":"Libtmux.Operations.capture","qualifiedName":"Libtmux.Operations.capture","name":"capture","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1074,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Capture and validate the complete session/window-link/pane graph. The\n result records an acquisition interval, not an atomic server instant. "],"declarations":[{"kind":"function","text":"val capture : unit -> Snapshot.t Command.t","source":{"file":"lib/libtmux.mli","line":1074,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Capture and validate the complete session/window-link/pane graph. The result records an acquisition interval, not an atomic server instant."},"signatures":[{"raw":"val capture : unit -> Snapshot.t Command.t","params":[{"name":"arg1","type":"unit"}],"returns":"Snapshot.t Command.t"}],"slug":"libtmux-operations-capture"},{"id":"Libtmux.Operations.capture_environment","publicId":"Libtmux.Operations.capture_environment","qualifiedName":"Libtmux.Operations.capture_environment","name":"capture_environment","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1132,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Acquire a bounded table through a read-only command process. Its response\n must identify the bound daemon while the original pidfd remains live.\n Unsupported external variable names fail decoding; they are not omitted.\n "],"declarations":[{"kind":"function","text":"val capture_environment :\n ?hidden:bool -> Environment.scope -> Environment.t Command.t","source":{"file":"lib/libtmux.mli","line":1132,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Acquire a bounded table through a read-only command process. Its response must identify the bound daemon while the original pidfd remains live. Unsupported external variable names fail decoding; they are not omitted."},"signatures":[{"raw":"val capture_environment :\n ?hidden:bool -> Environment.scope -> Environment.t Command.t","params":[{"name":"hidden","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"Environment.scope"}],"returns":"Environment.t Command.t"}],"slug":"libtmux-operations-capture_environment"},{"id":"Libtmux.Operations.capture_hooks","publicId":"Libtmux.Operations.capture_hooks","qualifiedName":"Libtmux.Operations.capture_hooks","name":"capture_hooks","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1190,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Capture locally configured built-in hooks. Command values are tmux's\n printed representation, retained as data. "],"declarations":[{"kind":"function","text":"val capture_hooks : Options.scope -> Options.t Command.t","source":{"file":"lib/libtmux.mli","line":1190,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Capture locally configured built-in hooks. Command values are tmux's printed representation, retained as data."},"signatures":[{"raw":"val capture_hooks : Options.scope -> Options.t Command.t","params":[{"name":"arg1","type":"Options.scope"}],"returns":"Options.t Command.t"}],"slug":"libtmux-operations-capture_hooks"},{"id":"Libtmux.Operations.capture_options","publicId":"Libtmux.Operations.capture_options","qualifiedName":"Libtmux.Operations.capture_options","name":"capture_options","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1152,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Acquire one bounded option table, excluding hooks. The default includes\n only local entries. Inherited table enumeration includes built-ins;\n inherited user options require [read_option] with their explicit name.\n Built-in descriptors cover every supported release from tmux 3.3a through\n 3.8; other versions return {!Error.Unsupported}. "],"declarations":[{"kind":"function","text":"val capture_options :\n ?include_inherited:bool -> Options.scope -> Options.t Command.t","source":{"file":"lib/libtmux.mli","line":1152,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Acquire one bounded option table, excluding hooks. The default includes only local entries. Inherited table enumeration includes built-ins; inherited user options require `read_option` with their explicit name. Built-in descriptors cover every supported release from tmux 3.3a through 3.8; other versions return {!Error.Unsupported}."},"signatures":[{"raw":"val capture_options :\n ?include_inherited:bool -> Options.scope -> Options.t Command.t","params":[{"name":"include_inherited","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"Options.scope"}],"returns":"Options.t Command.t"}],"slug":"libtmux-operations-capture_options"},{"id":"Libtmux.Operations.capture_text","publicId":"Libtmux.Operations.capture_text","qualifiedName":"Libtmux.Operations.capture_text","name":"capture_text","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1078,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Capture inclusive visible rows through an operation-owned temporary file.\n Require [0 <= start <= end_ < Pane.height pane]; scrollback is excluded.\n Retained bytes survive client close. The scratch directory must share the\n daemon filesystem. "],"declarations":[{"kind":"function","text":"val capture_text :\n ?scratch_dir:string ->\n Pane.t ->\n start:int ->\n end_:int ->\n Captured_text.t Command.t","source":{"file":"lib/libtmux.mli","line":1078,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Capture inclusive visible rows through an operation-owned temporary file. Require `0 <= start <= end_ < Pane.height pane`; scrollback is excluded. Retained bytes survive client close. The scratch directory must share the daemon filesystem."},"signatures":[{"raw":"val capture_text :\n ?scratch_dir:string ->\n Pane.t -> start:int -> end_:int -> Captured_text.t Command.t","params":[{"name":"scratch_dir","type":"string","optional":true,"keywordOnly":true},{"name":"arg1","type":"Pane.t"},{"name":"start","type":"int","keywordOnly":true},{"name":"end_","type":"int","keywordOnly":true}],"returns":"Captured_text.t Command.t"}],"slug":"libtmux-operations-capture_text"},{"id":"Libtmux.Operations.clear_history","publicId":"Libtmux.Operations.clear_history","qualifiedName":"Libtmux.Operations.clear_history","name":"clear_history","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1355,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Clear stored scrollback for this pane. The visible screen and running\n process remain; later captures cannot recover discarded history. "],"declarations":[{"kind":"function","text":"val clear_history : Pane.target -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1355,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Clear stored scrollback for this pane. The visible screen and running process remain; later captures cannot recover discarded history."},"signatures":[{"raw":"val clear_history : Pane.target -> unit Command.t","params":[{"name":"arg1","type":"Pane.target"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-clear_history"},{"id":"Libtmux.Operations.clear_option_array","publicId":"Libtmux.Operations.clear_option_array","qualifiedName":"Libtmux.Operations.clear_option_array","name":"clear_option_array","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1187,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set a local empty array, masking inheritance. "],"declarations":[{"kind":"function","text":"val clear_option_array : Options.scope -> string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1187,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Set a local empty array, masking inheritance."},"signatures":[{"raw":"val clear_option_array : Options.scope -> string -> unit Command.t","params":[{"name":"arg1","type":"Options.scope"},{"name":"arg2","type":"string"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-clear_option_array"},{"id":"Libtmux.Operations.create_session","publicId":"Libtmux.Operations.create_session","qualifiedName":"Libtmux.Operations.create_session","name":"create_session","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1229,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Create a detached session on the bound daemon. Name collisions fail. "],"declarations":[{"kind":"function","text":"val create_session :\n ?window_name:string ->\n ?width:int ->\n ?height:int ->\n ?spawn:Spawn.t ->\n name:string ->\n unit ->\n Created.t Command.t","source":{"file":"lib/libtmux.mli","line":1229,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Create a detached session on the bound daemon. Name collisions fail."},"signatures":[{"raw":"val create_session :\n ?window_name:string ->\n ?width:int ->\n ?height:int -> ?spawn:Spawn.t -> name:string -> unit -> Created.t Command.t","params":[{"name":"window_name","type":"string","optional":true,"keywordOnly":true},{"name":"width","type":"int","optional":true,"keywordOnly":true},{"name":"height","type":"int","optional":true,"keywordOnly":true},{"name":"spawn","type":"Spawn.t","optional":true,"keywordOnly":true},{"name":"name","type":"string","keywordOnly":true},{"name":"arg1","type":"unit"}],"returns":"Created.t Command.t"}],"slug":"libtmux-operations-create_session"},{"id":"Libtmux.Operations.create_window","publicId":"Libtmux.Operations.create_window","qualifiedName":"Libtmux.Operations.create_window","name":"create_window","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1239,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Create detached, rejecting an occupied explicit index. "],"declarations":[{"kind":"function","text":"val create_window :\n ?index:int ->\n ?name:string ->\n ?spawn:Spawn.t ->\n Session.target ->\n Created.t Command.t","source":{"file":"lib/libtmux.mli","line":1239,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Create detached, rejecting an occupied explicit index."},"signatures":[{"raw":"val create_window :\n ?index:int ->\n ?name:string -> ?spawn:Spawn.t -> Session.target -> Created.t Command.t","params":[{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"name","type":"string","optional":true,"keywordOnly":true},{"name":"spawn","type":"Spawn.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"Session.target"}],"returns":"Created.t Command.t"}],"slug":"libtmux-operations-create_window"},{"id":"Libtmux.Operations.cycle_layout","publicId":"Libtmux.Operations.cycle_layout","qualifiedName":"Libtmux.Operations.cycle_layout","name":"cycle_layout","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1325,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Select the next or previous tmux preset layout for this window. "],"declarations":[{"kind":"function","text":"val cycle_layout : Window.target -> [ `Next | `Previous ] -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1325,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Select the next or previous tmux preset layout for this window."},"signatures":[{"raw":"val cycle_layout : Window.target -> [ `Next | `Previous ] -> unit Command.t","params":[{"name":"arg1","type":"Window.target"},{"name":"arg2","type":"[ `Next | `Previous ]"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-cycle_layout"},{"id":"Libtmux.Operations.kill_pane","publicId":"Libtmux.Operations.kill_pane","qualifiedName":"Libtmux.Operations.kill_pane","name":"kill_pane","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1275,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Destroy the target pane and its running process. tmux removes a window\n that becomes empty and may remove its now-empty sessions. "],"declarations":[{"kind":"function","text":"val kill_pane : Pane.target -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1275,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Destroy the target pane and its running process. tmux removes a window that becomes empty and may remove its now-empty sessions."},"signatures":[{"raw":"val kill_pane : Pane.target -> unit Command.t","params":[{"name":"arg1","type":"Pane.target"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-kill_pane"},{"id":"Libtmux.Operations.kill_session","publicId":"Libtmux.Operations.kill_session","qualifiedName":"Libtmux.Operations.kill_session","name":"kill_session","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1267,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove the session and its window links. Windows with no other links and\n their panes are destroyed. Removing the last session may stop tmux. "],"declarations":[{"kind":"function","text":"val kill_session : Session.target -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1267,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Remove the session and its window links. Windows with no other links and their panes are destroyed. Removing the last session may stop tmux."},"signatures":[{"raw":"val kill_session : Session.target -> unit Command.t","params":[{"name":"arg1","type":"Session.target"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-kill_session"},{"id":"Libtmux.Operations.kill_window","publicId":"Libtmux.Operations.kill_window","qualifiedName":"Libtmux.Operations.kill_window","name":"kill_window","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1271,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Destroy the window, all its session links and every contained pane. This\n acts on the global window, not a single contextual link. "],"declarations":[{"kind":"function","text":"val kill_window : Window.target -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1271,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Destroy the window, all its session links and every contained pane. This acts on the global window, not a single contextual link."},"signatures":[{"raw":"val kill_window : Window.target -> unit Command.t","params":[{"name":"arg1","type":"Window.target"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-kill_window"},{"id":"Libtmux.Operations.link_window","publicId":"Libtmux.Operations.link_window","qualifiedName":"Libtmux.Operations.link_window","name":"link_window","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1288,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Add a session-specific link to the global window at [index], rejecting an\n occupied index. The source window and its panes stay shared. "],"declarations":[{"kind":"function","text":"val link_window :\n Window.target -> session:Session.target -> index:int -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1288,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Add a session-specific link to the global window at `index`, rejecting an occupied index. The source window and its panes stay shared."},"signatures":[{"raw":"val link_window :\n Window.target -> session:Session.target -> index:int -> unit Command.t","params":[{"name":"arg1","type":"Window.target"},{"name":"session","type":"Session.target","keywordOnly":true},{"name":"index","type":"int","keywordOnly":true}],"returns":"unit Command.t"}],"slug":"libtmux-operations-link_window"},{"id":"Libtmux.Operations.move_pane","publicId":"Libtmux.Operations.move_pane","qualifiedName":"Libtmux.Operations.move_pane","name":"move_pane","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1328,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Move the source pane beside another pane, optionally setting the split\n size. Both targets must belong to the same bound generation. An emptied\n source window is removed by tmux. "],"declarations":[{"kind":"function","text":"val move_pane :\n ?size:Geometry.size ->\n Pane.target ->\n beside:Pane.target ->\n direction:Geometry.direction ->\n unit Command.t","source":{"file":"lib/libtmux.mli","line":1328,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Move the source pane beside another pane, optionally setting the split size. Both targets must belong to the same bound generation. An emptied source window is removed by tmux."},"signatures":[{"raw":"val move_pane :\n ?size:Geometry.size ->\n Pane.target ->\n beside:Pane.target -> direction:Geometry.direction -> unit Command.t","params":[{"name":"size","type":"Geometry.size","optional":true,"keywordOnly":true},{"name":"arg1","type":"Pane.target"},{"name":"beside","type":"Pane.target","keywordOnly":true},{"name":"direction","type":"Geometry.direction","keywordOnly":true}],"returns":"unit Command.t"}],"slug":"libtmux-operations-move_pane"},{"id":"Libtmux.Operations.move_window_at","publicId":"Libtmux.Operations.move_window_at","qualifiedName":"Libtmux.Operations.move_window_at","name":"move_window_at","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1293,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Move the source session's current link at [from_index]. Destination\n collisions fail. "],"declarations":[{"kind":"function","text":"val move_window_at :\n Session.target ->\n from_index:int ->\n session:Session.target ->\n index:int ->\n unit Command.t","source":{"file":"lib/libtmux.mli","line":1293,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Move the source session's current link at `from_index`. Destination collisions fail."},"signatures":[{"raw":"val move_window_at :\n Session.target ->\n from_index:int -> session:Session.target -> index:int -> unit Command.t","params":[{"name":"arg1","type":"Session.target"},{"name":"from_index","type":"int","keywordOnly":true},{"name":"session","type":"Session.target","keywordOnly":true},{"name":"index","type":"int","keywordOnly":true}],"returns":"unit Command.t"}],"slug":"libtmux-operations-move_window_at"},{"id":"Libtmux.Operations.read_hook","publicId":"Libtmux.Operations.read_hook","qualifiedName":"Libtmux.Operations.read_hook","name":"read_hook","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1194,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read an exact hook name. Inheritance is included by default; [None] means\n no entry under the selected policy. Missing targets remain errors. "],"declarations":[{"kind":"function","text":"val read_hook :\n ?include_inherited:bool ->\n Options.scope ->\n string ->\n Options.value option Command.t","source":{"file":"lib/libtmux.mli","line":1194,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Read an exact hook name. Inheritance is included by default; `None` means no entry under the selected policy. Missing targets remain errors."},"signatures":[{"raw":"val read_hook :\n ?include_inherited:bool ->\n Options.scope -> string -> Options.value option Command.t","params":[{"name":"include_inherited","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"Options.scope"},{"name":"arg2","type":"string"}],"returns":"Options.value option Command.t"}],"slug":"libtmux-operations-read_hook"},{"id":"Libtmux.Operations.read_option","publicId":"Libtmux.Operations.read_option","qualifiedName":"Libtmux.Operations.read_option","name":"read_option","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1160,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read one exact name, including user-option inheritance. [None] means no\n entry under the selected policy. An invalid target remains an error. The\n default follows inheritance; this does not identify the defining parent\n scope. "],"declarations":[{"kind":"function","text":"val read_option :\n ?include_inherited:bool ->\n Options.scope ->\n string ->\n Options.value option Command.t","source":{"file":"lib/libtmux.mli","line":1160,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Read one exact name, including user-option inheritance. `None` means no entry under the selected policy. An invalid target remains an error. The default follows inheritance; this does not identify the defining parent scope."},"signatures":[{"raw":"val read_option :\n ?include_inherited:bool ->\n Options.scope -> string -> Options.value option Command.t","params":[{"name":"include_inherited","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"Options.scope"},{"name":"arg2","type":"string"}],"returns":"Options.value option Command.t"}],"slug":"libtmux-operations-read_option"},{"id":"Libtmux.Operations.refresh_client_at","publicId":"Libtmux.Operations.refresh_client_at","qualifiedName":"Libtmux.Operations.refresh_client_at","name":"refresh_client_at","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1111,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Request a redraw; no terminal-rendering completion is implied. "],"declarations":[{"kind":"function","text":"val refresh_client_at : ?status_only:bool -> Client_name.t -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1111,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Request a redraw; no terminal-rendering completion is implied."},"signatures":[{"raw":"val refresh_client_at : ?status_only:bool -> Client_name.t -> unit Command.t","params":[{"name":"status_only","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"Client_name.t"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-refresh_client_at"},{"id":"Libtmux.Operations.remove_environment","publicId":"Libtmux.Operations.remove_environment","qualifiedName":"Libtmux.Operations.remove_environment","name":"remove_environment","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1149,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Store a removal marker, excluding the variable from future panes. "],"declarations":[{"kind":"function","text":"val remove_environment : Environment.scope -> string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1149,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Store a removal marker, excluding the variable from future panes."},"signatures":[{"raw":"val remove_environment : Environment.scope -> string -> unit Command.t","params":[{"name":"arg1","type":"Environment.scope"},{"name":"arg2","type":"string"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-remove_environment"},{"id":"Libtmux.Operations.remove_hook","publicId":"Libtmux.Operations.remove_hook","qualifiedName":"Libtmux.Operations.remove_hook","name":"remove_hook","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1217,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove the local hook or one indexed array entry. An inherited hook may\n become effective again; this does not stop work it already started. "],"declarations":[{"kind":"function","text":"val remove_hook : ?index:int -> Options.scope -> string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1217,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Remove the local hook or one indexed array entry. An inherited hook may become effective again; this does not stop work it already started."},"signatures":[{"raw":"val remove_hook : ?index:int -> Options.scope -> string -> unit Command.t","params":[{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"Options.scope"},{"name":"arg2","type":"string"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-remove_hook"},{"id":"Libtmux.Operations.rename_session","publicId":"Libtmux.Operations.rename_session","qualifiedName":"Libtmux.Operations.rename_session","name":"rename_session","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1093,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set the session name, rejecting a conflicting existing name. Bound IDs\n remain usable; existing snapshots retain their captured names. "],"declarations":[{"kind":"function","text":"val rename_session : Session.target -> name:string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1093,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Set the session name, rejecting a conflicting existing name. Bound IDs remain usable; existing snapshots retain their captured names."},"signatures":[{"raw":"val rename_session : Session.target -> name:string -> unit Command.t","params":[{"name":"arg1","type":"Session.target"},{"name":"name","type":"string","keywordOnly":true}],"returns":"unit Command.t"}],"slug":"libtmux-operations-rename_session"},{"id":"Libtmux.Operations.rename_window","publicId":"Libtmux.Operations.rename_window","qualifiedName":"Libtmux.Operations.rename_window","name":"rename_window","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1089,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set the global window name. Every session link observes the new name on\n its next capture; existing snapshots retain the old value. "],"declarations":[{"kind":"function","text":"val rename_window : Window.target -> name:string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1089,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Set the global window name. Every session link observes the new name on its next capture; existing snapshots retain the old value."},"signatures":[{"raw":"val rename_window : Window.target -> name:string -> unit Command.t","params":[{"name":"arg1","type":"Window.target"},{"name":"name","type":"string","keywordOnly":true}],"returns":"unit Command.t"}],"slug":"libtmux-operations-rename_window"},{"id":"Libtmux.Operations.request_detach_client_at","publicId":"Libtmux.Operations.request_detach_client_at","qualifiedName":"Libtmux.Operations.request_detach_client_at","name":"request_detach_client_at","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1106,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Request detachment of the client currently bearing this name. Success\n confirms request processing, not peer exit. Detaching the library's own\n primary lane can lose the response and retire its generation. "],"declarations":[{"kind":"function","text":"val request_detach_client_at : Client_name.t -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1106,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Request detachment of the client currently bearing this name. Success confirms request processing, not peer exit. Detaching the library's own primary lane can lose the response and retire its generation."},"signatures":[{"raw":"val request_detach_client_at : Client_name.t -> unit Command.t","params":[{"name":"arg1","type":"Client_name.t"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-request_detach_client_at"},{"id":"Libtmux.Operations.resize_control_client_at","publicId":"Libtmux.Operations.resize_control_client_at","qualifiedName":"Libtmux.Operations.resize_control_client_at","name":"resize_control_client_at","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1114,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set a control client's reported size. tmux rejects terminal clients. "],"declarations":[{"kind":"function","text":"val resize_control_client_at :\n Client_name.t -> width:int -> height:int -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1114,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Set a control client's reported size. tmux rejects terminal clients."},"signatures":[{"raw":"val resize_control_client_at :\n Client_name.t -> width:int -> height:int -> unit Command.t","params":[{"name":"arg1","type":"Client_name.t"},{"name":"width","type":"int","keywordOnly":true},{"name":"height","type":"int","keywordOnly":true}],"returns":"unit Command.t"}],"slug":"libtmux-operations-resize_control_client_at"},{"id":"Libtmux.Operations.resize_pane","publicId":"Libtmux.Operations.resize_pane","qualifiedName":"Libtmux.Operations.resize_pane","name":"resize_pane","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1310,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Request positive cell dimensions, supplying at least one dimension. Omit\n either dimension to retain it. tmux can constrain the result to the\n available layout. Capture again to observe the actual dimensions. "],"declarations":[{"kind":"function","text":"val resize_pane : ?width:int -> ?height:int -> Pane.target -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1310,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Request positive cell dimensions, supplying at least one dimension. Omit either dimension to retain it. tmux can constrain the result to the available layout. Capture again to observe the actual dimensions."},"signatures":[{"raw":"val resize_pane : ?width:int -> ?height:int -> Pane.target -> unit Command.t","params":[{"name":"width","type":"int","optional":true,"keywordOnly":true},{"name":"height","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"Pane.target"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-resize_pane"},{"id":"Libtmux.Operations.resize_window","publicId":"Libtmux.Operations.resize_window","qualifiedName":"Libtmux.Operations.resize_window","name":"resize_window","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1315,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Request positive cell dimensions, supplying at least one dimension. Omit\n either dimension to retain it. Client-size and window-size policies can\n affect subsequent sizing. "],"declarations":[{"kind":"function","text":"val resize_window :\n ?width:int -> ?height:int -> Window.target -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1315,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Request positive cell dimensions, supplying at least one dimension. Omit either dimension to retain it. Client-size and window-size policies can affect subsequent sizing."},"signatures":[{"raw":"val resize_window :\n ?width:int -> ?height:int -> Window.target -> unit Command.t","params":[{"name":"width","type":"int","optional":true,"keywordOnly":true},{"name":"height","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"Window.target"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-resize_window"},{"id":"Libtmux.Operations.respawn_pane","publicId":"Libtmux.Operations.respawn_pane","qualifiedName":"Libtmux.Operations.respawn_pane","name":"respawn_pane","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1349,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Start the supplied command in the existing pane. A running process causes\n failure unless [kill_running:true] explicitly replaces it. The pane ID\n remains unchanged. "],"declarations":[{"kind":"function","text":"val respawn_pane :\n ?kill_running:bool -> Pane.target -> Spawn.t -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1349,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Start the supplied command in the existing pane. A running process causes failure unless `kill_running:true` explicitly replaces it. The pane ID remains unchanged."},"signatures":[{"raw":"val respawn_pane :\n ?kill_running:bool -> Pane.target -> Spawn.t -> unit Command.t","params":[{"name":"kill_running","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"Pane.target"},{"name":"arg2","type":"Spawn.t"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-respawn_pane"},{"id":"Libtmux.Operations.rotate_panes","publicId":"Libtmux.Operations.rotate_panes","qualifiedName":"Libtmux.Operations.rotate_panes","name":"rotate_panes","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1342,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Rotate pane positions in the selected direction. Pane identities and\n running processes remain attached to their panes. "],"declarations":[{"kind":"function","text":"val rotate_panes : Window.target -> [ `Forward | `Backward ] -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1342,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Rotate pane positions in the selected direction. Pane identities and running processes remain attached to their panes."},"signatures":[{"raw":"val rotate_panes :\n Window.target -> [ `Backward | `Forward ] -> unit Command.t","params":[{"name":"arg1","type":"Window.target"},{"name":"arg2","type":"[ `Backward | `Forward ]"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-rotate_panes"},{"id":"Libtmux.Operations.run_hook","publicId":"Libtmux.Operations.run_hook","qualifiedName":"Libtmux.Operations.run_hook","name":"run_hook","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1221,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Run the effective hook in an explicit session, window or pane context. A\n successful result follows completion of its synchronous command queue.\n Background work started by a hook has its own lifetime. A later hook\n failure returns an uncertain outcome; preceding effects remain. Named [@]\n hooks return [Unsupported] because tmux can hide their parse failures in\n the server log. Configuration and inspection remain available. "],"declarations":[{"kind":"function","text":"val run_hook : Options.scope -> string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1221,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Run the effective hook in an explicit session, window or pane context. A successful result follows completion of its synchronous command queue. Background work started by a hook has its own lifetime. A later hook failure returns an uncertain outcome; preceding effects remain. Named `@` hooks return `Unsupported` because tmux can hide their parse failures in the server log. Configuration and inspection remain available."},"signatures":[{"raw":"val run_hook : Options.scope -> string -> unit Command.t","params":[{"name":"arg1","type":"Options.scope"},{"name":"arg2","type":"string"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-run_hook"},{"id":"Libtmux.Operations.select_layout","publicId":"Libtmux.Operations.select_layout","qualifiedName":"Libtmux.Operations.select_layout","name":"select_layout","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1321,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Apply a preset or validated custom layout to the window. Pane geometry\n follows tmux layout rules; capture again to observe the result. "],"declarations":[{"kind":"function","text":"val select_layout : Window.target -> Layout.t -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1321,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Apply a preset or validated custom layout to the window. Pane geometry follows tmux layout rules; capture again to observe the result."},"signatures":[{"raw":"val select_layout : Window.target -> Layout.t -> unit Command.t","params":[{"name":"arg1","type":"Window.target"},{"name":"arg2","type":"Layout.t"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-select_layout"},{"id":"Libtmux.Operations.select_pane","publicId":"Libtmux.Operations.select_pane","qualifiedName":"Libtmux.Operations.select_pane","name":"select_pane","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1302,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Make the pane active in its containing window. This does not open or\n attach a terminal client. "],"declarations":[{"kind":"function","text":"val select_pane : Pane.target -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1302,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Make the pane active in its containing window. This does not open or attach a terminal client."},"signatures":[{"raw":"val select_pane : Pane.target -> unit Command.t","params":[{"name":"arg1","type":"Pane.target"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-select_pane"},{"id":"Libtmux.Operations.select_window_at","publicId":"Libtmux.Operations.select_window_at","qualifiedName":"Libtmux.Operations.select_window_at","name":"select_window_at","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1279,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Operate on the session's current index at execution, not an old link\n incarnation. "],"declarations":[{"kind":"function","text":"val select_window_at : Session.target -> index:int -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1279,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Operate on the session's current index at execution, not an old link incarnation."},"signatures":[{"raw":"val select_window_at : Session.target -> index:int -> unit Command.t","params":[{"name":"arg1","type":"Session.target"},{"name":"index","type":"int","keywordOnly":true}],"returns":"unit Command.t"}],"slug":"libtmux-operations-select_window_at"},{"id":"Libtmux.Operations.send_keys","publicId":"Libtmux.Operations.send_keys","qualifiedName":"Libtmux.Operations.send_keys","name":"send_keys","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1121,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Send named tmux keys in order, without an implicit Enter. Use {!send_text}\n for literal bytes rather than key interpretation. "],"declarations":[{"kind":"function","text":"val send_keys : Pane.target -> Key.t list -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1121,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Send named tmux keys in order, without an implicit Enter. Use {!send_text} for literal bytes rather than key interpretation."},"signatures":[{"raw":"val send_keys : Pane.target -> Key.t list -> unit Command.t","params":[{"name":"arg1","type":"Pane.target"},{"name":"arg2","type":"Key.t list"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-send_keys"},{"id":"Libtmux.Operations.send_text","publicId":"Libtmux.Operations.send_text","qualifiedName":"Libtmux.Operations.send_text","name":"send_text","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1118,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Literal bytes, without an implicit Enter. NUL is rejected at admission. "],"declarations":[{"kind":"function","text":"val send_text : Pane.target -> text:string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1118,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Literal bytes, without an implicit Enter. NUL is rejected at admission."},"signatures":[{"raw":"val send_text : Pane.target -> text:string -> unit Command.t","params":[{"name":"arg1","type":"Pane.target"},{"name":"text","type":"string","keywordOnly":true}],"returns":"unit Command.t"}],"slug":"libtmux-operations-send_text"},{"id":"Libtmux.Operations.set_environment","publicId":"Libtmux.Operations.set_environment","qualifiedName":"Libtmux.Operations.set_environment","name":"set_environment","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1139,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set a local environment value for future pane processes. [hidden] defaults\n to false; hidden values remain internal to tmux. Existing processes keep\n their environment. "],"declarations":[{"kind":"function","text":"val set_environment :\n ?hidden:bool -> Environment.scope -> name:string -> string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1139,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Set a local environment value for future pane processes. `hidden` defaults to false; hidden values remain internal to tmux. Existing processes keep their environment."},"signatures":[{"raw":"val set_environment :\n ?hidden:bool ->\n Environment.scope -> name:string -> string -> unit Command.t","params":[{"name":"hidden","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"Environment.scope"},{"name":"name","type":"string","keywordOnly":true},{"name":"arg2","type":"string"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-set_environment"},{"id":"Libtmux.Operations.set_hook","publicId":"Libtmux.Operations.set_hook","qualifiedName":"Libtmux.Operations.set_hook","name":"set_hook","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1202,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set a hook to a nonempty command list. Without an index, replace the whole\n hook array, or fill the lowest free index when appending. An explicit\n [@name] custom hook stores command text as a user option; it requires\n complete replacement and has no array indexes. [read_hook] returns its\n [Options.Text] value; bulk hook capture includes built-ins. Commands may\n cause arbitrary tmux effects when triggered. Hooks that print output are\n outside the supported control transport contract. "],"declarations":[{"kind":"function","text":"val set_hook :\n ?index:int ->\n ?append:bool ->\n Options.scope ->\n name:string ->\n Hook.command list ->\n unit Command.t","source":{"file":"lib/libtmux.mli","line":1202,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Set a hook to a nonempty command list. Without an index, replace the whole hook array, or fill the lowest free index when appending. An explicit `@name` custom hook stores command text as a user option; it requires complete replacement and has no array indexes. `read_hook` returns its `Options.Text` value; bulk hook capture includes built-ins. Commands may cause arbitrary tmux effects when triggered. Hooks that print output are outside the supported control transport contract."},"signatures":[{"raw":"val set_hook :\n ?index:int ->\n ?append:bool ->\n Options.scope -> name:string -> Hook.command list -> unit Command.t","params":[{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"append","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"Options.scope"},{"name":"name","type":"string","keywordOnly":true},{"name":"arg2","type":"Hook.command list"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-set_hook"},{"id":"Libtmux.Operations.set_option","publicId":"Libtmux.Operations.set_option","qualifiedName":"Libtmux.Operations.set_option","name":"set_option","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1170,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Validate the scope and scalar kind before admission. Array values require\n an index, or [append:true]. Without an index, tmux splits appended text\n using the option's separator and fills the lowest unused indexes. Text is\n literal; tmux format expansion is disabled. Hooks use a separate\n operation. "],"declarations":[{"kind":"function","text":"val set_option :\n ?index:int ->\n ?append:bool ->\n Options.scope ->\n name:string ->\n Options.scalar ->\n unit Command.t","source":{"file":"lib/libtmux.mli","line":1170,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Validate the scope and scalar kind before admission. Array values require an index, or `append:true`. Without an index, tmux splits appended text using the option's separator and fills the lowest unused indexes. Text is literal; tmux format expansion is disabled. Hooks use a separate operation."},"signatures":[{"raw":"val set_option :\n ?index:int ->\n ?append:bool ->\n Options.scope -> name:string -> Options.scalar -> unit Command.t","params":[{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"append","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"Options.scope"},{"name":"name","type":"string","keywordOnly":true},{"name":"arg2","type":"Options.scalar"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-set_option"},{"id":"Libtmux.Operations.set_pane_title","publicId":"Libtmux.Operations.set_pane_title","qualifiedName":"Libtmux.Operations.set_pane_title","name":"set_pane_title","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1306,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set the pane title as literal text, without tmux format expansion. A\n running terminal application can subsequently replace the title. "],"declarations":[{"kind":"function","text":"val set_pane_title : Pane.target -> title:string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1306,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Set the pane title as literal text, without tmux format expansion. A running terminal application can subsequently replace the title."},"signatures":[{"raw":"val set_pane_title : Pane.target -> title:string -> unit Command.t","params":[{"name":"arg1","type":"Pane.target"},{"name":"title","type":"string","keywordOnly":true}],"returns":"unit Command.t"}],"slug":"libtmux-operations-set_pane_title"},{"id":"Libtmux.Operations.signal","publicId":"Libtmux.Operations.signal","qualifiedName":"Libtmux.Operations.signal","name":"signal","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1128,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Signal a named tmux semaphore, releasing a waiter or retaining the signal\n for a later {!wait_for}. This does not signal an OS process. "],"declarations":[{"kind":"function","text":"val signal : string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1128,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Signal a named tmux semaphore, releasing a waiter or retaining the signal for a later {!wait_for}. This does not signal an OS process."},"signatures":[{"raw":"val signal : string -> unit Command.t","params":[{"name":"arg1","type":"string"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-signal"},{"id":"Libtmux.Operations.split_pane","publicId":"Libtmux.Operations.split_pane","qualifiedName":"Libtmux.Operations.split_pane","name":"split_pane","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1247,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Create a detached pane beside the target and return the IDs reported by\n tmux. Omitted [size] lets tmux choose the split; tmux rejects splits when\n no space remains. "],"declarations":[{"kind":"function","text":"val split_pane :\n ?size:Geometry.size ->\n ?spawn:Spawn.t ->\n Pane.target ->\n direction:Geometry.direction ->\n Created.t Command.t","source":{"file":"lib/libtmux.mli","line":1247,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Create a detached pane beside the target and return the IDs reported by tmux. Omitted `size` lets tmux choose the split; tmux rejects splits when no space remains."},"signatures":[{"raw":"val split_pane :\n ?size:Geometry.size ->\n ?spawn:Spawn.t ->\n Pane.target -> direction:Geometry.direction -> Created.t Command.t","params":[{"name":"size","type":"Geometry.size","optional":true,"keywordOnly":true},{"name":"spawn","type":"Spawn.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"Pane.target"},{"name":"direction","type":"Geometry.direction","keywordOnly":true}],"returns":"Created.t Command.t"}],"slug":"libtmux-operations-split_pane"},{"id":"Libtmux.Operations.swap_panes","publicId":"Libtmux.Operations.swap_panes","qualifiedName":"Libtmux.Operations.swap_panes","name":"swap_panes","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1338,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Exchange pane positions without exchanging their identities or running\n processes. Both targets must belong to the same bound generation. "],"declarations":[{"kind":"function","text":"val swap_panes : Pane.target -> Pane.target -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1338,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Exchange pane positions without exchanging their identities or running processes. Both targets must belong to the same bound generation."},"signatures":[{"raw":"val swap_panes : Pane.target -> Pane.target -> unit Command.t","params":[{"name":"arg1","type":"Pane.target"},{"name":"arg2","type":"Pane.target"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-swap_panes"},{"id":"Libtmux.Operations.switch_client_at","publicId":"Libtmux.Operations.switch_client_at","qualifiedName":"Libtmux.Operations.switch_client_at","name":"switch_client_at","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1097,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Switch the client currently bearing this name to the bound session.\n Environment updates are disabled by default. This can move either a\n terminal client or a control client; it does not open a new terminal. "],"declarations":[{"kind":"function","text":"val switch_client_at :\n ?update_environment:bool ->\n Client_name.t ->\n session:Session.target ->\n unit Command.t","source":{"file":"lib/libtmux.mli","line":1097,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Switch the client currently bearing this name to the bound session. Environment updates are disabled by default. This can move either a terminal client or a control client; it does not open a new terminal."},"signatures":[{"raw":"val switch_client_at :\n ?update_environment:bool ->\n Client_name.t -> session:Session.target -> unit Command.t","params":[{"name":"update_environment","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"Client_name.t"},{"name":"session","type":"Session.target","keywordOnly":true}],"returns":"unit Command.t"}],"slug":"libtmux-operations-switch_client_at"},{"id":"Libtmux.Operations.unlink_window_at","publicId":"Libtmux.Operations.unlink_window_at","qualifiedName":"Libtmux.Operations.unlink_window_at","name":"unlink_window_at","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1283,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Without [allow_kill], tmux rejects removal of the last link to a window.\n "],"declarations":[{"kind":"function","text":"val unlink_window_at :\n ?allow_kill:bool -> Session.target -> index:int -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1283,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Without `allow_kill`, tmux rejects removal of the last link to a window."},"signatures":[{"raw":"val unlink_window_at :\n ?allow_kill:bool -> Session.target -> index:int -> unit Command.t","params":[{"name":"allow_kill","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"Session.target"},{"name":"index","type":"int","keywordOnly":true}],"returns":"unit Command.t"}],"slug":"libtmux-operations-unlink_window_at"},{"id":"Libtmux.Operations.unset_environment","publicId":"Libtmux.Operations.unset_environment","qualifiedName":"Libtmux.Operations.unset_environment","name":"unset_environment","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1145,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove the local entry, allowing a global value to apply to future panes.\n "],"declarations":[{"kind":"function","text":"val unset_environment : Environment.scope -> string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1145,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Remove the local entry, allowing a global value to apply to future panes."},"signatures":[{"raw":"val unset_environment : Environment.scope -> string -> unit Command.t","params":[{"name":"arg1","type":"Environment.scope"},{"name":"arg2","type":"string"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-unset_environment"},{"id":"Libtmux.Operations.unset_option","publicId":"Libtmux.Operations.unset_option","qualifiedName":"Libtmux.Operations.unset_option","name":"unset_option","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1183,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove a local override or one array element. Global built-ins reset to\n their tmux defaults; this does not recursively unset child overrides. "],"declarations":[{"kind":"function","text":"val unset_option : ?index:int -> Options.scope -> string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1183,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Remove a local override or one array element. Global built-ins reset to their tmux defaults; this does not recursively unset child overrides."},"signatures":[{"raw":"val unset_option : ?index:int -> Options.scope -> string -> unit Command.t","params":[{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"Options.scope"},{"name":"arg2","type":"string"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-unset_option"},{"id":"Libtmux.Operations.wait_for","publicId":"Libtmux.Operations.wait_for","qualifiedName":"Libtmux.Operations.wait_for","name":"wait_for","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1125,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Wait on a named tmux semaphore using a dedicated bound lane. "],"declarations":[{"kind":"function","text":"val wait_for : string -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1125,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Wait on a named tmux semaphore using a dedicated bound lane."},"signatures":[{"raw":"val wait_for : string -> unit Command.t","params":[{"name":"arg1","type":"string"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-wait_for"},{"id":"Libtmux.Operations.zoom_pane","publicId":"Libtmux.Operations.zoom_pane","qualifiedName":"Libtmux.Operations.zoom_pane","name":"zoom_pane","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1346,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Toggle the window's zoom state around this pane. "],"declarations":[{"kind":"function","text":"val zoom_pane : Pane.target -> unit Command.t","source":{"file":"lib/libtmux.mli","line":1346,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Operations","doc":{"summary":"Toggle the window's zoom state around this pane."},"signatures":[{"raw":"val zoom_pane : Pane.target -> unit Command.t","params":[{"name":"arg1","type":"Pane.target"}],"returns":"unit Command.t"}],"slug":"libtmux-operations-zoom_pane"},{"id":"Libtmux.Options","publicId":"Libtmux.Options","qualifiedName":"Libtmux.Options","name":"Options","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":818,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Version-aware option descriptors and captured scoped values. Sparse array\n indexes and inherited entries retain their tmux meaning. "],"declarations":[{"kind":"module","text":"module Options : sig\n module Kind : sig\n type t = Text | Number | Flag | Choice | Key | Colour | Commands\n end\n\n type descriptor = {\n name : string;\n kind : Kind.t;\n array : bool;\n hook : bool;\n scopes : [ `Server | `Session | `Window | `Pane ] list;\n versions : string list;\n }\n (** Generated upstream descriptors. [versions] lists qualified releases; user\n options have no built-in release history. *)\n\n type scope =\n | Server\n | Global_sessions\n | Global_windows\n | Session of Session.target\n | Window of Window.target\n | Pane of Pane.target\n\n type scalar =\n | Text of string\n | Integer of int64\n | Bool of bool\n | Choice of string\n | Key of string\n | Colour of string\n | Commands of string\n\n type value = Scalar of scalar | Array of (int * scalar) Iarray.t\n type entry = { descriptor : descriptor; value : value; inherited : bool }\n\n type t = {\n source : Source.t;\n scope : scope;\n include_inherited : bool;\n entries : entry Iarray.t;\n started_at_ns : int64;\n finished_at_ns : int64;\n }\n (** Captured options in tmux order, with original array indexes. An empty\n array differs from an absent local entry. No accessor performs I/O. *)\n\n val catalog : version:string -> (descriptor Iarray.t, Error.t) result\n val describe : version:string -> string -> (descriptor, Error.t) result\n\n val lookup : t -> string -> entry option\n (** [None] means absent from this capture's selected scope and inheritance\n policy. Use [describe] to distinguish an unsupported built-in name. *)\nend","source":{"file":"lib/libtmux.mli","line":818,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"Version-aware option descriptors and captured scoped values. Sparse array indexes and inherited entries retain their tmux meaning."},"slug":"libtmux-options"},{"id":"Libtmux.Options.Kind","publicId":"Libtmux.Options.Kind","qualifiedName":"Libtmux.Options.Kind","name":"Kind","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":819,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Kind : sig\n type t = Text | Number | Flag | Choice | Key | Colour | Commands\n end","source":{"file":"lib/libtmux.mli","line":819,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options","slug":"libtmux-options-kind"},{"id":"Libtmux.Options.Kind.t","publicId":"Libtmux.Options.Kind.t","qualifiedName":"Libtmux.Options.Kind.t","name":"t","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":820,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type t = Text | Number | Flag | Choice | Key | Colour | Commands","source":{"file":"lib/libtmux.mli","line":820,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.Kind","signatures":[{"raw":"type t =\n | Text \n | Number \n | Flag \n | Choice \n | Key \n | Colour \n | Commands ","params":[]}],"slug":"libtmux-options-kind-t"},{"id":"Libtmux.Options.Kind.t.Choice","publicId":"Libtmux.Options.Kind.t.Choice","name":"Choice","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":820,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Choice","source":{"file":"lib/libtmux.mli","line":820,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.Kind.t","variant":"unit","qualifiedName":"Libtmux.Options.Kind.Choice","slug":"libtmux-options-kind-t-choice"},{"id":"Libtmux.Options.Kind.t.Colour","publicId":"Libtmux.Options.Kind.t.Colour","name":"Colour","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":820,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Colour","source":{"file":"lib/libtmux.mli","line":820,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.Kind.t","variant":"unit","qualifiedName":"Libtmux.Options.Kind.Colour","slug":"libtmux-options-kind-t-colour"},{"id":"Libtmux.Options.Kind.t.Commands","publicId":"Libtmux.Options.Kind.t.Commands","name":"Commands","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":820,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Commands","source":{"file":"lib/libtmux.mli","line":820,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.Kind.t","variant":"unit","qualifiedName":"Libtmux.Options.Kind.Commands","slug":"libtmux-options-kind-t-commands"},{"id":"Libtmux.Options.Kind.t.Flag","publicId":"Libtmux.Options.Kind.t.Flag","name":"Flag","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":820,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Flag","source":{"file":"lib/libtmux.mli","line":820,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.Kind.t","variant":"unit","qualifiedName":"Libtmux.Options.Kind.Flag","slug":"libtmux-options-kind-t-flag"},{"id":"Libtmux.Options.Kind.t.Key","publicId":"Libtmux.Options.Kind.t.Key","name":"Key","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":820,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Key","source":{"file":"lib/libtmux.mli","line":820,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.Kind.t","variant":"unit","qualifiedName":"Libtmux.Options.Kind.Key","slug":"libtmux-options-kind-t-key"},{"id":"Libtmux.Options.Kind.t.Number","publicId":"Libtmux.Options.Kind.t.Number","name":"Number","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":820,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Number","source":{"file":"lib/libtmux.mli","line":820,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.Kind.t","variant":"unit","qualifiedName":"Libtmux.Options.Kind.Number","slug":"libtmux-options-kind-t-number"},{"id":"Libtmux.Options.Kind.t.Text","publicId":"Libtmux.Options.Kind.t.Text","name":"Text","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":820,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Text","source":{"file":"lib/libtmux.mli","line":820,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.Kind.t","variant":"unit","qualifiedName":"Libtmux.Options.Kind.Text","slug":"libtmux-options-kind-t-text"},{"id":"Libtmux.Options.catalog","publicId":"Libtmux.Options.catalog","qualifiedName":"Libtmux.Options.catalog","name":"catalog","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":865,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val catalog : version:string -> (descriptor Iarray.t, Error.t) result","source":{"file":"lib/libtmux.mli","line":865,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options","signatures":[{"raw":"val catalog : version:string -> (descriptor Iarray.t, Error.t) result","params":[{"name":"version","type":"string","keywordOnly":true}],"returns":"(descriptor Iarray.t, Error.t) result"}],"slug":"libtmux-options-catalog"},{"id":"Libtmux.Options.describe","publicId":"Libtmux.Options.describe","qualifiedName":"Libtmux.Options.describe","name":"describe","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":866,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val describe : version:string -> string -> (descriptor, Error.t) result","source":{"file":"lib/libtmux.mli","line":866,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options","signatures":[{"raw":"val describe : version:string -> string -> (descriptor, Error.t) result","params":[{"name":"version","type":"string","keywordOnly":true},{"name":"arg1","type":"string"}],"returns":"(descriptor, Error.t) result"}],"slug":"libtmux-options-describe"},{"id":"Libtmux.Options.descriptor","publicId":"Libtmux.Options.descriptor","qualifiedName":"Libtmux.Options.descriptor","name":"descriptor","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":823,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Generated upstream descriptors. [versions] lists qualified releases; user\n options have no built-in release history. "],"declarations":[{"kind":"struct","text":"type descriptor = {\n name : string;\n kind : Kind.t;\n array : bool;\n hook : bool;\n scopes : [ `Server | `Session | `Window | `Pane ] list;\n versions : string list;\n }","source":{"file":"lib/libtmux.mli","line":823,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options","doc":{"summary":"Generated upstream descriptors. `versions` lists qualified releases; user options have no built-in release history."},"signatures":[{"raw":"type descriptor =\n {\n name: string ;\n kind: Kind.t ;\n array: bool ;\n hook: bool ;\n scopes: [ `Server | `Session | `Window | `Pane ] list ;\n versions: string list }","params":[]}],"slug":"libtmux-options-descriptor"},{"id":"Libtmux.Options.descriptor.array","publicId":"Libtmux.Options.descriptor.array","name":"array","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":826,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"array : bool;","source":{"file":"lib/libtmux.mli","line":826,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.descriptor","type":"bool","qualifiedName":"Libtmux.Options.array","slug":"libtmux-options-descriptor-array"},{"id":"Libtmux.Options.descriptor.hook","publicId":"Libtmux.Options.descriptor.hook","name":"hook","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":827,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"hook : bool;","source":{"file":"lib/libtmux.mli","line":827,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.descriptor","type":"bool","qualifiedName":"Libtmux.Options.hook","slug":"libtmux-options-descriptor-hook"},{"id":"Libtmux.Options.descriptor.kind","publicId":"Libtmux.Options.descriptor.kind","name":"kind","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":825,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"kind : Kind.t;","source":{"file":"lib/libtmux.mli","line":825,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.descriptor","type":"Kind.t","qualifiedName":"Libtmux.Options.kind","slug":"libtmux-options-descriptor-kind"},{"id":"Libtmux.Options.descriptor.name","publicId":"Libtmux.Options.descriptor.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":824,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"lib/libtmux.mli","line":824,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.descriptor","type":"string","qualifiedName":"Libtmux.Options.name","slug":"libtmux-options-descriptor-name"},{"id":"Libtmux.Options.descriptor.scopes","publicId":"Libtmux.Options.descriptor.scopes","name":"scopes","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":828,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"scopes : [ `Server | `Session | `Window | `Pane ] list;","source":{"file":"lib/libtmux.mli","line":828,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.descriptor","type":"[ `Pane | `Server | `Session | `Window ] list","qualifiedName":"Libtmux.Options.scopes","slug":"libtmux-options-descriptor-scopes"},{"id":"Libtmux.Options.descriptor.versions","publicId":"Libtmux.Options.descriptor.versions","name":"versions","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":829,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"versions : string list;","source":{"file":"lib/libtmux.mli","line":829,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.descriptor","type":"string list","qualifiedName":"Libtmux.Options.versions","slug":"libtmux-options-descriptor-versions"},{"id":"Libtmux.Options.entry","publicId":"Libtmux.Options.entry","qualifiedName":"Libtmux.Options.entry","name":"entry","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":852,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type entry = { descriptor : descriptor; value : value; inherited : bool }","source":{"file":"lib/libtmux.mli","line":852,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options","signatures":[{"raw":"type entry = {\n descriptor: descriptor ;\n value: value ;\n inherited: bool }","params":[]}],"slug":"libtmux-options-entry"},{"id":"Libtmux.Options.entry.descriptor","publicId":"Libtmux.Options.entry.descriptor","name":"descriptor","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":852,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"descriptor : descriptor;","source":{"file":"lib/libtmux.mli","line":852,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.entry","type":"descriptor","qualifiedName":"Libtmux.Options.descriptor","slug":"libtmux-options-entry-descriptor"},{"id":"Libtmux.Options.entry.inherited","publicId":"Libtmux.Options.entry.inherited","name":"inherited","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":852,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"inherited : bool","source":{"file":"lib/libtmux.mli","line":852,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.entry","type":"bool","qualifiedName":"Libtmux.Options.inherited","slug":"libtmux-options-entry-inherited"},{"id":"Libtmux.Options.entry.value","publicId":"Libtmux.Options.entry.value","name":"value","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":852,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"value : value;","source":{"file":"lib/libtmux.mli","line":852,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.entry","type":"value","qualifiedName":"Libtmux.Options.value","slug":"libtmux-options-entry-value"},{"id":"Libtmux.Options.lookup","publicId":"Libtmux.Options.lookup","qualifiedName":"Libtmux.Options.lookup","name":"lookup","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":868,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" [None] means absent from this capture's selected scope and inheritance\n policy. Use [describe] to distinguish an unsupported built-in name. "],"declarations":[{"kind":"function","text":"val lookup : t -> string -> entry option","source":{"file":"lib/libtmux.mli","line":868,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options","doc":{"summary":"`None` means absent from this capture's selected scope and inheritance policy. Use `describe` to distinguish an unsupported built-in name."},"signatures":[{"raw":"val lookup : t -> string -> entry option","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"string"}],"returns":"entry option"}],"slug":"libtmux-options-lookup"},{"id":"Libtmux.Options.scalar","publicId":"Libtmux.Options.scalar","qualifiedName":"Libtmux.Options.scalar","name":"scalar","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":842,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type scalar =\n | Text of string\n | Integer of int64\n | Bool of bool\n | Choice of string\n | Key of string\n | Colour of string\n | Commands of string","source":{"file":"lib/libtmux.mli","line":842,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options","signatures":[{"raw":"type scalar =\n | Text of string \n | Integer of int64 \n | Bool of bool \n | Choice of string \n | Key of string \n | Colour of string \n | Commands of string ","params":[]}],"slug":"libtmux-options-scalar"},{"id":"Libtmux.Options.scalar.Bool","publicId":"Libtmux.Options.scalar.Bool","name":"Bool","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":845,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Bool of bool","source":{"file":"lib/libtmux.mli","line":845,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scalar","variant":"tuple","qualifiedName":"Libtmux.Options.Bool","slug":"libtmux-options-scalar-bool"},{"id":"Libtmux.Options.scalar.Choice","publicId":"Libtmux.Options.scalar.Choice","name":"Choice","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":846,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Choice of string","source":{"file":"lib/libtmux.mli","line":846,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scalar","variant":"tuple","qualifiedName":"Libtmux.Options.Choice","slug":"libtmux-options-scalar-choice"},{"id":"Libtmux.Options.scalar.Colour","publicId":"Libtmux.Options.scalar.Colour","name":"Colour","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":848,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Colour of string","source":{"file":"lib/libtmux.mli","line":848,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scalar","variant":"tuple","qualifiedName":"Libtmux.Options.Colour","slug":"libtmux-options-scalar-colour"},{"id":"Libtmux.Options.scalar.Commands","publicId":"Libtmux.Options.scalar.Commands","name":"Commands","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":849,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Commands of string","source":{"file":"lib/libtmux.mli","line":849,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scalar","variant":"tuple","qualifiedName":"Libtmux.Options.Commands","slug":"libtmux-options-scalar-commands"},{"id":"Libtmux.Options.scalar.Integer","publicId":"Libtmux.Options.scalar.Integer","name":"Integer","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":844,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Integer of int64","source":{"file":"lib/libtmux.mli","line":844,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scalar","variant":"tuple","qualifiedName":"Libtmux.Options.Integer","slug":"libtmux-options-scalar-integer"},{"id":"Libtmux.Options.scalar.Key","publicId":"Libtmux.Options.scalar.Key","name":"Key","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":847,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Key of string","source":{"file":"lib/libtmux.mli","line":847,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scalar","variant":"tuple","qualifiedName":"Libtmux.Options.Key","slug":"libtmux-options-scalar-key"},{"id":"Libtmux.Options.scalar.Text","publicId":"Libtmux.Options.scalar.Text","name":"Text","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":843,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Text of string","source":{"file":"lib/libtmux.mli","line":843,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scalar","variant":"tuple","qualifiedName":"Libtmux.Options.Text","slug":"libtmux-options-scalar-text"},{"id":"Libtmux.Options.scope","publicId":"Libtmux.Options.scope","qualifiedName":"Libtmux.Options.scope","name":"scope","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":834,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type scope =\n | Server\n | Global_sessions\n | Global_windows\n | Session of Session.target\n | Window of Window.target\n | Pane of Pane.target","source":{"file":"lib/libtmux.mli","line":834,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options","signatures":[{"raw":"type scope =\n | Server \n | Global_sessions \n | Global_windows \n | Session of Session.target \n | Window of Window.target \n | Pane of Pane.target ","params":[]}],"slug":"libtmux-options-scope"},{"id":"Libtmux.Options.scope.Global_sessions","publicId":"Libtmux.Options.scope.Global_sessions","name":"Global_sessions","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":836,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Global_sessions","source":{"file":"lib/libtmux.mli","line":836,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scope","variant":"unit","qualifiedName":"Libtmux.Options.Global_sessions","slug":"libtmux-options-scope-global_sessions"},{"id":"Libtmux.Options.scope.Global_windows","publicId":"Libtmux.Options.scope.Global_windows","name":"Global_windows","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":837,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Global_windows","source":{"file":"lib/libtmux.mli","line":837,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scope","variant":"unit","qualifiedName":"Libtmux.Options.Global_windows","slug":"libtmux-options-scope-global_windows"},{"id":"Libtmux.Options.scope.Pane","publicId":"Libtmux.Options.scope.Pane","name":"Pane","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":840,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Pane of Pane.target","source":{"file":"lib/libtmux.mli","line":840,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scope","variant":"tuple","qualifiedName":"Libtmux.Options.Pane","slug":"libtmux-options-scope-pane"},{"id":"Libtmux.Options.scope.Server","publicId":"Libtmux.Options.scope.Server","name":"Server","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":835,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Server","source":{"file":"lib/libtmux.mli","line":835,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scope","variant":"unit","qualifiedName":"Libtmux.Options.Server","slug":"libtmux-options-scope-server"},{"id":"Libtmux.Options.scope.Session","publicId":"Libtmux.Options.scope.Session","name":"Session","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":838,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Session of Session.target","source":{"file":"lib/libtmux.mli","line":838,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scope","variant":"tuple","qualifiedName":"Libtmux.Options.Session","slug":"libtmux-options-scope-session"},{"id":"Libtmux.Options.scope.Window","publicId":"Libtmux.Options.scope.Window","name":"Window","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":839,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Window of Window.target","source":{"file":"lib/libtmux.mli","line":839,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.scope","variant":"tuple","qualifiedName":"Libtmux.Options.Window","slug":"libtmux-options-scope-window"},{"id":"Libtmux.Options.t","publicId":"Libtmux.Options.t","qualifiedName":"Libtmux.Options.t","name":"t","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":854,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Captured options in tmux order, with original array indexes. An empty\n array differs from an absent local entry. No accessor performs I/O. "],"declarations":[{"kind":"struct","text":"type t = {\n source : Source.t;\n scope : scope;\n include_inherited : bool;\n entries : entry Iarray.t;\n started_at_ns : int64;\n finished_at_ns : int64;\n }","source":{"file":"lib/libtmux.mli","line":854,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options","doc":{"summary":"Captured options in tmux order, with original array indexes. An empty array differs from an absent local entry. No accessor performs I/O."},"signatures":[{"raw":"type t =\n {\n source: Source.t ;\n scope: scope ;\n include_inherited: bool ;\n entries: entry Iarray.t ;\n started_at_ns: int64 ;\n finished_at_ns: int64 }","params":[]}],"slug":"libtmux-options-t"},{"id":"Libtmux.Options.t.entries","publicId":"Libtmux.Options.t.entries","name":"entries","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":858,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"entries : entry Iarray.t;","source":{"file":"lib/libtmux.mli","line":858,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.t","type":"entry Iarray.t","qualifiedName":"Libtmux.Options.entries","slug":"libtmux-options-t-entries"},{"id":"Libtmux.Options.t.finished_at_ns","publicId":"Libtmux.Options.t.finished_at_ns","name":"finished_at_ns","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":860,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"finished_at_ns : int64;","source":{"file":"lib/libtmux.mli","line":860,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.t","type":"int64","qualifiedName":"Libtmux.Options.finished_at_ns","slug":"libtmux-options-t-finished_at_ns"},{"id":"Libtmux.Options.t.include_inherited","publicId":"Libtmux.Options.t.include_inherited","name":"include_inherited","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":857,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"include_inherited : bool;","source":{"file":"lib/libtmux.mli","line":857,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.t","type":"bool","qualifiedName":"Libtmux.Options.include_inherited","slug":"libtmux-options-t-include_inherited"},{"id":"Libtmux.Options.t.scope","publicId":"Libtmux.Options.t.scope","name":"scope","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":856,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"scope : scope;","source":{"file":"lib/libtmux.mli","line":856,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.t","type":"scope","qualifiedName":"Libtmux.Options.scope","slug":"libtmux-options-t-scope"},{"id":"Libtmux.Options.t.source","publicId":"Libtmux.Options.t.source","name":"source","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":855,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"source : Source.t;","source":{"file":"lib/libtmux.mli","line":855,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.t","type":"Source.t","qualifiedName":"Libtmux.Options.source","slug":"libtmux-options-t-source"},{"id":"Libtmux.Options.t.started_at_ns","publicId":"Libtmux.Options.t.started_at_ns","name":"started_at_ns","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":859,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"started_at_ns : int64;","source":{"file":"lib/libtmux.mli","line":859,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.t","type":"int64","qualifiedName":"Libtmux.Options.started_at_ns","slug":"libtmux-options-t-started_at_ns"},{"id":"Libtmux.Options.value","publicId":"Libtmux.Options.value","qualifiedName":"Libtmux.Options.value","name":"value","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":851,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type value = Scalar of scalar | Array of (int * scalar) Iarray.t","source":{"file":"lib/libtmux.mli","line":851,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options","signatures":[{"raw":"type value =\n | Scalar of scalar \n | Array of (int * scalar) Iarray.t ","params":[]}],"slug":"libtmux-options-value"},{"id":"Libtmux.Options.value.Array","publicId":"Libtmux.Options.value.Array","name":"Array","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":851,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Array of (int * scalar) Iarray.t","source":{"file":"lib/libtmux.mli","line":851,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.value","variant":"tuple","qualifiedName":"Libtmux.Options.Array","slug":"libtmux-options-value-array"},{"id":"Libtmux.Options.value.Scalar","publicId":"Libtmux.Options.value.Scalar","name":"Scalar","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":851,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Scalar of scalar","source":{"file":"lib/libtmux.mli","line":851,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Options.value","variant":"tuple","qualifiedName":"Libtmux.Options.Scalar","slug":"libtmux-options-value-scalar"},{"id":"Libtmux.Output","publicId":"Libtmux.Output","qualifiedName":"Libtmux.Output","name":"Output","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1034,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Future observed pane bytes, local cursors and explicit continuity loss.\n Output cursors are unrelated to snapshot times or server-side history. "],"declarations":[{"kind":"module","text":"module Output : sig\n type cursor = { generation : Generation.t; offset : int64 }\n (** [offset] is the number of observed bytes through the end of a Data event.\n Cursors from different subscription generations are unrelated. No cursor\n identifies a snapshot instant or a server-side historical position. *)\n\n type reason =\n | Overflow\n | Membership_changed\n | Server_paused\n | Cancelled\n | Client_closed\n | Transport_error of Error.t\n\n type event =\n | Data of { cursor : cursor; bytes : string }\n | Gap of { after : cursor option; lost_bytes : int option; reason : reason }\n | End of reason\n (** Immutable event values. [Gap.after] is the last cursor delivered to\n the caller. Unknown loss is [None]. A gap ends continuity and is\n followed by End; recover with a fresh capture and a new\n subscription. Data preserves bytes, including NUL and invalid UTF-8.\n It is future observed output, not rendered text or historical\n reconstruction. *)\n\n val reason_pp : Format.formatter -> reason -> unit\n\n type wait_error =\n | Ended of reason\n | Failure of Error.t\n (** A future-byte wait either loses its subscription's continuity or\n fails an operation. Neither result establishes that the text was\n absent earlier. *)\nend","source":{"file":"lib/libtmux.mli","line":1034,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"Future observed pane bytes, local cursors and explicit continuity loss. Output cursors are unrelated to snapshot times or server-side history."},"slug":"libtmux-output"},{"id":"Libtmux.Output.cursor","publicId":"Libtmux.Output.cursor","qualifiedName":"Libtmux.Output.cursor","name":"cursor","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1035,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" [offset] is the number of observed bytes through the end of a Data event.\n Cursors from different subscription generations are unrelated. No cursor\n identifies a snapshot instant or a server-side historical position. "],"declarations":[{"kind":"struct","text":"type cursor = { generation : Generation.t; offset : int64 }","source":{"file":"lib/libtmux.mli","line":1035,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output","doc":{"summary":"`offset` is the number of observed bytes through the end of a Data event. Cursors from different subscription generations are unrelated. No cursor identifies a snapshot instant or a server-side historical position."},"signatures":[{"raw":"type cursor = {\n generation: Generation.t ;\n offset: int64 }","params":[]}],"slug":"libtmux-output-cursor"},{"id":"Libtmux.Output.cursor.generation","publicId":"Libtmux.Output.cursor.generation","name":"generation","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1035,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"generation : Generation.t;","source":{"file":"lib/libtmux.mli","line":1035,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.cursor","type":"Generation.t","qualifiedName":"Libtmux.Output.generation","slug":"libtmux-output-cursor-generation"},{"id":"Libtmux.Output.cursor.offset","publicId":"Libtmux.Output.cursor.offset","name":"offset","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1035,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"offset : int64","source":{"file":"lib/libtmux.mli","line":1035,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.cursor","type":"int64","qualifiedName":"Libtmux.Output.offset","slug":"libtmux-output-cursor-offset"},{"id":"Libtmux.Output.event","publicId":"Libtmux.Output.event","qualifiedName":"Libtmux.Output.event","name":"event","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1048,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type event =\n | Data of { cursor : cursor; bytes : string }\n | Gap of { after : cursor option; lost_bytes : int option; reason : reason }\n | End of reason","source":{"file":"lib/libtmux.mli","line":1048,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output","signatures":[{"raw":"type event =\n | Data of {\n cursor: cursor ;\n bytes: string } \n | Gap of {\n after: cursor option ;\n lost_bytes: int option ;\n reason: reason } \n | End of reason ","params":[]}],"slug":"libtmux-output-event"},{"id":"Libtmux.Output.event.Data","publicId":"Libtmux.Output.event.Data","name":"Data","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1049,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Data of { cursor : cursor; bytes : string }","source":{"file":"lib/libtmux.mli","line":1049,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.event","variant":"struct","qualifiedName":"Libtmux.Output.Data","slug":"libtmux-output-event-data"},{"id":"Libtmux.Output.event.Data.bytes","publicId":"Libtmux.Output.event.Data.bytes","name":"bytes","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1049,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"bytes : string","source":{"file":"lib/libtmux.mli","line":1049,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.event.Data","type":"string","qualifiedName":"Libtmux.Output.bytes","slug":"libtmux-output-event-data-bytes"},{"id":"Libtmux.Output.event.Data.cursor","publicId":"Libtmux.Output.event.Data.cursor","name":"cursor","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1049,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"cursor : cursor;","source":{"file":"lib/libtmux.mli","line":1049,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.event.Data","type":"cursor","qualifiedName":"Libtmux.Output.cursor","slug":"libtmux-output-event-data-cursor"},{"id":"Libtmux.Output.event.End","publicId":"Libtmux.Output.event.End","name":"End","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1051,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Immutable event values. [Gap.after] is the last cursor delivered to\n the caller. Unknown loss is [None]. A gap ends continuity and is\n followed by End; recover with a fresh capture and a new\n subscription. Data preserves bytes, including NUL and invalid UTF-8.\n It is future observed output, not rendered text or historical\n reconstruction. "],"declarations":[{"kind":"constant","text":"| End of reason","source":{"file":"lib/libtmux.mli","line":1051,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.event","doc":{"summary":"Immutable event values. `Gap.after` is the last cursor delivered to the caller. Unknown loss is `None`. A gap ends continuity and is followed by End; recover with a fresh capture and a new subscription. Data preserves bytes, including NUL and invalid UTF-8. It is future observed output, not rendered text or historical reconstruction."},"variant":"tuple","qualifiedName":"Libtmux.Output.End","slug":"libtmux-output-event-end"},{"id":"Libtmux.Output.event.Gap","publicId":"Libtmux.Output.event.Gap","name":"Gap","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1050,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Gap of { after : cursor option; lost_bytes : int option; reason : reason }","source":{"file":"lib/libtmux.mli","line":1050,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.event","variant":"struct","qualifiedName":"Libtmux.Output.Gap","slug":"libtmux-output-event-gap"},{"id":"Libtmux.Output.event.Gap.after","publicId":"Libtmux.Output.event.Gap.after","name":"after","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1050,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"after : cursor option;","source":{"file":"lib/libtmux.mli","line":1050,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.event.Gap","type":"cursor option","qualifiedName":"Libtmux.Output.after","slug":"libtmux-output-event-gap-after"},{"id":"Libtmux.Output.event.Gap.lost_bytes","publicId":"Libtmux.Output.event.Gap.lost_bytes","name":"lost_bytes","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1050,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"lost_bytes : int option;","source":{"file":"lib/libtmux.mli","line":1050,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.event.Gap","type":"int option","qualifiedName":"Libtmux.Output.lost_bytes","slug":"libtmux-output-event-gap-lost_bytes"},{"id":"Libtmux.Output.event.Gap.reason","publicId":"Libtmux.Output.event.Gap.reason","name":"reason","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1050,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"reason : reason","source":{"file":"lib/libtmux.mli","line":1050,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.event.Gap","type":"reason","qualifiedName":"Libtmux.Output.reason","slug":"libtmux-output-event-gap-reason"},{"id":"Libtmux.Output.reason","publicId":"Libtmux.Output.reason","qualifiedName":"Libtmux.Output.reason","name":"reason","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1040,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type reason =\n | Overflow\n | Membership_changed\n | Server_paused\n | Cancelled\n | Client_closed\n | Transport_error of Error.t","source":{"file":"lib/libtmux.mli","line":1040,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output","signatures":[{"raw":"type reason =\n | Overflow \n | Membership_changed \n | Server_paused \n | Cancelled \n | Client_closed \n | Transport_error of Error.t ","params":[]}],"slug":"libtmux-output-reason"},{"id":"Libtmux.Output.reason.Cancelled","publicId":"Libtmux.Output.reason.Cancelled","name":"Cancelled","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1044,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Cancelled","source":{"file":"lib/libtmux.mli","line":1044,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.reason","variant":"unit","qualifiedName":"Libtmux.Output.Cancelled","slug":"libtmux-output-reason-cancelled"},{"id":"Libtmux.Output.reason.Client_closed","publicId":"Libtmux.Output.reason.Client_closed","name":"Client_closed","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1045,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Client_closed","source":{"file":"lib/libtmux.mli","line":1045,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.reason","variant":"unit","qualifiedName":"Libtmux.Output.Client_closed","slug":"libtmux-output-reason-client_closed"},{"id":"Libtmux.Output.reason.Membership_changed","publicId":"Libtmux.Output.reason.Membership_changed","name":"Membership_changed","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1042,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Membership_changed","source":{"file":"lib/libtmux.mli","line":1042,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.reason","variant":"unit","qualifiedName":"Libtmux.Output.Membership_changed","slug":"libtmux-output-reason-membership_changed"},{"id":"Libtmux.Output.reason.Overflow","publicId":"Libtmux.Output.reason.Overflow","name":"Overflow","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1041,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Overflow","source":{"file":"lib/libtmux.mli","line":1041,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.reason","variant":"unit","qualifiedName":"Libtmux.Output.Overflow","slug":"libtmux-output-reason-overflow"},{"id":"Libtmux.Output.reason.Server_paused","publicId":"Libtmux.Output.reason.Server_paused","name":"Server_paused","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1043,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Server_paused","source":{"file":"lib/libtmux.mli","line":1043,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.reason","variant":"unit","qualifiedName":"Libtmux.Output.Server_paused","slug":"libtmux-output-reason-server_paused"},{"id":"Libtmux.Output.reason.Transport_error","publicId":"Libtmux.Output.reason.Transport_error","name":"Transport_error","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1046,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Transport_error of Error.t","source":{"file":"lib/libtmux.mli","line":1046,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.reason","variant":"tuple","qualifiedName":"Libtmux.Output.Transport_error","slug":"libtmux-output-reason-transport_error"},{"id":"Libtmux.Output.reason_pp","publicId":"Libtmux.Output.reason_pp","qualifiedName":"Libtmux.Output.reason_pp","name":"reason_pp","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1059,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val reason_pp : Format.formatter -> reason -> unit","source":{"file":"lib/libtmux.mli","line":1059,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output","signatures":[{"raw":"val reason_pp : Format.formatter -> reason -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"reason"}],"returns":"unit"}],"slug":"libtmux-output-reason_pp"},{"id":"Libtmux.Output.wait_error","publicId":"Libtmux.Output.wait_error","qualifiedName":"Libtmux.Output.wait_error","name":"wait_error","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1061,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type wait_error =\n | Ended of reason\n | Failure of Error.t","source":{"file":"lib/libtmux.mli","line":1061,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output","signatures":[{"raw":"type wait_error =\n | Ended of reason \n | Failure of Error.t ","params":[]}],"slug":"libtmux-output-wait_error"},{"id":"Libtmux.Output.wait_error.Ended","publicId":"Libtmux.Output.wait_error.Ended","name":"Ended","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1062,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Ended of reason","source":{"file":"lib/libtmux.mli","line":1062,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.wait_error","variant":"tuple","qualifiedName":"Libtmux.Output.Ended","slug":"libtmux-output-wait_error-ended"},{"id":"Libtmux.Output.wait_error.Failure","publicId":"Libtmux.Output.wait_error.Failure","name":"Failure","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":1063,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" A future-byte wait either loses its subscription's continuity or\n fails an operation. Neither result establishes that the text was\n absent earlier. "],"declarations":[{"kind":"constant","text":"| Failure of Error.t","source":{"file":"lib/libtmux.mli","line":1063,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Output.wait_error","doc":{"summary":"A future-byte wait either loses its subscription's continuity or fails an operation. Neither result establishes that the text was absent earlier."},"variant":"tuple","qualifiedName":"Libtmux.Output.Failure","slug":"libtmux-output-wait_error-failure"},{"id":"Libtmux.Pane","publicId":"Libtmux.Pane","qualifiedName":"Libtmux.Pane","name":"Pane","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":306,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" A captured pane with local geometry, process metadata and a window\n relationship. Use {!Pane.val-target} for explicit actions; reading the\n observation never refreshes it. "],"declarations":[{"kind":"module","text":"and Pane : sig\n type t\n\n module Fields : sig\n val id : (t, string) Field.t\n val index : (t, int) Field.t\n val active : (t, bool) Field.t\n val dead : (t, bool) Field.t\n val title : (t, string) Field.t\n val current_command : (t, string) Field.t\n val current_path : (t, string) Field.t\n val width : (t, int) Field.t\n val height : (t, int) Field.t\n val left : (t, int) Field.t\n val top : (t, int) Field.t\n end\n\n module Relations : sig\n val window : (t, Window.t) Relation.One.t\n end\n\n module Id : ID\n\n module Target : sig\n type t\n\n val of_id : source:Source.t -> Id.t -> t\n val source : t -> Source.t\n val id : t -> Id.t\n end\n\n type target = Target.t\n\n val id : t -> Id.t\n val index : t -> int\n val active : t -> bool\n val dead : t -> bool\n val title : t -> string\n val current_command : t -> string\n val current_path : t -> string\n\n val pid : t -> int option\n (** The captured process ID, absent when tmux reports no process. *)\n\n val width : t -> int\n val height : t -> int\n val left : t -> int\n val top : t -> int\n val window : t -> Window.t\n val source : t -> Source.t\n val target : t -> target\n\n val same_entity : t -> t -> bool\n (** Compare IDs within the same bound {!Source.t} generation. *)\n\n val same_observation : t -> t -> bool\n (** Compare entity identity and snapshot identity. *)\nend","source":{"file":"lib/libtmux.mli","line":306,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"A captured pane with local geometry, process metadata and a window relationship. Use {!Pane.val-target} for explicit actions; reading the observation never refreshes it."},"slug":"libtmux-pane"},{"id":"Libtmux.Pane.Fields","publicId":"Libtmux.Pane.Fields","qualifiedName":"Libtmux.Pane.Fields","name":"Fields","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":309,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Fields : sig\n val id : (t, string) Field.t\n val index : (t, int) Field.t\n val active : (t, bool) Field.t\n val dead : (t, bool) Field.t\n val title : (t, string) Field.t\n val current_command : (t, string) Field.t\n val current_path : (t, string) Field.t\n val width : (t, int) Field.t\n val height : (t, int) Field.t\n val left : (t, int) Field.t\n val top : (t, int) Field.t\n end","source":{"file":"lib/libtmux.mli","line":309,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","slug":"libtmux-pane-fields"},{"id":"Libtmux.Pane.Fields.active","publicId":"Libtmux.Pane.Fields.active","qualifiedName":"Libtmux.Pane.Fields.active","name":"active","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":312,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val active : (t, bool) Field.t","source":{"file":"lib/libtmux.mli","line":312,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Fields","signatures":[{"raw":"val active : (t, bool) Field.t","params":[],"returns":"(t, bool) Field.t"}],"slug":"libtmux-pane-fields-active"},{"id":"Libtmux.Pane.Fields.current_command","publicId":"Libtmux.Pane.Fields.current_command","qualifiedName":"Libtmux.Pane.Fields.current_command","name":"current_command","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":315,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val current_command : (t, string) Field.t","source":{"file":"lib/libtmux.mli","line":315,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Fields","signatures":[{"raw":"val current_command : (t, string) Field.t","params":[],"returns":"(t, string) Field.t"}],"slug":"libtmux-pane-fields-current_command"},{"id":"Libtmux.Pane.Fields.current_path","publicId":"Libtmux.Pane.Fields.current_path","qualifiedName":"Libtmux.Pane.Fields.current_path","name":"current_path","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":316,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val current_path : (t, string) Field.t","source":{"file":"lib/libtmux.mli","line":316,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Fields","signatures":[{"raw":"val current_path : (t, string) Field.t","params":[],"returns":"(t, string) Field.t"}],"slug":"libtmux-pane-fields-current_path"},{"id":"Libtmux.Pane.Fields.dead","publicId":"Libtmux.Pane.Fields.dead","qualifiedName":"Libtmux.Pane.Fields.dead","name":"dead","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":313,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val dead : (t, bool) Field.t","source":{"file":"lib/libtmux.mli","line":313,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Fields","signatures":[{"raw":"val dead : (t, bool) Field.t","params":[],"returns":"(t, bool) Field.t"}],"slug":"libtmux-pane-fields-dead"},{"id":"Libtmux.Pane.Fields.height","publicId":"Libtmux.Pane.Fields.height","qualifiedName":"Libtmux.Pane.Fields.height","name":"height","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":318,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val height : (t, int) Field.t","source":{"file":"lib/libtmux.mli","line":318,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Fields","signatures":[{"raw":"val height : (t, int) Field.t","params":[],"returns":"(t, int) Field.t"}],"slug":"libtmux-pane-fields-height"},{"id":"Libtmux.Pane.Fields.id","publicId":"Libtmux.Pane.Fields.id","qualifiedName":"Libtmux.Pane.Fields.id","name":"id","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":310,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val id : (t, string) Field.t","source":{"file":"lib/libtmux.mli","line":310,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Fields","signatures":[{"raw":"val id : (t, string) Field.t","params":[],"returns":"(t, string) Field.t"}],"slug":"libtmux-pane-fields-id"},{"id":"Libtmux.Pane.Fields.index","publicId":"Libtmux.Pane.Fields.index","qualifiedName":"Libtmux.Pane.Fields.index","name":"index","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":311,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val index : (t, int) Field.t","source":{"file":"lib/libtmux.mli","line":311,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Fields","signatures":[{"raw":"val index : (t, int) Field.t","params":[],"returns":"(t, int) Field.t"}],"slug":"libtmux-pane-fields-index"},{"id":"Libtmux.Pane.Fields.left","publicId":"Libtmux.Pane.Fields.left","qualifiedName":"Libtmux.Pane.Fields.left","name":"left","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":319,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val left : (t, int) Field.t","source":{"file":"lib/libtmux.mli","line":319,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Fields","signatures":[{"raw":"val left : (t, int) Field.t","params":[],"returns":"(t, int) Field.t"}],"slug":"libtmux-pane-fields-left"},{"id":"Libtmux.Pane.Fields.title","publicId":"Libtmux.Pane.Fields.title","qualifiedName":"Libtmux.Pane.Fields.title","name":"title","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":314,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val title : (t, string) Field.t","source":{"file":"lib/libtmux.mli","line":314,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Fields","signatures":[{"raw":"val title : (t, string) Field.t","params":[],"returns":"(t, string) Field.t"}],"slug":"libtmux-pane-fields-title"},{"id":"Libtmux.Pane.Fields.top","publicId":"Libtmux.Pane.Fields.top","qualifiedName":"Libtmux.Pane.Fields.top","name":"top","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":320,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val top : (t, int) Field.t","source":{"file":"lib/libtmux.mli","line":320,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Fields","signatures":[{"raw":"val top : (t, int) Field.t","params":[],"returns":"(t, int) Field.t"}],"slug":"libtmux-pane-fields-top"},{"id":"Libtmux.Pane.Fields.width","publicId":"Libtmux.Pane.Fields.width","qualifiedName":"Libtmux.Pane.Fields.width","name":"width","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":317,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val width : (t, int) Field.t","source":{"file":"lib/libtmux.mli","line":317,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Fields","signatures":[{"raw":"val width : (t, int) Field.t","params":[],"returns":"(t, int) Field.t"}],"slug":"libtmux-pane-fields-width"},{"id":"Libtmux.Pane.Id","publicId":"Libtmux.Pane.Id","qualifiedName":"Libtmux.Pane.Id","name":"Id","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":327,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Id : ID","source":{"file":"lib/libtmux.mli","line":327,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","slug":"libtmux-pane-id-16to"},{"id":"Libtmux.Pane.Id.compare","publicId":"Libtmux.Pane.Id.compare","qualifiedName":"Libtmux.Pane.Id.compare","name":"compare","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":136,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val compare : t -> t -> int","source":{"file":"lib/libtmux.mli","line":136,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Id","signatures":[{"raw":"val compare : t -> t -> int","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"int"}],"slug":"libtmux-pane-id-compare"},{"id":"Libtmux.Pane.Id.equal","publicId":"Libtmux.Pane.Id.equal","qualifiedName":"Libtmux.Pane.Id.equal","name":"equal","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":135,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val equal : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":135,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Id","signatures":[{"raw":"val equal : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-pane-id-equal"},{"id":"Libtmux.Pane.Id.of_string","publicId":"Libtmux.Pane.Id.of_string","qualifiedName":"Libtmux.Pane.Id.of_string","name":"of_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":131,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Accept a canonical prefixed decimal tmux ID in the uint32 range. "],"declarations":[{"kind":"function","text":"val of_string : string -> (t, Error.t) result","source":{"file":"lib/libtmux.mli","line":131,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Id","doc":{"summary":"Accept a canonical prefixed decimal tmux ID in the uint32 range."},"signatures":[{"raw":"val of_string : string -> (t, Error.t) result","params":[{"name":"arg1","type":"string"}],"returns":"(t, Error.t) result"}],"slug":"libtmux-pane-id-of_string"},{"id":"Libtmux.Pane.Id.pp","publicId":"Libtmux.Pane.Id.pp","qualifiedName":"Libtmux.Pane.Id.pp","name":"pp","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":137,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pp : Format.formatter -> t -> unit","source":{"file":"lib/libtmux.mli","line":137,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Id","signatures":[{"raw":"val pp : Format.formatter -> t -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"t"}],"returns":"unit"}],"slug":"libtmux-pane-id-pp"},{"id":"Libtmux.Pane.Id.t","publicId":"Libtmux.Pane.Id.t","qualifiedName":"Libtmux.Pane.Id.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":129,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":129,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Id","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-pane-id-t"},{"id":"Libtmux.Pane.Id.to_string","publicId":"Libtmux.Pane.Id.to_string","qualifiedName":"Libtmux.Pane.Id.to_string","name":"to_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":134,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val to_string : t -> string","source":{"file":"lib/libtmux.mli","line":134,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Id","signatures":[{"raw":"val to_string : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-pane-id-to_string"},{"id":"Libtmux.Pane.Relations","publicId":"Libtmux.Pane.Relations","qualifiedName":"Libtmux.Pane.Relations","name":"Relations","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":323,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Relations : sig\n val window : (t, Window.t) Relation.One.t\n end","source":{"file":"lib/libtmux.mli","line":323,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","slug":"libtmux-pane-relations"},{"id":"Libtmux.Pane.Relations.window","publicId":"Libtmux.Pane.Relations.window","qualifiedName":"Libtmux.Pane.Relations.window","name":"window","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":324,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val window : (t, Window.t) Relation.One.t","source":{"file":"lib/libtmux.mli","line":324,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Relations","signatures":[{"raw":"val window : (t, Window.t) Relation.One.t","params":[],"returns":"(t, Window.t) Relation.One.t"}],"slug":"libtmux-pane-relations-window"},{"id":"Libtmux.Pane.Target","publicId":"Libtmux.Pane.Target","qualifiedName":"Libtmux.Pane.Target","name":"Target","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":329,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Target : sig\n type t\n\n val of_id : source:Source.t -> Id.t -> t\n val source : t -> Source.t\n val id : t -> Id.t\n end","source":{"file":"lib/libtmux.mli","line":329,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","slug":"libtmux-pane-target-nx8w"},{"id":"Libtmux.Pane.Target.id","publicId":"Libtmux.Pane.Target.id","qualifiedName":"Libtmux.Pane.Target.id","name":"id","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":334,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val id : t -> Id.t","source":{"file":"lib/libtmux.mli","line":334,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Target","signatures":[{"raw":"val id : t -> Id.t","params":[{"name":"arg1","type":"t"}],"returns":"Id.t"}],"slug":"libtmux-pane-target-id"},{"id":"Libtmux.Pane.Target.of_id","publicId":"Libtmux.Pane.Target.of_id","qualifiedName":"Libtmux.Pane.Target.of_id","name":"of_id","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":332,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val of_id : source:Source.t -> Id.t -> t","source":{"file":"lib/libtmux.mli","line":332,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Target","signatures":[{"raw":"val of_id : source:Source.t -> Id.t -> t","params":[{"name":"source","type":"Source.t","keywordOnly":true},{"name":"arg1","type":"Id.t"}],"returns":"t"}],"slug":"libtmux-pane-target-of_id"},{"id":"Libtmux.Pane.Target.source","publicId":"Libtmux.Pane.Target.source","qualifiedName":"Libtmux.Pane.Target.source","name":"source","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":333,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val source : t -> Source.t","source":{"file":"lib/libtmux.mli","line":333,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Target","signatures":[{"raw":"val source : t -> Source.t","params":[{"name":"arg1","type":"t"}],"returns":"Source.t"}],"slug":"libtmux-pane-target-source"},{"id":"Libtmux.Pane.Target.t","publicId":"Libtmux.Pane.Target.t","qualifiedName":"Libtmux.Pane.Target.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":330,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":330,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane.Target","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-pane-target-t"},{"id":"Libtmux.Pane.active","publicId":"Libtmux.Pane.active","qualifiedName":"Libtmux.Pane.active","name":"active","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":341,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val active : t -> bool","source":{"file":"lib/libtmux.mli","line":341,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val active : t -> bool","params":[{"name":"arg1","type":"t"}],"returns":"bool"}],"slug":"libtmux-pane-active"},{"id":"Libtmux.Pane.current_command","publicId":"Libtmux.Pane.current_command","qualifiedName":"Libtmux.Pane.current_command","name":"current_command","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":344,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val current_command : t -> string","source":{"file":"lib/libtmux.mli","line":344,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val current_command : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-pane-current_command"},{"id":"Libtmux.Pane.current_path","publicId":"Libtmux.Pane.current_path","qualifiedName":"Libtmux.Pane.current_path","name":"current_path","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":345,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val current_path : t -> string","source":{"file":"lib/libtmux.mli","line":345,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val current_path : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-pane-current_path"},{"id":"Libtmux.Pane.dead","publicId":"Libtmux.Pane.dead","qualifiedName":"Libtmux.Pane.dead","name":"dead","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":342,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val dead : t -> bool","source":{"file":"lib/libtmux.mli","line":342,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val dead : t -> bool","params":[{"name":"arg1","type":"t"}],"returns":"bool"}],"slug":"libtmux-pane-dead"},{"id":"Libtmux.Pane.height","publicId":"Libtmux.Pane.height","qualifiedName":"Libtmux.Pane.height","name":"height","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":351,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val height : t -> int","source":{"file":"lib/libtmux.mli","line":351,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val height : t -> int","params":[{"name":"arg1","type":"t"}],"returns":"int"}],"slug":"libtmux-pane-height"},{"id":"Libtmux.Pane.id","publicId":"Libtmux.Pane.id","qualifiedName":"Libtmux.Pane.id","name":"id","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":339,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val id : t -> Id.t","source":{"file":"lib/libtmux.mli","line":339,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val id : t -> Id.t","params":[{"name":"arg1","type":"t"}],"returns":"Id.t"}],"slug":"libtmux-pane-id-19ve"},{"id":"Libtmux.Pane.index","publicId":"Libtmux.Pane.index","qualifiedName":"Libtmux.Pane.index","name":"index","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":340,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val index : t -> int","source":{"file":"lib/libtmux.mli","line":340,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val index : t -> int","params":[{"name":"arg1","type":"t"}],"returns":"int"}],"slug":"libtmux-pane-index"},{"id":"Libtmux.Pane.left","publicId":"Libtmux.Pane.left","qualifiedName":"Libtmux.Pane.left","name":"left","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":352,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val left : t -> int","source":{"file":"lib/libtmux.mli","line":352,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val left : t -> int","params":[{"name":"arg1","type":"t"}],"returns":"int"}],"slug":"libtmux-pane-left"},{"id":"Libtmux.Pane.pid","publicId":"Libtmux.Pane.pid","qualifiedName":"Libtmux.Pane.pid","name":"pid","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":347,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" The captured process ID, absent when tmux reports no process. "],"declarations":[{"kind":"function","text":"val pid : t -> int option","source":{"file":"lib/libtmux.mli","line":347,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","doc":{"summary":"The captured process ID, absent when tmux reports no process."},"signatures":[{"raw":"val pid : t -> int option","params":[{"name":"arg1","type":"t"}],"returns":"int option"}],"slug":"libtmux-pane-pid"},{"id":"Libtmux.Pane.same_entity","publicId":"Libtmux.Pane.same_entity","qualifiedName":"Libtmux.Pane.same_entity","name":"same_entity","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":358,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Compare IDs within the same bound {!Source.t} generation. "],"declarations":[{"kind":"function","text":"val same_entity : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":358,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","doc":{"summary":"Compare IDs within the same bound {!Source.t} generation."},"signatures":[{"raw":"val same_entity : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-pane-same_entity"},{"id":"Libtmux.Pane.same_observation","publicId":"Libtmux.Pane.same_observation","qualifiedName":"Libtmux.Pane.same_observation","name":"same_observation","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":361,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Compare entity identity and snapshot identity. "],"declarations":[{"kind":"function","text":"val same_observation : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":361,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","doc":{"summary":"Compare entity identity and snapshot identity."},"signatures":[{"raw":"val same_observation : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-pane-same_observation"},{"id":"Libtmux.Pane.source","publicId":"Libtmux.Pane.source","qualifiedName":"Libtmux.Pane.source","name":"source","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":355,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val source : t -> Source.t","source":{"file":"lib/libtmux.mli","line":355,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val source : t -> Source.t","params":[{"name":"arg1","type":"t"}],"returns":"Source.t"}],"slug":"libtmux-pane-source"},{"id":"Libtmux.Pane.t","publicId":"Libtmux.Pane.t","qualifiedName":"Libtmux.Pane.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":307,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":307,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-pane-t"},{"id":"Libtmux.Pane.target","publicId":"Libtmux.Pane.target","qualifiedName":"Libtmux.Pane.target","name":"target","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":356,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val target : t -> target","source":{"file":"lib/libtmux.mli","line":356,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val target : t -> target","params":[{"name":"arg1","type":"t"}],"returns":"target"}],"slug":"libtmux-pane-target-t3h1"},{"id":"Libtmux.Pane.target:type","publicId":"Libtmux.Pane.target:type","qualifiedName":"Libtmux.Pane.target","name":"target","kind":"typealias","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":337,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type target = Target.t","source":{"file":"lib/libtmux.mli","line":337,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","type":"Target.t","signatures":[{"raw":"type target = Target.t","params":[]}],"slug":"libtmux-pane-target-type"},{"id":"Libtmux.Pane.title","publicId":"Libtmux.Pane.title","qualifiedName":"Libtmux.Pane.title","name":"title","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":343,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val title : t -> string","source":{"file":"lib/libtmux.mli","line":343,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val title : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-pane-title"},{"id":"Libtmux.Pane.top","publicId":"Libtmux.Pane.top","qualifiedName":"Libtmux.Pane.top","name":"top","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":353,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val top : t -> int","source":{"file":"lib/libtmux.mli","line":353,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val top : t -> int","params":[{"name":"arg1","type":"t"}],"returns":"int"}],"slug":"libtmux-pane-top"},{"id":"Libtmux.Pane.width","publicId":"Libtmux.Pane.width","qualifiedName":"Libtmux.Pane.width","name":"width","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":350,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val width : t -> int","source":{"file":"lib/libtmux.mli","line":350,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val width : t -> int","params":[{"name":"arg1","type":"t"}],"returns":"int"}],"slug":"libtmux-pane-width"},{"id":"Libtmux.Pane.window","publicId":"Libtmux.Pane.window","qualifiedName":"Libtmux.Pane.window","name":"window","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":354,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val window : t -> Window.t","source":{"file":"lib/libtmux.mli","line":354,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Pane","signatures":[{"raw":"val window : t -> Window.t","params":[{"name":"arg1","type":"t"}],"returns":"Window.t"}],"slug":"libtmux-pane-window"},{"id":"Libtmux.Plan","publicId":"Libtmux.Plan","qualifiedName":"Libtmux.Plan","name":"Plan","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":666,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Explicit source-filter planning for a new acquisition. A plan separates\n supported tmux predicates from residual local evaluation; it never changes\n the I/O-free contract of {!Query.matching}. Backend capture operations\n acquire a complete graph and do not consume these plans. "],"declarations":[{"kind":"module","text":"module Plan : sig\n type pushdown = Auto | Never | Require_exact\n type t\n\n val panes : ?pushdown:pushdown -> Pane.t Expr.t -> (t, Error.t) result\n (** Plan without I/O. Exact lowering covers pane active/dead flags and\n complete Boolean combinations. Unsupported children prevent lowering the\n whole expression, including under OR and NOT. Relationships always stay\n local. [Require_exact] rejects an unsupported expression before\n acquisition. *)\n\n val source_filter : t -> string option\n val residual : t -> Pane.t Expr.t\n val required_fields : t -> string list\n val required_relations : t -> string list\n val explanation : t -> string\n val pp : Format.formatter -> t -> unit\nend","source":{"file":"lib/libtmux.mli","line":666,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"Explicit source-filter planning for a new acquisition. A plan separates supported tmux predicates from residual local evaluation; it never changes the I/O-free contract of {!Query.matching}. Backend capture operations acquire a complete graph and do not consume these plans."},"slug":"libtmux-plan"},{"id":"Libtmux.Plan.explanation","publicId":"Libtmux.Plan.explanation","qualifiedName":"Libtmux.Plan.explanation","name":"explanation","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":681,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val explanation : t -> string","source":{"file":"lib/libtmux.mli","line":681,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Plan","signatures":[{"raw":"val explanation : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-plan-explanation"},{"id":"Libtmux.Plan.panes","publicId":"Libtmux.Plan.panes","qualifiedName":"Libtmux.Plan.panes","name":"panes","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":670,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Plan without I/O. Exact lowering covers pane active/dead flags and\n complete Boolean combinations. Unsupported children prevent lowering the\n whole expression, including under OR and NOT. Relationships always stay\n local. [Require_exact] rejects an unsupported expression before\n acquisition. "],"declarations":[{"kind":"function","text":"val panes : ?pushdown:pushdown -> Pane.t Expr.t -> (t, Error.t) result","source":{"file":"lib/libtmux.mli","line":670,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Plan","doc":{"summary":"Plan without I/O. Exact lowering covers pane active/dead flags and complete Boolean combinations. Unsupported children prevent lowering the whole expression, including under OR and NOT. Relationships always stay local. `Require_exact` rejects an unsupported expression before acquisition."},"signatures":[{"raw":"val panes : ?pushdown:pushdown -> Pane.t Expr.t -> (t, Error.t) result","params":[{"name":"pushdown","type":"pushdown","optional":true,"keywordOnly":true},{"name":"arg1","type":"Pane.t Expr.t"}],"returns":"(t, Error.t) result"}],"slug":"libtmux-plan-panes"},{"id":"Libtmux.Plan.pp","publicId":"Libtmux.Plan.pp","qualifiedName":"Libtmux.Plan.pp","name":"pp","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":682,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pp : Format.formatter -> t -> unit","source":{"file":"lib/libtmux.mli","line":682,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Plan","signatures":[{"raw":"val pp : Format.formatter -> t -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"t"}],"returns":"unit"}],"slug":"libtmux-plan-pp"},{"id":"Libtmux.Plan.pushdown","publicId":"Libtmux.Plan.pushdown","qualifiedName":"Libtmux.Plan.pushdown","name":"pushdown","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":667,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type pushdown = Auto | Never | Require_exact","source":{"file":"lib/libtmux.mli","line":667,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Plan","signatures":[{"raw":"type pushdown =\n | Auto \n | Never \n | Require_exact ","params":[]}],"slug":"libtmux-plan-pushdown"},{"id":"Libtmux.Plan.pushdown.Auto","publicId":"Libtmux.Plan.pushdown.Auto","name":"Auto","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":667,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Auto","source":{"file":"lib/libtmux.mli","line":667,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Plan.pushdown","variant":"unit","qualifiedName":"Libtmux.Plan.Auto","slug":"libtmux-plan-pushdown-auto"},{"id":"Libtmux.Plan.pushdown.Never","publicId":"Libtmux.Plan.pushdown.Never","name":"Never","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":667,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Never","source":{"file":"lib/libtmux.mli","line":667,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Plan.pushdown","variant":"unit","qualifiedName":"Libtmux.Plan.Never","slug":"libtmux-plan-pushdown-never"},{"id":"Libtmux.Plan.pushdown.Require_exact","publicId":"Libtmux.Plan.pushdown.Require_exact","name":"Require_exact","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":667,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Require_exact","source":{"file":"lib/libtmux.mli","line":667,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Plan.pushdown","variant":"unit","qualifiedName":"Libtmux.Plan.Require_exact","slug":"libtmux-plan-pushdown-require_exact"},{"id":"Libtmux.Plan.required_fields","publicId":"Libtmux.Plan.required_fields","qualifiedName":"Libtmux.Plan.required_fields","name":"required_fields","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":679,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val required_fields : t -> string list","source":{"file":"lib/libtmux.mli","line":679,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Plan","signatures":[{"raw":"val required_fields : t -> string list","params":[{"name":"arg1","type":"t"}],"returns":"string list"}],"slug":"libtmux-plan-required_fields"},{"id":"Libtmux.Plan.required_relations","publicId":"Libtmux.Plan.required_relations","qualifiedName":"Libtmux.Plan.required_relations","name":"required_relations","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":680,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val required_relations : t -> string list","source":{"file":"lib/libtmux.mli","line":680,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Plan","signatures":[{"raw":"val required_relations : t -> string list","params":[{"name":"arg1","type":"t"}],"returns":"string list"}],"slug":"libtmux-plan-required_relations"},{"id":"Libtmux.Plan.residual","publicId":"Libtmux.Plan.residual","qualifiedName":"Libtmux.Plan.residual","name":"residual","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":678,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val residual : t -> Pane.t Expr.t","source":{"file":"lib/libtmux.mli","line":678,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Plan","signatures":[{"raw":"val residual : t -> Pane.t Expr.t","params":[{"name":"arg1","type":"t"}],"returns":"Pane.t Expr.t"}],"slug":"libtmux-plan-residual"},{"id":"Libtmux.Plan.source_filter","publicId":"Libtmux.Plan.source_filter","qualifiedName":"Libtmux.Plan.source_filter","name":"source_filter","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":677,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val source_filter : t -> string option","source":{"file":"lib/libtmux.mli","line":677,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Plan","signatures":[{"raw":"val source_filter : t -> string option","params":[{"name":"arg1","type":"t"}],"returns":"string option"}],"slug":"libtmux-plan-source_filter"},{"id":"Libtmux.Plan.t","publicId":"Libtmux.Plan.t","qualifiedName":"Libtmux.Plan.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":668,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":668,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Plan","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-plan-t"},{"id":"Libtmux.Query","publicId":"Libtmux.Query","qualifiedName":"Libtmux.Query","name":"Query","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":694,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Sequence adapters and bounded cardinality checks over captured values.\n Matching preserves order and duplicates. Expected absence and ambiguity\n remain ordinary result values. "],"declarations":[{"kind":"module","text":"module Query : sig\n val matching : 'a Expr.t -> 'a Seq.t -> 'a Seq.t\n (** [matching expression] compiles once when the adapter is constructed.\n Filtering preserves order and duplicates. Snapshot-derived sequences\n replay captured values; arbitrary input sequences retain their effects,\n exceptions and replay semantics. No tmux acquisition occurs. *)\n\n val exactly_one : 'a Seq.t -> ('a, Cardinality.error) result\n (** Return the unique value. Stop when a second value is found; proving\n uniqueness requires exhausting the remaining sequence. The input's effects\n and exceptions propagate. This does not execute a mutation. *)\n\n val one_or_none : 'a Seq.t -> ('a option, Cardinality.error) result\n (** As {!exactly_one}, with [Ok None] for an empty sequence. Order and\n duplicate entries count toward cardinality; values are not deduplicated.\n *)\nend","source":{"file":"lib/libtmux.mli","line":694,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"Sequence adapters and bounded cardinality checks over captured values. Matching preserves order and duplicates. Expected absence and ambiguity remain ordinary result values."},"slug":"libtmux-query"},{"id":"Libtmux.Query.exactly_one","publicId":"Libtmux.Query.exactly_one","qualifiedName":"Libtmux.Query.exactly_one","name":"exactly_one","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":701,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Return the unique value. Stop when a second value is found; proving\n uniqueness requires exhausting the remaining sequence. The input's effects\n and exceptions propagate. This does not execute a mutation. "],"declarations":[{"kind":"function","text":"val exactly_one : 'a Seq.t -> ('a, Cardinality.error) result","source":{"file":"lib/libtmux.mli","line":701,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Query","doc":{"summary":"Return the unique value. Stop when a second value is found; proving uniqueness requires exhausting the remaining sequence. The input's effects and exceptions propagate. This does not execute a mutation."},"signatures":[{"raw":"val exactly_one : 'a Seq.t -> ('a, Cardinality.error) result","params":[{"name":"arg1","type":"'a Seq.t"}],"returns":"('a, Cardinality.error) result"}],"slug":"libtmux-query-exactly_one"},{"id":"Libtmux.Query.matching","publicId":"Libtmux.Query.matching","qualifiedName":"Libtmux.Query.matching","name":"matching","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":695,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" [matching expression] compiles once when the adapter is constructed.\n Filtering preserves order and duplicates. Snapshot-derived sequences\n replay captured values; arbitrary input sequences retain their effects,\n exceptions and replay semantics. No tmux acquisition occurs. "],"declarations":[{"kind":"function","text":"val matching : 'a Expr.t -> 'a Seq.t -> 'a Seq.t","source":{"file":"lib/libtmux.mli","line":695,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Query","doc":{"summary":"`matching expression` compiles once when the adapter is constructed. Filtering preserves order and duplicates. Snapshot-derived sequences replay captured values; arbitrary input sequences retain their effects, exceptions and replay semantics. No tmux acquisition occurs."},"signatures":[{"raw":"val matching : 'a Expr.t -> 'a Seq.t -> 'a Seq.t","params":[{"name":"arg1","type":"'a Expr.t"},{"name":"arg2","type":"'a Seq.t"}],"returns":"'a Seq.t"}],"slug":"libtmux-query-matching"},{"id":"Libtmux.Query.one_or_none","publicId":"Libtmux.Query.one_or_none","qualifiedName":"Libtmux.Query.one_or_none","name":"one_or_none","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":706,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" As {!exactly_one}, with [Ok None] for an empty sequence. Order and\n duplicate entries count toward cardinality; values are not deduplicated.\n "],"declarations":[{"kind":"function","text":"val one_or_none : 'a Seq.t -> ('a option, Cardinality.error) result","source":{"file":"lib/libtmux.mli","line":706,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Query","doc":{"summary":"As {!exactly_one}, with `Ok None` for an empty sequence. Order and duplicate entries count toward cardinality; values are not deduplicated."},"signatures":[{"raw":"val one_or_none : 'a Seq.t -> ('a option, Cardinality.error) result","params":[{"name":"arg1","type":"'a Seq.t"}],"returns":"('a option, Cardinality.error) result"}],"slug":"libtmux-query-one_or_none"},{"id":"Libtmux.Relation","publicId":"Libtmux.Relation","qualifiedName":"Libtmux.Relation","name":"Relation","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":159,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Typed edges in a captured graph. Many, one and optional relations are\n distinct; an unacquired relationship is never represented as an empty one.\n"],"declarations":[{"kind":"module","text":"module Relation : sig\n module Many : sig\n type ('parent, 'child) t\n\n val name : ('parent, 'child) t -> string\n end\n\n module One : sig\n type ('parent, 'child) t\n\n val name : ('parent, 'child) t -> string\n end\n\n module Optional : sig\n type ('parent, 'child) t\n\n val name : ('parent, 'child) t -> string\n end\nend","source":{"file":"lib/libtmux.mli","line":159,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"Typed edges in a captured graph. Many, one and optional relations are distinct; an unacquired relationship is never represented as an empty one."},"slug":"libtmux-relation"},{"id":"Libtmux.Relation.Many","publicId":"Libtmux.Relation.Many","qualifiedName":"Libtmux.Relation.Many","name":"Many","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":160,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Many : sig\n type ('parent, 'child) t\n\n val name : ('parent, 'child) t -> string\n end","source":{"file":"lib/libtmux.mli","line":160,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Relation","slug":"libtmux-relation-many"},{"id":"Libtmux.Relation.Many.name","publicId":"Libtmux.Relation.Many.name","qualifiedName":"Libtmux.Relation.Many.name","name":"name","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":163,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val name : ('parent, 'child) t -> string","source":{"file":"lib/libtmux.mli","line":163,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Relation.Many","signatures":[{"raw":"val name : ('parent, 'child) t -> string","params":[{"name":"arg1","type":"('parent, 'child) t"}],"returns":"string"}],"slug":"libtmux-relation-many-name"},{"id":"Libtmux.Relation.Many.t","publicId":"Libtmux.Relation.Many.t","qualifiedName":"Libtmux.Relation.Many.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":161,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type ('parent, 'child) t","source":{"file":"lib/libtmux.mli","line":161,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Relation.Many","signatures":[{"raw":"type ('parent, 'child) t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-relation-many-t"},{"id":"Libtmux.Relation.One","publicId":"Libtmux.Relation.One","qualifiedName":"Libtmux.Relation.One","name":"One","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":166,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module One : sig\n type ('parent, 'child) t\n\n val name : ('parent, 'child) t -> string\n end","source":{"file":"lib/libtmux.mli","line":166,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Relation","slug":"libtmux-relation-one"},{"id":"Libtmux.Relation.One.name","publicId":"Libtmux.Relation.One.name","qualifiedName":"Libtmux.Relation.One.name","name":"name","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":169,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val name : ('parent, 'child) t -> string","source":{"file":"lib/libtmux.mli","line":169,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Relation.One","signatures":[{"raw":"val name : ('parent, 'child) t -> string","params":[{"name":"arg1","type":"('parent, 'child) t"}],"returns":"string"}],"slug":"libtmux-relation-one-name"},{"id":"Libtmux.Relation.One.t","publicId":"Libtmux.Relation.One.t","qualifiedName":"Libtmux.Relation.One.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":167,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type ('parent, 'child) t","source":{"file":"lib/libtmux.mli","line":167,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Relation.One","signatures":[{"raw":"type ('parent, 'child) t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-relation-one-t"},{"id":"Libtmux.Relation.Optional","publicId":"Libtmux.Relation.Optional","qualifiedName":"Libtmux.Relation.Optional","name":"Optional","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":172,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Optional : sig\n type ('parent, 'child) t\n\n val name : ('parent, 'child) t -> string\n end","source":{"file":"lib/libtmux.mli","line":172,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Relation","slug":"libtmux-relation-optional"},{"id":"Libtmux.Relation.Optional.name","publicId":"Libtmux.Relation.Optional.name","qualifiedName":"Libtmux.Relation.Optional.name","name":"name","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":175,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val name : ('parent, 'child) t -> string","source":{"file":"lib/libtmux.mli","line":175,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Relation.Optional","signatures":[{"raw":"val name : ('parent, 'child) t -> string","params":[{"name":"arg1","type":"('parent, 'child) t"}],"returns":"string"}],"slug":"libtmux-relation-optional-name"},{"id":"Libtmux.Relation.Optional.t","publicId":"Libtmux.Relation.Optional.t","qualifiedName":"Libtmux.Relation.Optional.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":173,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type ('parent, 'child) t","source":{"file":"lib/libtmux.mli","line":173,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Relation.Optional","signatures":[{"raw":"type ('parent, 'child) t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-relation-optional-t"},{"id":"Libtmux.Session","publicId":"Libtmux.Session","qualifiedName":"Libtmux.Session","name":"Session","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":181,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" A captured session and its ordered window-link contexts. A session can\n contain repeated links to the same global window. "],"declarations":[{"kind":"module","text":"module rec Session : sig\n type t\n\n module Fields : sig\n val id : (t, string) Field.t\n val name : (t, string) Field.t\n val attached : (t, int) Field.t\n end\n\n module Relations : sig\n val window_links : (t, Window_link.t) Relation.Many.t\n val windows : (t, Window.t) Relation.Many.t\n end\n\n module Id : ID\n\n module Target : sig\n type t\n\n val of_id : source:Source.t -> Id.t -> t\n (** Describe a target in an existing connection generation. No I/O. *)\n\n val source : t -> Source.t\n val id : t -> Id.t\n end\n\n type target = Target.t\n\n val id : t -> Id.t\n val name : t -> string\n val attached : t -> int\n val source : t -> Source.t\n val target : t -> target\n\n val same_entity : t -> t -> bool\n (** Compare IDs within the same bound {!Source.t} generation. *)\n\n val same_observation : t -> t -> bool\n (** Compare entity identity and snapshot identity. *)\n\n val window_links : t -> Window_link.t Iarray.t\n (** All captured links, in capture order, including repeated windows. *)\n\n val windows : t -> Window.t Iarray.t\n (** Distinct windows in first-link order. All accesses are local. *)\nend","source":{"file":"lib/libtmux.mli","line":181,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"A captured session and its ordered window-link contexts. A session can contain repeated links to the same global window."},"slug":"libtmux-session"},{"id":"Libtmux.Session.Fields","publicId":"Libtmux.Session.Fields","qualifiedName":"Libtmux.Session.Fields","name":"Fields","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":184,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Fields : sig\n val id : (t, string) Field.t\n val name : (t, string) Field.t\n val attached : (t, int) Field.t\n end","source":{"file":"lib/libtmux.mli","line":184,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","slug":"libtmux-session-fields"},{"id":"Libtmux.Session.Fields.attached","publicId":"Libtmux.Session.Fields.attached","qualifiedName":"Libtmux.Session.Fields.attached","name":"attached","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":187,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val attached : (t, int) Field.t","source":{"file":"lib/libtmux.mli","line":187,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Fields","signatures":[{"raw":"val attached : (t, int) Field.t","params":[],"returns":"(t, int) Field.t"}],"slug":"libtmux-session-fields-attached"},{"id":"Libtmux.Session.Fields.id","publicId":"Libtmux.Session.Fields.id","qualifiedName":"Libtmux.Session.Fields.id","name":"id","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":185,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val id : (t, string) Field.t","source":{"file":"lib/libtmux.mli","line":185,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Fields","signatures":[{"raw":"val id : (t, string) Field.t","params":[],"returns":"(t, string) Field.t"}],"slug":"libtmux-session-fields-id"},{"id":"Libtmux.Session.Fields.name","publicId":"Libtmux.Session.Fields.name","qualifiedName":"Libtmux.Session.Fields.name","name":"name","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":186,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val name : (t, string) Field.t","source":{"file":"lib/libtmux.mli","line":186,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Fields","signatures":[{"raw":"val name : (t, string) Field.t","params":[],"returns":"(t, string) Field.t"}],"slug":"libtmux-session-fields-name"},{"id":"Libtmux.Session.Id","publicId":"Libtmux.Session.Id","qualifiedName":"Libtmux.Session.Id","name":"Id","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":195,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Id : ID","source":{"file":"lib/libtmux.mli","line":195,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","slug":"libtmux-session-id-12k2"},{"id":"Libtmux.Session.Id.compare","publicId":"Libtmux.Session.Id.compare","qualifiedName":"Libtmux.Session.Id.compare","name":"compare","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":136,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val compare : t -> t -> int","source":{"file":"lib/libtmux.mli","line":136,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Id","signatures":[{"raw":"val compare : t -> t -> int","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"int"}],"slug":"libtmux-session-id-compare"},{"id":"Libtmux.Session.Id.equal","publicId":"Libtmux.Session.Id.equal","qualifiedName":"Libtmux.Session.Id.equal","name":"equal","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":135,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val equal : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":135,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Id","signatures":[{"raw":"val equal : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-session-id-equal"},{"id":"Libtmux.Session.Id.of_string","publicId":"Libtmux.Session.Id.of_string","qualifiedName":"Libtmux.Session.Id.of_string","name":"of_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":131,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Accept a canonical prefixed decimal tmux ID in the uint32 range. "],"declarations":[{"kind":"function","text":"val of_string : string -> (t, Error.t) result","source":{"file":"lib/libtmux.mli","line":131,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Id","doc":{"summary":"Accept a canonical prefixed decimal tmux ID in the uint32 range."},"signatures":[{"raw":"val of_string : string -> (t, Error.t) result","params":[{"name":"arg1","type":"string"}],"returns":"(t, Error.t) result"}],"slug":"libtmux-session-id-of_string"},{"id":"Libtmux.Session.Id.pp","publicId":"Libtmux.Session.Id.pp","qualifiedName":"Libtmux.Session.Id.pp","name":"pp","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":137,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pp : Format.formatter -> t -> unit","source":{"file":"lib/libtmux.mli","line":137,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Id","signatures":[{"raw":"val pp : Format.formatter -> t -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"t"}],"returns":"unit"}],"slug":"libtmux-session-id-pp"},{"id":"Libtmux.Session.Id.t","publicId":"Libtmux.Session.Id.t","qualifiedName":"Libtmux.Session.Id.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":129,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":129,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Id","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-session-id-t"},{"id":"Libtmux.Session.Id.to_string","publicId":"Libtmux.Session.Id.to_string","qualifiedName":"Libtmux.Session.Id.to_string","name":"to_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":134,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val to_string : t -> string","source":{"file":"lib/libtmux.mli","line":134,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Id","signatures":[{"raw":"val to_string : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-session-id-to_string"},{"id":"Libtmux.Session.Relations","publicId":"Libtmux.Session.Relations","qualifiedName":"Libtmux.Session.Relations","name":"Relations","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":190,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Relations : sig\n val window_links : (t, Window_link.t) Relation.Many.t\n val windows : (t, Window.t) Relation.Many.t\n end","source":{"file":"lib/libtmux.mli","line":190,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","slug":"libtmux-session-relations"},{"id":"Libtmux.Session.Relations.window_links","publicId":"Libtmux.Session.Relations.window_links","qualifiedName":"Libtmux.Session.Relations.window_links","name":"window_links","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":191,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val window_links : (t, Window_link.t) Relation.Many.t","source":{"file":"lib/libtmux.mli","line":191,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Relations","signatures":[{"raw":"val window_links : (t, Window_link.t) Relation.Many.t","params":[],"returns":"(t, Window_link.t) Relation.Many.t"}],"slug":"libtmux-session-relations-window_links"},{"id":"Libtmux.Session.Relations.windows","publicId":"Libtmux.Session.Relations.windows","qualifiedName":"Libtmux.Session.Relations.windows","name":"windows","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":192,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val windows : (t, Window.t) Relation.Many.t","source":{"file":"lib/libtmux.mli","line":192,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Relations","signatures":[{"raw":"val windows : (t, Window.t) Relation.Many.t","params":[],"returns":"(t, Window.t) Relation.Many.t"}],"slug":"libtmux-session-relations-windows"},{"id":"Libtmux.Session.Target","publicId":"Libtmux.Session.Target","qualifiedName":"Libtmux.Session.Target","name":"Target","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":197,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Target : sig\n type t\n\n val of_id : source:Source.t -> Id.t -> t\n (** Describe a target in an existing connection generation. No I/O. *)\n\n val source : t -> Source.t\n val id : t -> Id.t\n end","source":{"file":"lib/libtmux.mli","line":197,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","slug":"libtmux-session-target-5p2d"},{"id":"Libtmux.Session.Target.id","publicId":"Libtmux.Session.Target.id","qualifiedName":"Libtmux.Session.Target.id","name":"id","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":204,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val id : t -> Id.t","source":{"file":"lib/libtmux.mli","line":204,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Target","signatures":[{"raw":"val id : t -> Id.t","params":[{"name":"arg1","type":"t"}],"returns":"Id.t"}],"slug":"libtmux-session-target-id"},{"id":"Libtmux.Session.Target.of_id","publicId":"Libtmux.Session.Target.of_id","qualifiedName":"Libtmux.Session.Target.of_id","name":"of_id","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":200,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Describe a target in an existing connection generation. No I/O. "],"declarations":[{"kind":"function","text":"val of_id : source:Source.t -> Id.t -> t","source":{"file":"lib/libtmux.mli","line":200,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Target","doc":{"summary":"Describe a target in an existing connection generation. No I/O."},"signatures":[{"raw":"val of_id : source:Source.t -> Id.t -> t","params":[{"name":"source","type":"Source.t","keywordOnly":true},{"name":"arg1","type":"Id.t"}],"returns":"t"}],"slug":"libtmux-session-target-of_id"},{"id":"Libtmux.Session.Target.source","publicId":"Libtmux.Session.Target.source","qualifiedName":"Libtmux.Session.Target.source","name":"source","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":203,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val source : t -> Source.t","source":{"file":"lib/libtmux.mli","line":203,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Target","signatures":[{"raw":"val source : t -> Source.t","params":[{"name":"arg1","type":"t"}],"returns":"Source.t"}],"slug":"libtmux-session-target-source"},{"id":"Libtmux.Session.Target.t","publicId":"Libtmux.Session.Target.t","qualifiedName":"Libtmux.Session.Target.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":198,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":198,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session.Target","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-session-target-t"},{"id":"Libtmux.Session.attached","publicId":"Libtmux.Session.attached","qualifiedName":"Libtmux.Session.attached","name":"attached","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":211,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val attached : t -> int","source":{"file":"lib/libtmux.mli","line":211,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","signatures":[{"raw":"val attached : t -> int","params":[{"name":"arg1","type":"t"}],"returns":"int"}],"slug":"libtmux-session-attached"},{"id":"Libtmux.Session.id","publicId":"Libtmux.Session.id","qualifiedName":"Libtmux.Session.id","name":"id","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":209,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val id : t -> Id.t","source":{"file":"lib/libtmux.mli","line":209,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","signatures":[{"raw":"val id : t -> Id.t","params":[{"name":"arg1","type":"t"}],"returns":"Id.t"}],"slug":"libtmux-session-id-12gy"},{"id":"Libtmux.Session.name","publicId":"Libtmux.Session.name","qualifiedName":"Libtmux.Session.name","name":"name","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":210,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val name : t -> string","source":{"file":"lib/libtmux.mli","line":210,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","signatures":[{"raw":"val name : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-session-name"},{"id":"Libtmux.Session.same_entity","publicId":"Libtmux.Session.same_entity","qualifiedName":"Libtmux.Session.same_entity","name":"same_entity","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":215,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Compare IDs within the same bound {!Source.t} generation. "],"declarations":[{"kind":"function","text":"val same_entity : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":215,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","doc":{"summary":"Compare IDs within the same bound {!Source.t} generation."},"signatures":[{"raw":"val same_entity : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-session-same_entity"},{"id":"Libtmux.Session.same_observation","publicId":"Libtmux.Session.same_observation","qualifiedName":"Libtmux.Session.same_observation","name":"same_observation","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":218,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Compare entity identity and snapshot identity. "],"declarations":[{"kind":"function","text":"val same_observation : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":218,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","doc":{"summary":"Compare entity identity and snapshot identity."},"signatures":[{"raw":"val same_observation : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-session-same_observation"},{"id":"Libtmux.Session.source","publicId":"Libtmux.Session.source","qualifiedName":"Libtmux.Session.source","name":"source","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":212,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val source : t -> Source.t","source":{"file":"lib/libtmux.mli","line":212,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","signatures":[{"raw":"val source : t -> Source.t","params":[{"name":"arg1","type":"t"}],"returns":"Source.t"}],"slug":"libtmux-session-source"},{"id":"Libtmux.Session.t","publicId":"Libtmux.Session.t","qualifiedName":"Libtmux.Session.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":182,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":182,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-session-t"},{"id":"Libtmux.Session.target","publicId":"Libtmux.Session.target","qualifiedName":"Libtmux.Session.target","name":"target","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":213,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val target : t -> target","source":{"file":"lib/libtmux.mli","line":213,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","signatures":[{"raw":"val target : t -> target","params":[{"name":"arg1","type":"t"}],"returns":"target"}],"slug":"libtmux-session-target-iu8j"},{"id":"Libtmux.Session.target:type","publicId":"Libtmux.Session.target:type","qualifiedName":"Libtmux.Session.target","name":"target","kind":"typealias","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":207,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type target = Target.t","source":{"file":"lib/libtmux.mli","line":207,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","type":"Target.t","signatures":[{"raw":"type target = Target.t","params":[]}],"slug":"libtmux-session-target-type"},{"id":"Libtmux.Session.window_links","publicId":"Libtmux.Session.window_links","qualifiedName":"Libtmux.Session.window_links","name":"window_links","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":221,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" All captured links, in capture order, including repeated windows. "],"declarations":[{"kind":"function","text":"val window_links : t -> Window_link.t Iarray.t","source":{"file":"lib/libtmux.mli","line":221,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","doc":{"summary":"All captured links, in capture order, including repeated windows.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet capture_graph client (initial : Created.t) spawn =\n let linked =\n get\n (Client.create_session client ~name:\"linked\" ~window_name:\"linked-home\"\n ~spawn ())\n in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id linked.pane)\n |> Option.get\n in\n let text = \"showcase ready\" in\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n get\n (Client.link_window client initial.window ~session:linked.session ~index:7);\n get (Client.capture client)\n\nlet print_graph snapshot =\n Snapshot.sessions snapshot\n |> Iarray.iter (fun session ->\n Session.window_links session\n |> Iarray.iter (fun link ->\n let window = Window_link.window link in\n Printf.printf \"%s/%d %s: %d pane(s)\\n\" (Session.name session)\n (Window_link.index link) (Window.name window)\n (Iarray.length (Window.panes window))));\n assert (Iarray.length (Snapshot.sessions snapshot) = 2);\n assert (Iarray.length (Snapshot.windows snapshot) = 2);\n assert (Iarray.length (Snapshot.window_links snapshot) = 3);\n assert (Iarray.length (Snapshot.panes snapshot) = 2);\n print_endline \"graph: 2 sessions, 2 windows, 3 links, 2 panes\"\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let snapshot = with_demo binary capture_graph in\n print_graph snapshot\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_graph.ml","intro":"Navigate the typed object graph. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_graph.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"graph: 2 sessions, 2 windows, 3 links, 2 panes\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val window_links : t -> Window_link.t Iarray.t","params":[{"name":"arg1","type":"t"}],"returns":"Window_link.t Iarray.t"}],"slug":"libtmux-session-window_links"},{"id":"Libtmux.Session.windows","publicId":"Libtmux.Session.windows","qualifiedName":"Libtmux.Session.windows","name":"windows","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":224,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Distinct windows in first-link order. All accesses are local. "],"declarations":[{"kind":"function","text":"val windows : t -> Window.t Iarray.t","source":{"file":"lib/libtmux.mli","line":224,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Session","doc":{"summary":"Distinct windows in first-link order. All accesses are local."},"signatures":[{"raw":"val windows : t -> Window.t Iarray.t","params":[{"name":"arg1","type":"t"}],"returns":"Window.t Iarray.t"}],"slug":"libtmux-session-windows"},{"id":"Libtmux.Snapshot","publicId":"Libtmux.Snapshot","qualifiedName":"Libtmux.Snapshot","name":"Snapshot","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":403,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" A complete immutable graph captured over an acquisition interval.\n Collections are replayable immutable arrays. Capturing several tmux commands\n does not establish an atomic transaction. "],"declarations":[{"kind":"module","text":"module Snapshot : sig\n type t\n\n module Id : sig\n type t\n\n val of_string : string -> (t, Error.t) result\n val to_string : t -> string\n val equal : t -> t -> bool\n end\n\n module Input : sig\n type session = { id : Session.Id.t; name : string; attached : int }\n\n type window = {\n id : Window.Id.t;\n name : string;\n width : int;\n height : int;\n layout : string;\n }\n\n type window_link = {\n session_id : Session.Id.t;\n window_id : Window.Id.t;\n index : int;\n is_current : bool;\n }\n\n type pane = {\n id : Pane.Id.t;\n window_id : Window.Id.t;\n index : int;\n active : bool;\n dead : bool;\n title : string;\n current_command : string;\n current_path : string;\n pid : int option;\n width : int;\n height : int;\n left : int;\n top : int;\n }\n\n type client = {\n name : string;\n session_id : Session.Id.t option;\n pid : int;\n width : int;\n height : int option;\n control_mode : bool;\n }\n end\n\n val create :\n source:Source.t ->\n id:Id.t ->\n started_at_ns:int64 ->\n finished_at_ns:int64 ->\n sessions:Input.session list ->\n windows:Input.window list ->\n window_links:Input.window_link list ->\n panes:Input.pane list ->\n clients:Input.client list ->\n (t, Error.t) result\n (** Validate and materialize a complete captured graph without I/O. Equal\n duplicate global rows collapse in first-occurrence order; conflicting rows\n and dangling references return {!Error.Capture_raced}. Links at different\n indexes remain distinct, including within one session. At most 10,000\n input rows are admitted. Each session needs one current link and each\n window one active pane. Capture spans an interval, not an atomic instant.\n Input strings are bytes; no Unicode normalization is performed. *)\n\n val id : t -> Id.t\n val source : t -> Source.t\n val started_at_ns : t -> int64\n val finished_at_ns : t -> int64\n val sessions : t -> Session.t Iarray.t\n val windows : t -> Window.t Iarray.t\n val window_links : t -> Window_link.t Iarray.t\n val panes : t -> Pane.t Iarray.t\n\n val clients : t -> Client_observation.t Iarray.t\n (** Collections and their contents are immutable. They retain capture order,\n are replayable and remain readable after the acquiring client closes. *)\n\n val find_session : t -> Session.Id.t -> Session.t option\n val find_window : t -> Window.Id.t -> Window.t option\n val find_pane : t -> Pane.Id.t -> Pane.t option\nend","source":{"file":"lib/libtmux.mli","line":403,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"A complete immutable graph captured over an acquisition interval. Collections are replayable immutable arrays. Capturing several tmux commands does not establish an atomic transaction."},"slug":"libtmux-snapshot"},{"id":"Libtmux.Snapshot.Id","publicId":"Libtmux.Snapshot.Id","qualifiedName":"Libtmux.Snapshot.Id","name":"Id","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":406,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Id : sig\n type t\n\n val of_string : string -> (t, Error.t) result\n val to_string : t -> string\n val equal : t -> t -> bool\n end","source":{"file":"lib/libtmux.mli","line":406,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","slug":"libtmux-snapshot-id-1y9h"},{"id":"Libtmux.Snapshot.Id.equal","publicId":"Libtmux.Snapshot.Id.equal","qualifiedName":"Libtmux.Snapshot.Id.equal","name":"equal","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":411,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val equal : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":411,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Id","signatures":[{"raw":"val equal : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-snapshot-id-equal"},{"id":"Libtmux.Snapshot.Id.of_string","publicId":"Libtmux.Snapshot.Id.of_string","qualifiedName":"Libtmux.Snapshot.Id.of_string","name":"of_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":409,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val of_string : string -> (t, Error.t) result","source":{"file":"lib/libtmux.mli","line":409,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Id","signatures":[{"raw":"val of_string : string -> (t, Error.t) result","params":[{"name":"arg1","type":"string"}],"returns":"(t, Error.t) result"}],"slug":"libtmux-snapshot-id-of_string"},{"id":"Libtmux.Snapshot.Id.t","publicId":"Libtmux.Snapshot.Id.t","qualifiedName":"Libtmux.Snapshot.Id.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":407,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":407,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Id","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-snapshot-id-t"},{"id":"Libtmux.Snapshot.Id.to_string","publicId":"Libtmux.Snapshot.Id.to_string","qualifiedName":"Libtmux.Snapshot.Id.to_string","name":"to_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":410,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val to_string : t -> string","source":{"file":"lib/libtmux.mli","line":410,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Id","signatures":[{"raw":"val to_string : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-snapshot-id-to_string"},{"id":"Libtmux.Snapshot.Input","publicId":"Libtmux.Snapshot.Input","qualifiedName":"Libtmux.Snapshot.Input","name":"Input","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":414,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Input : sig\n type session = { id : Session.Id.t; name : string; attached : int }\n\n type window = {\n id : Window.Id.t;\n name : string;\n width : int;\n height : int;\n layout : string;\n }\n\n type window_link = {\n session_id : Session.Id.t;\n window_id : Window.Id.t;\n index : int;\n is_current : bool;\n }\n\n type pane = {\n id : Pane.Id.t;\n window_id : Window.Id.t;\n index : int;\n active : bool;\n dead : bool;\n title : string;\n current_command : string;\n current_path : string;\n pid : int option;\n width : int;\n height : int;\n left : int;\n top : int;\n }\n\n type client = {\n name : string;\n session_id : Session.Id.t option;\n pid : int;\n width : int;\n height : int option;\n control_mode : bool;\n }\n end","source":{"file":"lib/libtmux.mli","line":414,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","slug":"libtmux-snapshot-input"},{"id":"Libtmux.Snapshot.Input.client","publicId":"Libtmux.Snapshot.Input.client","qualifiedName":"Libtmux.Snapshot.Input.client","name":"client","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":448,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type client = {\n name : string;\n session_id : Session.Id.t option;\n pid : int;\n width : int;\n height : int option;\n control_mode : bool;\n }","source":{"file":"lib/libtmux.mli","line":448,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input","signatures":[{"raw":"type client =\n {\n name: string ;\n session_id: Session.Id.t option ;\n pid: int ;\n width: int ;\n height: int option ;\n control_mode: bool }","params":[]}],"slug":"libtmux-snapshot-input-client"},{"id":"Libtmux.Snapshot.Input.client.control_mode","publicId":"Libtmux.Snapshot.Input.client.control_mode","name":"control_mode","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":454,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"control_mode : bool;","source":{"file":"lib/libtmux.mli","line":454,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.client","type":"bool","qualifiedName":"Libtmux.Snapshot.Input.control_mode","slug":"libtmux-snapshot-input-client-control_mode"},{"id":"Libtmux.Snapshot.Input.client.height","publicId":"Libtmux.Snapshot.Input.client.height","name":"height","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":453,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"height : int option;","source":{"file":"lib/libtmux.mli","line":453,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.client","type":"int option","qualifiedName":"Libtmux.Snapshot.Input.height","slug":"libtmux-snapshot-input-client-height"},{"id":"Libtmux.Snapshot.Input.client.name","publicId":"Libtmux.Snapshot.Input.client.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":449,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"lib/libtmux.mli","line":449,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.client","type":"string","qualifiedName":"Libtmux.Snapshot.Input.name","slug":"libtmux-snapshot-input-client-name"},{"id":"Libtmux.Snapshot.Input.client.pid","publicId":"Libtmux.Snapshot.Input.client.pid","name":"pid","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":451,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pid : int;","source":{"file":"lib/libtmux.mli","line":451,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.client","type":"int","qualifiedName":"Libtmux.Snapshot.Input.pid","slug":"libtmux-snapshot-input-client-pid"},{"id":"Libtmux.Snapshot.Input.client.session_id","publicId":"Libtmux.Snapshot.Input.client.session_id","name":"session_id","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":450,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"session_id : Session.Id.t option;","source":{"file":"lib/libtmux.mli","line":450,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.client","type":"Session.Id.t option","qualifiedName":"Libtmux.Snapshot.Input.session_id","slug":"libtmux-snapshot-input-client-session_id"},{"id":"Libtmux.Snapshot.Input.client.width","publicId":"Libtmux.Snapshot.Input.client.width","name":"width","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":452,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"width : int;","source":{"file":"lib/libtmux.mli","line":452,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.client","type":"int","qualifiedName":"Libtmux.Snapshot.Input.width","slug":"libtmux-snapshot-input-client-width"},{"id":"Libtmux.Snapshot.Input.pane","publicId":"Libtmux.Snapshot.Input.pane","qualifiedName":"Libtmux.Snapshot.Input.pane","name":"pane","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":432,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type pane = {\n id : Pane.Id.t;\n window_id : Window.Id.t;\n index : int;\n active : bool;\n dead : bool;\n title : string;\n current_command : string;\n current_path : string;\n pid : int option;\n width : int;\n height : int;\n left : int;\n top : int;\n }","source":{"file":"lib/libtmux.mli","line":432,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input","signatures":[{"raw":"type pane =\n {\n id: Pane.Id.t ;\n window_id: Window.Id.t ;\n index: int ;\n active: bool ;\n dead: bool ;\n title: string ;\n current_command: string ;\n current_path: string ;\n pid: int option ;\n width: int ;\n height: int ;\n left: int ;\n top: int }","params":[]}],"slug":"libtmux-snapshot-input-pane"},{"id":"Libtmux.Snapshot.Input.pane.active","publicId":"Libtmux.Snapshot.Input.pane.active","name":"active","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":436,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"active : bool;","source":{"file":"lib/libtmux.mli","line":436,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"bool","qualifiedName":"Libtmux.Snapshot.Input.active","slug":"libtmux-snapshot-input-pane-active"},{"id":"Libtmux.Snapshot.Input.pane.current_command","publicId":"Libtmux.Snapshot.Input.pane.current_command","name":"current_command","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":439,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"current_command : string;","source":{"file":"lib/libtmux.mli","line":439,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"string","qualifiedName":"Libtmux.Snapshot.Input.current_command","slug":"libtmux-snapshot-input-pane-current_command"},{"id":"Libtmux.Snapshot.Input.pane.current_path","publicId":"Libtmux.Snapshot.Input.pane.current_path","name":"current_path","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":440,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"current_path : string;","source":{"file":"lib/libtmux.mli","line":440,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"string","qualifiedName":"Libtmux.Snapshot.Input.current_path","slug":"libtmux-snapshot-input-pane-current_path"},{"id":"Libtmux.Snapshot.Input.pane.dead","publicId":"Libtmux.Snapshot.Input.pane.dead","name":"dead","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":437,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"dead : bool;","source":{"file":"lib/libtmux.mli","line":437,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"bool","qualifiedName":"Libtmux.Snapshot.Input.dead","slug":"libtmux-snapshot-input-pane-dead"},{"id":"Libtmux.Snapshot.Input.pane.height","publicId":"Libtmux.Snapshot.Input.pane.height","name":"height","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":443,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"height : int;","source":{"file":"lib/libtmux.mli","line":443,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"int","qualifiedName":"Libtmux.Snapshot.Input.height","slug":"libtmux-snapshot-input-pane-height"},{"id":"Libtmux.Snapshot.Input.pane.id","publicId":"Libtmux.Snapshot.Input.pane.id","name":"id","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":433,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"id : Pane.Id.t;","source":{"file":"lib/libtmux.mli","line":433,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"Pane.Id.t","qualifiedName":"Libtmux.Snapshot.Input.id","slug":"libtmux-snapshot-input-pane-id"},{"id":"Libtmux.Snapshot.Input.pane.index","publicId":"Libtmux.Snapshot.Input.pane.index","name":"index","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":435,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"index : int;","source":{"file":"lib/libtmux.mli","line":435,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"int","qualifiedName":"Libtmux.Snapshot.Input.index","slug":"libtmux-snapshot-input-pane-index"},{"id":"Libtmux.Snapshot.Input.pane.left","publicId":"Libtmux.Snapshot.Input.pane.left","name":"left","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":444,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"left : int;","source":{"file":"lib/libtmux.mli","line":444,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"int","qualifiedName":"Libtmux.Snapshot.Input.left","slug":"libtmux-snapshot-input-pane-left"},{"id":"Libtmux.Snapshot.Input.pane.pid","publicId":"Libtmux.Snapshot.Input.pane.pid","name":"pid","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":441,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pid : int option;","source":{"file":"lib/libtmux.mli","line":441,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"int option","qualifiedName":"Libtmux.Snapshot.Input.pid","slug":"libtmux-snapshot-input-pane-pid"},{"id":"Libtmux.Snapshot.Input.pane.title","publicId":"Libtmux.Snapshot.Input.pane.title","name":"title","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":438,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"title : string;","source":{"file":"lib/libtmux.mli","line":438,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"string","qualifiedName":"Libtmux.Snapshot.Input.title","slug":"libtmux-snapshot-input-pane-title"},{"id":"Libtmux.Snapshot.Input.pane.top","publicId":"Libtmux.Snapshot.Input.pane.top","name":"top","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":445,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"top : int;","source":{"file":"lib/libtmux.mli","line":445,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"int","qualifiedName":"Libtmux.Snapshot.Input.top","slug":"libtmux-snapshot-input-pane-top"},{"id":"Libtmux.Snapshot.Input.pane.width","publicId":"Libtmux.Snapshot.Input.pane.width","name":"width","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":442,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"width : int;","source":{"file":"lib/libtmux.mli","line":442,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"int","qualifiedName":"Libtmux.Snapshot.Input.width","slug":"libtmux-snapshot-input-pane-width"},{"id":"Libtmux.Snapshot.Input.pane.window_id","publicId":"Libtmux.Snapshot.Input.pane.window_id","name":"window_id","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":434,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window_id : Window.Id.t;","source":{"file":"lib/libtmux.mli","line":434,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.pane","type":"Window.Id.t","qualifiedName":"Libtmux.Snapshot.Input.window_id","slug":"libtmux-snapshot-input-pane-window_id"},{"id":"Libtmux.Snapshot.Input.session","publicId":"Libtmux.Snapshot.Input.session","qualifiedName":"Libtmux.Snapshot.Input.session","name":"session","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":415,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type session = { id : Session.Id.t; name : string; attached : int }","source":{"file":"lib/libtmux.mli","line":415,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input","signatures":[{"raw":"type session = {\n id: Session.Id.t ;\n name: string ;\n attached: int }","params":[]}],"slug":"libtmux-snapshot-input-session"},{"id":"Libtmux.Snapshot.Input.session.attached","publicId":"Libtmux.Snapshot.Input.session.attached","name":"attached","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":415,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"attached : int","source":{"file":"lib/libtmux.mli","line":415,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.session","type":"int","qualifiedName":"Libtmux.Snapshot.Input.attached","slug":"libtmux-snapshot-input-session-attached"},{"id":"Libtmux.Snapshot.Input.session.id","publicId":"Libtmux.Snapshot.Input.session.id","name":"id","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":415,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"id : Session.Id.t;","source":{"file":"lib/libtmux.mli","line":415,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.session","type":"Session.Id.t","qualifiedName":"Libtmux.Snapshot.Input.id","slug":"libtmux-snapshot-input-session-id"},{"id":"Libtmux.Snapshot.Input.session.name","publicId":"Libtmux.Snapshot.Input.session.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":415,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"lib/libtmux.mli","line":415,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.session","type":"string","qualifiedName":"Libtmux.Snapshot.Input.name","slug":"libtmux-snapshot-input-session-name"},{"id":"Libtmux.Snapshot.Input.window","publicId":"Libtmux.Snapshot.Input.window","qualifiedName":"Libtmux.Snapshot.Input.window","name":"window","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":417,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type window = {\n id : Window.Id.t;\n name : string;\n width : int;\n height : int;\n layout : string;\n }","source":{"file":"lib/libtmux.mli","line":417,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input","signatures":[{"raw":"type window =\n {\n id: Window.Id.t ;\n name: string ;\n width: int ;\n height: int ;\n layout: string }","params":[]}],"slug":"libtmux-snapshot-input-window"},{"id":"Libtmux.Snapshot.Input.window.height","publicId":"Libtmux.Snapshot.Input.window.height","name":"height","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":421,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"height : int;","source":{"file":"lib/libtmux.mli","line":421,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.window","type":"int","qualifiedName":"Libtmux.Snapshot.Input.height","slug":"libtmux-snapshot-input-window-height"},{"id":"Libtmux.Snapshot.Input.window.id","publicId":"Libtmux.Snapshot.Input.window.id","name":"id","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":418,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"id : Window.Id.t;","source":{"file":"lib/libtmux.mli","line":418,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.window","type":"Window.Id.t","qualifiedName":"Libtmux.Snapshot.Input.id","slug":"libtmux-snapshot-input-window-id"},{"id":"Libtmux.Snapshot.Input.window.layout","publicId":"Libtmux.Snapshot.Input.window.layout","name":"layout","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":422,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"layout : string;","source":{"file":"lib/libtmux.mli","line":422,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.window","type":"string","qualifiedName":"Libtmux.Snapshot.Input.layout","slug":"libtmux-snapshot-input-window-layout"},{"id":"Libtmux.Snapshot.Input.window.name","publicId":"Libtmux.Snapshot.Input.window.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":419,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"lib/libtmux.mli","line":419,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.window","type":"string","qualifiedName":"Libtmux.Snapshot.Input.name","slug":"libtmux-snapshot-input-window-name"},{"id":"Libtmux.Snapshot.Input.window.width","publicId":"Libtmux.Snapshot.Input.window.width","name":"width","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":420,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"width : int;","source":{"file":"lib/libtmux.mli","line":420,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.window","type":"int","qualifiedName":"Libtmux.Snapshot.Input.width","slug":"libtmux-snapshot-input-window-width"},{"id":"Libtmux.Snapshot.Input.window_link","publicId":"Libtmux.Snapshot.Input.window_link","qualifiedName":"Libtmux.Snapshot.Input.window_link","name":"window_link","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":425,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type window_link = {\n session_id : Session.Id.t;\n window_id : Window.Id.t;\n index : int;\n is_current : bool;\n }","source":{"file":"lib/libtmux.mli","line":425,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input","signatures":[{"raw":"type window_link =\n {\n session_id: Session.Id.t ;\n window_id: Window.Id.t ;\n index: int ;\n is_current: bool }","params":[]}],"slug":"libtmux-snapshot-input-window_link"},{"id":"Libtmux.Snapshot.Input.window_link.index","publicId":"Libtmux.Snapshot.Input.window_link.index","name":"index","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":428,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"index : int;","source":{"file":"lib/libtmux.mli","line":428,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.window_link","type":"int","qualifiedName":"Libtmux.Snapshot.Input.index","slug":"libtmux-snapshot-input-window_link-index"},{"id":"Libtmux.Snapshot.Input.window_link.is_current","publicId":"Libtmux.Snapshot.Input.window_link.is_current","name":"is_current","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":429,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"is_current : bool;","source":{"file":"lib/libtmux.mli","line":429,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.window_link","type":"bool","qualifiedName":"Libtmux.Snapshot.Input.is_current","slug":"libtmux-snapshot-input-window_link-is_current"},{"id":"Libtmux.Snapshot.Input.window_link.session_id","publicId":"Libtmux.Snapshot.Input.window_link.session_id","name":"session_id","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":426,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"session_id : Session.Id.t;","source":{"file":"lib/libtmux.mli","line":426,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.window_link","type":"Session.Id.t","qualifiedName":"Libtmux.Snapshot.Input.session_id","slug":"libtmux-snapshot-input-window_link-session_id"},{"id":"Libtmux.Snapshot.Input.window_link.window_id","publicId":"Libtmux.Snapshot.Input.window_link.window_id","name":"window_id","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":427,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window_id : Window.Id.t;","source":{"file":"lib/libtmux.mli","line":427,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot.Input.window_link","type":"Window.Id.t","qualifiedName":"Libtmux.Snapshot.Input.window_id","slug":"libtmux-snapshot-input-window_link-window_id"},{"id":"Libtmux.Snapshot.clients","publicId":"Libtmux.Snapshot.clients","qualifiedName":"Libtmux.Snapshot.clients","name":"clients","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":486,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Collections and their contents are immutable. They retain capture order,\n are replayable and remain readable after the acquiring client closes. "],"declarations":[{"kind":"function","text":"val clients : t -> Client_observation.t Iarray.t","source":{"file":"lib/libtmux.mli","line":486,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","doc":{"summary":"Collections and their contents are immutable. They retain capture order, are replayable and remain readable after the acquiring client closes."},"signatures":[{"raw":"val clients : t -> Client_observation.t Iarray.t","params":[{"name":"arg1","type":"t"}],"returns":"Client_observation.t Iarray.t"}],"slug":"libtmux-snapshot-clients"},{"id":"Libtmux.Snapshot.create","publicId":"Libtmux.Snapshot.create","qualifiedName":"Libtmux.Snapshot.create","name":"create","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":458,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Validate and materialize a complete captured graph without I/O. Equal\n duplicate global rows collapse in first-occurrence order; conflicting rows\n and dangling references return {!Error.Capture_raced}. Links at different\n indexes remain distinct, including within one session. At most 10,000\n input rows are admitted. Each session needs one current link and each\n window one active pane. Capture spans an interval, not an atomic instant.\n Input strings are bytes; no Unicode normalization is performed. "],"declarations":[{"kind":"function","text":"val create :\n source:Source.t ->\n id:Id.t ->\n started_at_ns:int64 ->\n finished_at_ns:int64 ->\n sessions:Input.session list ->\n windows:Input.window list ->\n window_links:Input.window_link list ->\n panes:Input.pane list ->\n clients:Input.client list ->\n (t, Error.t) result","source":{"file":"lib/libtmux.mli","line":458,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","doc":{"summary":"Validate and materialize a complete captured graph without I/O. Equal duplicate global rows collapse in first-occurrence order; conflicting rows and dangling references return {!Error.Capture_raced}. Links at different indexes remain distinct, including within one session. At most 10,000 input rows are admitted. Each session needs one current link and each window one active pane. Capture spans an interval, not an atomic instant. Input strings are bytes; no Unicode normalization is performed."},"signatures":[{"raw":"val create :\n source:Source.t ->\n id:Id.t ->\n started_at_ns:int64 ->\n finished_at_ns:int64 ->\n sessions:Input.session list ->\n windows:Input.window list ->\n window_links:Input.window_link list ->\n panes:Input.pane list -> clients:Input.client list -> (t, Error.t) result","params":[{"name":"source","type":"Source.t","keywordOnly":true},{"name":"id","type":"Id.t","keywordOnly":true},{"name":"started_at_ns","type":"int64","keywordOnly":true},{"name":"finished_at_ns","type":"int64","keywordOnly":true},{"name":"sessions","type":"Input.session list","keywordOnly":true},{"name":"windows","type":"Input.window list","keywordOnly":true},{"name":"window_links","type":"Input.window_link list","keywordOnly":true},{"name":"panes","type":"Input.pane list","keywordOnly":true},{"name":"clients","type":"Input.client list","keywordOnly":true}],"returns":"(t, Error.t) result"}],"slug":"libtmux-snapshot-create"},{"id":"Libtmux.Snapshot.find_pane","publicId":"Libtmux.Snapshot.find_pane","qualifiedName":"Libtmux.Snapshot.find_pane","name":"find_pane","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":492,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val find_pane : t -> Pane.Id.t -> Pane.t option","source":{"file":"lib/libtmux.mli","line":492,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","signatures":[{"raw":"val find_pane : t -> Pane.Id.t -> Pane.t option","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Pane.Id.t"}],"returns":"Pane.t option"}],"slug":"libtmux-snapshot-find_pane"},{"id":"Libtmux.Snapshot.find_session","publicId":"Libtmux.Snapshot.find_session","qualifiedName":"Libtmux.Snapshot.find_session","name":"find_session","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":490,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val find_session : t -> Session.Id.t -> Session.t option","source":{"file":"lib/libtmux.mli","line":490,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","signatures":[{"raw":"val find_session : t -> Session.Id.t -> Session.t option","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Session.Id.t"}],"returns":"Session.t option"}],"slug":"libtmux-snapshot-find_session"},{"id":"Libtmux.Snapshot.find_window","publicId":"Libtmux.Snapshot.find_window","qualifiedName":"Libtmux.Snapshot.find_window","name":"find_window","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":491,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val find_window : t -> Window.Id.t -> Window.t option","source":{"file":"lib/libtmux.mli","line":491,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","signatures":[{"raw":"val find_window : t -> Window.Id.t -> Window.t option","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Window.Id.t"}],"returns":"Window.t option"}],"slug":"libtmux-snapshot-find_window"},{"id":"Libtmux.Snapshot.finished_at_ns","publicId":"Libtmux.Snapshot.finished_at_ns","qualifiedName":"Libtmux.Snapshot.finished_at_ns","name":"finished_at_ns","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":480,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val finished_at_ns : t -> int64","source":{"file":"lib/libtmux.mli","line":480,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","signatures":[{"raw":"val finished_at_ns : t -> int64","params":[{"name":"arg1","type":"t"}],"returns":"int64"}],"slug":"libtmux-snapshot-finished_at_ns"},{"id":"Libtmux.Snapshot.id","publicId":"Libtmux.Snapshot.id","qualifiedName":"Libtmux.Snapshot.id","name":"id","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":477,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val id : t -> Id.t","source":{"file":"lib/libtmux.mli","line":477,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","signatures":[{"raw":"val id : t -> Id.t","params":[{"name":"arg1","type":"t"}],"returns":"Id.t"}],"slug":"libtmux-snapshot-id-1y6d"},{"id":"Libtmux.Snapshot.panes","publicId":"Libtmux.Snapshot.panes","qualifiedName":"Libtmux.Snapshot.panes","name":"panes","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":484,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val panes : t -> Pane.t Iarray.t","source":{"file":"lib/libtmux.mli","line":484,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","signatures":[{"raw":"val panes : t -> Pane.t Iarray.t","params":[{"name":"arg1","type":"t"}],"returns":"Pane.t Iarray.t"}],"slug":"libtmux-snapshot-panes"},{"id":"Libtmux.Snapshot.sessions","publicId":"Libtmux.Snapshot.sessions","qualifiedName":"Libtmux.Snapshot.sessions","name":"sessions","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":481,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val sessions : t -> Session.t Iarray.t","source":{"file":"lib/libtmux.mli","line":481,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","signatures":[{"raw":"val sessions : t -> Session.t Iarray.t","params":[{"name":"arg1","type":"t"}],"returns":"Session.t Iarray.t"}],"doc":{"summary":"","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet capture_graph client (initial : Created.t) spawn =\n let linked =\n get\n (Client.create_session client ~name:\"linked\" ~window_name:\"linked-home\"\n ~spawn ())\n in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id linked.pane)\n |> Option.get\n in\n let text = \"showcase ready\" in\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n get\n (Client.link_window client initial.window ~session:linked.session ~index:7);\n get (Client.capture client)\n\nlet print_graph snapshot =\n Snapshot.sessions snapshot\n |> Iarray.iter (fun session ->\n Session.window_links session\n |> Iarray.iter (fun link ->\n let window = Window_link.window link in\n Printf.printf \"%s/%d %s: %d pane(s)\\n\" (Session.name session)\n (Window_link.index link) (Window.name window)\n (Iarray.length (Window.panes window))));\n assert (Iarray.length (Snapshot.sessions snapshot) = 2);\n assert (Iarray.length (Snapshot.windows snapshot) = 2);\n assert (Iarray.length (Snapshot.window_links snapshot) = 3);\n assert (Iarray.length (Snapshot.panes snapshot) = 2);\n print_endline \"graph: 2 sessions, 2 windows, 3 links, 2 panes\"\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let snapshot = with_demo binary capture_graph in\n print_graph snapshot\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_graph.ml","intro":"Navigate the typed object graph. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_graph.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"graph: 2 sessions, 2 windows, 3 links, 2 panes\n","intro":"Expected outcome line, after the temporary socket path:"}]},"slug":"libtmux-snapshot-sessions"},{"id":"Libtmux.Snapshot.source","publicId":"Libtmux.Snapshot.source","qualifiedName":"Libtmux.Snapshot.source","name":"source","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":478,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val source : t -> Source.t","source":{"file":"lib/libtmux.mli","line":478,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","signatures":[{"raw":"val source : t -> Source.t","params":[{"name":"arg1","type":"t"}],"returns":"Source.t"}],"slug":"libtmux-snapshot-source"},{"id":"Libtmux.Snapshot.started_at_ns","publicId":"Libtmux.Snapshot.started_at_ns","qualifiedName":"Libtmux.Snapshot.started_at_ns","name":"started_at_ns","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":479,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val started_at_ns : t -> int64","source":{"file":"lib/libtmux.mli","line":479,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","signatures":[{"raw":"val started_at_ns : t -> int64","params":[{"name":"arg1","type":"t"}],"returns":"int64"}],"slug":"libtmux-snapshot-started_at_ns"},{"id":"Libtmux.Snapshot.t","publicId":"Libtmux.Snapshot.t","qualifiedName":"Libtmux.Snapshot.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":404,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":404,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-snapshot-t"},{"id":"Libtmux.Snapshot.window_links","publicId":"Libtmux.Snapshot.window_links","qualifiedName":"Libtmux.Snapshot.window_links","name":"window_links","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":483,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val window_links : t -> Window_link.t Iarray.t","source":{"file":"lib/libtmux.mli","line":483,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","signatures":[{"raw":"val window_links : t -> Window_link.t Iarray.t","params":[{"name":"arg1","type":"t"}],"returns":"Window_link.t Iarray.t"}],"slug":"libtmux-snapshot-window_links"},{"id":"Libtmux.Snapshot.windows","publicId":"Libtmux.Snapshot.windows","qualifiedName":"Libtmux.Snapshot.windows","name":"windows","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":482,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val windows : t -> Window.t Iarray.t","source":{"file":"lib/libtmux.mli","line":482,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Snapshot","signatures":[{"raw":"val windows : t -> Window.t Iarray.t","params":[{"name":"arg1","type":"t"}],"returns":"Window.t Iarray.t"}],"slug":"libtmux-snapshot-windows"},{"id":"Libtmux.Source","publicId":"Libtmux.Source","qualifiedName":"Libtmux.Source","name":"Source","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":96,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Endpoint and observed daemon identity for one connection generation.\n Constructing metadata alone does not establish a live binding. "],"declarations":[{"kind":"module","text":"module Source : sig\n type t\n\n val create :\n endpoint:Endpoint.t ->\n generation:Generation.t ->\n server_pid:int ->\n (t, Error.t) result\n (** Pure metadata import for capture adapters. This neither establishes a\n connection nor verifies process identity. The backend must bind the\n generation to a live daemon before it admits operations. *)\n\n val endpoint : t -> Endpoint.t\n val generation : t -> Generation.t\n val server_pid : t -> int\n\n val equal : t -> t -> bool\n (** Compare endpoint, observed daemon PID and connection generation.\n Independent connections compare unequal even when they observe the same\n PID. Equality establishes neither a live binding nor fresh observations.\n *)\nend","source":{"file":"lib/libtmux.mli","line":96,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"Endpoint and observed daemon identity for one connection generation. Constructing metadata alone does not establish a live binding."},"slug":"libtmux-source"},{"id":"Libtmux.Source.create","publicId":"Libtmux.Source.create","qualifiedName":"Libtmux.Source.create","name":"create","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":99,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Pure metadata import for capture adapters. This neither establishes a\n connection nor verifies process identity. The backend must bind the\n generation to a live daemon before it admits operations. "],"declarations":[{"kind":"function","text":"val create :\n endpoint:Endpoint.t ->\n generation:Generation.t ->\n server_pid:int ->\n (t, Error.t) result","source":{"file":"lib/libtmux.mli","line":99,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Source","doc":{"summary":"Pure metadata import for capture adapters. This neither establishes a connection nor verifies process identity. The backend must bind the generation to a live daemon before it admits operations."},"signatures":[{"raw":"val create :\n endpoint:Endpoint.t ->\n generation:Generation.t -> server_pid:int -> (t, Error.t) result","params":[{"name":"endpoint","type":"Endpoint.t","keywordOnly":true},{"name":"generation","type":"Generation.t","keywordOnly":true},{"name":"server_pid","type":"int","keywordOnly":true}],"returns":"(t, Error.t) result"}],"slug":"libtmux-source-create"},{"id":"Libtmux.Source.endpoint","publicId":"Libtmux.Source.endpoint","qualifiedName":"Libtmux.Source.endpoint","name":"endpoint","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":108,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val endpoint : t -> Endpoint.t","source":{"file":"lib/libtmux.mli","line":108,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Source","signatures":[{"raw":"val endpoint : t -> Endpoint.t","params":[{"name":"arg1","type":"t"}],"returns":"Endpoint.t"}],"slug":"libtmux-source-endpoint"},{"id":"Libtmux.Source.equal","publicId":"Libtmux.Source.equal","qualifiedName":"Libtmux.Source.equal","name":"equal","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":112,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Compare endpoint, observed daemon PID and connection generation.\n Independent connections compare unequal even when they observe the same\n PID. Equality establishes neither a live binding nor fresh observations.\n "],"declarations":[{"kind":"function","text":"val equal : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":112,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Source","doc":{"summary":"Compare endpoint, observed daemon PID and connection generation. Independent connections compare unequal even when they observe the same PID. Equality establishes neither a live binding nor fresh observations."},"signatures":[{"raw":"val equal : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-source-equal"},{"id":"Libtmux.Source.generation","publicId":"Libtmux.Source.generation","qualifiedName":"Libtmux.Source.generation","name":"generation","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":109,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val generation : t -> Generation.t","source":{"file":"lib/libtmux.mli","line":109,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Source","signatures":[{"raw":"val generation : t -> Generation.t","params":[{"name":"arg1","type":"t"}],"returns":"Generation.t"}],"slug":"libtmux-source-generation"},{"id":"Libtmux.Source.server_pid","publicId":"Libtmux.Source.server_pid","qualifiedName":"Libtmux.Source.server_pid","name":"server_pid","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":110,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val server_pid : t -> int","source":{"file":"lib/libtmux.mli","line":110,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Source","signatures":[{"raw":"val server_pid : t -> int","params":[{"name":"arg1","type":"t"}],"returns":"int"}],"slug":"libtmux-source-server_pid"},{"id":"Libtmux.Source.t","publicId":"Libtmux.Source.t","qualifiedName":"Libtmux.Source.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":97,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":97,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Source","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-source-t"},{"id":"Libtmux.Spawn","publicId":"Libtmux.Spawn","qualifiedName":"Libtmux.Spawn","name":"Spawn","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":739,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" A process description with explicit argv or shell semantics, working\n directory and environment. Describing a process performs no I/O. "],"declarations":[{"kind":"module","text":"module Spawn : sig\n type command =\n | Default\n | Exec of { program : string; args : string list }\n | Shell of string\n\n type t = {\n command : command;\n cwd : string option;\n environment : (string * string) list;\n }\n\n val make : ?cwd:string -> ?environment:(string * string) list -> command -> t\n (** Describe a program without I/O. [Exec] preserves argv; [Shell] explicitly\n requests the daemon's configured shell. [cwd] must be absolute. Validation\n occurs at admission. With no arguments, [Exec] uses a fixed [/bin/sh]\n trampoline because tmux treats a single argument as shell code. [Default]\n follows tmux defaults on creation and reuses the previous command on\n respawn. *)\n\n val default : t\nend","source":{"file":"lib/libtmux.mli","line":739,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"A process description with explicit argv or shell semantics, working directory and environment. Describing a process performs no I/O."},"slug":"libtmux-spawn"},{"id":"Libtmux.Spawn.command","publicId":"Libtmux.Spawn.command","qualifiedName":"Libtmux.Spawn.command","name":"command","kind":"enum","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":740,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type command =\n | Default\n | Exec of { program : string; args : string list }\n | Shell of string","source":{"file":"lib/libtmux.mli","line":740,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Spawn","signatures":[{"raw":"type command =\n | Default \n | Exec of {\n program: string ;\n args: string list } \n | Shell of string ","params":[]}],"slug":"libtmux-spawn-command"},{"id":"Libtmux.Spawn.command.Default","publicId":"Libtmux.Spawn.command.Default","name":"Default","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":741,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Default","source":{"file":"lib/libtmux.mli","line":741,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Spawn.command","variant":"unit","qualifiedName":"Libtmux.Spawn.Default","slug":"libtmux-spawn-command-default"},{"id":"Libtmux.Spawn.command.Exec","publicId":"Libtmux.Spawn.command.Exec","name":"Exec","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":742,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Exec of { program : string; args : string list }","source":{"file":"lib/libtmux.mli","line":742,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Spawn.command","variant":"struct","qualifiedName":"Libtmux.Spawn.Exec","slug":"libtmux-spawn-command-exec"},{"id":"Libtmux.Spawn.command.Exec.args","publicId":"Libtmux.Spawn.command.Exec.args","name":"args","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":742,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"args : string list","source":{"file":"lib/libtmux.mli","line":742,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Spawn.command.Exec","type":"string list","qualifiedName":"Libtmux.Spawn.args","slug":"libtmux-spawn-command-exec-args"},{"id":"Libtmux.Spawn.command.Exec.program","publicId":"Libtmux.Spawn.command.Exec.program","name":"program","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":742,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"program : string;","source":{"file":"lib/libtmux.mli","line":742,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Spawn.command.Exec","type":"string","qualifiedName":"Libtmux.Spawn.program","slug":"libtmux-spawn-command-exec-program"},{"id":"Libtmux.Spawn.command.Shell","publicId":"Libtmux.Spawn.command.Shell","name":"Shell","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":743,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Shell of string","source":{"file":"lib/libtmux.mli","line":743,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Spawn.command","variant":"tuple","qualifiedName":"Libtmux.Spawn.Shell","slug":"libtmux-spawn-command-shell"},{"id":"Libtmux.Spawn.default","publicId":"Libtmux.Spawn.default","qualifiedName":"Libtmux.Spawn.default","name":"default","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":759,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val default : t","source":{"file":"lib/libtmux.mli","line":759,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Spawn","signatures":[{"raw":"val default : t","params":[],"returns":"t"}],"slug":"libtmux-spawn-default"},{"id":"Libtmux.Spawn.make","publicId":"Libtmux.Spawn.make","qualifiedName":"Libtmux.Spawn.make","name":"make","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":751,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Describe a program without I/O. [Exec] preserves argv; [Shell] explicitly\n requests the daemon's configured shell. [cwd] must be absolute. Validation\n occurs at admission. With no arguments, [Exec] uses a fixed [/bin/sh]\n trampoline because tmux treats a single argument as shell code. [Default]\n follows tmux defaults on creation and reuses the previous command on\n respawn. "],"declarations":[{"kind":"function","text":"val make : ?cwd:string -> ?environment:(string * string) list -> command -> t","source":{"file":"lib/libtmux.mli","line":751,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Spawn","doc":{"summary":"Describe a program without I/O. `Exec` preserves argv; `Shell` explicitly requests the daemon's configured shell. `cwd` must be absolute. Validation occurs at admission. With no arguments, `Exec` uses a fixed `/bin/sh` trampoline because tmux treats a single argument as shell code. `Default` follows tmux defaults on creation and reuses the previous command on respawn."},"signatures":[{"raw":"val make : ?cwd:string -> ?environment:(string * string) list -> command -> t","params":[{"name":"cwd","type":"string","optional":true,"keywordOnly":true},{"name":"environment","type":"(string * string) list","optional":true,"keywordOnly":true},{"name":"arg1","type":"command"}],"returns":"t"}],"slug":"libtmux-spawn-make"},{"id":"Libtmux.Spawn.t","publicId":"Libtmux.Spawn.t","qualifiedName":"Libtmux.Spawn.t","name":"t","kind":"struct","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":745,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type t = {\n command : command;\n cwd : string option;\n environment : (string * string) list;\n }","source":{"file":"lib/libtmux.mli","line":745,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Spawn","signatures":[{"raw":"type t =\n {\n command: command ;\n cwd: string option ;\n environment: (string * string) list }","params":[]}],"slug":"libtmux-spawn-t"},{"id":"Libtmux.Spawn.t.command","publicId":"Libtmux.Spawn.t.command","name":"command","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":746,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"command : command;","source":{"file":"lib/libtmux.mli","line":746,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Spawn.t","type":"command","qualifiedName":"Libtmux.Spawn.command","slug":"libtmux-spawn-t-command"},{"id":"Libtmux.Spawn.t.cwd","publicId":"Libtmux.Spawn.t.cwd","name":"cwd","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":747,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"cwd : string option;","source":{"file":"lib/libtmux.mli","line":747,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Spawn.t","type":"string option","qualifiedName":"Libtmux.Spawn.cwd","slug":"libtmux-spawn-t-cwd"},{"id":"Libtmux.Spawn.t.environment","publicId":"Libtmux.Spawn.t.environment","name":"environment","kind":"attribute","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":748,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"environment : (string * string) list;","source":{"file":"lib/libtmux.mli","line":748,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Spawn.t","type":"(string * string) list","qualifiedName":"Libtmux.Spawn.environment","slug":"libtmux-spawn-t-environment"},{"id":"Libtmux.Window","publicId":"Libtmux.Window","qualifiedName":"Libtmux.Window","name":"Window","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":230,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" A global window shared by its session links. Window index and current state\n belong to a link, while panes and geometry belong to the window. "],"declarations":[{"kind":"module","text":"and Window : sig\n type t\n\n module Fields : sig\n val id : (t, string) Field.t\n val name : (t, string) Field.t\n val width : (t, int) Field.t\n val height : (t, int) Field.t\n val layout : (t, string) Field.t\n end\n\n module Relations : sig\n val panes : (t, Pane.t) Relation.Many.t\n val links : (t, Window_link.t) Relation.Many.t\n end\n\n module Id : ID\n\n module Target : sig\n type t\n\n val of_id : source:Source.t -> Id.t -> t\n val source : t -> Source.t\n val id : t -> Id.t\n end\n\n type target = Target.t\n\n val id : t -> Id.t\n val name : t -> string\n val width : t -> int\n val height : t -> int\n val layout : t -> string\n val source : t -> Source.t\n val target : t -> target\n\n val same_entity : t -> t -> bool\n (** Compare IDs within the same bound {!Source.t} generation. *)\n\n val same_observation : t -> t -> bool\n (** Compare entity identity and snapshot identity. *)\n\n val panes : t -> Pane.t Iarray.t\n val links : t -> Window_link.t Iarray.t\nend","source":{"file":"lib/libtmux.mli","line":230,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"A global window shared by its session links. Window index and current state belong to a link, while panes and geometry belong to the window."},"slug":"libtmux-window"},{"id":"Libtmux.Window.Fields","publicId":"Libtmux.Window.Fields","qualifiedName":"Libtmux.Window.Fields","name":"Fields","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":233,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Fields : sig\n val id : (t, string) Field.t\n val name : (t, string) Field.t\n val width : (t, int) Field.t\n val height : (t, int) Field.t\n val layout : (t, string) Field.t\n end","source":{"file":"lib/libtmux.mli","line":233,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","slug":"libtmux-window-fields"},{"id":"Libtmux.Window.Fields.height","publicId":"Libtmux.Window.Fields.height","qualifiedName":"Libtmux.Window.Fields.height","name":"height","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":237,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val height : (t, int) Field.t","source":{"file":"lib/libtmux.mli","line":237,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Fields","signatures":[{"raw":"val height : (t, int) Field.t","params":[],"returns":"(t, int) Field.t"}],"slug":"libtmux-window-fields-height"},{"id":"Libtmux.Window.Fields.id","publicId":"Libtmux.Window.Fields.id","qualifiedName":"Libtmux.Window.Fields.id","name":"id","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":234,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val id : (t, string) Field.t","source":{"file":"lib/libtmux.mli","line":234,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Fields","signatures":[{"raw":"val id : (t, string) Field.t","params":[],"returns":"(t, string) Field.t"}],"slug":"libtmux-window-fields-id"},{"id":"Libtmux.Window.Fields.layout","publicId":"Libtmux.Window.Fields.layout","qualifiedName":"Libtmux.Window.Fields.layout","name":"layout","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":238,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val layout : (t, string) Field.t","source":{"file":"lib/libtmux.mli","line":238,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Fields","signatures":[{"raw":"val layout : (t, string) Field.t","params":[],"returns":"(t, string) Field.t"}],"slug":"libtmux-window-fields-layout"},{"id":"Libtmux.Window.Fields.name","publicId":"Libtmux.Window.Fields.name","qualifiedName":"Libtmux.Window.Fields.name","name":"name","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":235,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val name : (t, string) Field.t","source":{"file":"lib/libtmux.mli","line":235,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Fields","signatures":[{"raw":"val name : (t, string) Field.t","params":[],"returns":"(t, string) Field.t"}],"slug":"libtmux-window-fields-name"},{"id":"Libtmux.Window.Fields.width","publicId":"Libtmux.Window.Fields.width","qualifiedName":"Libtmux.Window.Fields.width","name":"width","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":236,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val width : (t, int) Field.t","source":{"file":"lib/libtmux.mli","line":236,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Fields","signatures":[{"raw":"val width : (t, int) Field.t","params":[],"returns":"(t, int) Field.t"}],"slug":"libtmux-window-fields-width"},{"id":"Libtmux.Window.Id","publicId":"Libtmux.Window.Id","qualifiedName":"Libtmux.Window.Id","name":"Id","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":246,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Id : ID","source":{"file":"lib/libtmux.mli","line":246,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","slug":"libtmux-window-id-1sgu"},{"id":"Libtmux.Window.Id.compare","publicId":"Libtmux.Window.Id.compare","qualifiedName":"Libtmux.Window.Id.compare","name":"compare","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":136,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val compare : t -> t -> int","source":{"file":"lib/libtmux.mli","line":136,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Id","signatures":[{"raw":"val compare : t -> t -> int","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"int"}],"slug":"libtmux-window-id-compare"},{"id":"Libtmux.Window.Id.equal","publicId":"Libtmux.Window.Id.equal","qualifiedName":"Libtmux.Window.Id.equal","name":"equal","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":135,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val equal : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":135,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Id","signatures":[{"raw":"val equal : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-window-id-equal"},{"id":"Libtmux.Window.Id.of_string","publicId":"Libtmux.Window.Id.of_string","qualifiedName":"Libtmux.Window.Id.of_string","name":"of_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":131,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Accept a canonical prefixed decimal tmux ID in the uint32 range. "],"declarations":[{"kind":"function","text":"val of_string : string -> (t, Error.t) result","source":{"file":"lib/libtmux.mli","line":131,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Id","doc":{"summary":"Accept a canonical prefixed decimal tmux ID in the uint32 range."},"signatures":[{"raw":"val of_string : string -> (t, Error.t) result","params":[{"name":"arg1","type":"string"}],"returns":"(t, Error.t) result"}],"slug":"libtmux-window-id-of_string"},{"id":"Libtmux.Window.Id.pp","publicId":"Libtmux.Window.Id.pp","qualifiedName":"Libtmux.Window.Id.pp","name":"pp","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":137,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pp : Format.formatter -> t -> unit","source":{"file":"lib/libtmux.mli","line":137,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Id","signatures":[{"raw":"val pp : Format.formatter -> t -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"t"}],"returns":"unit"}],"slug":"libtmux-window-id-pp"},{"id":"Libtmux.Window.Id.t","publicId":"Libtmux.Window.Id.t","qualifiedName":"Libtmux.Window.Id.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":129,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":129,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Id","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-window-id-t"},{"id":"Libtmux.Window.Id.to_string","publicId":"Libtmux.Window.Id.to_string","qualifiedName":"Libtmux.Window.Id.to_string","name":"to_string","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":134,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val to_string : t -> string","source":{"file":"lib/libtmux.mli","line":134,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Id","signatures":[{"raw":"val to_string : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-window-id-to_string"},{"id":"Libtmux.Window.Relations","publicId":"Libtmux.Window.Relations","qualifiedName":"Libtmux.Window.Relations","name":"Relations","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":241,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Relations : sig\n val panes : (t, Pane.t) Relation.Many.t\n val links : (t, Window_link.t) Relation.Many.t\n end","source":{"file":"lib/libtmux.mli","line":241,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","slug":"libtmux-window-relations"},{"id":"Libtmux.Window.Relations.links","publicId":"Libtmux.Window.Relations.links","qualifiedName":"Libtmux.Window.Relations.links","name":"links","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":243,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val links : (t, Window_link.t) Relation.Many.t","source":{"file":"lib/libtmux.mli","line":243,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Relations","signatures":[{"raw":"val links : (t, Window_link.t) Relation.Many.t","params":[],"returns":"(t, Window_link.t) Relation.Many.t"}],"slug":"libtmux-window-relations-links"},{"id":"Libtmux.Window.Relations.panes","publicId":"Libtmux.Window.Relations.panes","qualifiedName":"Libtmux.Window.Relations.panes","name":"panes","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":242,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val panes : (t, Pane.t) Relation.Many.t","source":{"file":"lib/libtmux.mli","line":242,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Relations","signatures":[{"raw":"val panes : (t, Pane.t) Relation.Many.t","params":[],"returns":"(t, Pane.t) Relation.Many.t"}],"slug":"libtmux-window-relations-panes"},{"id":"Libtmux.Window.Target","publicId":"Libtmux.Window.Target","qualifiedName":"Libtmux.Window.Target","name":"Target","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":248,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Target : sig\n type t\n\n val of_id : source:Source.t -> Id.t -> t\n val source : t -> Source.t\n val id : t -> Id.t\n end","source":{"file":"lib/libtmux.mli","line":248,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","slug":"libtmux-window-target-6ecc"},{"id":"Libtmux.Window.Target.id","publicId":"Libtmux.Window.Target.id","qualifiedName":"Libtmux.Window.Target.id","name":"id","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":253,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val id : t -> Id.t","source":{"file":"lib/libtmux.mli","line":253,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Target","signatures":[{"raw":"val id : t -> Id.t","params":[{"name":"arg1","type":"t"}],"returns":"Id.t"}],"slug":"libtmux-window-target-id"},{"id":"Libtmux.Window.Target.of_id","publicId":"Libtmux.Window.Target.of_id","qualifiedName":"Libtmux.Window.Target.of_id","name":"of_id","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":251,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val of_id : source:Source.t -> Id.t -> t","source":{"file":"lib/libtmux.mli","line":251,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Target","signatures":[{"raw":"val of_id : source:Source.t -> Id.t -> t","params":[{"name":"source","type":"Source.t","keywordOnly":true},{"name":"arg1","type":"Id.t"}],"returns":"t"}],"slug":"libtmux-window-target-of_id"},{"id":"Libtmux.Window.Target.source","publicId":"Libtmux.Window.Target.source","qualifiedName":"Libtmux.Window.Target.source","name":"source","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":252,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val source : t -> Source.t","source":{"file":"lib/libtmux.mli","line":252,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Target","signatures":[{"raw":"val source : t -> Source.t","params":[{"name":"arg1","type":"t"}],"returns":"Source.t"}],"slug":"libtmux-window-target-source"},{"id":"Libtmux.Window.Target.t","publicId":"Libtmux.Window.Target.t","qualifiedName":"Libtmux.Window.Target.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":249,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":249,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window.Target","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-window-target-t"},{"id":"Libtmux.Window.height","publicId":"Libtmux.Window.height","qualifiedName":"Libtmux.Window.height","name":"height","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":261,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val height : t -> int","source":{"file":"lib/libtmux.mli","line":261,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","signatures":[{"raw":"val height : t -> int","params":[{"name":"arg1","type":"t"}],"returns":"int"}],"slug":"libtmux-window-height"},{"id":"Libtmux.Window.id","publicId":"Libtmux.Window.id","qualifiedName":"Libtmux.Window.id","name":"id","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":258,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val id : t -> Id.t","source":{"file":"lib/libtmux.mli","line":258,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","signatures":[{"raw":"val id : t -> Id.t","params":[{"name":"arg1","type":"t"}],"returns":"Id.t"}],"slug":"libtmux-window-id-1sjw"},{"id":"Libtmux.Window.layout","publicId":"Libtmux.Window.layout","qualifiedName":"Libtmux.Window.layout","name":"layout","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":262,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val layout : t -> string","source":{"file":"lib/libtmux.mli","line":262,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","signatures":[{"raw":"val layout : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-window-layout"},{"id":"Libtmux.Window.links","publicId":"Libtmux.Window.links","qualifiedName":"Libtmux.Window.links","name":"links","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":273,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val links : t -> Window_link.t Iarray.t","source":{"file":"lib/libtmux.mli","line":273,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","signatures":[{"raw":"val links : t -> Window_link.t Iarray.t","params":[{"name":"arg1","type":"t"}],"returns":"Window_link.t Iarray.t"}],"slug":"libtmux-window-links"},{"id":"Libtmux.Window.name","publicId":"Libtmux.Window.name","qualifiedName":"Libtmux.Window.name","name":"name","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":259,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val name : t -> string","source":{"file":"lib/libtmux.mli","line":259,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","signatures":[{"raw":"val name : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux-window-name"},{"id":"Libtmux.Window.panes","publicId":"Libtmux.Window.panes","qualifiedName":"Libtmux.Window.panes","name":"panes","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":272,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val panes : t -> Pane.t Iarray.t","source":{"file":"lib/libtmux.mli","line":272,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","signatures":[{"raw":"val panes : t -> Pane.t Iarray.t","params":[{"name":"arg1","type":"t"}],"returns":"Pane.t Iarray.t"}],"doc":{"summary":"","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet capture_graph client (initial : Created.t) spawn =\n let linked =\n get\n (Client.create_session client ~name:\"linked\" ~window_name:\"linked-home\"\n ~spawn ())\n in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id linked.pane)\n |> Option.get\n in\n let text = \"showcase ready\" in\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n get\n (Client.link_window client initial.window ~session:linked.session ~index:7);\n get (Client.capture client)\n\nlet print_graph snapshot =\n Snapshot.sessions snapshot\n |> Iarray.iter (fun session ->\n Session.window_links session\n |> Iarray.iter (fun link ->\n let window = Window_link.window link in\n Printf.printf \"%s/%d %s: %d pane(s)\\n\" (Session.name session)\n (Window_link.index link) (Window.name window)\n (Iarray.length (Window.panes window))));\n assert (Iarray.length (Snapshot.sessions snapshot) = 2);\n assert (Iarray.length (Snapshot.windows snapshot) = 2);\n assert (Iarray.length (Snapshot.window_links snapshot) = 3);\n assert (Iarray.length (Snapshot.panes snapshot) = 2);\n print_endline \"graph: 2 sessions, 2 windows, 3 links, 2 panes\"\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let snapshot = with_demo binary capture_graph in\n print_graph snapshot\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_graph.ml","intro":"Navigate the typed object graph. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_graph.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"graph: 2 sessions, 2 windows, 3 links, 2 panes\n","intro":"Expected outcome line, after the temporary socket path:"}]},"slug":"libtmux-window-panes"},{"id":"Libtmux.Window.same_entity","publicId":"Libtmux.Window.same_entity","qualifiedName":"Libtmux.Window.same_entity","name":"same_entity","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":266,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Compare IDs within the same bound {!Source.t} generation. "],"declarations":[{"kind":"function","text":"val same_entity : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":266,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","doc":{"summary":"Compare IDs within the same bound {!Source.t} generation."},"signatures":[{"raw":"val same_entity : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-window-same_entity"},{"id":"Libtmux.Window.same_observation","publicId":"Libtmux.Window.same_observation","qualifiedName":"Libtmux.Window.same_observation","name":"same_observation","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":269,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Compare entity identity and snapshot identity. "],"declarations":[{"kind":"function","text":"val same_observation : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":269,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","doc":{"summary":"Compare entity identity and snapshot identity."},"signatures":[{"raw":"val same_observation : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-window-same_observation"},{"id":"Libtmux.Window.source","publicId":"Libtmux.Window.source","qualifiedName":"Libtmux.Window.source","name":"source","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":263,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val source : t -> Source.t","source":{"file":"lib/libtmux.mli","line":263,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","signatures":[{"raw":"val source : t -> Source.t","params":[{"name":"arg1","type":"t"}],"returns":"Source.t"}],"slug":"libtmux-window-source"},{"id":"Libtmux.Window.t","publicId":"Libtmux.Window.t","qualifiedName":"Libtmux.Window.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":231,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":231,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-window-t"},{"id":"Libtmux.Window.target","publicId":"Libtmux.Window.target","qualifiedName":"Libtmux.Window.target","name":"target","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":264,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val target : t -> target","source":{"file":"lib/libtmux.mli","line":264,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","signatures":[{"raw":"val target : t -> target","params":[{"name":"arg1","type":"t"}],"returns":"target"}],"slug":"libtmux-window-target-1sbf"},{"id":"Libtmux.Window.target:type","publicId":"Libtmux.Window.target:type","qualifiedName":"Libtmux.Window.target","name":"target","kind":"typealias","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":256,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type target = Target.t","source":{"file":"lib/libtmux.mli","line":256,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","type":"Target.t","signatures":[{"raw":"type target = Target.t","params":[]}],"slug":"libtmux-window-target-type"},{"id":"Libtmux.Window.width","publicId":"Libtmux.Window.width","qualifiedName":"Libtmux.Window.width","name":"width","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":260,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val width : t -> int","source":{"file":"lib/libtmux.mli","line":260,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window","signatures":[{"raw":"val width : t -> int","params":[{"name":"arg1","type":"t"}],"returns":"int"}],"slug":"libtmux-window-width"},{"id":"Libtmux.Window_link","publicId":"Libtmux.Window_link","qualifiedName":"Libtmux.Window_link","name":"Window_link","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":278,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" One captured session/index/window context. It is not a stable link\n incarnation across unlinking, movement or reindexing. "],"declarations":[{"kind":"module","text":"and Window_link : sig\n type t\n\n module Fields : sig\n val index : (t, int) Field.t\n val is_current : (t, bool) Field.t\n end\n\n module Relations : sig\n val session : (t, Session.t) Relation.One.t\n val window : (t, Window.t) Relation.One.t\n end\n\n val index : t -> int\n val is_current : t -> bool\n val session : t -> Session.t\n val window : t -> Window.t\n\n val same_context : t -> t -> bool\n (** Compare source, session, index and window. An equal context does not\n certify a stable link incarnation across reindexing or unlink/relink. *)\n\n val same_observation : t -> t -> bool\nend","source":{"file":"lib/libtmux.mli","line":278,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux","doc":{"summary":"One captured session/index/window context. It is not a stable link incarnation across unlinking, movement or reindexing."},"slug":"libtmux-window_link"},{"id":"Libtmux.Window_link.Fields","publicId":"Libtmux.Window_link.Fields","qualifiedName":"Libtmux.Window_link.Fields","name":"Fields","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":281,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Fields : sig\n val index : (t, int) Field.t\n val is_current : (t, bool) Field.t\n end","source":{"file":"lib/libtmux.mli","line":281,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link","slug":"libtmux-window_link-fields"},{"id":"Libtmux.Window_link.Fields.index","publicId":"Libtmux.Window_link.Fields.index","qualifiedName":"Libtmux.Window_link.Fields.index","name":"index","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":282,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val index : (t, int) Field.t","source":{"file":"lib/libtmux.mli","line":282,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link.Fields","signatures":[{"raw":"val index : (t, int) Field.t","params":[],"returns":"(t, int) Field.t"}],"slug":"libtmux-window_link-fields-index"},{"id":"Libtmux.Window_link.Fields.is_current","publicId":"Libtmux.Window_link.Fields.is_current","qualifiedName":"Libtmux.Window_link.Fields.is_current","name":"is_current","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":283,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val is_current : (t, bool) Field.t","source":{"file":"lib/libtmux.mli","line":283,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link.Fields","signatures":[{"raw":"val is_current : (t, bool) Field.t","params":[],"returns":"(t, bool) Field.t"}],"slug":"libtmux-window_link-fields-is_current"},{"id":"Libtmux.Window_link.Relations","publicId":"Libtmux.Window_link.Relations","qualifiedName":"Libtmux.Window_link.Relations","name":"Relations","kind":"module","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":286,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Relations : sig\n val session : (t, Session.t) Relation.One.t\n val window : (t, Window.t) Relation.One.t\n end","source":{"file":"lib/libtmux.mli","line":286,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link","slug":"libtmux-window_link-relations"},{"id":"Libtmux.Window_link.Relations.session","publicId":"Libtmux.Window_link.Relations.session","qualifiedName":"Libtmux.Window_link.Relations.session","name":"session","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":287,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val session : (t, Session.t) Relation.One.t","source":{"file":"lib/libtmux.mli","line":287,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link.Relations","signatures":[{"raw":"val session : (t, Session.t) Relation.One.t","params":[],"returns":"(t, Session.t) Relation.One.t"}],"slug":"libtmux-window_link-relations-session"},{"id":"Libtmux.Window_link.Relations.window","publicId":"Libtmux.Window_link.Relations.window","qualifiedName":"Libtmux.Window_link.Relations.window","name":"window","kind":"constant","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":288,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"val window : (t, Window.t) Relation.One.t","source":{"file":"lib/libtmux.mli","line":288,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link.Relations","signatures":[{"raw":"val window : (t, Window.t) Relation.One.t","params":[],"returns":"(t, Window.t) Relation.One.t"}],"slug":"libtmux-window_link-relations-window"},{"id":"Libtmux.Window_link.index","publicId":"Libtmux.Window_link.index","qualifiedName":"Libtmux.Window_link.index","name":"index","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":291,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val index : t -> int","source":{"file":"lib/libtmux.mli","line":291,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link","signatures":[{"raw":"val index : t -> int","params":[{"name":"arg1","type":"t"}],"returns":"int"}],"slug":"libtmux-window_link-index"},{"id":"Libtmux.Window_link.is_current","publicId":"Libtmux.Window_link.is_current","qualifiedName":"Libtmux.Window_link.is_current","name":"is_current","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":292,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val is_current : t -> bool","source":{"file":"lib/libtmux.mli","line":292,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link","signatures":[{"raw":"val is_current : t -> bool","params":[{"name":"arg1","type":"t"}],"returns":"bool"}],"slug":"libtmux-window_link-is_current"},{"id":"Libtmux.Window_link.same_context","publicId":"Libtmux.Window_link.same_context","qualifiedName":"Libtmux.Window_link.same_context","name":"same_context","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":296,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Compare source, session, index and window. An equal context does not\n certify a stable link incarnation across reindexing or unlink/relink. "],"declarations":[{"kind":"function","text":"val same_context : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":296,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link","doc":{"summary":"Compare source, session, index and window. An equal context does not certify a stable link incarnation across reindexing or unlink/relink."},"signatures":[{"raw":"val same_context : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-window_link-same_context"},{"id":"Libtmux.Window_link.same_observation","publicId":"Libtmux.Window_link.same_observation","qualifiedName":"Libtmux.Window_link.same_observation","name":"same_observation","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":300,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val same_observation : t -> t -> bool","source":{"file":"lib/libtmux.mli","line":300,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link","signatures":[{"raw":"val same_observation : t -> t -> bool","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"t"}],"returns":"bool"}],"slug":"libtmux-window_link-same_observation"},{"id":"Libtmux.Window_link.session","publicId":"Libtmux.Window_link.session","qualifiedName":"Libtmux.Window_link.session","name":"session","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":293,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val session : t -> Session.t","source":{"file":"lib/libtmux.mli","line":293,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link","signatures":[{"raw":"val session : t -> Session.t","params":[{"name":"arg1","type":"t"}],"returns":"Session.t"}],"slug":"libtmux-window_link-session"},{"id":"Libtmux.Window_link.t","publicId":"Libtmux.Window_link.t","qualifiedName":"Libtmux.Window_link.t","name":"t","kind":"typealias","package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":279,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"lib/libtmux.mli","line":279,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux-window_link-t"},{"id":"Libtmux.Window_link.window","publicId":"Libtmux.Window_link.window","qualifiedName":"Libtmux.Window_link.window","name":"window","kind":"function","modifiers":[],"package":"libtmux","product":"core","apiScope":"exported","publicOwner":"Libtmux","source":{"file":"lib/libtmux.mli","line":294,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val window : t -> Window.t","source":{"file":"lib/libtmux.mli","line":294,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux.Window_link","signatures":[{"raw":"val window : t -> Window.t","params":[{"name":"arg1","type":"t"}],"returns":"Window.t"}],"slug":"libtmux-window_link-window"},{"id":"Libtmux_eio","publicId":"Libtmux_eio","qualifiedName":"Libtmux_eio","name":"Libtmux_eio","kind":"module","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":1,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Concurrent Linux tmux clients using the application's Eio scheduler.\n\n Client methods perform I/O unless documented otherwise. Captured\n {!Libtmux.Snapshot} observations and retained {!Operation.inspect} remain\n local. Clients belong to the connecting domain. Closure releases their owned\n resources; tmux applies its configured daemon lifetime.\n\n See {!Client} for acquisition and commands, {!Operation} for cancellation\n outcomes, and {!Subscription} for bounded future output. The\n {{:https://github.com/libtmux/libtmux-ocaml/blob/master/docs/streaming.md}streaming\n guide} demonstrates application-owned switches, cancellation and continuity\n gaps. "],"declarations":[{"kind":"module","text":"","source":{"file":"eio/libtmux_eio.mli","line":1,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"doc":{"summary":"Concurrent Linux tmux clients using the application's Eio scheduler.","body":"Client methods perform I/O unless documented otherwise. Captured {!Libtmux.Snapshot} observations and retained {!Operation.inspect} remain local. Clients belong to the connecting domain. Closure releases their owned resources; tmux applies its configured daemon lifetime.\n\nSee {!Client} for acquisition and commands, {!Operation} for cancellation outcomes, and {!Subscription} for bounded future output. The [streaming guide](https://github.com/libtmux/libtmux-ocaml/blob/master/docs/streaming.md) demonstrates application-owned switches, cancellation and continuity gaps."},"slug":"libtmux_eio"},{"id":"Libtmux_eio.Cleanup","publicId":"Libtmux_eio.Cleanup","qualifiedName":"Libtmux_eio.Cleanup","name":"Cleanup","kind":"module","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":14,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Domain-owned cleanup diagnostics shared with the blocking backend. Supply a\n report before setup to inspect secondary failures after native cancellation.\n No scheduler is needed to inspect a report. "],"declarations":[{"kind":"module","text":"module Cleanup = Libtmux_unix.Cleanup","source":{"file":"eio/libtmux_eio.mli","line":14,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio","doc":{"summary":"Domain-owned cleanup diagnostics shared with the blocking backend. Supply a report before setup to inspect secondary failures after native cancellation. No scheduler is needed to inspect a report."},"exportedFrom":"Libtmux_unix.Cleanup","slug":"libtmux_eio-cleanup"},{"id":"Libtmux_eio.Client","publicId":"Libtmux_eio.Client","qualifiedName":"Libtmux_eio.Client","name":"Client","kind":"module","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":127,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" An explicit generation-bound connection. Applications retain ownership of\n the endpoint choice and resource lifetime. "],"declarations":[{"kind":"module","text":"module Client : sig\n type t\n\n val connect :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?timeout:float ->\n sw:Eio.Switch.t ->\n process_mgr:_ Eio.Process.mgr ->\n mono_clock:_ Eio.Time.Mono.t ->\n Libtmux.Endpoint.t ->\n (t, Libtmux.Error.t) result\n (** Attach to an existing local Linux daemon in the same PID namespace and\n shared filesystem. Requires pidfd support. Default exchange timeout: one\n second. All client calls belong to the connecting OCaml domain. Initial\n and auxiliary attachments suppress tmux's [update-environment] behavior.\n *)\n\n val cleanup : t -> Cleanup.t\n (** Read the supplied report or the client's fresh default without I/O.\n {!Cleanup.inspect} remains available after close. *)\n\n val source : t -> Libtmux.Source.t\n (** Read the retained endpoint, daemon PID and connection generation without\n I/O. *)\n\n val version : t -> string\n (** Read the bound daemon's observed version without I/O. *)\n\n val subscribe :\n ?session:Libtmux.Session.target ->\n ?capacity_bytes:int ->\n ?capacity_events:int ->\n t ->\n Libtmux.Pane.t ->\n (Subscription.t, Libtmux.Error.t) result\n (** Acquire verified coverage through one shared lane per session; choose the\n least observed session ID unless supplied. A client-owned reader delivers\n future bytes without application callbacks. Default queue bounds are 1\n MiB/1024 events; max 16 subscribers and eight total client lanes, sharing\n the 32 MiB payload budget. Queue capacities remain reserved while empty;\n captures and reads need additional scratch space and can return\n {!Libtmux.Error.Capacity} below the subscriber-count limit. See the\n {{:https://github.com/libtmux/libtmux-ocaml/blob/master/docs/streaming.md#plan-shared-capacity}shared\n capacity guide} for combined reservations and process slots.\n\n Overflow or coverage/layout changes emit Gap then End. Data starts after\n admission's marker, with no snapshot/history barrier, automatic reconnect\n or silent cursor reuse. New admission returns [Error Libtmux.Error.Closed]\n once {!close} starts. *)\n\n val wait_for_text :\n ?timeout:float ->\n ?scratch_dir:string ->\n t ->\n Libtmux.Pane.t ->\n text:string ->\n (Rendered.t, Libtmux.Error.t) result\n (** Subscribe and capture the screen immediately, then recapture on output.\n Membership/overflow gaps establish fresh coverage in the same binding.\n Maximum pattern: 64 KiB. Return captured rendered text containing it;\n transient text may be missed. Deadlines are checked between bounded\n acquisitions, whose I/O retains the client exchange timeout. Cancellation\n propagates and releases the subscription. A cleanup failure cannot replace\n an earlier error or cancellation; inspect {!cleanup} for secondary\n failures. Otherwise cleanup failure prevents success or renewed coverage.\n No history/barrier guarantee. *)\n\n val submit :\n t -> 'a Libtmux.Command.t -> ('a Operation.t, Libtmux.Error.t) result\n (** Validate and reserve bounded capacity without I/O. Return\n [Error Libtmux.Error.Closed] once {!close} starts. *)\n\n val await : 'a Operation.t -> ('a, Libtmux.Error.t) result\n (** Cancellation propagates as Eio cancellation. Store the handle outside the\n cancelled fiber: the client drains written work independently, and the\n eventual result remains inspectable. *)\n\n val run : t -> 'a Libtmux.Command.t -> ('a, Libtmux.Error.t) result\n (** Submit and await an explicit command. Retain a separate submitted handle\n when the outcome must remain inspectable after caller cancellation. *)\n\n val capture : t -> (Libtmux.Snapshot.t, Libtmux.Error.t) result\n (** Acquire a complete immutable graph over an interval. Conflicting or\n disappearing entities fail capture; they do not become empty relations.\n The returned values remain readable after client closure. *)\n\n val capture_text :\n ?scratch_dir:string ->\n t ->\n Libtmux.Pane.t ->\n start:int ->\n end_:int ->\n (Rendered.t, Libtmux.Error.t) result\n (** Inclusive ordinary screen rows, using a bounded private file transfer.\n Qualified local scratch storage must be shared with the daemon. *)\n\n (* BEGIN GENERATED OPERATIONS *)\n val rename_window :\n t -> Libtmux.Window.target -> name:string -> (unit, Libtmux.Error.t) result\n (** Set the global window name. Every session link observes the new name on\n its next capture; existing snapshots retain the old value. *)\n\n val rename_session :\n t -> Libtmux.Session.target -> name:string -> (unit, Libtmux.Error.t) result\n (** Set the session name, rejecting a conflicting existing name. Bound IDs\n remain usable; existing snapshots retain their captured names. *)\n\n val switch_client_at :\n ?update_environment:bool ->\n t ->\n Libtmux.Client_name.t ->\n session:Libtmux.Session.target ->\n (unit, Libtmux.Error.t) result\n (** Switch the client currently bearing this name to the bound session.\n Environment updates are disabled by default. This can move either a\n terminal client or a control client; it does not open a new terminal. *)\n\n val request_detach_client_at :\n t -> Libtmux.Client_name.t -> (unit, Libtmux.Error.t) result\n (** Request detachment of the client currently bearing this name. Success\n confirms request processing, not peer exit. Detaching the library's own\n primary lane can lose the response and retire its generation. *)\n\n val refresh_client_at :\n ?status_only:bool ->\n t ->\n Libtmux.Client_name.t ->\n (unit, Libtmux.Error.t) result\n (** Request a redraw; no terminal-rendering completion is implied. *)\n\n val resize_control_client_at :\n t ->\n Libtmux.Client_name.t ->\n width:int ->\n height:int ->\n (unit, Libtmux.Error.t) result\n (** Set a control client's reported size. tmux rejects terminal clients. *)\n\n val send_text :\n t -> Libtmux.Pane.target -> text:string -> (unit, Libtmux.Error.t) result\n (** Literal bytes, without an implicit Enter. NUL is rejected at admission. *)\n\n val send_keys :\n t ->\n Libtmux.Pane.target ->\n Libtmux.Key.t list ->\n (unit, Libtmux.Error.t) result\n (** Send named tmux keys in order, without an implicit Enter. Use {!send_text}\n for literal bytes rather than key interpretation. *)\n\n val wait_for : t -> string -> (unit, Libtmux.Error.t) result\n (** Wait on a named tmux semaphore using a dedicated bound lane. *)\n\n val signal : t -> string -> (unit, Libtmux.Error.t) result\n (** Signal a named tmux semaphore, releasing a waiter or retaining the signal\n for a later {!wait_for}. This does not signal an OS process. *)\n\n val capture_environment :\n ?hidden:bool ->\n t ->\n Libtmux.Environment.scope ->\n (Libtmux.Environment.t, Libtmux.Error.t) result\n (** Acquire a bounded table through a read-only command process. Its response\n must identify the bound daemon while the original pidfd remains live.\n Unsupported external variable names fail decoding; they are not omitted.\n *)\n\n val set_environment :\n ?hidden:bool ->\n t ->\n Libtmux.Environment.scope ->\n name:string ->\n string ->\n (unit, Libtmux.Error.t) result\n (** Set a local environment value for future pane processes. [hidden] defaults\n to false; hidden values remain internal to tmux. Existing processes keep\n their environment. *)\n\n val unset_environment :\n t -> Libtmux.Environment.scope -> string -> (unit, Libtmux.Error.t) result\n (** Remove the local entry, allowing a global value to apply to future panes.\n *)\n\n val remove_environment :\n t -> Libtmux.Environment.scope -> string -> (unit, Libtmux.Error.t) result\n (** Store a removal marker, excluding the variable from future panes. *)\n\n val capture_options :\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n (Libtmux.Options.t, Libtmux.Error.t) result\n (** Acquire one bounded option table, excluding hooks. The default includes\n only local entries. Inherited table enumeration includes built-ins;\n inherited user options require [read_option] with their explicit name.\n Built-in descriptors cover every supported release from tmux 3.3a through\n 3.8; other versions return {!Libtmux.Error.Unsupported}. *)\n\n val read_option :\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (Libtmux.Options.value option, Libtmux.Error.t) result\n (** Read one exact name, including user-option inheritance. [None] means no\n entry under the selected policy. An invalid target remains an error. The\n default follows inheritance; this does not identify the defining parent\n scope. *)\n\n val set_option :\n ?index:int ->\n ?append:bool ->\n t ->\n Libtmux.Options.scope ->\n name:string ->\n Libtmux.Options.scalar ->\n (unit, Libtmux.Error.t) result\n (** Validate the scope and scalar kind before admission. Array values require\n an index, or [append:true]. Without an index, tmux splits appended text\n using the option's separator and fills the lowest unused indexes. Text is\n literal; tmux format expansion is disabled. Hooks use a separate\n operation. *)\n\n val unset_option :\n ?index:int ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (unit, Libtmux.Error.t) result\n (** Remove a local override or one array element. Global built-ins reset to\n their tmux defaults; this does not recursively unset child overrides. *)\n\n val clear_option_array :\n t -> Libtmux.Options.scope -> string -> (unit, Libtmux.Error.t) result\n (** Set a local empty array, masking inheritance. *)\n\n val capture_hooks :\n t -> Libtmux.Options.scope -> (Libtmux.Options.t, Libtmux.Error.t) result\n (** Capture locally configured built-in hooks. Command values are tmux's\n printed representation, retained as data. *)\n\n val read_hook :\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (Libtmux.Options.value option, Libtmux.Error.t) result\n (** Read an exact hook name. Inheritance is included by default; [None] means\n no entry under the selected policy. Missing targets remain errors. *)\n\n val set_hook :\n ?index:int ->\n ?append:bool ->\n t ->\n Libtmux.Options.scope ->\n name:string ->\n Libtmux.Hook.command list ->\n (unit, Libtmux.Error.t) result\n (** Set a hook to a nonempty command list. Without an index, replace the whole\n hook array, or fill the lowest free index when appending. An explicit\n [@name] custom hook stores command text as a user option; it requires\n complete replacement and has no array indexes. [read_hook] returns its\n [Libtmux.Options.Text] value; bulk hook capture includes built-ins.\n Commands may cause arbitrary tmux effects when triggered. Hooks that print\n output are outside the supported control transport contract. *)\n\n val remove_hook :\n ?index:int ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (unit, Libtmux.Error.t) result\n (** Remove the local hook or one indexed array entry. An inherited hook may\n become effective again; this does not stop work it already started. *)\n\n val run_hook :\n t -> Libtmux.Options.scope -> string -> (unit, Libtmux.Error.t) result\n (** Run the effective hook in an explicit session, window or pane context. A\n successful result follows completion of its synchronous command queue.\n Background work started by a hook has its own lifetime. A later hook\n failure returns an uncertain outcome; preceding effects remain. Named [@]\n hooks return [Unsupported] because tmux can hide their parse failures in\n the server log. Configuration and inspection remain available. *)\n\n val create_session :\n ?window_name:string ->\n ?width:int ->\n ?height:int ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n name:string ->\n unit ->\n (Libtmux.Created.t, Libtmux.Error.t) result\n (** Create a detached session on the bound daemon. Name collisions fail. *)\n\n val create_window :\n ?index:int ->\n ?name:string ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n Libtmux.Session.target ->\n (Libtmux.Created.t, Libtmux.Error.t) result\n (** Create detached, rejecting an occupied explicit index. *)\n\n val split_pane :\n ?size:Libtmux.Geometry.size ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n Libtmux.Pane.target ->\n direction:Libtmux.Geometry.direction ->\n (Libtmux.Created.t, Libtmux.Error.t) result\n (** Create a detached pane beside the target and return the IDs reported by\n tmux. Omitted [size] lets tmux choose the split; tmux rejects splits when\n no space remains. *)\n\n val break_pane :\n ?name:string ->\n t ->\n Libtmux.Pane.target ->\n session:Libtmux.Session.target ->\n index:int ->\n (Libtmux.Created.t, Libtmux.Error.t) result\n (** Move the pane into a new window at an explicit session index. An occupied\n destination fails. The returned IDs describe the resulting context; the\n pane itself already existed. *)\n\n val kill_session :\n t -> Libtmux.Session.target -> (unit, Libtmux.Error.t) result\n (** Remove the session and its window links. Windows with no other links and\n their panes are destroyed. Removing the last session may stop tmux. *)\n\n val kill_window : t -> Libtmux.Window.target -> (unit, Libtmux.Error.t) result\n (** Destroy the window, all its session links and every contained pane. This\n acts on the global window, not a single contextual link. *)\n\n val kill_pane : t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result\n (** Destroy the target pane and its running process. tmux removes a window\n that becomes empty and may remove its now-empty sessions. *)\n\n val select_window_at :\n t -> Libtmux.Session.target -> index:int -> (unit, Libtmux.Error.t) result\n (** Operate on the session's current index at execution, not an old link\n incarnation. *)\n\n val unlink_window_at :\n ?allow_kill:bool ->\n t ->\n Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result\n (** Without [allow_kill], tmux rejects removal of the last link to a window.\n *)\n\n val link_window :\n t ->\n Libtmux.Window.target ->\n session:Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result\n (** Add a session-specific link to the global window at [index], rejecting an\n occupied index. The source window and its panes stay shared. *)\n\n val move_window_at :\n t ->\n Libtmux.Session.target ->\n from_index:int ->\n session:Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result\n (** Move the source session's current link at [from_index]. Destination\n collisions fail. *)\n\n val select_pane : t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result\n (** Make the pane active in its containing window. This does not open or\n attach a terminal client. *)\n\n val set_pane_title :\n t -> Libtmux.Pane.target -> title:string -> (unit, Libtmux.Error.t) result\n (** Set the pane title as literal text, without tmux format expansion. A\n running terminal application can subsequently replace the title. *)\n\n val resize_pane :\n ?width:int ->\n ?height:int ->\n t ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result\n (** Request positive cell dimensions, supplying at least one dimension. Omit\n either dimension to retain it. tmux can constrain the result to the\n available layout. Capture again to observe the actual dimensions. *)\n\n val resize_window :\n ?width:int ->\n ?height:int ->\n t ->\n Libtmux.Window.target ->\n (unit, Libtmux.Error.t) result\n (** Request positive cell dimensions, supplying at least one dimension. Omit\n either dimension to retain it. Client-size and window-size policies can\n affect subsequent sizing. *)\n\n val select_layout :\n t ->\n Libtmux.Window.target ->\n Libtmux.Layout.t ->\n (unit, Libtmux.Error.t) result\n (** Apply a preset or validated custom layout to the window. Pane geometry\n follows tmux layout rules; capture again to observe the result. *)\n\n val cycle_layout :\n t ->\n Libtmux.Window.target ->\n [ `Next | `Previous ] ->\n (unit, Libtmux.Error.t) result\n (** Select the next or previous tmux preset layout for this window. *)\n\n val move_pane :\n ?size:Libtmux.Geometry.size ->\n t ->\n Libtmux.Pane.target ->\n beside:Libtmux.Pane.target ->\n direction:Libtmux.Geometry.direction ->\n (unit, Libtmux.Error.t) result\n (** Move the source pane beside another pane, optionally setting the split\n size. Both targets must belong to the same bound generation. An emptied\n source window is removed by tmux. *)\n\n val swap_panes :\n t ->\n Libtmux.Pane.target ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result\n (** Exchange pane positions without exchanging their identities or running\n processes. Both targets must belong to the same bound generation. *)\n\n val rotate_panes :\n t ->\n Libtmux.Window.target ->\n [ `Forward | `Backward ] ->\n (unit, Libtmux.Error.t) result\n (** Rotate pane positions in the selected direction. Pane identities and\n running processes remain attached to their panes. *)\n\n val zoom_pane : t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result\n (** Toggle the window's zoom state around this pane. *)\n\n val respawn_pane :\n ?kill_running:bool ->\n t ->\n Libtmux.Pane.target ->\n Libtmux.Spawn.t ->\n (unit, Libtmux.Error.t) result\n (** Start the supplied command in the existing pane. A running process causes\n failure unless [kill_running:true] explicitly replaces it. The pane ID\n remains unchanged. *)\n\n val clear_history : t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result\n (** Clear stored scrollback for this pane. The visible screen and running\n process remain; later captures cannot recover discarded history. *)\n\n (* END GENERATED OPERATIONS *)\n\n val close : t -> (unit, Libtmux.Error.t) result\n (** Retire the generation and close owned control clients and descriptors.\n Reject new {!submit} and {!subscribe} calls as soon as closing starts.\n Concurrent calls await the same teardown result. Later calls retain a\n teardown failure instead of treating the closed flag as success. Each\n helper gets 200 ms of TERM grace, followed by KILL if needed and reaping.\n Other fibers can run during that wait. The grace is per helper; it does\n not bound scheduling, filesystem or uninterruptible kernel work. No signal\n targets the daemon. tmux's [exit-unattached] and [exit-empty] policies can\n end the daemon after its clients or sessions disappear. *)\nend","source":{"file":"eio/libtmux_eio.mli","line":127,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio","doc":{"summary":"An explicit generation-bound connection. Applications retain ownership of the endpoint choice and resource lifetime."},"slug":"libtmux_eio-client"},{"id":"Libtmux_eio.Client.await","publicId":"Libtmux_eio.Client.await","qualifiedName":"Libtmux_eio.Client.await","name":"await","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":200,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Cancellation propagates as Eio cancellation. Store the handle outside the\n cancelled fiber: the client drains written work independently, and the\n eventual result remains inspectable. "],"declarations":[{"kind":"function","text":"val await : 'a Operation.t -> ('a, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":200,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Cancellation propagates as Eio cancellation. Store the handle outside the cancelled fiber: the client drains written work independently, and the eventual result remains inspectable."},"signatures":[{"raw":"val await : 'a Operation.t -> ('a, Libtmux.Error.t) result","params":[{"name":"arg1","type":"'a Operation.t"}],"returns":"('a, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-await"},{"id":"Libtmux_eio.Client.break_pane","publicId":"Libtmux_eio.Client.break_pane","qualifiedName":"Libtmux_eio.Client.break_pane","name":"break_pane","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":443,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Move the pane into a new window at an explicit session index. An occupied\n destination fails. The returned IDs describe the resulting context; the\n pane itself already existed. "],"declarations":[{"kind":"function","text":"val break_pane :\n ?name:string ->\n t ->\n Libtmux.Pane.target ->\n session:Libtmux.Session.target ->\n index:int ->\n (Libtmux.Created.t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":443,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Move the pane into a new window at an explicit session index. An occupied destination fails. The returned IDs describe the resulting context; the pane itself already existed."},"signatures":[{"raw":"val break_pane :\n ?name:string ->\n t ->\n Libtmux.Pane.target ->\n session:Libtmux.Session.target ->\n index:int -> (Libtmux.Created.t, Libtmux.Error.t) result","params":[{"name":"name","type":"string","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"session","type":"Libtmux.Session.target","keywordOnly":true},{"name":"index","type":"int","keywordOnly":true}],"returns":"(Libtmux.Created.t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-break_pane"},{"id":"Libtmux_eio.Client.capture","publicId":"Libtmux_eio.Client.capture","qualifiedName":"Libtmux_eio.Client.capture","name":"capture","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":209,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Acquire a complete immutable graph over an interval. Conflicting or\n disappearing entities fail capture; they do not become empty relations.\n The returned values remain readable after client closure. "],"declarations":[{"kind":"function","text":"val capture : t -> (Libtmux.Snapshot.t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":209,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Acquire a complete immutable graph over an interval. Conflicting or disappearing entities fail capture; they do not become empty relations. The returned values remain readable after client closure."},"signatures":[{"raw":"val capture : t -> (Libtmux.Snapshot.t, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"}],"returns":"(Libtmux.Snapshot.t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-capture"},{"id":"Libtmux_eio.Client.capture_environment","publicId":"Libtmux_eio.Client.capture_environment","qualifiedName":"Libtmux_eio.Client.capture_environment","name":"capture_environment","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":285,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Acquire a bounded table through a read-only command process. Its response\n must identify the bound daemon while the original pidfd remains live.\n Unsupported external variable names fail decoding; they are not omitted.\n "],"declarations":[{"kind":"function","text":"val capture_environment :\n ?hidden:bool ->\n t ->\n Libtmux.Environment.scope ->\n (Libtmux.Environment.t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":285,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Acquire a bounded table through a read-only command process. Its response must identify the bound daemon while the original pidfd remains live. Unsupported external variable names fail decoding; they are not omitted."},"signatures":[{"raw":"val capture_environment :\n ?hidden:bool ->\n t ->\n Libtmux.Environment.scope ->\n (Libtmux.Environment.t, Libtmux.Error.t) result","params":[{"name":"hidden","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Environment.scope"}],"returns":"(Libtmux.Environment.t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-capture_environment"},{"id":"Libtmux_eio.Client.capture_hooks","publicId":"Libtmux_eio.Client.capture_hooks","qualifiedName":"Libtmux_eio.Client.capture_hooks","name":"capture_hooks","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":364,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Capture locally configured built-in hooks. Command values are tmux's\n printed representation, retained as data. "],"declarations":[{"kind":"function","text":"val capture_hooks :\n t -> Libtmux.Options.scope -> (Libtmux.Options.t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":364,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Capture locally configured built-in hooks. Command values are tmux's printed representation, retained as data."},"signatures":[{"raw":"val capture_hooks :\n t -> Libtmux.Options.scope -> (Libtmux.Options.t, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"}],"returns":"(Libtmux.Options.t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-capture_hooks"},{"id":"Libtmux_eio.Client.capture_options","publicId":"Libtmux_eio.Client.capture_options","qualifiedName":"Libtmux_eio.Client.capture_options","name":"capture_options","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":315,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Acquire one bounded option table, excluding hooks. The default includes\n only local entries. Inherited table enumeration includes built-ins;\n inherited user options require [read_option] with their explicit name.\n Built-in descriptors cover every supported release from tmux 3.3a through\n 3.8; other versions return {!Libtmux.Error.Unsupported}. "],"declarations":[{"kind":"function","text":"val capture_options :\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n (Libtmux.Options.t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":315,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Acquire one bounded option table, excluding hooks. The default includes only local entries. Inherited table enumeration includes built-ins; inherited user options require `read_option` with their explicit name. Built-in descriptors cover every supported release from tmux 3.3a through 3.8; other versions return {!Libtmux.Error.Unsupported}."},"signatures":[{"raw":"val capture_options :\n ?include_inherited:bool ->\n t -> Libtmux.Options.scope -> (Libtmux.Options.t, Libtmux.Error.t) result","params":[{"name":"include_inherited","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"}],"returns":"(Libtmux.Options.t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-capture_options"},{"id":"Libtmux_eio.Client.capture_text","publicId":"Libtmux_eio.Client.capture_text","qualifiedName":"Libtmux_eio.Client.capture_text","name":"capture_text","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":214,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Inclusive ordinary screen rows, using a bounded private file transfer.\n Qualified local scratch storage must be shared with the daemon. "],"declarations":[{"kind":"function","text":"val capture_text :\n ?scratch_dir:string ->\n t ->\n Libtmux.Pane.t ->\n start:int ->\n end_:int ->\n (Rendered.t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":214,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Inclusive ordinary screen rows, using a bounded private file transfer. Qualified local scratch storage must be shared with the daemon."},"signatures":[{"raw":"val capture_text :\n ?scratch_dir:string ->\n t ->\n Libtmux.Pane.t ->\n start:int -> end_:int -> (Rendered.t, Libtmux.Error.t) result","params":[{"name":"scratch_dir","type":"string","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.t"},{"name":"start","type":"int","keywordOnly":true},{"name":"end_","type":"int","keywordOnly":true}],"returns":"(Rendered.t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-capture_text"},{"id":"Libtmux_eio.Client.cleanup","publicId":"Libtmux_eio.Client.cleanup","qualifiedName":"Libtmux_eio.Client.cleanup","name":"cleanup","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":145,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read the supplied report or the client's fresh default without I/O.\n {!Cleanup.inspect} remains available after close. "],"declarations":[{"kind":"function","text":"val cleanup : t -> Cleanup.t","source":{"file":"eio/libtmux_eio.mli","line":145,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Read the supplied report or the client's fresh default without I/O. {!Cleanup.inspect} remains available after close."},"signatures":[{"raw":"val cleanup : t -> Cleanup.t","params":[{"name":"arg1","type":"t"}],"returns":"Cleanup.t"}],"slug":"libtmux_eio-client-cleanup"},{"id":"Libtmux_eio.Client.clear_history","publicId":"Libtmux_eio.Client.clear_history","qualifiedName":"Libtmux_eio.Client.clear_history","name":"clear_history","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":584,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Clear stored scrollback for this pane. The visible screen and running\n process remain; later captures cannot recover discarded history. "],"declarations":[{"kind":"function","text":"val clear_history : t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":584,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Clear stored scrollback for this pane. The visible screen and running process remain; later captures cannot recover discarded history."},"signatures":[{"raw":"val clear_history :\n t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-clear_history"},{"id":"Libtmux_eio.Client.clear_option_array","publicId":"Libtmux_eio.Client.clear_option_array","qualifiedName":"Libtmux_eio.Client.clear_option_array","name":"clear_option_array","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":360,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set a local empty array, masking inheritance. "],"declarations":[{"kind":"function","text":"val clear_option_array :\n t -> Libtmux.Options.scope -> string -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":360,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Set a local empty array, masking inheritance."},"signatures":[{"raw":"val clear_option_array :\n t -> Libtmux.Options.scope -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-clear_option_array"},{"id":"Libtmux_eio.Client.close","publicId":"Libtmux_eio.Client.close","qualifiedName":"Libtmux_eio.Client.close","name":"close","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":590,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Retire the generation and close owned control clients and descriptors.\n Reject new {!submit} and {!subscribe} calls as soon as closing starts.\n Concurrent calls await the same teardown result. Later calls retain a\n teardown failure instead of treating the closed flag as success. Each\n helper gets 200 ms of TERM grace, followed by KILL if needed and reaping.\n Other fibers can run during that wait. The grace is per helper; it does\n not bound scheduling, filesystem or uninterruptible kernel work. No signal\n targets the daemon. tmux's [exit-unattached] and [exit-empty] policies can\n end the daemon after its clients or sessions disappear. "],"declarations":[{"kind":"function","text":"val close : t -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":590,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Retire the generation and close owned control clients and descriptors. Reject new {!submit} and {!subscribe} calls as soon as closing starts. Concurrent calls await the same teardown result. Later calls retain a teardown failure instead of treating the closed flag as success. Each helper gets 200 ms of TERM grace, followed by KILL if needed and reaping. Other fibers can run during that wait. The grace is per helper; it does not bound scheduling, filesystem or uninterruptible kernel work. No signal targets the daemon. tmux's `exit-unattached` and `exit-empty` policies can end the daemon after its clients or sessions disappear."},"signatures":[{"raw":"val close : t -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-close"},{"id":"Libtmux_eio.Client.connect","publicId":"Libtmux_eio.Client.connect","qualifiedName":"Libtmux_eio.Client.connect","name":"connect","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":130,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Attach to an existing local Linux daemon in the same PID namespace and\n shared filesystem. Requires pidfd support. Default exchange timeout: one\n second. All client calls belong to the connecting OCaml domain. Initial\n and auxiliary attachments suppress tmux's [update-environment] behavior.\n "],"declarations":[{"kind":"function","text":"val connect :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?timeout:float ->\n sw:Eio.Switch.t ->\n process_mgr:_ Eio.Process.mgr ->\n mono_clock:_ Eio.Time.Mono.t ->\n Libtmux.Endpoint.t ->\n (t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":130,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Attach to an existing local Linux daemon in the same PID namespace and shared filesystem. Requires pidfd support. Default exchange timeout: one second. All client calls belong to the connecting OCaml domain. Initial and auxiliary attachments suppress tmux's `update-environment` behavior."},"signatures":[{"raw":"val connect :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?timeout:float ->\n sw:Eio.Switch.t ->\n process_mgr:[> [> `Generic ] Eio.Process.mgr_ty ] Eio.Process.mgr ->\n mono_clock:[> Eio.Time.Mono.ty ] Eio.Time.Mono.t ->\n Libtmux.Endpoint.t -> (t, Libtmux.Error.t) result","params":[{"name":"cleanup","type":"Cleanup.t","optional":true,"keywordOnly":true},{"name":"binary","type":"string","optional":true,"keywordOnly":true},{"name":"timeout","type":"float","optional":true,"keywordOnly":true},{"name":"sw","type":"Eio.Switch.t","keywordOnly":true},{"name":"process_mgr","type":"[> [> `Generic ] Eio.Process.mgr_ty ] Eio.Process.mgr","keywordOnly":true},{"name":"mono_clock","type":"[> Eio.Time.Mono.ty ] Eio.Time.Mono.t","keywordOnly":true},{"name":"arg1","type":"Libtmux.Endpoint.t"}],"returns":"(t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-connect"},{"id":"Libtmux_eio.Client.create_session","publicId":"Libtmux_eio.Client.create_session","qualifiedName":"Libtmux_eio.Client.create_session","name":"create_session","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":412,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Create a detached session on the bound daemon. Name collisions fail. "],"declarations":[{"kind":"function","text":"val create_session :\n ?window_name:string ->\n ?width:int ->\n ?height:int ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n name:string ->\n unit ->\n (Libtmux.Created.t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":412,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Create a detached session on the bound daemon. Name collisions fail."},"signatures":[{"raw":"val create_session :\n ?window_name:string ->\n ?width:int ->\n ?height:int ->\n ?spawn:Libtmux.Spawn.t ->\n t -> name:string -> unit -> (Libtmux.Created.t, Libtmux.Error.t) result","params":[{"name":"window_name","type":"string","optional":true,"keywordOnly":true},{"name":"width","type":"int","optional":true,"keywordOnly":true},{"name":"height","type":"int","optional":true,"keywordOnly":true},{"name":"spawn","type":"Libtmux.Spawn.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"name","type":"string","keywordOnly":true},{"name":"arg2","type":"unit"}],"returns":"(Libtmux.Created.t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-create_session"},{"id":"Libtmux_eio.Client.create_window","publicId":"Libtmux_eio.Client.create_window","qualifiedName":"Libtmux_eio.Client.create_window","name":"create_window","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":423,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Create detached, rejecting an occupied explicit index. "],"declarations":[{"kind":"function","text":"val create_window :\n ?index:int ->\n ?name:string ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n Libtmux.Session.target ->\n (Libtmux.Created.t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":423,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Create detached, rejecting an occupied explicit index."},"signatures":[{"raw":"val create_window :\n ?index:int ->\n ?name:string ->\n ?spawn:Libtmux.Spawn.t ->\n t -> Libtmux.Session.target -> (Libtmux.Created.t, Libtmux.Error.t) result","params":[{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"name","type":"string","optional":true,"keywordOnly":true},{"name":"spawn","type":"Libtmux.Spawn.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Session.target"}],"returns":"(Libtmux.Created.t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-create_window"},{"id":"Libtmux_eio.Client.cycle_layout","publicId":"Libtmux_eio.Client.cycle_layout","qualifiedName":"Libtmux_eio.Client.cycle_layout","name":"cycle_layout","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":537,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Select the next or previous tmux preset layout for this window. "],"declarations":[{"kind":"function","text":"val cycle_layout :\n t ->\n Libtmux.Window.target ->\n [ `Next | `Previous ] ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":537,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Select the next or previous tmux preset layout for this window."},"signatures":[{"raw":"val cycle_layout :\n t ->\n Libtmux.Window.target ->\n [ `Next | `Previous ] -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"},{"name":"arg3","type":"[ `Next | `Previous ]"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-cycle_layout"},{"id":"Libtmux_eio.Client.kill_pane","publicId":"Libtmux_eio.Client.kill_pane","qualifiedName":"Libtmux_eio.Client.kill_pane","name":"kill_pane","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":463,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Destroy the target pane and its running process. tmux removes a window\n that becomes empty and may remove its now-empty sessions. "],"declarations":[{"kind":"function","text":"val kill_pane : t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":463,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Destroy the target pane and its running process. tmux removes a window that becomes empty and may remove its now-empty sessions."},"signatures":[{"raw":"val kill_pane : t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-kill_pane"},{"id":"Libtmux_eio.Client.kill_session","publicId":"Libtmux_eio.Client.kill_session","qualifiedName":"Libtmux_eio.Client.kill_session","name":"kill_session","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":454,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove the session and its window links. Windows with no other links and\n their panes are destroyed. Removing the last session may stop tmux. "],"declarations":[{"kind":"function","text":"val kill_session :\n t -> Libtmux.Session.target -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":454,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Remove the session and its window links. Windows with no other links and their panes are destroyed. Removing the last session may stop tmux."},"signatures":[{"raw":"val kill_session :\n t -> Libtmux.Session.target -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Session.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-kill_session"},{"id":"Libtmux_eio.Client.kill_window","publicId":"Libtmux_eio.Client.kill_window","qualifiedName":"Libtmux_eio.Client.kill_window","name":"kill_window","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":459,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Destroy the window, all its session links and every contained pane. This\n acts on the global window, not a single contextual link. "],"declarations":[{"kind":"function","text":"val kill_window : t -> Libtmux.Window.target -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":459,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Destroy the window, all its session links and every contained pane. This acts on the global window, not a single contextual link."},"signatures":[{"raw":"val kill_window :\n t -> Libtmux.Window.target -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-kill_window"},{"id":"Libtmux_eio.Client.link_window","publicId":"Libtmux_eio.Client.link_window","qualifiedName":"Libtmux_eio.Client.link_window","name":"link_window","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":481,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Add a session-specific link to the global window at [index], rejecting an\n occupied index. The source window and its panes stay shared. "],"declarations":[{"kind":"function","text":"val link_window :\n t ->\n Libtmux.Window.target ->\n session:Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":481,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Add a session-specific link to the global window at `index`, rejecting an occupied index. The source window and its panes stay shared."},"signatures":[{"raw":"val link_window :\n t ->\n Libtmux.Window.target ->\n session:Libtmux.Session.target ->\n index:int -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"},{"name":"session","type":"Libtmux.Session.target","keywordOnly":true},{"name":"index","type":"int","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-link_window"},{"id":"Libtmux_eio.Client.move_pane","publicId":"Libtmux_eio.Client.move_pane","qualifiedName":"Libtmux_eio.Client.move_pane","name":"move_pane","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":544,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Move the source pane beside another pane, optionally setting the split\n size. Both targets must belong to the same bound generation. An emptied\n source window is removed by tmux. "],"declarations":[{"kind":"function","text":"val move_pane :\n ?size:Libtmux.Geometry.size ->\n t ->\n Libtmux.Pane.target ->\n beside:Libtmux.Pane.target ->\n direction:Libtmux.Geometry.direction ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":544,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Move the source pane beside another pane, optionally setting the split size. Both targets must belong to the same bound generation. An emptied source window is removed by tmux."},"signatures":[{"raw":"val move_pane :\n ?size:Libtmux.Geometry.size ->\n t ->\n Libtmux.Pane.target ->\n beside:Libtmux.Pane.target ->\n direction:Libtmux.Geometry.direction -> (unit, Libtmux.Error.t) result","params":[{"name":"size","type":"Libtmux.Geometry.size","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"beside","type":"Libtmux.Pane.target","keywordOnly":true},{"name":"direction","type":"Libtmux.Geometry.direction","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-move_pane"},{"id":"Libtmux_eio.Client.move_window_at","publicId":"Libtmux_eio.Client.move_window_at","qualifiedName":"Libtmux_eio.Client.move_window_at","name":"move_window_at","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":490,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Move the source session's current link at [from_index]. Destination\n collisions fail. "],"declarations":[{"kind":"function","text":"val move_window_at :\n t ->\n Libtmux.Session.target ->\n from_index:int ->\n session:Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":490,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Move the source session's current link at `from_index`. Destination collisions fail."},"signatures":[{"raw":"val move_window_at :\n t ->\n Libtmux.Session.target ->\n from_index:int ->\n session:Libtmux.Session.target ->\n index:int -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Session.target"},{"name":"from_index","type":"int","keywordOnly":true},{"name":"session","type":"Libtmux.Session.target","keywordOnly":true},{"name":"index","type":"int","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-move_window_at"},{"id":"Libtmux_eio.Client.read_hook","publicId":"Libtmux_eio.Client.read_hook","qualifiedName":"Libtmux_eio.Client.read_hook","name":"read_hook","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":369,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read an exact hook name. Inheritance is included by default; [None] means\n no entry under the selected policy. Missing targets remain errors. "],"declarations":[{"kind":"function","text":"val read_hook :\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (Libtmux.Options.value option, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":369,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Read an exact hook name. Inheritance is included by default; `None` means no entry under the selected policy. Missing targets remain errors."},"signatures":[{"raw":"val read_hook :\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n string -> (Libtmux.Options.value option, Libtmux.Error.t) result","params":[{"name":"include_inherited","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"arg3","type":"string"}],"returns":"(Libtmux.Options.value option, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-read_hook"},{"id":"Libtmux_eio.Client.read_option","publicId":"Libtmux_eio.Client.read_option","qualifiedName":"Libtmux_eio.Client.read_option","name":"read_option","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":326,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read one exact name, including user-option inheritance. [None] means no\n entry under the selected policy. An invalid target remains an error. The\n default follows inheritance; this does not identify the defining parent\n scope. "],"declarations":[{"kind":"function","text":"val read_option :\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (Libtmux.Options.value option, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":326,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Read one exact name, including user-option inheritance. `None` means no entry under the selected policy. An invalid target remains an error. The default follows inheritance; this does not identify the defining parent scope."},"signatures":[{"raw":"val read_option :\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n string -> (Libtmux.Options.value option, Libtmux.Error.t) result","params":[{"name":"include_inherited","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"arg3","type":"string"}],"returns":"(Libtmux.Options.value option, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-read_option"},{"id":"Libtmux_eio.Client.refresh_client_at","publicId":"Libtmux_eio.Client.refresh_client_at","qualifiedName":"Libtmux_eio.Client.refresh_client_at","name":"refresh_client_at","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":251,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Request a redraw; no terminal-rendering completion is implied. "],"declarations":[{"kind":"function","text":"val refresh_client_at :\n ?status_only:bool ->\n t ->\n Libtmux.Client_name.t ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":251,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Request a redraw; no terminal-rendering completion is implied."},"signatures":[{"raw":"val refresh_client_at :\n ?status_only:bool ->\n t -> Libtmux.Client_name.t -> (unit, Libtmux.Error.t) result","params":[{"name":"status_only","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Client_name.t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-refresh_client_at"},{"id":"Libtmux_eio.Client.remove_environment","publicId":"Libtmux_eio.Client.remove_environment","qualifiedName":"Libtmux_eio.Client.remove_environment","name":"remove_environment","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":311,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Store a removal marker, excluding the variable from future panes. "],"declarations":[{"kind":"function","text":"val remove_environment :\n t -> Libtmux.Environment.scope -> string -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":311,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Store a removal marker, excluding the variable from future panes."},"signatures":[{"raw":"val remove_environment :\n t -> Libtmux.Environment.scope -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Environment.scope"},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-remove_environment"},{"id":"Libtmux_eio.Client.remove_hook","publicId":"Libtmux_eio.Client.remove_hook","qualifiedName":"Libtmux_eio.Client.remove_hook","name":"remove_hook","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":394,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove the local hook or one indexed array entry. An inherited hook may\n become effective again; this does not stop work it already started. "],"declarations":[{"kind":"function","text":"val remove_hook :\n ?index:int ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":394,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Remove the local hook or one indexed array entry. An inherited hook may become effective again; this does not stop work it already started."},"signatures":[{"raw":"val remove_hook :\n ?index:int ->\n t -> Libtmux.Options.scope -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-remove_hook"},{"id":"Libtmux_eio.Client.rename_session","publicId":"Libtmux_eio.Client.rename_session","qualifiedName":"Libtmux_eio.Client.rename_session","name":"rename_session","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":230,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set the session name, rejecting a conflicting existing name. Bound IDs\n remain usable; existing snapshots retain their captured names. "],"declarations":[{"kind":"function","text":"val rename_session :\n t -> Libtmux.Session.target -> name:string -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":230,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Set the session name, rejecting a conflicting existing name. Bound IDs remain usable; existing snapshots retain their captured names."},"signatures":[{"raw":"val rename_session :\n t ->\n Libtmux.Session.target -> name:string -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Session.target"},{"name":"name","type":"string","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-rename_session"},{"id":"Libtmux_eio.Client.rename_window","publicId":"Libtmux_eio.Client.rename_window","qualifiedName":"Libtmux_eio.Client.rename_window","name":"rename_window","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":225,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set the global window name. Every session link observes the new name on\n its next capture; existing snapshots retain the old value. "],"declarations":[{"kind":"function","text":"val rename_window :\n t -> Libtmux.Window.target -> name:string -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":225,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Set the global window name. Every session link observes the new name on its next capture; existing snapshots retain the old value."},"signatures":[{"raw":"val rename_window :\n t -> Libtmux.Window.target -> name:string -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"},{"name":"name","type":"string","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-rename_window"},{"id":"Libtmux_eio.Client.request_detach_client_at","publicId":"Libtmux_eio.Client.request_detach_client_at","qualifiedName":"Libtmux_eio.Client.request_detach_client_at","name":"request_detach_client_at","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":245,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Request detachment of the client currently bearing this name. Success\n confirms request processing, not peer exit. Detaching the library's own\n primary lane can lose the response and retire its generation. "],"declarations":[{"kind":"function","text":"val request_detach_client_at :\n t -> Libtmux.Client_name.t -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":245,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Request detachment of the client currently bearing this name. Success confirms request processing, not peer exit. Detaching the library's own primary lane can lose the response and retire its generation."},"signatures":[{"raw":"val request_detach_client_at :\n t -> Libtmux.Client_name.t -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Client_name.t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-request_detach_client_at"},{"id":"Libtmux_eio.Client.resize_control_client_at","publicId":"Libtmux_eio.Client.resize_control_client_at","qualifiedName":"Libtmux_eio.Client.resize_control_client_at","name":"resize_control_client_at","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":258,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set a control client's reported size. tmux rejects terminal clients. "],"declarations":[{"kind":"function","text":"val resize_control_client_at :\n t ->\n Libtmux.Client_name.t ->\n width:int ->\n height:int ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":258,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Set a control client's reported size. tmux rejects terminal clients."},"signatures":[{"raw":"val resize_control_client_at :\n t ->\n Libtmux.Client_name.t ->\n width:int -> height:int -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Client_name.t"},{"name":"width","type":"int","keywordOnly":true},{"name":"height","type":"int","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-resize_control_client_at"},{"id":"Libtmux_eio.Client.resize_pane","publicId":"Libtmux_eio.Client.resize_pane","qualifiedName":"Libtmux_eio.Client.resize_pane","name":"resize_pane","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":509,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Request positive cell dimensions, supplying at least one dimension. Omit\n either dimension to retain it. tmux can constrain the result to the\n available layout. Capture again to observe the actual dimensions. "],"declarations":[{"kind":"function","text":"val resize_pane :\n ?width:int ->\n ?height:int ->\n t ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":509,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Request positive cell dimensions, supplying at least one dimension. Omit either dimension to retain it. tmux can constrain the result to the available layout. Capture again to observe the actual dimensions."},"signatures":[{"raw":"val resize_pane :\n ?width:int ->\n ?height:int -> t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","params":[{"name":"width","type":"int","optional":true,"keywordOnly":true},{"name":"height","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-resize_pane"},{"id":"Libtmux_eio.Client.resize_window","publicId":"Libtmux_eio.Client.resize_window","qualifiedName":"Libtmux_eio.Client.resize_window","name":"resize_window","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":519,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Request positive cell dimensions, supplying at least one dimension. Omit\n either dimension to retain it. Client-size and window-size policies can\n affect subsequent sizing. "],"declarations":[{"kind":"function","text":"val resize_window :\n ?width:int ->\n ?height:int ->\n t ->\n Libtmux.Window.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":519,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Request positive cell dimensions, supplying at least one dimension. Omit either dimension to retain it. Client-size and window-size policies can affect subsequent sizing."},"signatures":[{"raw":"val resize_window :\n ?width:int ->\n ?height:int -> t -> Libtmux.Window.target -> (unit, Libtmux.Error.t) result","params":[{"name":"width","type":"int","optional":true,"keywordOnly":true},{"name":"height","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-resize_window"},{"id":"Libtmux_eio.Client.respawn_pane","publicId":"Libtmux_eio.Client.respawn_pane","qualifiedName":"Libtmux_eio.Client.respawn_pane","name":"respawn_pane","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":574,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Start the supplied command in the existing pane. A running process causes\n failure unless [kill_running:true] explicitly replaces it. The pane ID\n remains unchanged. "],"declarations":[{"kind":"function","text":"val respawn_pane :\n ?kill_running:bool ->\n t ->\n Libtmux.Pane.target ->\n Libtmux.Spawn.t ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":574,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Start the supplied command in the existing pane. A running process causes failure unless `kill_running:true` explicitly replaces it. The pane ID remains unchanged."},"signatures":[{"raw":"val respawn_pane :\n ?kill_running:bool ->\n t ->\n Libtmux.Pane.target -> Libtmux.Spawn.t -> (unit, Libtmux.Error.t) result","params":[{"name":"kill_running","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"arg3","type":"Libtmux.Spawn.t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-respawn_pane"},{"id":"Libtmux_eio.Client.rotate_panes","publicId":"Libtmux_eio.Client.rotate_panes","qualifiedName":"Libtmux_eio.Client.rotate_panes","name":"rotate_panes","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":563,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Rotate pane positions in the selected direction. Pane identities and\n running processes remain attached to their panes. "],"declarations":[{"kind":"function","text":"val rotate_panes :\n t ->\n Libtmux.Window.target ->\n [ `Forward | `Backward ] ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":563,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Rotate pane positions in the selected direction. Pane identities and running processes remain attached to their panes."},"signatures":[{"raw":"val rotate_panes :\n t ->\n Libtmux.Window.target ->\n [ `Backward | `Forward ] -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"},{"name":"arg3","type":"[ `Backward | `Forward ]"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-rotate_panes"},{"id":"Libtmux_eio.Client.run","publicId":"Libtmux_eio.Client.run","qualifiedName":"Libtmux_eio.Client.run","name":"run","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":205,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Submit and await an explicit command. Retain a separate submitted handle\n when the outcome must remain inspectable after caller cancellation. "],"declarations":[{"kind":"function","text":"val run : t -> 'a Libtmux.Command.t -> ('a, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":205,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Submit and await an explicit command. Retain a separate submitted handle when the outcome must remain inspectable after caller cancellation."},"signatures":[{"raw":"val run : t -> 'a Libtmux.Command.t -> ('a, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"'a Libtmux.Command.t"}],"returns":"('a, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-run"},{"id":"Libtmux_eio.Client.run_hook","publicId":"Libtmux_eio.Client.run_hook","qualifiedName":"Libtmux_eio.Client.run_hook","name":"run_hook","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":403,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Run the effective hook in an explicit session, window or pane context. A\n successful result follows completion of its synchronous command queue.\n Background work started by a hook has its own lifetime. A later hook\n failure returns an uncertain outcome; preceding effects remain. Named [@]\n hooks return [Unsupported] because tmux can hide their parse failures in\n the server log. Configuration and inspection remain available. "],"declarations":[{"kind":"function","text":"val run_hook :\n t -> Libtmux.Options.scope -> string -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":403,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Run the effective hook in an explicit session, window or pane context. A successful result follows completion of its synchronous command queue. Background work started by a hook has its own lifetime. A later hook failure returns an uncertain outcome; preceding effects remain. Named `@` hooks return `Unsupported` because tmux can hide their parse failures in the server log. Configuration and inspection remain available."},"signatures":[{"raw":"val run_hook :\n t -> Libtmux.Options.scope -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-run_hook"},{"id":"Libtmux_eio.Client.select_layout","publicId":"Libtmux_eio.Client.select_layout","qualifiedName":"Libtmux_eio.Client.select_layout","name":"select_layout","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":529,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Apply a preset or validated custom layout to the window. Pane geometry\n follows tmux layout rules; capture again to observe the result. "],"declarations":[{"kind":"function","text":"val select_layout :\n t ->\n Libtmux.Window.target ->\n Libtmux.Layout.t ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":529,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Apply a preset or validated custom layout to the window. Pane geometry follows tmux layout rules; capture again to observe the result."},"signatures":[{"raw":"val select_layout :\n t ->\n Libtmux.Window.target -> Libtmux.Layout.t -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"},{"name":"arg3","type":"Libtmux.Layout.t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-select_layout"},{"id":"Libtmux_eio.Client.select_pane","publicId":"Libtmux_eio.Client.select_pane","qualifiedName":"Libtmux_eio.Client.select_pane","name":"select_pane","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":500,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Make the pane active in its containing window. This does not open or\n attach a terminal client. "],"declarations":[{"kind":"function","text":"val select_pane : t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":500,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Make the pane active in its containing window. This does not open or attach a terminal client."},"signatures":[{"raw":"val select_pane : t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-select_pane"},{"id":"Libtmux_eio.Client.select_window_at","publicId":"Libtmux_eio.Client.select_window_at","qualifiedName":"Libtmux_eio.Client.select_window_at","name":"select_window_at","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":467,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Operate on the session's current index at execution, not an old link\n incarnation. "],"declarations":[{"kind":"function","text":"val select_window_at :\n t -> Libtmux.Session.target -> index:int -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":467,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Operate on the session's current index at execution, not an old link incarnation."},"signatures":[{"raw":"val select_window_at :\n t -> Libtmux.Session.target -> index:int -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Session.target"},{"name":"index","type":"int","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-select_window_at"},{"id":"Libtmux_eio.Client.send_keys","publicId":"Libtmux_eio.Client.send_keys","qualifiedName":"Libtmux_eio.Client.send_keys","name":"send_keys","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":270,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Send named tmux keys in order, without an implicit Enter. Use {!send_text}\n for literal bytes rather than key interpretation. "],"declarations":[{"kind":"function","text":"val send_keys :\n t ->\n Libtmux.Pane.target ->\n Libtmux.Key.t list ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":270,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Send named tmux keys in order, without an implicit Enter. Use {!send_text} for literal bytes rather than key interpretation."},"signatures":[{"raw":"val send_keys :\n t ->\n Libtmux.Pane.target -> Libtmux.Key.t list -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"arg3","type":"Libtmux.Key.t list"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-send_keys"},{"id":"Libtmux_eio.Client.send_text","publicId":"Libtmux_eio.Client.send_text","qualifiedName":"Libtmux_eio.Client.send_text","name":"send_text","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":266,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Literal bytes, without an implicit Enter. NUL is rejected at admission. "],"declarations":[{"kind":"function","text":"val send_text :\n t -> Libtmux.Pane.target -> text:string -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":266,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Literal bytes, without an implicit Enter. NUL is rejected at admission."},"signatures":[{"raw":"val send_text :\n t -> Libtmux.Pane.target -> text:string -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"text","type":"string","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-send_text"},{"id":"Libtmux_eio.Client.set_environment","publicId":"Libtmux_eio.Client.set_environment","qualifiedName":"Libtmux_eio.Client.set_environment","name":"set_environment","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":295,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set a local environment value for future pane processes. [hidden] defaults\n to false; hidden values remain internal to tmux. Existing processes keep\n their environment. "],"declarations":[{"kind":"function","text":"val set_environment :\n ?hidden:bool ->\n t ->\n Libtmux.Environment.scope ->\n name:string ->\n string ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":295,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Set a local environment value for future pane processes. `hidden` defaults to false; hidden values remain internal to tmux. Existing processes keep their environment."},"signatures":[{"raw":"val set_environment :\n ?hidden:bool ->\n t ->\n Libtmux.Environment.scope ->\n name:string -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"hidden","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Environment.scope"},{"name":"name","type":"string","keywordOnly":true},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-set_environment"},{"id":"Libtmux_eio.Client.set_hook","publicId":"Libtmux_eio.Client.set_hook","qualifiedName":"Libtmux_eio.Client.set_hook","name":"set_hook","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":378,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set a hook to a nonempty command list. Without an index, replace the whole\n hook array, or fill the lowest free index when appending. An explicit\n [@name] custom hook stores command text as a user option; it requires\n complete replacement and has no array indexes. [read_hook] returns its\n [Libtmux.Options.Text] value; bulk hook capture includes built-ins.\n Commands may cause arbitrary tmux effects when triggered. Hooks that print\n output are outside the supported control transport contract. "],"declarations":[{"kind":"function","text":"val set_hook :\n ?index:int ->\n ?append:bool ->\n t ->\n Libtmux.Options.scope ->\n name:string ->\n Libtmux.Hook.command list ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":378,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Set a hook to a nonempty command list. Without an index, replace the whole hook array, or fill the lowest free index when appending. An explicit `@name` custom hook stores command text as a user option; it requires complete replacement and has no array indexes. `read_hook` returns its `Libtmux.Options.Text` value; bulk hook capture includes built-ins. Commands may cause arbitrary tmux effects when triggered. Hooks that print output are outside the supported control transport contract."},"signatures":[{"raw":"val set_hook :\n ?index:int ->\n ?append:bool ->\n t ->\n Libtmux.Options.scope ->\n name:string -> Libtmux.Hook.command list -> (unit, Libtmux.Error.t) result","params":[{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"append","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"name","type":"string","keywordOnly":true},{"name":"arg3","type":"Libtmux.Hook.command list"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-set_hook"},{"id":"Libtmux_eio.Client.set_option","publicId":"Libtmux_eio.Client.set_option","qualifiedName":"Libtmux_eio.Client.set_option","name":"set_option","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":337,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Validate the scope and scalar kind before admission. Array values require\n an index, or [append:true]. Without an index, tmux splits appended text\n using the option's separator and fills the lowest unused indexes. Text is\n literal; tmux format expansion is disabled. Hooks use a separate\n operation. "],"declarations":[{"kind":"function","text":"val set_option :\n ?index:int ->\n ?append:bool ->\n t ->\n Libtmux.Options.scope ->\n name:string ->\n Libtmux.Options.scalar ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":337,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Validate the scope and scalar kind before admission. Array values require an index, or `append:true`. Without an index, tmux splits appended text using the option's separator and fills the lowest unused indexes. Text is literal; tmux format expansion is disabled. Hooks use a separate operation."},"signatures":[{"raw":"val set_option :\n ?index:int ->\n ?append:bool ->\n t ->\n Libtmux.Options.scope ->\n name:string -> Libtmux.Options.scalar -> (unit, Libtmux.Error.t) result","params":[{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"append","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"name","type":"string","keywordOnly":true},{"name":"arg3","type":"Libtmux.Options.scalar"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-set_option"},{"id":"Libtmux_eio.Client.set_pane_title","publicId":"Libtmux_eio.Client.set_pane_title","qualifiedName":"Libtmux_eio.Client.set_pane_title","name":"set_pane_title","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":504,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set the pane title as literal text, without tmux format expansion. A\n running terminal application can subsequently replace the title. "],"declarations":[{"kind":"function","text":"val set_pane_title :\n t -> Libtmux.Pane.target -> title:string -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":504,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Set the pane title as literal text, without tmux format expansion. A running terminal application can subsequently replace the title."},"signatures":[{"raw":"val set_pane_title :\n t -> Libtmux.Pane.target -> title:string -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"title","type":"string","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-set_pane_title"},{"id":"Libtmux_eio.Client.signal","publicId":"Libtmux_eio.Client.signal","qualifiedName":"Libtmux_eio.Client.signal","name":"signal","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":281,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Signal a named tmux semaphore, releasing a waiter or retaining the signal\n for a later {!wait_for}. This does not signal an OS process. "],"declarations":[{"kind":"function","text":"val signal : t -> string -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":281,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Signal a named tmux semaphore, releasing a waiter or retaining the signal for a later {!wait_for}. This does not signal an OS process."},"signatures":[{"raw":"val signal : t -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-signal"},{"id":"Libtmux_eio.Client.source","publicId":"Libtmux_eio.Client.source","qualifiedName":"Libtmux_eio.Client.source","name":"source","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":149,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read the retained endpoint, daemon PID and connection generation without\n I/O. "],"declarations":[{"kind":"function","text":"val source : t -> Libtmux.Source.t","source":{"file":"eio/libtmux_eio.mli","line":149,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Read the retained endpoint, daemon PID and connection generation without I/O."},"signatures":[{"raw":"val source : t -> Libtmux.Source.t","params":[{"name":"arg1","type":"t"}],"returns":"Libtmux.Source.t"}],"slug":"libtmux_eio-client-source"},{"id":"Libtmux_eio.Client.split_pane","publicId":"Libtmux_eio.Client.split_pane","qualifiedName":"Libtmux_eio.Client.split_pane","name":"split_pane","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":432,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Create a detached pane beside the target and return the IDs reported by\n tmux. Omitted [size] lets tmux choose the split; tmux rejects splits when\n no space remains. "],"declarations":[{"kind":"function","text":"val split_pane :\n ?size:Libtmux.Geometry.size ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n Libtmux.Pane.target ->\n direction:Libtmux.Geometry.direction ->\n (Libtmux.Created.t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":432,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Create a detached pane beside the target and return the IDs reported by tmux. Omitted `size` lets tmux choose the split; tmux rejects splits when no space remains."},"signatures":[{"raw":"val split_pane :\n ?size:Libtmux.Geometry.size ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n Libtmux.Pane.target ->\n direction:Libtmux.Geometry.direction ->\n (Libtmux.Created.t, Libtmux.Error.t) result","params":[{"name":"size","type":"Libtmux.Geometry.size","optional":true,"keywordOnly":true},{"name":"spawn","type":"Libtmux.Spawn.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"direction","type":"Libtmux.Geometry.direction","keywordOnly":true}],"returns":"(Libtmux.Created.t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-split_pane"},{"id":"Libtmux_eio.Client.submit","publicId":"Libtmux_eio.Client.submit","qualifiedName":"Libtmux_eio.Client.submit","name":"submit","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":195,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Validate and reserve bounded capacity without I/O. Return\n [Error Libtmux.Error.Closed] once {!close} starts. "],"declarations":[{"kind":"function","text":"val submit :\n t -> 'a Libtmux.Command.t -> ('a Operation.t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":195,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Validate and reserve bounded capacity without I/O. Return `Error Libtmux.Error.Closed` once {!close} starts."},"signatures":[{"raw":"val submit :\n t -> 'a Libtmux.Command.t -> ('a Operation.t, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"'a Libtmux.Command.t"}],"returns":"('a Operation.t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-submit"},{"id":"Libtmux_eio.Client.subscribe","publicId":"Libtmux_eio.Client.subscribe","qualifiedName":"Libtmux_eio.Client.subscribe","name":"subscribe","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":156,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Acquire verified coverage through one shared lane per session; choose the\n least observed session ID unless supplied. A client-owned reader delivers\n future bytes without application callbacks. Default queue bounds are 1\n MiB/1024 events; max 16 subscribers and eight total client lanes, sharing\n the 32 MiB payload budget. Queue capacities remain reserved while empty;\n captures and reads need additional scratch space and can return\n {!Libtmux.Error.Capacity} below the subscriber-count limit. See the\n {{:https://github.com/libtmux/libtmux-ocaml/blob/master/docs/streaming.md#plan-shared-capacity}shared\n capacity guide} for combined reservations and process slots.\n\n Overflow or coverage/layout changes emit Gap then End. Data starts after\n admission's marker, with no snapshot/history barrier, automatic reconnect\n or silent cursor reuse. New admission returns [Error Libtmux.Error.Closed]\n once {!close} starts. "],"declarations":[{"kind":"function","text":"val subscribe :\n ?session:Libtmux.Session.target ->\n ?capacity_bytes:int ->\n ?capacity_events:int ->\n t ->\n Libtmux.Pane.t ->\n (Subscription.t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":156,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Acquire verified coverage through one shared lane per session; choose the least observed session ID unless supplied. A client-owned reader delivers future bytes without application callbacks. Default queue bounds are 1 MiB/1024 events; max 16 subscribers and eight total client lanes, sharing the 32 MiB payload budget. Queue capacities remain reserved while empty; captures and reads need additional scratch space and can return {!Libtmux.Error.Capacity} below the subscriber-count limit. See the [shared capacity guide](https://github.com/libtmux/libtmux-ocaml/blob/master/docs/streaming.md#plan-shared-capacity) for combined reservations and process slots.","body":"Overflow or coverage/layout changes emit Gap then End. Data starts after admission's marker, with no snapshot/history barrier, automatic reconnect or silent cursor reuse. New admission returns `Error Libtmux.Error.Closed` once {!close} starts.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet watch_output binary blocking (initial : Created.t) _spawn =\n Eio_main.run @@ fun env ->\n Eio.Switch.run @@ fun sw ->\n let module Client = Libtmux_eio.Client in\n let module Subscription = Libtmux_eio.Subscription in\n let client =\n get\n (Client.connect ~sw ~binary\n ~process_mgr:(Eio.Stdenv.process_mgr env)\n ~mono_clock:(Eio.Stdenv.mono_clock env)\n (Source.endpoint (Libtmux_unix.Client.source blocking)))\n in\n Fun.protect\n ~finally:(fun () ->\n Eio.Cancel.protect (fun () -> get (Client.close client)))\n (fun () ->\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n let subscription =\n get (Client.subscribe ~capacity_bytes:4096 client pane)\n in\n Fun.protect\n ~finally:(fun () ->\n Eio.Cancel.protect (fun () -> get (Subscription.close subscription)))\n (fun () ->\n let cursor, () =\n Eio.Fiber.pair\n (fun () ->\n match\n Subscription.wait_for_bytes ~timeout:0.5 subscription\n ~text:\"changed\"\n with\n | Ok cursor -> cursor\n | Error (Output.Failure error) ->\n failwith (Format.asprintf \"%a\" Error.pp error)\n | Error (Output.Ended reason) ->\n failwith (Format.asprintf \"%a\" Output.reason_pp reason))\n (fun () ->\n get (Client.send_text client (Pane.target pane) ~text:\"changed\");\n get (Client.send_keys client (Pane.target pane) [ Key.Enter ]))\n in\n assert (cursor.offset >= 7L);\n print_endline \"observed: changed\"))\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary (watch_output binary)\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_watch.ml","intro":"Observe future output with Eio. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_watch.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"observed: changed\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val subscribe :\n ?session:Libtmux.Session.target ->\n ?capacity_bytes:int ->\n ?capacity_events:int ->\n t -> Libtmux.Pane.t -> (Subscription.t, Libtmux.Error.t) result","params":[{"name":"session","type":"Libtmux.Session.target","optional":true,"keywordOnly":true},{"name":"capacity_bytes","type":"int","optional":true,"keywordOnly":true},{"name":"capacity_events","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.t"}],"returns":"(Subscription.t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-subscribe"},{"id":"Libtmux_eio.Client.swap_panes","publicId":"Libtmux_eio.Client.swap_panes","qualifiedName":"Libtmux_eio.Client.swap_panes","name":"swap_panes","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":555,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Exchange pane positions without exchanging their identities or running\n processes. Both targets must belong to the same bound generation. "],"declarations":[{"kind":"function","text":"val swap_panes :\n t ->\n Libtmux.Pane.target ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":555,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Exchange pane positions without exchanging their identities or running processes. Both targets must belong to the same bound generation."},"signatures":[{"raw":"val swap_panes :\n t ->\n Libtmux.Pane.target ->\n Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"arg3","type":"Libtmux.Pane.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-swap_panes"},{"id":"Libtmux_eio.Client.switch_client_at","publicId":"Libtmux_eio.Client.switch_client_at","qualifiedName":"Libtmux_eio.Client.switch_client_at","name":"switch_client_at","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":235,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Switch the client currently bearing this name to the bound session.\n Environment updates are disabled by default. This can move either a\n terminal client or a control client; it does not open a new terminal. "],"declarations":[{"kind":"function","text":"val switch_client_at :\n ?update_environment:bool ->\n t ->\n Libtmux.Client_name.t ->\n session:Libtmux.Session.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":235,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Switch the client currently bearing this name to the bound session. Environment updates are disabled by default. This can move either a terminal client or a control client; it does not open a new terminal."},"signatures":[{"raw":"val switch_client_at :\n ?update_environment:bool ->\n t ->\n Libtmux.Client_name.t ->\n session:Libtmux.Session.target -> (unit, Libtmux.Error.t) result","params":[{"name":"update_environment","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Client_name.t"},{"name":"session","type":"Libtmux.Session.target","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-switch_client_at"},{"id":"Libtmux_eio.Client.t","publicId":"Libtmux_eio.Client.t","qualifiedName":"Libtmux_eio.Client.t","name":"t","kind":"typealias","package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":128,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"eio/libtmux_eio.mli","line":128,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux_eio-client-t"},{"id":"Libtmux_eio.Client.unlink_window_at","publicId":"Libtmux_eio.Client.unlink_window_at","qualifiedName":"Libtmux_eio.Client.unlink_window_at","name":"unlink_window_at","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":472,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Without [allow_kill], tmux rejects removal of the last link to a window.\n "],"declarations":[{"kind":"function","text":"val unlink_window_at :\n ?allow_kill:bool ->\n t ->\n Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":472,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Without `allow_kill`, tmux rejects removal of the last link to a window."},"signatures":[{"raw":"val unlink_window_at :\n ?allow_kill:bool ->\n t -> Libtmux.Session.target -> index:int -> (unit, Libtmux.Error.t) result","params":[{"name":"allow_kill","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Session.target"},{"name":"index","type":"int","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-unlink_window_at"},{"id":"Libtmux_eio.Client.unset_environment","publicId":"Libtmux_eio.Client.unset_environment","qualifiedName":"Libtmux_eio.Client.unset_environment","name":"unset_environment","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":306,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove the local entry, allowing a global value to apply to future panes.\n "],"declarations":[{"kind":"function","text":"val unset_environment :\n t -> Libtmux.Environment.scope -> string -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":306,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Remove the local entry, allowing a global value to apply to future panes."},"signatures":[{"raw":"val unset_environment :\n t -> Libtmux.Environment.scope -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Environment.scope"},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-unset_environment"},{"id":"Libtmux_eio.Client.unset_option","publicId":"Libtmux_eio.Client.unset_option","qualifiedName":"Libtmux_eio.Client.unset_option","name":"unset_option","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":351,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove a local override or one array element. Global built-ins reset to\n their tmux defaults; this does not recursively unset child overrides. "],"declarations":[{"kind":"function","text":"val unset_option :\n ?index:int ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":351,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Remove a local override or one array element. Global built-ins reset to their tmux defaults; this does not recursively unset child overrides."},"signatures":[{"raw":"val unset_option :\n ?index:int ->\n t -> Libtmux.Options.scope -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-unset_option"},{"id":"Libtmux_eio.Client.version","publicId":"Libtmux_eio.Client.version","qualifiedName":"Libtmux_eio.Client.version","name":"version","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":153,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read the bound daemon's observed version without I/O. "],"declarations":[{"kind":"function","text":"val version : t -> string","source":{"file":"eio/libtmux_eio.mli","line":153,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Read the bound daemon's observed version without I/O."},"signatures":[{"raw":"val version : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux_eio-client-version"},{"id":"Libtmux_eio.Client.wait_for","publicId":"Libtmux_eio.Client.wait_for","qualifiedName":"Libtmux_eio.Client.wait_for","name":"wait_for","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":278,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Wait on a named tmux semaphore using a dedicated bound lane. "],"declarations":[{"kind":"function","text":"val wait_for : t -> string -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":278,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Wait on a named tmux semaphore using a dedicated bound lane."},"signatures":[{"raw":"val wait_for : t -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-wait_for"},{"id":"Libtmux_eio.Client.wait_for_text","publicId":"Libtmux_eio.Client.wait_for_text","qualifiedName":"Libtmux_eio.Client.wait_for_text","name":"wait_for_text","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":178,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Subscribe and capture the screen immediately, then recapture on output.\n Membership/overflow gaps establish fresh coverage in the same binding.\n Maximum pattern: 64 KiB. Return captured rendered text containing it;\n transient text may be missed. Deadlines are checked between bounded\n acquisitions, whose I/O retains the client exchange timeout. Cancellation\n propagates and releases the subscription. A cleanup failure cannot replace\n an earlier error or cancellation; inspect {!cleanup} for secondary\n failures. Otherwise cleanup failure prevents success or renewed coverage.\n No history/barrier guarantee. "],"declarations":[{"kind":"function","text":"val wait_for_text :\n ?timeout:float ->\n ?scratch_dir:string ->\n t ->\n Libtmux.Pane.t ->\n text:string ->\n (Rendered.t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":178,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Subscribe and capture the screen immediately, then recapture on output. Membership/overflow gaps establish fresh coverage in the same binding. Maximum pattern: 64 KiB. Return captured rendered text containing it; transient text may be missed. Deadlines are checked between bounded acquisitions, whose I/O retains the client exchange timeout. Cancellation propagates and releases the subscription. A cleanup failure cannot replace an earlier error or cancellation; inspect {!cleanup} for secondary failures. Otherwise cleanup failure prevents success or renewed coverage. No history/barrier guarantee."},"signatures":[{"raw":"val wait_for_text :\n ?timeout:float ->\n ?scratch_dir:string ->\n t -> Libtmux.Pane.t -> text:string -> (Rendered.t, Libtmux.Error.t) result","params":[{"name":"timeout","type":"float","optional":true,"keywordOnly":true},{"name":"scratch_dir","type":"string","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.t"},{"name":"text","type":"string","keywordOnly":true}],"returns":"(Rendered.t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-wait_for_text"},{"id":"Libtmux_eio.Client.zoom_pane","publicId":"Libtmux_eio.Client.zoom_pane","qualifiedName":"Libtmux_eio.Client.zoom_pane","name":"zoom_pane","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":571,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Toggle the window's zoom state around this pane. "],"declarations":[{"kind":"function","text":"val zoom_pane : t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":571,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Client","doc":{"summary":"Toggle the window's zoom state around this pane."},"signatures":[{"raw":"val zoom_pane : t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-client-zoom_pane"},{"id":"Libtmux_eio.Operation","publicId":"Libtmux_eio.Operation","qualifiedName":"Libtmux_eio.Operation","name":"Operation","kind":"module","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":55,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" A retained admitted command. A cancelled waiter does not erase its eventual\n success, failure or uncertainty. "],"declarations":[{"kind":"module","text":"module Operation : sig\n type 'a t\n\n type cleanup_receipt = {\n cause : Libtmux.Error.t;\n owned_buffers : string list;\n created : Libtmux.Created.t list;\n }\n (** [created] retains IDs reported before a later hook or completion failure.\n It does not prove those resources still exist or authorize retry. When the\n daemon watcher retires an in-flight operation, [cause] retains\n {!Libtmux.Error.Disconnected}. Idle-reader failures also retain their\n library cause instead of becoming an explicit client-close reason. *)\n\n type 'a state =\n | Queued\n | Not_started\n | Written\n | Acknowledged\n | Finished of ('a, Libtmux.Error.t) result\n | Outcome_unknown of cleanup_receipt\n\n val id : 'a t -> string\n\n val inspect : 'a t -> ('a state, Libtmux.Error.t) result\n (** Read without I/O, including after client closure. Owning domain only. *)\n\n val cancel : 'a t -> (unit, Libtmux.Error.t) result\n (** Remove unsent work. A written request remains owned and drained by the\n client. *)\n\n val await_stage :\n 'a t -> [ `Written | `Acknowledged ] -> ('a state, Libtmux.Error.t) result\n (** Wait for the named stage or a terminal state. Acknowledgement does not\n establish completion. Cancelling this observer leaves the operation alone.\n *)\nend","source":{"file":"eio/libtmux_eio.mli","line":55,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio","doc":{"summary":"A retained admitted command. A cancelled waiter does not erase its eventual success, failure or uncertainty."},"slug":"libtmux_eio-operation"},{"id":"Libtmux_eio.Operation.await_stage","publicId":"Libtmux_eio.Operation.await_stage","qualifiedName":"Libtmux_eio.Operation.await_stage","name":"await_stage","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":86,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Wait for the named stage or a terminal state. Acknowledgement does not\n establish completion. Cancelling this observer leaves the operation alone.\n "],"declarations":[{"kind":"function","text":"val await_stage :\n 'a t -> [ `Written | `Acknowledged ] -> ('a state, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":86,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation","doc":{"summary":"Wait for the named stage or a terminal state. Acknowledgement does not establish completion. Cancelling this observer leaves the operation alone."},"signatures":[{"raw":"val await_stage :\n 'a t -> [ `Acknowledged | `Written ] -> ('a state, Libtmux.Error.t) result","params":[{"name":"arg1","type":"'a t"},{"name":"arg2","type":"[ `Acknowledged | `Written ]"}],"returns":"('a state, Libtmux.Error.t) result"}],"slug":"libtmux_eio-operation-await_stage"},{"id":"Libtmux_eio.Operation.cancel","publicId":"Libtmux_eio.Operation.cancel","qualifiedName":"Libtmux_eio.Operation.cancel","name":"cancel","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":82,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove unsent work. A written request remains owned and drained by the\n client. "],"declarations":[{"kind":"function","text":"val cancel : 'a t -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":82,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation","doc":{"summary":"Remove unsent work. A written request remains owned and drained by the client."},"signatures":[{"raw":"val cancel : 'a t -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"'a t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-operation-cancel"},{"id":"Libtmux_eio.Operation.cleanup_receipt","publicId":"Libtmux_eio.Operation.cleanup_receipt","qualifiedName":"Libtmux_eio.Operation.cleanup_receipt","name":"cleanup_receipt","kind":"struct","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":58,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" [created] retains IDs reported before a later hook or completion failure.\n It does not prove those resources still exist or authorize retry. When the\n daemon watcher retires an in-flight operation, [cause] retains\n {!Libtmux.Error.Disconnected}. Idle-reader failures also retain their\n library cause instead of becoming an explicit client-close reason. "],"declarations":[{"kind":"struct","text":"type cleanup_receipt = {\n cause : Libtmux.Error.t;\n owned_buffers : string list;\n created : Libtmux.Created.t list;\n }","source":{"file":"eio/libtmux_eio.mli","line":58,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation","doc":{"summary":"`created` retains IDs reported before a later hook or completion failure. It does not prove those resources still exist or authorize retry. When the daemon watcher retires an in-flight operation, `cause` retains {!Libtmux.Error.Disconnected}. Idle-reader failures also retain their library cause instead of becoming an explicit client-close reason."},"signatures":[{"raw":"type cleanup_receipt =\n {\n cause: Libtmux.Error.t ;\n owned_buffers: string list ;\n created: Libtmux.Created.t list }","params":[]}],"slug":"libtmux_eio-operation-cleanup_receipt"},{"id":"Libtmux_eio.Operation.cleanup_receipt.cause","publicId":"Libtmux_eio.Operation.cleanup_receipt.cause","name":"cause","kind":"attribute","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":59,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"cause : Libtmux.Error.t;","source":{"file":"eio/libtmux_eio.mli","line":59,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation.cleanup_receipt","type":"Libtmux.Error.t","qualifiedName":"Libtmux_eio.Operation.cause","slug":"libtmux_eio-operation-cleanup_receipt-cause"},{"id":"Libtmux_eio.Operation.cleanup_receipt.created","publicId":"Libtmux_eio.Operation.cleanup_receipt.created","name":"created","kind":"attribute","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":61,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"created : Libtmux.Created.t list;","source":{"file":"eio/libtmux_eio.mli","line":61,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation.cleanup_receipt","type":"Libtmux.Created.t list","qualifiedName":"Libtmux_eio.Operation.created","slug":"libtmux_eio-operation-cleanup_receipt-created"},{"id":"Libtmux_eio.Operation.cleanup_receipt.owned_buffers","publicId":"Libtmux_eio.Operation.cleanup_receipt.owned_buffers","name":"owned_buffers","kind":"attribute","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":60,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"owned_buffers : string list;","source":{"file":"eio/libtmux_eio.mli","line":60,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation.cleanup_receipt","type":"string list","qualifiedName":"Libtmux_eio.Operation.owned_buffers","slug":"libtmux_eio-operation-cleanup_receipt-owned_buffers"},{"id":"Libtmux_eio.Operation.id","publicId":"Libtmux_eio.Operation.id","qualifiedName":"Libtmux_eio.Operation.id","name":"id","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":77,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val id : 'a t -> string","source":{"file":"eio/libtmux_eio.mli","line":77,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation","signatures":[{"raw":"val id : 'a t -> string","params":[{"name":"arg1","type":"'a t"}],"returns":"string"}],"slug":"libtmux_eio-operation-id"},{"id":"Libtmux_eio.Operation.inspect","publicId":"Libtmux_eio.Operation.inspect","qualifiedName":"Libtmux_eio.Operation.inspect","name":"inspect","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":79,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read without I/O, including after client closure. Owning domain only. "],"declarations":[{"kind":"function","text":"val inspect : 'a t -> ('a state, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":79,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation","doc":{"summary":"Read without I/O, including after client closure. Owning domain only."},"signatures":[{"raw":"val inspect : 'a t -> ('a state, Libtmux.Error.t) result","params":[{"name":"arg1","type":"'a t"}],"returns":"('a state, Libtmux.Error.t) result"}],"slug":"libtmux_eio-operation-inspect"},{"id":"Libtmux_eio.Operation.state","publicId":"Libtmux_eio.Operation.state","qualifiedName":"Libtmux_eio.Operation.state","name":"state","kind":"enum","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":69,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type 'a state =\n | Queued\n | Not_started\n | Written\n | Acknowledged\n | Finished of ('a, Libtmux.Error.t) result\n | Outcome_unknown of cleanup_receipt","source":{"file":"eio/libtmux_eio.mli","line":69,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation","signatures":[{"raw":"type 'a state =\n | Queued \n | Not_started \n | Written \n | Acknowledged \n | Finished of ('a, Libtmux.Error.t) result \n | Outcome_unknown of cleanup_receipt ","params":[]}],"slug":"libtmux_eio-operation-state"},{"id":"Libtmux_eio.Operation.state.Acknowledged","publicId":"Libtmux_eio.Operation.state.Acknowledged","name":"Acknowledged","kind":"constant","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":73,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Acknowledged","source":{"file":"eio/libtmux_eio.mli","line":73,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation.state","variant":"unit","qualifiedName":"Libtmux_eio.Operation.Acknowledged","slug":"libtmux_eio-operation-state-acknowledged"},{"id":"Libtmux_eio.Operation.state.Finished","publicId":"Libtmux_eio.Operation.state.Finished","name":"Finished","kind":"constant","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":74,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Finished of ('a, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":74,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation.state","variant":"tuple","qualifiedName":"Libtmux_eio.Operation.Finished","slug":"libtmux_eio-operation-state-finished"},{"id":"Libtmux_eio.Operation.state.Not_started","publicId":"Libtmux_eio.Operation.state.Not_started","name":"Not_started","kind":"constant","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":71,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Not_started","source":{"file":"eio/libtmux_eio.mli","line":71,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation.state","variant":"unit","qualifiedName":"Libtmux_eio.Operation.Not_started","slug":"libtmux_eio-operation-state-not_started"},{"id":"Libtmux_eio.Operation.state.Outcome_unknown","publicId":"Libtmux_eio.Operation.state.Outcome_unknown","name":"Outcome_unknown","kind":"constant","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":75,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Outcome_unknown of cleanup_receipt","source":{"file":"eio/libtmux_eio.mli","line":75,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation.state","variant":"tuple","qualifiedName":"Libtmux_eio.Operation.Outcome_unknown","slug":"libtmux_eio-operation-state-outcome_unknown"},{"id":"Libtmux_eio.Operation.state.Queued","publicId":"Libtmux_eio.Operation.state.Queued","name":"Queued","kind":"constant","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":70,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Queued","source":{"file":"eio/libtmux_eio.mli","line":70,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation.state","variant":"unit","qualifiedName":"Libtmux_eio.Operation.Queued","slug":"libtmux_eio-operation-state-queued"},{"id":"Libtmux_eio.Operation.state.Written","publicId":"Libtmux_eio.Operation.state.Written","name":"Written","kind":"constant","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":72,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Written","source":{"file":"eio/libtmux_eio.mli","line":72,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation.state","variant":"unit","qualifiedName":"Libtmux_eio.Operation.Written","slug":"libtmux_eio-operation-state-written"},{"id":"Libtmux_eio.Operation.t","publicId":"Libtmux_eio.Operation.t","qualifiedName":"Libtmux_eio.Operation.t","name":"t","kind":"typealias","package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":56,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type 'a t","source":{"file":"eio/libtmux_eio.mli","line":56,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Operation","signatures":[{"raw":"type 'a t","params":[]}],"modifiers":["opaque"],"slug":"libtmux_eio-operation-t"},{"id":"Libtmux_eio.Rendered","publicId":"Libtmux_eio.Rendered","qualifiedName":"Libtmux_eio.Rendered","name":"Rendered","kind":"module","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":19,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Rendered = Libtmux.Captured_text","source":{"file":"eio/libtmux_eio.mli","line":19,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio","exportedFrom":"Libtmux.Captured_text","slug":"libtmux_eio-rendered"},{"id":"Libtmux_eio.Subscription","publicId":"Libtmux_eio.Subscription","qualifiedName":"Libtmux_eio.Subscription","name":"Subscription","kind":"module","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":95,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Bounded future-byte observation with Data/Gap/End and local cursors. Polling\n is local; waiting and admission belong to the backend. "],"declarations":[{"kind":"module","text":"module Subscription : sig\n type t\n\n val poll : t -> (Libtmux.Output.event option, Libtmux.Error.t) result\n (** Remove a queued event without I/O, on the owning domain. *)\n\n val next :\n ?timeout:float -> t -> (Libtmux.Output.event option, Libtmux.Error.t) result\n (** Await one event, defaulting to a one-second deadline. [None] follows a\n consumed End. A deadline keeps the subscription active. Eio cancellation\n closes it, releases its lane when unused, and propagates. *)\n\n val close : t -> (unit, Libtmux.Error.t) result\n (** End an active subscription with Cancelled and discard pending data.\n Preserve an already ended subscription's terminal reason. Concurrent calls\n join the same cleanup, including reaping a lane when it becomes unused;\n later calls retain cleanup failures. Borrowed clients and the daemon\n remain alive. {!poll} can still read the terminal event. *)\n\n val wait_for_bytes :\n ?timeout:float ->\n t ->\n text:string ->\n (Libtmux.Output.cursor, Libtmux.Output.wait_error) result\n (** Consume future observed bytes through a match, with a maximum 64 KiB\n nonempty pattern. Match across Data boundaries and return its end cursor.\n Gaps end matching. This searches neither rendered text nor history. A\n deadline leaves the subscription active; cancellation closes it. *)\nend","source":{"file":"eio/libtmux_eio.mli","line":95,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio","doc":{"summary":"Bounded future-byte observation with Data/Gap/End and local cursors. Polling is local; waiting and admission belong to the backend."},"slug":"libtmux_eio-subscription"},{"id":"Libtmux_eio.Subscription.close","publicId":"Libtmux_eio.Subscription.close","qualifiedName":"Libtmux_eio.Subscription.close","name":"close","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":107,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" End an active subscription with Cancelled and discard pending data.\n Preserve an already ended subscription's terminal reason. Concurrent calls\n join the same cleanup, including reaping a lane when it becomes unused;\n later calls retain cleanup failures. Borrowed clients and the daemon\n remain alive. {!poll} can still read the terminal event. "],"declarations":[{"kind":"function","text":"val close : t -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":107,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Subscription","doc":{"summary":"End an active subscription with Cancelled and discard pending data. Preserve an already ended subscription's terminal reason. Concurrent calls join the same cleanup, including reaping a lane when it becomes unused; later calls retain cleanup failures. Borrowed clients and the daemon remain alive. {!poll} can still read the terminal event."},"signatures":[{"raw":"val close : t -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-subscription-close"},{"id":"Libtmux_eio.Subscription.next","publicId":"Libtmux_eio.Subscription.next","qualifiedName":"Libtmux_eio.Subscription.next","name":"next","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":101,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Await one event, defaulting to a one-second deadline. [None] follows a\n consumed End. A deadline keeps the subscription active. Eio cancellation\n closes it, releases its lane when unused, and propagates. "],"declarations":[{"kind":"function","text":"val next :\n ?timeout:float -> t -> (Libtmux.Output.event option, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":101,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Subscription","doc":{"summary":"Await one event, defaulting to a one-second deadline. `None` follows a consumed End. A deadline keeps the subscription active. Eio cancellation closes it, releases its lane when unused, and propagates."},"signatures":[{"raw":"val next :\n ?timeout:float ->\n t -> (Libtmux.Output.event option, Libtmux.Error.t) result","params":[{"name":"timeout","type":"float","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"}],"returns":"(Libtmux.Output.event option, Libtmux.Error.t) result"}],"slug":"libtmux_eio-subscription-next"},{"id":"Libtmux_eio.Subscription.poll","publicId":"Libtmux_eio.Subscription.poll","qualifiedName":"Libtmux_eio.Subscription.poll","name":"poll","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":98,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove a queued event without I/O, on the owning domain. "],"declarations":[{"kind":"function","text":"val poll : t -> (Libtmux.Output.event option, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":98,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Subscription","doc":{"summary":"Remove a queued event without I/O, on the owning domain."},"signatures":[{"raw":"val poll : t -> (Libtmux.Output.event option, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"}],"returns":"(Libtmux.Output.event option, Libtmux.Error.t) result"}],"slug":"libtmux_eio-subscription-poll"},{"id":"Libtmux_eio.Subscription.t","publicId":"Libtmux_eio.Subscription.t","qualifiedName":"Libtmux_eio.Subscription.t","name":"t","kind":"typealias","package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":96,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"eio/libtmux_eio.mli","line":96,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Subscription","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux_eio-subscription-t"},{"id":"Libtmux_eio.Subscription.wait_for_bytes","publicId":"Libtmux_eio.Subscription.wait_for_bytes","qualifiedName":"Libtmux_eio.Subscription.wait_for_bytes","name":"wait_for_bytes","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":114,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Consume future observed bytes through a match, with a maximum 64 KiB\n nonempty pattern. Match across Data boundaries and return its end cursor.\n Gaps end matching. This searches neither rendered text nor history. A\n deadline leaves the subscription active; cancellation closes it. "],"declarations":[{"kind":"function","text":"val wait_for_bytes :\n ?timeout:float ->\n t ->\n text:string ->\n (Libtmux.Output.cursor, Libtmux.Output.wait_error) result","source":{"file":"eio/libtmux_eio.mli","line":114,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Subscription","doc":{"summary":"Consume future observed bytes through a match, with a maximum 64 KiB nonempty pattern. Match across Data boundaries and return its end cursor. Gaps end matching. This searches neither rendered text nor history. A deadline leaves the subscription active; cancellation closes it.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet watch_output binary blocking (initial : Created.t) _spawn =\n Eio_main.run @@ fun env ->\n Eio.Switch.run @@ fun sw ->\n let module Client = Libtmux_eio.Client in\n let module Subscription = Libtmux_eio.Subscription in\n let client =\n get\n (Client.connect ~sw ~binary\n ~process_mgr:(Eio.Stdenv.process_mgr env)\n ~mono_clock:(Eio.Stdenv.mono_clock env)\n (Source.endpoint (Libtmux_unix.Client.source blocking)))\n in\n Fun.protect\n ~finally:(fun () ->\n Eio.Cancel.protect (fun () -> get (Client.close client)))\n (fun () ->\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n let subscription =\n get (Client.subscribe ~capacity_bytes:4096 client pane)\n in\n Fun.protect\n ~finally:(fun () ->\n Eio.Cancel.protect (fun () -> get (Subscription.close subscription)))\n (fun () ->\n let cursor, () =\n Eio.Fiber.pair\n (fun () ->\n match\n Subscription.wait_for_bytes ~timeout:0.5 subscription\n ~text:\"changed\"\n with\n | Ok cursor -> cursor\n | Error (Output.Failure error) ->\n failwith (Format.asprintf \"%a\" Error.pp error)\n | Error (Output.Ended reason) ->\n failwith (Format.asprintf \"%a\" Output.reason_pp reason))\n (fun () ->\n get (Client.send_text client (Pane.target pane) ~text:\"changed\");\n get (Client.send_keys client (Pane.target pane) [ Key.Enter ]))\n in\n assert (cursor.offset >= 7L);\n print_endline \"observed: changed\"))\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary (watch_output binary)\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_watch.ml","intro":"Observe future output with Eio. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_watch.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"observed: changed\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val wait_for_bytes :\n ?timeout:float ->\n t ->\n text:string -> (Libtmux.Output.cursor, Libtmux.Output.wait_error) result","params":[{"name":"timeout","type":"float","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"text","type":"string","keywordOnly":true}],"returns":"(Libtmux.Output.cursor, Libtmux.Output.wait_error) result"}],"slug":"libtmux_eio-subscription-wait_for_bytes"},{"id":"Libtmux_eio.Terminal","publicId":"Libtmux_eio.Terminal","qualifiedName":"Libtmux_eio.Terminal","name":"Terminal","kind":"module","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":24,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Interactive attachment using borrowed application streams. This utility\n addresses the current daemon explicitly and does not reuse captured targets.\n"],"declarations":[{"kind":"module","text":"module Terminal : sig\n val attach_current :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?read_only:bool ->\n ?update_environment:bool ->\n ?stdin:_ Eio.Flow.source ->\n ?stdout:_ Eio.Flow.sink ->\n ?stderr:_ Eio.Flow.sink ->\n process_mgr:_ Eio.Process.mgr ->\n Libtmux.Endpoint.t ->\n session:Libtmux.Session.Id.t ->\n (unit, Libtmux.Error.t) result\n (** Run an interactive terminal client until exit, using the application's\n process manager and standard streams unless explicit flows are supplied.\n [stdin] must be backed by a terminal descriptor; a pipe-backed flow is\n rejected by tmux. Select the exact ID on the daemon currently listening at\n [endpoint], without a captured target, binding, retry or daemon startup.\n\n Environment updates and read-only mode default to false. Clear inherited\n [TMUX] and [TMUX_PANE]. Cancellation propagates after terminating and\n reaping this client; it does not stop the daemon. Cooperative TERM gets\n 200 ms of grace before forced termination, while other fibers can run.\n Scheduling and kernel completion can add time. Success proves terminal\n client exit. Diagnostics go to [stderr]; borrowed flows stay open. Supply\n [cleanup] before the call to retain secondary failures after cancellation.\n *)\nend","source":{"file":"eio/libtmux_eio.mli","line":24,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio","doc":{"summary":"Interactive attachment using borrowed application streams. This utility addresses the current daemon explicitly and does not reuse captured targets."},"slug":"libtmux_eio-terminal"},{"id":"Libtmux_eio.Terminal.attach_current","publicId":"Libtmux_eio.Terminal.attach_current","qualifiedName":"Libtmux_eio.Terminal.attach_current","name":"attach_current","kind":"function","modifiers":[],"package":"libtmux-eio","product":"core","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":25,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Run an interactive terminal client until exit, using the application's\n process manager and standard streams unless explicit flows are supplied.\n [stdin] must be backed by a terminal descriptor; a pipe-backed flow is\n rejected by tmux. Select the exact ID on the daemon currently listening at\n [endpoint], without a captured target, binding, retry or daemon startup.\n\n Environment updates and read-only mode default to false. Clear inherited\n [TMUX] and [TMUX_PANE]. Cancellation propagates after terminating and\n reaping this client; it does not stop the daemon. Cooperative TERM gets\n 200 ms of grace before forced termination, while other fibers can run.\n Scheduling and kernel completion can add time. Success proves terminal\n client exit. Diagnostics go to [stderr]; borrowed flows stay open. Supply\n [cleanup] before the call to retain secondary failures after cancellation.\n "],"declarations":[{"kind":"function","text":"val attach_current :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?read_only:bool ->\n ?update_environment:bool ->\n ?stdin:_ Eio.Flow.source ->\n ?stdout:_ Eio.Flow.sink ->\n ?stderr:_ Eio.Flow.sink ->\n process_mgr:_ Eio.Process.mgr ->\n Libtmux.Endpoint.t ->\n session:Libtmux.Session.Id.t ->\n (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":25,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Terminal","doc":{"summary":"Run an interactive terminal client until exit, using the application's process manager and standard streams unless explicit flows are supplied. `stdin` must be backed by a terminal descriptor; a pipe-backed flow is rejected by tmux. Select the exact ID on the daemon currently listening at `endpoint`, without a captured target, binding, retry or daemon startup.","body":"Environment updates and read-only mode default to false. Clear inherited `TMUX` and `TMUX_PANE`. Cancellation propagates after terminating and reaping this client; it does not stop the daemon. Cooperative TERM gets 200 ms of grace before forced termination, while other fibers can run. Scheduling and kernel completion can add time. Success proves terminal client exit. Diagnostics go to `stderr`; borrowed flows stay open. Supply `cleanup` before the call to retain secondary failures after cancellation."},"signatures":[{"raw":"val attach_current :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?read_only:bool ->\n ?update_environment:bool ->\n ?stdin:[> Eio.Flow.source_ty ] Eio.Flow.source ->\n ?stdout:[> Eio.Flow.sink_ty ] Eio.Flow.sink ->\n ?stderr:[> Eio.Flow.sink_ty ] Eio.Flow.sink ->\n process_mgr:[> [> `Generic ] Eio.Process.mgr_ty ] Eio.Process.mgr ->\n Libtmux.Endpoint.t ->\n session:Libtmux.Session.Id.t -> (unit, Libtmux.Error.t) result","params":[{"name":"cleanup","type":"Cleanup.t","optional":true,"keywordOnly":true},{"name":"binary","type":"string","optional":true,"keywordOnly":true},{"name":"read_only","type":"bool","optional":true,"keywordOnly":true},{"name":"update_environment","type":"bool","optional":true,"keywordOnly":true},{"name":"stdin","type":"[> Eio.Flow.source_ty ] Eio.Flow.source","optional":true,"keywordOnly":true},{"name":"stdout","type":"[> Eio.Flow.sink_ty ] Eio.Flow.sink","optional":true,"keywordOnly":true},{"name":"stderr","type":"[> Eio.Flow.sink_ty ] Eio.Flow.sink","optional":true,"keywordOnly":true},{"name":"process_mgr","type":"[> [> `Generic ] Eio.Process.mgr_ty ] Eio.Process.mgr","keywordOnly":true},{"name":"arg1","type":"Libtmux.Endpoint.t"},{"name":"session","type":"Libtmux.Session.Id.t","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-terminal-attach_current"},{"id":"Libtmux_eio.Workspace","publicId":"Libtmux_eio.Workspace","qualifiedName":"Libtmux_eio.Workspace","name":"Workspace","kind":"module","modifiers":[],"package":"libtmux-eio","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":605,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Apply workspace plans through Eio while retaining journals across caller\n cancellation. Handles belong to the creating domain; the application owns\n the scheduler and switch. "],"declarations":[{"kind":"module","text":"module Workspace : sig\n type t\n\n val submit :\n Client.t -> Libtmux_workspace.Plan.t -> (t, Libtmux.Error.t) result\n (** Allocate a generation-bound handle without I/O. The supplied client is\n borrowed; closing the handle leaves it open. *)\n\n val submit_bootstrap :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?timeout:float ->\n sw:Eio.Switch.t ->\n process_mgr:_ Eio.Process.mgr ->\n mono_clock:_ Eio.Time.Mono.t ->\n Libtmux_workspace.Plan.t ->\n (t, Libtmux.Error.t) result\n (** Allocate a missing-endpoint execution without I/O. Await starts control\n new-session and binds that same connection. The handle owns its new client\n within [sw]; it never owns the daemon. *)\n\n val await :\n ?compensate_on_failure:bool ->\n t ->\n (Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result\n (** Apply once. Expected failures return a retained journal. Eio cancellation\n propagates after progress is recorded and at most 500 ms of protected\n compensation. Admitted commands can still complete under client ownership;\n inspect the receipt before attempting manual recovery. *)\n\n val inspect :\n t -> (Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result\n (** Read a journal copy without I/O, including any late retained outcome. *)\n\n val client : t -> Client.t option\n (** Borrow the existing or bootstrapped {!Client.t} without I/O for subsequent\n actions or recovery. {!close} releases a client owned by this workspace\n execution handle. *)\n\n val close : t -> (unit, Libtmux.Error.t) result\n (** Release an owned client through {!Client.close}. Active await returns\n Busy. Closing is idempotent; completed journals remain readable. *)\nend","source":{"file":"eio/libtmux_eio.mli","line":605,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio","doc":{"summary":"Apply workspace plans through Eio while retaining journals across caller cancellation. Handles belong to the creating domain; the application owns the scheduler and switch."},"slug":"libtmux_eio-workspace"},{"id":"Libtmux_eio.Workspace.await","publicId":"Libtmux_eio.Workspace.await","qualifiedName":"Libtmux_eio.Workspace.await","name":"await","kind":"function","modifiers":[],"package":"libtmux-eio","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":626,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Apply once. Expected failures return a retained journal. Eio cancellation\n propagates after progress is recorded and at most 500 ms of protected\n compensation. Admitted commands can still complete under client ownership;\n inspect the receipt before attempting manual recovery. "],"declarations":[{"kind":"function","text":"val await :\n ?compensate_on_failure:bool ->\n t ->\n (Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":626,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Workspace","doc":{"summary":"Apply once. Expected failures return a retained journal. Eio cancellation propagates after progress is recorded and at most 500 ms of protected compensation. Admitted commands can still complete under client ownership; inspect the receipt before attempting manual recovery."},"signatures":[{"raw":"val await :\n ?compensate_on_failure:bool ->\n t -> (Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result","params":[{"name":"compensate_on_failure","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"}],"returns":"(Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result"}],"slug":"libtmux_eio-workspace-await"},{"id":"Libtmux_eio.Workspace.client","publicId":"Libtmux_eio.Workspace.client","qualifiedName":"Libtmux_eio.Workspace.client","name":"client","kind":"function","modifiers":[],"package":"libtmux-eio","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":639,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Borrow the existing or bootstrapped {!Client.t} without I/O for subsequent\n actions or recovery. {!close} releases a client owned by this workspace\n execution handle. "],"declarations":[{"kind":"function","text":"val client : t -> Client.t option","source":{"file":"eio/libtmux_eio.mli","line":639,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Workspace","doc":{"summary":"Borrow the existing or bootstrapped {!Client.t} without I/O for subsequent actions or recovery. {!close} releases a client owned by this workspace execution handle."},"signatures":[{"raw":"val client : t -> Client.t option","params":[{"name":"arg1","type":"t"}],"returns":"Client.t option"}],"slug":"libtmux_eio-workspace-client"},{"id":"Libtmux_eio.Workspace.close","publicId":"Libtmux_eio.Workspace.close","qualifiedName":"Libtmux_eio.Workspace.close","name":"close","kind":"function","modifiers":[],"package":"libtmux-eio","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":644,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Release an owned client through {!Client.close}. Active await returns\n Busy. Closing is idempotent; completed journals remain readable. "],"declarations":[{"kind":"function","text":"val close : t -> (unit, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":644,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Workspace","doc":{"summary":"Release an owned client through {!Client.close}. Active await returns Busy. Closing is idempotent; completed journals remain readable."},"signatures":[{"raw":"val close : t -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_eio-workspace-close"},{"id":"Libtmux_eio.Workspace.inspect","publicId":"Libtmux_eio.Workspace.inspect","qualifiedName":"Libtmux_eio.Workspace.inspect","name":"inspect","kind":"function","modifiers":[],"package":"libtmux-eio","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":635,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read a journal copy without I/O, including any late retained outcome. "],"declarations":[{"kind":"function","text":"val inspect :\n t -> (Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":635,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Workspace","doc":{"summary":"Read a journal copy without I/O, including any late retained outcome."},"signatures":[{"raw":"val inspect :\n t -> (Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"}],"returns":"(Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result"}],"slug":"libtmux_eio-workspace-inspect"},{"id":"Libtmux_eio.Workspace.submit","publicId":"Libtmux_eio.Workspace.submit","qualifiedName":"Libtmux_eio.Workspace.submit","name":"submit","kind":"function","modifiers":[],"package":"libtmux-eio","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":608,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Allocate a generation-bound handle without I/O. The supplied client is\n borrowed; closing the handle leaves it open. "],"declarations":[{"kind":"function","text":"val submit :\n Client.t -> Libtmux_workspace.Plan.t -> (t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":608,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Workspace","doc":{"summary":"Allocate a generation-bound handle without I/O. The supplied client is borrowed; closing the handle leaves it open."},"signatures":[{"raw":"val submit :\n Client.t -> Libtmux_workspace.Plan.t -> (t, Libtmux.Error.t) result","params":[{"name":"arg1","type":"Client.t"},{"name":"arg2","type":"Libtmux_workspace.Plan.t"}],"returns":"(t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-workspace-submit"},{"id":"Libtmux_eio.Workspace.submit_bootstrap","publicId":"Libtmux_eio.Workspace.submit_bootstrap","qualifiedName":"Libtmux_eio.Workspace.submit_bootstrap","name":"submit_bootstrap","kind":"function","modifiers":[],"package":"libtmux-eio","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":613,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Allocate a missing-endpoint execution without I/O. Await starts control\n new-session and binds that same connection. The handle owns its new client\n within [sw]; it never owns the daemon. "],"declarations":[{"kind":"function","text":"val submit_bootstrap :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?timeout:float ->\n sw:Eio.Switch.t ->\n process_mgr:_ Eio.Process.mgr ->\n mono_clock:_ Eio.Time.Mono.t ->\n Libtmux_workspace.Plan.t ->\n (t, Libtmux.Error.t) result","source":{"file":"eio/libtmux_eio.mli","line":613,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Workspace","doc":{"summary":"Allocate a missing-endpoint execution without I/O. Await starts control new-session and binds that same connection. The handle owns its new client within `sw`; it never owns the daemon."},"signatures":[{"raw":"val submit_bootstrap :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?timeout:float ->\n sw:Eio.Switch.t ->\n process_mgr:[> [> `Generic ] Eio.Process.mgr_ty ] Eio.Process.mgr ->\n mono_clock:[> Eio.Time.Mono.ty ] Eio.Time.Mono.t ->\n Libtmux_workspace.Plan.t -> (t, Libtmux.Error.t) result","params":[{"name":"cleanup","type":"Cleanup.t","optional":true,"keywordOnly":true},{"name":"binary","type":"string","optional":true,"keywordOnly":true},{"name":"timeout","type":"float","optional":true,"keywordOnly":true},{"name":"sw","type":"Eio.Switch.t","keywordOnly":true},{"name":"process_mgr","type":"[> [> `Generic ] Eio.Process.mgr_ty ] Eio.Process.mgr","keywordOnly":true},{"name":"mono_clock","type":"[> Eio.Time.Mono.ty ] Eio.Time.Mono.t","keywordOnly":true},{"name":"arg1","type":"Libtmux_workspace.Plan.t"}],"returns":"(t, Libtmux.Error.t) result"}],"slug":"libtmux_eio-workspace-submit_bootstrap"},{"id":"Libtmux_eio.Workspace.t","publicId":"Libtmux_eio.Workspace.t","qualifiedName":"Libtmux_eio.Workspace.t","name":"t","kind":"typealias","package":"libtmux-eio","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_eio","source":{"file":"eio/libtmux_eio.mli","line":606,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"eio/libtmux_eio.mli","line":606,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_eio.Workspace","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux_eio-workspace-t"},{"id":"Libtmux_json","publicId":"Libtmux_json","qualifiedName":"Libtmux_json","name":"Libtmux_json","kind":"module","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":1,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Pure, bounded query and workspace JSON interchange.\n\n {!Expr} validates portable queries and {!Workspace} decodes configurations\n and encodes plans and receipts. Both return {!Decode_error.t} on invalid\n data. See the\n {{:https://github.com/libtmux/libtmux-ocaml/blob/master/docs/queries.md}query\n guide} and\n {{:https://github.com/libtmux/libtmux-ocaml/blob/master/docs/workspaces.md}workspace\n guide} for complete programs. "],"declarations":[{"kind":"module","text":"","source":{"file":"json/libtmux_json.mli","line":1,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"doc":{"summary":"Pure, bounded query and workspace JSON interchange.","body":"{!Expr} validates portable queries and {!Workspace} decodes configurations and encodes plans and receipts. Both return {!Decode_error.t} on invalid data. See the [query guide](https://github.com/libtmux/libtmux-ocaml/blob/master/docs/queries.md) and [workspace guide](https://github.com/libtmux/libtmux-ocaml/blob/master/docs/workspaces.md) for complete programs."},"slug":"libtmux_json"},{"id":"Libtmux_json.Decode_error","publicId":"Libtmux_json.Decode_error","qualifiedName":"Libtmux_json.Decode_error","name":"Decode_error","kind":"module","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":11,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Decode_error : sig\n type category =\n | Syntax\n | Limit\n | Unknown\n | Wrong_type\n | Out_of_range\n | Unsupported\n\n type t = { pointer : string; category : category; message : string }\n\n val pp : Format.formatter -> t -> unit\nend","source":{"file":"json/libtmux_json.mli","line":11,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json","slug":"libtmux_json-decode_error"},{"id":"Libtmux_json.Decode_error.category","publicId":"Libtmux_json.Decode_error.category","qualifiedName":"Libtmux_json.Decode_error.category","name":"category","kind":"enum","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":12,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type category =\n | Syntax\n | Limit\n | Unknown\n | Wrong_type\n | Out_of_range\n | Unsupported","source":{"file":"json/libtmux_json.mli","line":12,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Decode_error","signatures":[{"raw":"type category =\n | Syntax \n | Limit \n | Unknown \n | Wrong_type \n | Out_of_range \n | Unsupported ","params":[]}],"slug":"libtmux_json-decode_error-category"},{"id":"Libtmux_json.Decode_error.category.Limit","publicId":"Libtmux_json.Decode_error.category.Limit","name":"Limit","kind":"constant","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":14,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Limit","source":{"file":"json/libtmux_json.mli","line":14,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Decode_error.category","variant":"unit","qualifiedName":"Libtmux_json.Decode_error.Limit","slug":"libtmux_json-decode_error-category-limit"},{"id":"Libtmux_json.Decode_error.category.Out_of_range","publicId":"Libtmux_json.Decode_error.category.Out_of_range","name":"Out_of_range","kind":"constant","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":17,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Out_of_range","source":{"file":"json/libtmux_json.mli","line":17,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Decode_error.category","variant":"unit","qualifiedName":"Libtmux_json.Decode_error.Out_of_range","slug":"libtmux_json-decode_error-category-out_of_range"},{"id":"Libtmux_json.Decode_error.category.Syntax","publicId":"Libtmux_json.Decode_error.category.Syntax","name":"Syntax","kind":"constant","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":13,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Syntax","source":{"file":"json/libtmux_json.mli","line":13,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Decode_error.category","variant":"unit","qualifiedName":"Libtmux_json.Decode_error.Syntax","slug":"libtmux_json-decode_error-category-syntax"},{"id":"Libtmux_json.Decode_error.category.Unknown","publicId":"Libtmux_json.Decode_error.category.Unknown","name":"Unknown","kind":"constant","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":15,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unknown","source":{"file":"json/libtmux_json.mli","line":15,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Decode_error.category","variant":"unit","qualifiedName":"Libtmux_json.Decode_error.Unknown","slug":"libtmux_json-decode_error-category-unknown"},{"id":"Libtmux_json.Decode_error.category.Unsupported","publicId":"Libtmux_json.Decode_error.category.Unsupported","name":"Unsupported","kind":"constant","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":18,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unsupported","source":{"file":"json/libtmux_json.mli","line":18,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Decode_error.category","variant":"unit","qualifiedName":"Libtmux_json.Decode_error.Unsupported","slug":"libtmux_json-decode_error-category-unsupported"},{"id":"Libtmux_json.Decode_error.category.Wrong_type","publicId":"Libtmux_json.Decode_error.category.Wrong_type","name":"Wrong_type","kind":"constant","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":16,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Wrong_type","source":{"file":"json/libtmux_json.mli","line":16,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Decode_error.category","variant":"unit","qualifiedName":"Libtmux_json.Decode_error.Wrong_type","slug":"libtmux_json-decode_error-category-wrong_type"},{"id":"Libtmux_json.Decode_error.pp","publicId":"Libtmux_json.Decode_error.pp","qualifiedName":"Libtmux_json.Decode_error.pp","name":"pp","kind":"function","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":22,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pp : Format.formatter -> t -> unit","source":{"file":"json/libtmux_json.mli","line":22,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Decode_error","signatures":[{"raw":"val pp : Format.formatter -> t -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"t"}],"returns":"unit"}],"slug":"libtmux_json-decode_error-pp"},{"id":"Libtmux_json.Decode_error.t","publicId":"Libtmux_json.Decode_error.t","qualifiedName":"Libtmux_json.Decode_error.t","name":"t","kind":"struct","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":20,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type t = { pointer : string; category : category; message : string }","source":{"file":"json/libtmux_json.mli","line":20,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Decode_error","signatures":[{"raw":"type t = {\n pointer: string ;\n category: category ;\n message: string }","params":[]}],"slug":"libtmux_json-decode_error-t"},{"id":"Libtmux_json.Decode_error.t.category","publicId":"Libtmux_json.Decode_error.t.category","name":"category","kind":"attribute","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":20,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"category : category;","source":{"file":"json/libtmux_json.mli","line":20,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Decode_error.t","type":"category","qualifiedName":"Libtmux_json.Decode_error.category","slug":"libtmux_json-decode_error-t-category"},{"id":"Libtmux_json.Decode_error.t.message","publicId":"Libtmux_json.Decode_error.t.message","name":"message","kind":"attribute","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":20,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"message : string","source":{"file":"json/libtmux_json.mli","line":20,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Decode_error.t","type":"string","qualifiedName":"Libtmux_json.Decode_error.message","slug":"libtmux_json-decode_error-t-message"},{"id":"Libtmux_json.Decode_error.t.pointer","publicId":"Libtmux_json.Decode_error.t.pointer","name":"pointer","kind":"attribute","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":20,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pointer : string;","source":{"file":"json/libtmux_json.mli","line":20,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Decode_error.t","type":"string","qualifiedName":"Libtmux_json.Decode_error.pointer","slug":"libtmux_json-decode_error-t-pointer"},{"id":"Libtmux_json.Error","publicId":"Libtmux_json.Error","qualifiedName":"Libtmux_json.Error","name":"Error","kind":"module","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":26,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Structured native failures for JSON consumers. "],"declarations":[{"kind":"module","text":"module Error : sig\n val encode : Libtmux.Error.t -> Yojson.Safe.t\n (** Return a stable [code], bounded [message], [message_truncated] flag and\n relevant operation, resource or target metadata. Messages and text\n attributes retain at most 4096 bytes; invalid UTF-8 uses the tagged hex\n representation described by {!Workspace.encode_receipt}. No I/O. *)\nend","source":{"file":"json/libtmux_json.mli","line":26,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json","doc":{"summary":"Structured native failures for JSON consumers."},"slug":"libtmux_json-error"},{"id":"Libtmux_json.Error.encode","publicId":"Libtmux_json.Error.encode","qualifiedName":"Libtmux_json.Error.encode","name":"encode","kind":"function","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":27,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Return a stable [code], bounded [message], [message_truncated] flag and\n relevant operation, resource or target metadata. Messages and text\n attributes retain at most 4096 bytes; invalid UTF-8 uses the tagged hex\n representation described by {!Workspace.encode_receipt}. No I/O. "],"declarations":[{"kind":"function","text":"val encode : Libtmux.Error.t -> Yojson.Safe.t","source":{"file":"json/libtmux_json.mli","line":27,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Error","doc":{"summary":"Return a stable `code`, bounded `message`, `message_truncated` flag and relevant operation, resource or target metadata. Messages and text attributes retain at most 4096 bytes; invalid UTF-8 uses the tagged hex representation described by {!Workspace.encode_receipt}. No I/O."},"signatures":[{"raw":"val encode : Libtmux.Error.t -> Yojson.Safe.t","params":[{"name":"arg1","type":"Libtmux.Error.t"}],"returns":"Yojson.Safe.t"}],"slug":"libtmux_json-error-encode"},{"id":"Libtmux_json.Expr","publicId":"Libtmux_json.Expr","qualifiedName":"Libtmux_json.Expr","name":"Expr","kind":"module","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":73,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Portable scalar pane expressions. See the\n {{:https://github.com/libtmux/libtmux-ocaml/blob/master/docs/query-interchange.md}wire\n subset} for canonical fields, operators and bounds. "],"declarations":[{"kind":"module","text":"module Expr : sig\n val decode :\n 'a Libtmux.Model.t ->\n Yojson.Safe.t ->\n ('a Libtmux.Expr.t, Decode_error.t) result\n (** Validate the supplied tree, including duplicate properties, before typed\n construction. Only the shared scalar pane registry and Boolean composition\n are accepted. Java regex, relationships and native extension fields return\n [Unsupported]. Numbers must fit signed 32-bit integers. *)\n\n val of_string :\n 'a Libtmux.Model.t -> string -> ('a Libtmux.Expr.t, Decode_error.t) result\n (** Enforce 64 KiB and 32 JSON nesting levels before parsing; require valid\n UTF-8 JSON. Expressions have at most 1,024 nodes and membership lists at\n most 256 values. Errors include a JSON pointer, never the whole input. *)\n\n val encode :\n 'a Libtmux.Model.t ->\n 'a Libtmux.Expr.t ->\n (Yojson.Safe.t, Decode_error.t) result\n\n val to_string :\n 'a Libtmux.Model.t -> 'a Libtmux.Expr.t -> (string, Decode_error.t) result\n (** Apply the same bounds and subset when encoding. Text with invalid UTF-8\n has no representation in this schema. These functions perform no I/O. *)\nend","source":{"file":"json/libtmux_json.mli","line":73,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json","doc":{"summary":"Portable scalar pane expressions. See the [wire subset](https://github.com/libtmux/libtmux-ocaml/blob/master/docs/query-interchange.md) for canonical fields, operators and bounds."},"slug":"libtmux_json-expr"},{"id":"Libtmux_json.Expr.decode","publicId":"Libtmux_json.Expr.decode","qualifiedName":"Libtmux_json.Expr.decode","name":"decode","kind":"function","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":74,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Validate the supplied tree, including duplicate properties, before typed\n construction. Only the shared scalar pane registry and Boolean composition\n are accepted. Java regex, relationships and native extension fields return\n [Unsupported]. Numbers must fit signed 32-bit integers. "],"declarations":[{"kind":"function","text":"val decode :\n 'a Libtmux.Model.t ->\n Yojson.Safe.t ->\n ('a Libtmux.Expr.t, Decode_error.t) result","source":{"file":"json/libtmux_json.mli","line":74,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Expr","doc":{"summary":"Validate the supplied tree, including duplicate properties, before typed construction. Only the shared scalar pane registry and Boolean composition are accepted. Java regex, relationships and native extension fields return `Unsupported`. Numbers must fit signed 32-bit integers."},"signatures":[{"raw":"val decode :\n 'a Libtmux.Model.t ->\n Yojson.Safe.t -> ('a Libtmux.Expr.t, Decode_error.t) result","params":[{"name":"arg1","type":"'a Libtmux.Model.t"},{"name":"arg2","type":"Yojson.Safe.t"}],"returns":"('a Libtmux.Expr.t, Decode_error.t) result"}],"slug":"libtmux_json-expr-decode"},{"id":"Libtmux_json.Expr.encode","publicId":"Libtmux_json.Expr.encode","qualifiedName":"Libtmux_json.Expr.encode","name":"encode","kind":"function","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":89,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val encode :\n 'a Libtmux.Model.t ->\n 'a Libtmux.Expr.t ->\n (Yojson.Safe.t, Decode_error.t) result","source":{"file":"json/libtmux_json.mli","line":89,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Expr","signatures":[{"raw":"val encode :\n 'a Libtmux.Model.t ->\n 'a Libtmux.Expr.t -> (Yojson.Safe.t, Decode_error.t) result","params":[{"name":"arg1","type":"'a Libtmux.Model.t"},{"name":"arg2","type":"'a Libtmux.Expr.t"}],"returns":"(Yojson.Safe.t, Decode_error.t) result"}],"slug":"libtmux_json-expr-encode"},{"id":"Libtmux_json.Expr.of_string","publicId":"Libtmux_json.Expr.of_string","qualifiedName":"Libtmux_json.Expr.of_string","name":"of_string","kind":"function","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":83,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Enforce 64 KiB and 32 JSON nesting levels before parsing; require valid\n UTF-8 JSON. Expressions have at most 1,024 nodes and membership lists at\n most 256 values. Errors include a JSON pointer, never the whole input. "],"declarations":[{"kind":"function","text":"val of_string :\n 'a Libtmux.Model.t -> string -> ('a Libtmux.Expr.t, Decode_error.t) result","source":{"file":"json/libtmux_json.mli","line":83,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Expr","doc":{"summary":"Enforce 64 KiB and 32 JSON nesting levels before parsing; require valid UTF-8 JSON. Expressions have at most 1,024 nodes and membership lists at most 256 values. Errors include a JSON pointer, never the whole input."},"signatures":[{"raw":"val of_string :\n 'a Libtmux.Model.t -> string -> ('a Libtmux.Expr.t, Decode_error.t) result","params":[{"name":"arg1","type":"'a Libtmux.Model.t"},{"name":"arg2","type":"string"}],"returns":"('a Libtmux.Expr.t, Decode_error.t) result"}],"slug":"libtmux_json-expr-of_string"},{"id":"Libtmux_json.Expr.to_string","publicId":"Libtmux_json.Expr.to_string","qualifiedName":"Libtmux_json.Expr.to_string","name":"to_string","kind":"function","modifiers":[],"package":"libtmux-json","product":"core","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":94,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Apply the same bounds and subset when encoding. Text with invalid UTF-8\n has no representation in this schema. These functions perform no I/O. "],"declarations":[{"kind":"function","text":"val to_string :\n 'a Libtmux.Model.t -> 'a Libtmux.Expr.t -> (string, Decode_error.t) result","source":{"file":"json/libtmux_json.mli","line":94,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Expr","doc":{"summary":"Apply the same bounds and subset when encoding. Text with invalid UTF-8 has no representation in this schema. These functions perform no I/O."},"signatures":[{"raw":"val to_string :\n 'a Libtmux.Model.t -> 'a Libtmux.Expr.t -> (string, Decode_error.t) result","params":[{"name":"arg1","type":"'a Libtmux.Model.t"},{"name":"arg2","type":"'a Libtmux.Expr.t"}],"returns":"(string, Decode_error.t) result"}],"slug":"libtmux_json-expr-to_string"},{"id":"Libtmux_json.Workspace","publicId":"Libtmux_json.Workspace","qualifiedName":"Libtmux_json.Workspace","name":"Workspace","kind":"module","modifiers":[],"package":"libtmux-json","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":36,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Validate workspace documents and describe plans and retained execution.\n Preview output never supplies executable targets. "],"declarations":[{"kind":"module","text":"module Workspace : sig\n val decode :\n directory:string ->\n Yojson.Safe.t ->\n (Libtmux_workspace.Config.t, Decode_error.t) result\n\n val of_string :\n directory:string ->\n string ->\n (Libtmux_workspace.Config.t, Decode_error.t) result\n (** Decode [libtmux.workspace/1] with the query codec's 64 KiB, UTF-8 and\n 32-level JSON bounds. Reject duplicate and unknown properties, invalid\n argv/shell combinations and configuration errors. [directory] is the\n absolute document directory; these functions perform no filesystem I/O. *)\n\n val encode_plan :\n Libtmux_workspace.Plan.t -> (Yojson.Safe.t, Decode_error.t) result\n (** Describe [libtmux.workspace-plan/1] without I/O. The advisory preview\n contains command argv, cwd and environment names, excluding environment\n values, option values and startup text. It is not an execution script. *)\n\n val encode_receipt :\n Libtmux_workspace.Execution.receipt ->\n (Yojson.Safe.t, Decode_error.t) result\n (** Describe [libtmux.workspace-receipt/1] with ordered steps, outcome index\n lists, creation IDs, unbound hints and per-pane cleanup. Diagnostic\n messages are limited to 4096 bytes with an explicit truncation flag;\n command payloads are omitted.\n\n Both output schemas have a 4 MiB bound. Invalid UTF-8 values use\n [{\"encoding\":\"hex\",\"bytes\":\"...\"}] instead of losing bytes. Imported IDs\n and hints never establish a connection binding. *)\nend","source":{"file":"json/libtmux_json.mli","line":36,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json","doc":{"summary":"Validate workspace documents and describe plans and retained execution. Preview output never supplies executable targets."},"slug":"libtmux_json-workspace"},{"id":"Libtmux_json.Workspace.decode","publicId":"Libtmux_json.Workspace.decode","qualifiedName":"Libtmux_json.Workspace.decode","name":"decode","kind":"function","modifiers":[],"package":"libtmux-json","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":37,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val decode :\n directory:string ->\n Yojson.Safe.t ->\n (Libtmux_workspace.Config.t, Decode_error.t) result","source":{"file":"json/libtmux_json.mli","line":37,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Workspace","signatures":[{"raw":"val decode :\n directory:string ->\n Yojson.Safe.t -> (Libtmux_workspace.Config.t, Decode_error.t) result","params":[{"name":"directory","type":"string","keywordOnly":true},{"name":"arg1","type":"Yojson.Safe.t"}],"returns":"(Libtmux_workspace.Config.t, Decode_error.t) result"}],"slug":"libtmux_json-workspace-decode"},{"id":"Libtmux_json.Workspace.encode_plan","publicId":"Libtmux_json.Workspace.encode_plan","qualifiedName":"Libtmux_json.Workspace.encode_plan","name":"encode_plan","kind":"function","modifiers":[],"package":"libtmux-json","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":51,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Describe [libtmux.workspace-plan/1] without I/O. The advisory preview\n contains command argv, cwd and environment names, excluding environment\n values, option values and startup text. It is not an execution script. "],"declarations":[{"kind":"function","text":"val encode_plan :\n Libtmux_workspace.Plan.t -> (Yojson.Safe.t, Decode_error.t) result","source":{"file":"json/libtmux_json.mli","line":51,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Workspace","doc":{"summary":"Describe `libtmux.workspace-plan/1` without I/O. The advisory preview contains command argv, cwd and environment names, excluding environment values, option values and startup text. It is not an execution script."},"signatures":[{"raw":"val encode_plan :\n Libtmux_workspace.Plan.t -> (Yojson.Safe.t, Decode_error.t) result","params":[{"name":"arg1","type":"Libtmux_workspace.Plan.t"}],"returns":"(Yojson.Safe.t, Decode_error.t) result"}],"slug":"libtmux_json-workspace-encode_plan"},{"id":"Libtmux_json.Workspace.encode_receipt","publicId":"Libtmux_json.Workspace.encode_receipt","qualifiedName":"Libtmux_json.Workspace.encode_receipt","name":"encode_receipt","kind":"function","modifiers":[],"package":"libtmux-json","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":57,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Describe [libtmux.workspace-receipt/1] with ordered steps, outcome index\n lists, creation IDs, unbound hints and per-pane cleanup. Diagnostic\n messages are limited to 4096 bytes with an explicit truncation flag;\n command payloads are omitted.\n\n Both output schemas have a 4 MiB bound. Invalid UTF-8 values use\n [{\"encoding\":\"hex\",\"bytes\":\"...\"}] instead of losing bytes. Imported IDs\n and hints never establish a connection binding. "],"declarations":[{"kind":"function","text":"val encode_receipt :\n Libtmux_workspace.Execution.receipt ->\n (Yojson.Safe.t, Decode_error.t) result","source":{"file":"json/libtmux_json.mli","line":57,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Workspace","doc":{"summary":"Describe `libtmux.workspace-receipt/1` with ordered steps, outcome index lists, creation IDs, unbound hints and per-pane cleanup. Diagnostic messages are limited to 4096 bytes with an explicit truncation flag; command payloads are omitted.","body":"Both output schemas have a 4 MiB bound. Invalid UTF-8 values use `{\"encoding\":\"hex\",\"bytes\":\"...\"}` instead of losing bytes. Imported IDs and hints never establish a connection binding."},"signatures":[{"raw":"val encode_receipt :\n Libtmux_workspace.Execution.receipt ->\n (Yojson.Safe.t, Decode_error.t) result","params":[{"name":"arg1","type":"Libtmux_workspace.Execution.receipt"}],"returns":"(Yojson.Safe.t, Decode_error.t) result"}],"slug":"libtmux_json-workspace-encode_receipt"},{"id":"Libtmux_json.Workspace.of_string","publicId":"Libtmux_json.Workspace.of_string","qualifiedName":"Libtmux_json.Workspace.of_string","name":"of_string","kind":"function","modifiers":[],"package":"libtmux-json","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_json","source":{"file":"json/libtmux_json.mli","line":42,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Decode [libtmux.workspace/1] with the query codec's 64 KiB, UTF-8 and\n 32-level JSON bounds. Reject duplicate and unknown properties, invalid\n argv/shell combinations and configuration errors. [directory] is the\n absolute document directory; these functions perform no filesystem I/O. "],"declarations":[{"kind":"function","text":"val of_string :\n directory:string ->\n string ->\n (Libtmux_workspace.Config.t, Decode_error.t) result","source":{"file":"json/libtmux_json.mli","line":42,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_json.Workspace","doc":{"summary":"Decode `libtmux.workspace/1` with the query codec's 64 KiB, UTF-8 and 32-level JSON bounds. Reject duplicate and unknown properties, invalid argv/shell combinations and configuration errors. `directory` is the absolute document directory; these functions perform no filesystem I/O."},"signatures":[{"raw":"val of_string :\n directory:string ->\n string -> (Libtmux_workspace.Config.t, Decode_error.t) result","params":[{"name":"directory","type":"string","keywordOnly":true},{"name":"arg1","type":"string"}],"returns":"(Libtmux_workspace.Config.t, Decode_error.t) result"}],"slug":"libtmux_json-workspace-of_string"},{"id":"Libtmux_unix","publicId":"Libtmux_unix","qualifiedName":"Libtmux_unix","name":"Libtmux_unix","kind":"module","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":1,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Blocking Linux tmux clients with explicit scoped cancellation.\n\n Client methods perform I/O unless documented otherwise. Captured\n {!Libtmux.Snapshot} observations and retained {!Operation.inspect} remain\n local. Clients belong to the connecting domain. Closure releases their owned\n resources; tmux applies its configured daemon lifetime.\n\n See {!Client} for acquisition and commands, {!Operation} for cancellation\n outcomes, and {!Subscription} for bounded future output. The\n {{:https://github.com/libtmux/libtmux-ocaml/blob/master/docs/control.md}control\n guide} explains binding, completion and recovery. "],"declarations":[{"kind":"module","text":"","source":{"file":"unix/libtmux_unix.mli","line":1,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"doc":{"summary":"Blocking Linux tmux clients with explicit scoped cancellation.","body":"Client methods perform I/O unless documented otherwise. Captured {!Libtmux.Snapshot} observations and retained {!Operation.inspect} remain local. Clients belong to the connecting domain. Closure releases their owned resources; tmux applies its configured daemon lifetime.\n\nSee {!Client} for acquisition and commands, {!Operation} for cancellation outcomes, and {!Subscription} for bounded future output. The [control guide](https://github.com/libtmux/libtmux-ocaml/blob/master/docs/control.md) explains binding, completion and recovery."},"slug":"libtmux_unix"},{"id":"Libtmux_unix.Cancellation","publicId":"Libtmux_unix.Cancellation","qualifiedName":"Libtmux_unix.Cancellation","name":"Cancellation","kind":"module","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":63,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"module","text":"module Cancellation : sig\n type t\n\n exception Cancelled\n\n val with_ : (t -> 'a) -> 'a\n (** Own a cancellation token for the callback's lifetime. Leaving the scope\n cancels outstanding waiters and releases its descriptors after they\n finish. An escaped token is cancelled and cannot be reused. *)\n\n val cancel : t -> unit\n (** Wake waiters. Safe from another domain or systhread, but not from a signal\n handler. Repeated calls and calls after scope exit have no effect. *)\nend","source":{"file":"unix/libtmux_unix.mli","line":63,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix","slug":"libtmux_unix-cancellation"},{"id":"Libtmux_unix.Cancellation.Cancelled","publicId":"Libtmux_unix.Cancellation.Cancelled","qualifiedName":"Libtmux_unix.Cancellation.Cancelled","name":"Cancelled","kind":"exception","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":66,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"exception","text":"exception Cancelled","source":{"file":"unix/libtmux_unix.mli","line":66,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cancellation","signatures":[{"raw":"type exn += Cancelled","params":[]}],"slug":"libtmux_unix-cancellation-cancelled"},{"id":"Libtmux_unix.Cancellation.cancel","publicId":"Libtmux_unix.Cancellation.cancel","qualifiedName":"Libtmux_unix.Cancellation.cancel","name":"cancel","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":73,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Wake waiters. Safe from another domain or systhread, but not from a signal\n handler. Repeated calls and calls after scope exit have no effect. "],"declarations":[{"kind":"function","text":"val cancel : t -> unit","source":{"file":"unix/libtmux_unix.mli","line":73,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cancellation","doc":{"summary":"Wake waiters. Safe from another domain or systhread, but not from a signal handler. Repeated calls and calls after scope exit have no effect."},"signatures":[{"raw":"val cancel : t -> unit","params":[{"name":"arg1","type":"t"}],"returns":"unit"}],"slug":"libtmux_unix-cancellation-cancel"},{"id":"Libtmux_unix.Cancellation.t","publicId":"Libtmux_unix.Cancellation.t","qualifiedName":"Libtmux_unix.Cancellation.t","name":"t","kind":"typealias","package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":64,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"unix/libtmux_unix.mli","line":64,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cancellation","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux_unix-cancellation-t"},{"id":"Libtmux_unix.Cancellation.with_","publicId":"Libtmux_unix.Cancellation.with_","qualifiedName":"Libtmux_unix.Cancellation.with_","name":"with_","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":68,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Own a cancellation token for the callback's lifetime. Leaving the scope\n cancels outstanding waiters and releases its descriptors after they\n finish. An escaped token is cancelled and cannot be reused. "],"declarations":[{"kind":"function","text":"val with_ : (t -> 'a) -> 'a","source":{"file":"unix/libtmux_unix.mli","line":68,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cancellation","doc":{"summary":"Own a cancellation token for the callback's lifetime. Leaving the scope cancels outstanding waiters and releases its descriptors after they finish. An escaped token is cancelled and cannot be reused."},"signatures":[{"raw":"val with_ : (t -> 'a) -> 'a","params":[{"name":"arg1","type":"t -> 'a"}],"returns":"'a"}],"slug":"libtmux_unix-cancellation-with_"},{"id":"Libtmux_unix.Cleanup","publicId":"Libtmux_unix.Cleanup","qualifiedName":"Libtmux_unix.Cleanup","name":"Cleanup","kind":"module","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":17,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Retained failures from releasing processes and descriptors. Reports belong\n to their creating domain and remain readable after client closure. They\n preserve secondary failures without replacing a primary exception or\n cancellation. "],"declarations":[{"kind":"module","text":"module Cleanup : sig\n type t = Cleanup.t\n\n type phase = Cleanup.phase =\n | Close_pipe\n | Open_pidfd\n | Close_pidfd\n | Terminate\n | Grace\n | Kill\n | Reap\n | Unreaped_child\n | Cancel_workers\n | Release_hook\n | Notify_waiters\n\n type issue = Cleanup.issue = {\n phase : phase;\n error : Libtmux.Error.t option;\n exception_ : exn;\n backtrace : Printexc.raw_backtrace;\n }\n (** One failed cleanup action. [error] retains a typed library cause when\n available; [exception_] and [backtrace] retain the original exception.\n [Unreaped_child] means exit was not established after a failed signal. It\n does not release ownership or authorize signalling a reused PID. *)\n\n type snapshot = Cleanup.snapshot = { issues : issue Iarray.t; omitted : int }\n (** Issues in occurrence order, with a count of additional omitted issues. A\n report retains at most 64 entries. This bounds entry count, not heap\n retention: exception payloads and backtraces may retain other values.\n These diagnostics are not immutable graph observations. *)\n\n val create : unit -> t\n (** Create an empty report without I/O. Supply it before {!Client.connect},\n {!Workspace.submit_bootstrap} or {!Terminal.attach_current} to retain\n cleanup evidence even when setup fails or cancellation raises. *)\n\n val inspect : t -> (snapshot, Libtmux.Error.t) result\n (** Copy the current diagnostics without I/O. Returns\n {!Libtmux.Error.Wrong_domain} outside the creating domain. *)\nend","source":{"file":"unix/libtmux_unix.mli","line":17,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix","doc":{"summary":"Retained failures from releasing processes and descriptors. Reports belong to their creating domain and remain readable after client closure. They preserve secondary failures without replacing a primary exception or cancellation."},"slug":"libtmux_unix-cleanup"},{"id":"Libtmux_unix.Cleanup.create","publicId":"Libtmux_unix.Cleanup.create","qualifiedName":"Libtmux_unix.Cleanup.create","name":"create","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":50,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Create an empty report without I/O. Supply it before {!Client.connect},\n {!Workspace.submit_bootstrap} or {!Terminal.attach_current} to retain\n cleanup evidence even when setup fails or cancellation raises. "],"declarations":[{"kind":"function","text":"val create : unit -> t","source":{"file":"unix/libtmux_unix.mli","line":50,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup","doc":{"summary":"Create an empty report without I/O. Supply it before {!Client.connect}, {!Workspace.submit_bootstrap} or {!Terminal.attach_current} to retain cleanup evidence even when setup fails or cancellation raises."},"signatures":[{"raw":"val create : unit -> t","params":[{"name":"arg1","type":"unit"}],"returns":"t"}],"slug":"libtmux_unix-cleanup-create"},{"id":"Libtmux_unix.Cleanup.inspect","publicId":"Libtmux_unix.Cleanup.inspect","qualifiedName":"Libtmux_unix.Cleanup.inspect","name":"inspect","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":55,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Copy the current diagnostics without I/O. Returns\n {!Libtmux.Error.Wrong_domain} outside the creating domain. "],"declarations":[{"kind":"function","text":"val inspect : t -> (snapshot, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":55,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup","doc":{"summary":"Copy the current diagnostics without I/O. Returns {!Libtmux.Error.Wrong_domain} outside the creating domain."},"signatures":[{"raw":"val inspect : t -> (snapshot, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"}],"returns":"(snapshot, Libtmux.Error.t) result"}],"slug":"libtmux_unix-cleanup-inspect"},{"id":"Libtmux_unix.Cleanup.issue","publicId":"Libtmux_unix.Cleanup.issue","qualifiedName":"Libtmux_unix.Cleanup.issue","name":"issue","kind":"struct","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":33,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" One failed cleanup action. [error] retains a typed library cause when\n available; [exception_] and [backtrace] retain the original exception.\n [Unreaped_child] means exit was not established after a failed signal. It\n does not release ownership or authorize signalling a reused PID. "],"declarations":[{"kind":"struct","text":"type issue = Cleanup.issue = {\n phase : phase;\n error : Libtmux.Error.t option;\n exception_ : exn;\n backtrace : Printexc.raw_backtrace;\n }","source":{"file":"unix/libtmux_unix.mli","line":33,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup","doc":{"summary":"One failed cleanup action. `error` retains a typed library cause when available; `exception_` and `backtrace` retain the original exception. `Unreaped_child` means exit was not established after a failed signal. It does not release ownership or authorize signalling a reused PID."},"type":"Cleanup.issue","signatures":[{"raw":"type issue = Cleanup.issue =\n {\n phase: phase ;\n error: Libtmux.Error.t option ;\n exception_: exn ;\n backtrace: Printexc.raw_backtrace }","params":[]}],"slug":"libtmux_unix-cleanup-issue"},{"id":"Libtmux_unix.Cleanup.issue.backtrace","publicId":"Libtmux_unix.Cleanup.issue.backtrace","name":"backtrace","kind":"attribute","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":37,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"backtrace : Printexc.raw_backtrace;","source":{"file":"unix/libtmux_unix.mli","line":37,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.issue","type":"Printexc.raw_backtrace","qualifiedName":"Libtmux_unix.Cleanup.backtrace","slug":"libtmux_unix-cleanup-issue-backtrace"},{"id":"Libtmux_unix.Cleanup.issue.error","publicId":"Libtmux_unix.Cleanup.issue.error","name":"error","kind":"attribute","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":35,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"error : Libtmux.Error.t option;","source":{"file":"unix/libtmux_unix.mli","line":35,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.issue","type":"Libtmux.Error.t option","qualifiedName":"Libtmux_unix.Cleanup.error","slug":"libtmux_unix-cleanup-issue-error"},{"id":"Libtmux_unix.Cleanup.issue.exception_","publicId":"Libtmux_unix.Cleanup.issue.exception_","name":"exception_","kind":"attribute","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":36,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"exception_ : exn;","source":{"file":"unix/libtmux_unix.mli","line":36,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.issue","type":"exn","qualifiedName":"Libtmux_unix.Cleanup.exception_","slug":"libtmux_unix-cleanup-issue-exception_"},{"id":"Libtmux_unix.Cleanup.issue.phase","publicId":"Libtmux_unix.Cleanup.issue.phase","name":"phase","kind":"attribute","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":34,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"phase : phase;","source":{"file":"unix/libtmux_unix.mli","line":34,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.issue","type":"phase","qualifiedName":"Libtmux_unix.Cleanup.phase","slug":"libtmux_unix-cleanup-issue-phase"},{"id":"Libtmux_unix.Cleanup.phase","publicId":"Libtmux_unix.Cleanup.phase","qualifiedName":"Libtmux_unix.Cleanup.phase","name":"phase","kind":"enum","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":20,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type phase = Cleanup.phase =\n | Close_pipe\n | Open_pidfd\n | Close_pidfd\n | Terminate\n | Grace\n | Kill\n | Reap\n | Unreaped_child\n | Cancel_workers\n | Release_hook\n | Notify_waiters","source":{"file":"unix/libtmux_unix.mli","line":20,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup","type":"Cleanup.phase","signatures":[{"raw":"type phase = Cleanup.phase =\n | Close_pipe \n | Open_pidfd \n | Close_pidfd \n | Terminate \n | Grace \n | Kill \n | Reap \n | Unreaped_child \n | Cancel_workers \n | Release_hook \n | Notify_waiters ","params":[]}],"slug":"libtmux_unix-cleanup-phase"},{"id":"Libtmux_unix.Cleanup.phase.Cancel_workers","publicId":"Libtmux_unix.Cleanup.phase.Cancel_workers","name":"Cancel_workers","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":29,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Cancel_workers","source":{"file":"unix/libtmux_unix.mli","line":29,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.phase","variant":"unit","qualifiedName":"Libtmux_unix.Cleanup.Cancel_workers","slug":"libtmux_unix-cleanup-phase-cancel_workers"},{"id":"Libtmux_unix.Cleanup.phase.Close_pidfd","publicId":"Libtmux_unix.Cleanup.phase.Close_pidfd","name":"Close_pidfd","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":23,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Close_pidfd","source":{"file":"unix/libtmux_unix.mli","line":23,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.phase","variant":"unit","qualifiedName":"Libtmux_unix.Cleanup.Close_pidfd","slug":"libtmux_unix-cleanup-phase-close_pidfd"},{"id":"Libtmux_unix.Cleanup.phase.Close_pipe","publicId":"Libtmux_unix.Cleanup.phase.Close_pipe","name":"Close_pipe","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":21,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Close_pipe","source":{"file":"unix/libtmux_unix.mli","line":21,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.phase","variant":"unit","qualifiedName":"Libtmux_unix.Cleanup.Close_pipe","slug":"libtmux_unix-cleanup-phase-close_pipe"},{"id":"Libtmux_unix.Cleanup.phase.Grace","publicId":"Libtmux_unix.Cleanup.phase.Grace","name":"Grace","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":25,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Grace","source":{"file":"unix/libtmux_unix.mli","line":25,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.phase","variant":"unit","qualifiedName":"Libtmux_unix.Cleanup.Grace","slug":"libtmux_unix-cleanup-phase-grace"},{"id":"Libtmux_unix.Cleanup.phase.Kill","publicId":"Libtmux_unix.Cleanup.phase.Kill","name":"Kill","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":26,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Kill","source":{"file":"unix/libtmux_unix.mli","line":26,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.phase","variant":"unit","qualifiedName":"Libtmux_unix.Cleanup.Kill","slug":"libtmux_unix-cleanup-phase-kill"},{"id":"Libtmux_unix.Cleanup.phase.Notify_waiters","publicId":"Libtmux_unix.Cleanup.phase.Notify_waiters","name":"Notify_waiters","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":31,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Notify_waiters","source":{"file":"unix/libtmux_unix.mli","line":31,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.phase","variant":"unit","qualifiedName":"Libtmux_unix.Cleanup.Notify_waiters","slug":"libtmux_unix-cleanup-phase-notify_waiters"},{"id":"Libtmux_unix.Cleanup.phase.Open_pidfd","publicId":"Libtmux_unix.Cleanup.phase.Open_pidfd","name":"Open_pidfd","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":22,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Open_pidfd","source":{"file":"unix/libtmux_unix.mli","line":22,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.phase","variant":"unit","qualifiedName":"Libtmux_unix.Cleanup.Open_pidfd","slug":"libtmux_unix-cleanup-phase-open_pidfd"},{"id":"Libtmux_unix.Cleanup.phase.Reap","publicId":"Libtmux_unix.Cleanup.phase.Reap","name":"Reap","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":27,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Reap","source":{"file":"unix/libtmux_unix.mli","line":27,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.phase","variant":"unit","qualifiedName":"Libtmux_unix.Cleanup.Reap","slug":"libtmux_unix-cleanup-phase-reap"},{"id":"Libtmux_unix.Cleanup.phase.Release_hook","publicId":"Libtmux_unix.Cleanup.phase.Release_hook","name":"Release_hook","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":30,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Release_hook","source":{"file":"unix/libtmux_unix.mli","line":30,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.phase","variant":"unit","qualifiedName":"Libtmux_unix.Cleanup.Release_hook","slug":"libtmux_unix-cleanup-phase-release_hook"},{"id":"Libtmux_unix.Cleanup.phase.Terminate","publicId":"Libtmux_unix.Cleanup.phase.Terminate","name":"Terminate","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":24,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Terminate","source":{"file":"unix/libtmux_unix.mli","line":24,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.phase","variant":"unit","qualifiedName":"Libtmux_unix.Cleanup.Terminate","slug":"libtmux_unix-cleanup-phase-terminate"},{"id":"Libtmux_unix.Cleanup.phase.Unreaped_child","publicId":"Libtmux_unix.Cleanup.phase.Unreaped_child","name":"Unreaped_child","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":28,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unreaped_child","source":{"file":"unix/libtmux_unix.mli","line":28,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.phase","variant":"unit","qualifiedName":"Libtmux_unix.Cleanup.Unreaped_child","slug":"libtmux_unix-cleanup-phase-unreaped_child"},{"id":"Libtmux_unix.Cleanup.snapshot","publicId":"Libtmux_unix.Cleanup.snapshot","qualifiedName":"Libtmux_unix.Cleanup.snapshot","name":"snapshot","kind":"struct","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":44,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Issues in occurrence order, with a count of additional omitted issues. A\n report retains at most 64 entries. This bounds entry count, not heap\n retention: exception payloads and backtraces may retain other values.\n These diagnostics are not immutable graph observations. "],"declarations":[{"kind":"struct","text":"type snapshot = Cleanup.snapshot = { issues : issue Iarray.t; omitted : int }","source":{"file":"unix/libtmux_unix.mli","line":44,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup","doc":{"summary":"Issues in occurrence order, with a count of additional omitted issues. A report retains at most 64 entries. This bounds entry count, not heap retention: exception payloads and backtraces may retain other values. These diagnostics are not immutable graph observations."},"type":"Cleanup.snapshot","signatures":[{"raw":"type snapshot = Cleanup.snapshot = {\n issues: issue Iarray.t ;\n omitted: int }","params":[]}],"slug":"libtmux_unix-cleanup-snapshot"},{"id":"Libtmux_unix.Cleanup.snapshot.issues","publicId":"Libtmux_unix.Cleanup.snapshot.issues","name":"issues","kind":"attribute","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":44,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"issues : issue Iarray.t;","source":{"file":"unix/libtmux_unix.mli","line":44,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.snapshot","type":"issue Iarray.t","qualifiedName":"Libtmux_unix.Cleanup.issues","slug":"libtmux_unix-cleanup-snapshot-issues"},{"id":"Libtmux_unix.Cleanup.snapshot.omitted","publicId":"Libtmux_unix.Cleanup.snapshot.omitted","name":"omitted","kind":"attribute","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":44,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"omitted : int","source":{"file":"unix/libtmux_unix.mli","line":44,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup.snapshot","type":"int","qualifiedName":"Libtmux_unix.Cleanup.omitted","slug":"libtmux_unix-cleanup-snapshot-omitted"},{"id":"Libtmux_unix.Cleanup.t","publicId":"Libtmux_unix.Cleanup.t","qualifiedName":"Libtmux_unix.Cleanup.t","name":"t","kind":"typealias","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":18,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t = Cleanup.t","source":{"file":"unix/libtmux_unix.mli","line":18,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Cleanup","type":"Cleanup.t","signatures":[{"raw":"type t = Cleanup.t","params":[]}],"slug":"libtmux_unix-cleanup-t"},{"id":"Libtmux_unix.Client","publicId":"Libtmux_unix.Client","qualifiedName":"Libtmux_unix.Client","name":"Client","kind":"module","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":182,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" An explicit generation-bound connection. Applications retain ownership of\n the endpoint choice and resource lifetime. "],"declarations":[{"kind":"module","text":"module Client : sig\n type t\n\n val connect :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?timeout:float ->\n Libtmux.Endpoint.t ->\n (t, Libtmux.Error.t) result\n (** Attach to an existing local daemon with at least one session. The caller\n and daemon must share the PID namespace and filesystem. A local socket\n pathname alone does not establish these preconditions. [timeout] is the\n maximum seconds per control exchange, defaulting to one second. Requires\n Linux pidfd support. The client belongs to the current domain. Initial and\n auxiliary attachments suppress tmux's [update-environment] behavior. *)\n\n val cleanup : t -> Cleanup.t\n (** Read the report supplied at connection time, or its fresh default.\n {!Cleanup.inspect} remains available after close. *)\n\n val source : t -> Libtmux.Source.t\n (** Read the retained endpoint, daemon PID and connection generation without\n I/O. *)\n\n val version : t -> string\n (** Read the bound daemon's observed version without I/O. *)\n\n val subscribe :\n ?session:Libtmux.Session.target ->\n ?capacity_bytes:int ->\n ?capacity_events:int ->\n t ->\n Libtmux.Pane.t ->\n (Subscription.t, Libtmux.Error.t) result\n (** Acquire verified coverage of the pane's observed session/window. Choose\n the least session ID unless explicitly supplied. Reuse one lane per\n session. Defaults: 1 MiB and 1024 queued events per subscriber; at most 16\n subscribers and eight client lanes including commands. Reserve payload\n against the shared 32 MiB budget before admission.\n\n Queue capacities remain reserved while empty. Captures and reads need\n additional scratch space; their admission can return\n {!Libtmux.Error.Capacity} below the subscriber-count limit. See the\n {{:https://github.com/libtmux/libtmux-ocaml/blob/master/docs/streaming.md#plan-shared-capacity}shared\n capacity guide} for the combined reservations and process slots.\n\n Data starts after admission's marker. Layout/membership changes end\n continuity conservatively. Overflow emits Gap then End, without blocking\n another subscriber. Blocking delivery advances during Subscription.next.\n There is no snapshot/history barrier or automatic recovery. *)\n\n val wait_for_text :\n ?cancel:Cancellation.t ->\n ?timeout:float ->\n ?scratch_dir:string ->\n t ->\n Libtmux.Pane.t ->\n text:string ->\n (Rendered.t, Libtmux.Error.t) result\n (** Subscribe, capture the ordinary screen immediately, and recapture after\n output. Membership/overflow gaps trigger explicit fresh capture and new\n coverage in the same binding. Maximum pattern: 64 KiB. Success returns a\n capture that contains the text. Transient text between captures may be\n missed. Check the deadline between bounded acquisitions; in-flight I/O\n retains the client's exchange timeout. Release the temporary subscription\n without replacing an earlier error or cancellation; inspect {!cleanup} for\n secondary failures. Otherwise cleanup failure prevents success or renewed\n coverage. No capture/stream barrier exists. *)\n\n val submit :\n t -> 'a Libtmux.Command.t -> ('a Operation.t, Libtmux.Error.t) result\n (** Validate and reserve queue capacity without I/O. *)\n\n val await :\n ?cancel:Cancellation.t -> 'a Operation.t -> ('a, Libtmux.Error.t) result\n (** Pump admitted work until this operation is finished. Only one blocking\n caller may own the client at a time. Cancellation removes queued work or\n drains admitted work before raising [Cancellation.Cancelled]. The handle\n retains its outcome. Draining has at most one exchange timeout from\n detection; local scratch filesystem I/O and owned-child cleanup must also\n finish. Each owned child gets 200 ms of TERM grace before forced\n termination and reaping; scheduling and kernel completion can add time. No\n background scheduler or worker is started. *)\n\n val run :\n ?cancel:Cancellation.t ->\n t ->\n 'a Libtmux.Command.t ->\n ('a, Libtmux.Error.t) result\n (** Submit and await. Use the two calls separately to retain an operation\n handle. *)\n\n val capture :\n ?cancel:Cancellation.t -> t -> (Libtmux.Snapshot.t, Libtmux.Error.t) result\n (** Acquire a complete graph over a recorded interval, with a fixed number of\n listing commands. Races fail validation. Access to returned values\n performs no I/O, including after closing the client. *)\n\n val capture_text :\n ?cancel:Cancellation.t ->\n ?scratch_dir:string ->\n t ->\n Libtmux.Pane.t ->\n start:int ->\n end_:int ->\n (Rendered.t, Libtmux.Error.t) result\n (** Capture ordinary rendered screen rows, inclusively, via an owned paste\n buffer and private file. Reject applicable capture/save hooks. The scratch\n directory defaults to [/tmp] and must be local storage shared with the\n daemon. Pending and alternate-screen byte modes are unsupported. This\n observes an interval and establishes no stream continuity barrier. *)\n\n (* BEGIN GENERATED OPERATIONS *)\n val rename_window :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n name:string ->\n (unit, Libtmux.Error.t) result\n (** Set the global window name. Every session link observes the new name on\n its next capture; existing snapshots retain the old value. *)\n\n val rename_session :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Session.target ->\n name:string ->\n (unit, Libtmux.Error.t) result\n (** Set the session name, rejecting a conflicting existing name. Bound IDs\n remain usable; existing snapshots retain their captured names. *)\n\n val switch_client_at :\n ?cancel:Cancellation.t ->\n ?update_environment:bool ->\n t ->\n Libtmux.Client_name.t ->\n session:Libtmux.Session.target ->\n (unit, Libtmux.Error.t) result\n (** Switch the client currently bearing this name to the bound session.\n Environment updates are disabled by default. This can move either a\n terminal client or a control client; it does not open a new terminal. *)\n\n val request_detach_client_at :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Client_name.t ->\n (unit, Libtmux.Error.t) result\n (** Request detachment of the client currently bearing this name. Success\n confirms request processing, not peer exit. Detaching the library's own\n primary lane can lose the response and retire its generation. *)\n\n val refresh_client_at :\n ?cancel:Cancellation.t ->\n ?status_only:bool ->\n t ->\n Libtmux.Client_name.t ->\n (unit, Libtmux.Error.t) result\n (** Request a redraw; no terminal-rendering completion is implied. *)\n\n val resize_control_client_at :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Client_name.t ->\n width:int ->\n height:int ->\n (unit, Libtmux.Error.t) result\n (** Set a control client's reported size. tmux rejects terminal clients. *)\n\n val send_text :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n text:string ->\n (unit, Libtmux.Error.t) result\n (** Literal bytes, without an implicit Enter. NUL is rejected at admission. *)\n\n val send_keys :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n Libtmux.Key.t list ->\n (unit, Libtmux.Error.t) result\n (** Send named tmux keys in order, without an implicit Enter. Use {!send_text}\n for literal bytes rather than key interpretation. *)\n\n val wait_for :\n ?cancel:Cancellation.t -> t -> string -> (unit, Libtmux.Error.t) result\n (** Wait on a named tmux semaphore using a dedicated bound lane. *)\n\n val signal :\n ?cancel:Cancellation.t -> t -> string -> (unit, Libtmux.Error.t) result\n (** Signal a named tmux semaphore, releasing a waiter or retaining the signal\n for a later {!wait_for}. This does not signal an OS process. *)\n\n val capture_environment :\n ?cancel:Cancellation.t ->\n ?hidden:bool ->\n t ->\n Libtmux.Environment.scope ->\n (Libtmux.Environment.t, Libtmux.Error.t) result\n (** Acquire a bounded table through a read-only command process. Its response\n must identify the bound daemon while the original pidfd remains live.\n Unsupported external variable names fail decoding; they are not omitted.\n *)\n\n val set_environment :\n ?cancel:Cancellation.t ->\n ?hidden:bool ->\n t ->\n Libtmux.Environment.scope ->\n name:string ->\n string ->\n (unit, Libtmux.Error.t) result\n (** Set a local environment value for future pane processes. [hidden] defaults\n to false; hidden values remain internal to tmux. Existing processes keep\n their environment. *)\n\n val unset_environment :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Environment.scope ->\n string ->\n (unit, Libtmux.Error.t) result\n (** Remove the local entry, allowing a global value to apply to future panes.\n *)\n\n val remove_environment :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Environment.scope ->\n string ->\n (unit, Libtmux.Error.t) result\n (** Store a removal marker, excluding the variable from future panes. *)\n\n val capture_options :\n ?cancel:Cancellation.t ->\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n (Libtmux.Options.t, Libtmux.Error.t) result\n (** Acquire one bounded option table, excluding hooks. The default includes\n only local entries. Inherited table enumeration includes built-ins;\n inherited user options require [read_option] with their explicit name.\n Built-in descriptors cover every supported release from tmux 3.3a through\n 3.8; other versions return {!Libtmux.Error.Unsupported}. *)\n\n val read_option :\n ?cancel:Cancellation.t ->\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (Libtmux.Options.value option, Libtmux.Error.t) result\n (** Read one exact name, including user-option inheritance. [None] means no\n entry under the selected policy. An invalid target remains an error. The\n default follows inheritance; this does not identify the defining parent\n scope. *)\n\n val set_option :\n ?cancel:Cancellation.t ->\n ?index:int ->\n ?append:bool ->\n t ->\n Libtmux.Options.scope ->\n name:string ->\n Libtmux.Options.scalar ->\n (unit, Libtmux.Error.t) result\n (** Validate the scope and scalar kind before admission. Array values require\n an index, or [append:true]. Without an index, tmux splits appended text\n using the option's separator and fills the lowest unused indexes. Text is\n literal; tmux format expansion is disabled. Hooks use a separate\n operation. *)\n\n val unset_option :\n ?cancel:Cancellation.t ->\n ?index:int ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (unit, Libtmux.Error.t) result\n (** Remove a local override or one array element. Global built-ins reset to\n their tmux defaults; this does not recursively unset child overrides. *)\n\n val clear_option_array :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (unit, Libtmux.Error.t) result\n (** Set a local empty array, masking inheritance. *)\n\n val capture_hooks :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Options.scope ->\n (Libtmux.Options.t, Libtmux.Error.t) result\n (** Capture locally configured built-in hooks. Command values are tmux's\n printed representation, retained as data. *)\n\n val read_hook :\n ?cancel:Cancellation.t ->\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (Libtmux.Options.value option, Libtmux.Error.t) result\n (** Read an exact hook name. Inheritance is included by default; [None] means\n no entry under the selected policy. Missing targets remain errors. *)\n\n val set_hook :\n ?cancel:Cancellation.t ->\n ?index:int ->\n ?append:bool ->\n t ->\n Libtmux.Options.scope ->\n name:string ->\n Libtmux.Hook.command list ->\n (unit, Libtmux.Error.t) result\n (** Set a hook to a nonempty command list. Without an index, replace the whole\n hook array, or fill the lowest free index when appending. An explicit\n [@name] custom hook stores command text as a user option; it requires\n complete replacement and has no array indexes. [read_hook] returns its\n [Libtmux.Options.Text] value; bulk hook capture includes built-ins.\n Commands may cause arbitrary tmux effects when triggered. Hooks that print\n output are outside the supported control transport contract. *)\n\n val remove_hook :\n ?cancel:Cancellation.t ->\n ?index:int ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (unit, Libtmux.Error.t) result\n (** Remove the local hook or one indexed array entry. An inherited hook may\n become effective again; this does not stop work it already started. *)\n\n val run_hook :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (unit, Libtmux.Error.t) result\n (** Run the effective hook in an explicit session, window or pane context. A\n successful result follows completion of its synchronous command queue.\n Background work started by a hook has its own lifetime. A later hook\n failure returns an uncertain outcome; preceding effects remain. Named [@]\n hooks return [Unsupported] because tmux can hide their parse failures in\n the server log. Configuration and inspection remain available. *)\n\n val create_session :\n ?cancel:Cancellation.t ->\n ?window_name:string ->\n ?width:int ->\n ?height:int ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n name:string ->\n unit ->\n (Libtmux.Created.t, Libtmux.Error.t) result\n (** Create a detached session on the bound daemon. Name collisions fail. *)\n\n val create_window :\n ?cancel:Cancellation.t ->\n ?index:int ->\n ?name:string ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n Libtmux.Session.target ->\n (Libtmux.Created.t, Libtmux.Error.t) result\n (** Create detached, rejecting an occupied explicit index. *)\n\n val split_pane :\n ?cancel:Cancellation.t ->\n ?size:Libtmux.Geometry.size ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n Libtmux.Pane.target ->\n direction:Libtmux.Geometry.direction ->\n (Libtmux.Created.t, Libtmux.Error.t) result\n (** Create a detached pane beside the target and return the IDs reported by\n tmux. Omitted [size] lets tmux choose the split; tmux rejects splits when\n no space remains. *)\n\n val break_pane :\n ?cancel:Cancellation.t ->\n ?name:string ->\n t ->\n Libtmux.Pane.target ->\n session:Libtmux.Session.target ->\n index:int ->\n (Libtmux.Created.t, Libtmux.Error.t) result\n (** Move the pane into a new window at an explicit session index. An occupied\n destination fails. The returned IDs describe the resulting context; the\n pane itself already existed. *)\n\n val kill_session :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Session.target ->\n (unit, Libtmux.Error.t) result\n (** Remove the session and its window links. Windows with no other links and\n their panes are destroyed. Removing the last session may stop tmux. *)\n\n val kill_window :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n (unit, Libtmux.Error.t) result\n (** Destroy the window, all its session links and every contained pane. This\n acts on the global window, not a single contextual link. *)\n\n val kill_pane :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result\n (** Destroy the target pane and its running process. tmux removes a window\n that becomes empty and may remove its now-empty sessions. *)\n\n val select_window_at :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result\n (** Operate on the session's current index at execution, not an old link\n incarnation. *)\n\n val unlink_window_at :\n ?cancel:Cancellation.t ->\n ?allow_kill:bool ->\n t ->\n Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result\n (** Without [allow_kill], tmux rejects removal of the last link to a window.\n *)\n\n val link_window :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n session:Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result\n (** Add a session-specific link to the global window at [index], rejecting an\n occupied index. The source window and its panes stay shared. *)\n\n val move_window_at :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Session.target ->\n from_index:int ->\n session:Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result\n (** Move the source session's current link at [from_index]. Destination\n collisions fail. *)\n\n val select_pane :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result\n (** Make the pane active in its containing window. This does not open or\n attach a terminal client. *)\n\n val set_pane_title :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n title:string ->\n (unit, Libtmux.Error.t) result\n (** Set the pane title as literal text, without tmux format expansion. A\n running terminal application can subsequently replace the title. *)\n\n val resize_pane :\n ?cancel:Cancellation.t ->\n ?width:int ->\n ?height:int ->\n t ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result\n (** Request positive cell dimensions, supplying at least one dimension. Omit\n either dimension to retain it. tmux can constrain the result to the\n available layout. Capture again to observe the actual dimensions. *)\n\n val resize_window :\n ?cancel:Cancellation.t ->\n ?width:int ->\n ?height:int ->\n t ->\n Libtmux.Window.target ->\n (unit, Libtmux.Error.t) result\n (** Request positive cell dimensions, supplying at least one dimension. Omit\n either dimension to retain it. Client-size and window-size policies can\n affect subsequent sizing. *)\n\n val select_layout :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n Libtmux.Layout.t ->\n (unit, Libtmux.Error.t) result\n (** Apply a preset or validated custom layout to the window. Pane geometry\n follows tmux layout rules; capture again to observe the result. *)\n\n val cycle_layout :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n [ `Next | `Previous ] ->\n (unit, Libtmux.Error.t) result\n (** Select the next or previous tmux preset layout for this window. *)\n\n val move_pane :\n ?cancel:Cancellation.t ->\n ?size:Libtmux.Geometry.size ->\n t ->\n Libtmux.Pane.target ->\n beside:Libtmux.Pane.target ->\n direction:Libtmux.Geometry.direction ->\n (unit, Libtmux.Error.t) result\n (** Move the source pane beside another pane, optionally setting the split\n size. Both targets must belong to the same bound generation. An emptied\n source window is removed by tmux. *)\n\n val swap_panes :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result\n (** Exchange pane positions without exchanging their identities or running\n processes. Both targets must belong to the same bound generation. *)\n\n val rotate_panes :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n [ `Forward | `Backward ] ->\n (unit, Libtmux.Error.t) result\n (** Rotate pane positions in the selected direction. Pane identities and\n running processes remain attached to their panes. *)\n\n val zoom_pane :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result\n (** Toggle the window's zoom state around this pane. *)\n\n val respawn_pane :\n ?cancel:Cancellation.t ->\n ?kill_running:bool ->\n t ->\n Libtmux.Pane.target ->\n Libtmux.Spawn.t ->\n (unit, Libtmux.Error.t) result\n (** Start the supplied command in the existing pane. A running process causes\n failure unless [kill_running:true] explicitly replaces it. The pane ID\n remains unchanged. *)\n\n val clear_history :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result\n (** Clear stored scrollback for this pane. The visible screen and running\n process remain; later captures cannot recover discarded history. *)\n\n (* END GENERATED OPERATIONS *)\n\n val close : t -> (unit, Libtmux.Error.t) result\n (** Close owned control clients and descriptors on the owning domain. Later\n calls retain the original cleanup result, including failure. Each owned\n helper gets 200 ms of TERM grace, followed by KILL if needed and reaping.\n This is not a whole-client deadline or a bound on uninterruptible kernel\n work. No signal targets the daemon. tmux's [exit-unattached] and\n [exit-empty] policies can end the daemon after its clients or sessions\n disappear. *)\nend","source":{"file":"unix/libtmux_unix.mli","line":182,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix","doc":{"summary":"An explicit generation-bound connection. Applications retain ownership of the endpoint choice and resource lifetime."},"slug":"libtmux_unix-client"},{"id":"Libtmux_unix.Client.await","publicId":"Libtmux_unix.Client.await","qualifiedName":"Libtmux_unix.Client.await","name":"await","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":255,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Pump admitted work until this operation is finished. Only one blocking\n caller may own the client at a time. Cancellation removes queued work or\n drains admitted work before raising [Cancellation.Cancelled]. The handle\n retains its outcome. Draining has at most one exchange timeout from\n detection; local scratch filesystem I/O and owned-child cleanup must also\n finish. Each owned child gets 200 ms of TERM grace before forced\n termination and reaping; scheduling and kernel completion can add time. No\n background scheduler or worker is started. "],"declarations":[{"kind":"function","text":"val await :\n ?cancel:Cancellation.t -> 'a Operation.t -> ('a, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":255,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Pump admitted work until this operation is finished. Only one blocking caller may own the client at a time. Cancellation removes queued work or drains admitted work before raising `Cancellation.Cancelled`. The handle retains its outcome. Draining has at most one exchange timeout from detection; local scratch filesystem I/O and owned-child cleanup must also finish. Each owned child gets 200 ms of TERM grace before forced termination and reaping; scheduling and kernel completion can add time. No background scheduler or worker is started."},"signatures":[{"raw":"val await :\n ?cancel:Cancellation.t -> 'a Operation.t -> ('a, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"'a Operation.t"}],"returns":"('a, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-await"},{"id":"Libtmux_unix.Client.break_pane","publicId":"Libtmux_unix.Client.break_pane","qualifiedName":"Libtmux_unix.Client.break_pane","name":"break_pane","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":565,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Move the pane into a new window at an explicit session index. An occupied\n destination fails. The returned IDs describe the resulting context; the\n pane itself already existed. "],"declarations":[{"kind":"function","text":"val break_pane :\n ?cancel:Cancellation.t ->\n ?name:string ->\n t ->\n Libtmux.Pane.target ->\n session:Libtmux.Session.target ->\n index:int ->\n (Libtmux.Created.t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":565,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Move the pane into a new window at an explicit session index. An occupied destination fails. The returned IDs describe the resulting context; the pane itself already existed."},"signatures":[{"raw":"val break_pane :\n ?cancel:Cancellation.t ->\n ?name:string ->\n t ->\n Libtmux.Pane.target ->\n session:Libtmux.Session.target ->\n index:int -> (Libtmux.Created.t, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"name","type":"string","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"session","type":"Libtmux.Session.target","keywordOnly":true},{"name":"index","type":"int","keywordOnly":true}],"returns":"(Libtmux.Created.t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-break_pane"},{"id":"Libtmux_unix.Client.capture","publicId":"Libtmux_unix.Client.capture","qualifiedName":"Libtmux_unix.Client.capture","name":"capture","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":274,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Acquire a complete graph over a recorded interval, with a fixed number of\n listing commands. Races fail validation. Access to returned values\n performs no I/O, including after closing the client. "],"declarations":[{"kind":"function","text":"val capture :\n ?cancel:Cancellation.t -> t -> (Libtmux.Snapshot.t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":274,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Acquire a complete graph over a recorded interval, with a fixed number of listing commands. Races fail validation. Access to returned values performs no I/O, including after closing the client.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet capture_graph client (initial : Created.t) spawn =\n let linked =\n get\n (Client.create_session client ~name:\"linked\" ~window_name:\"linked-home\"\n ~spawn ())\n in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id linked.pane)\n |> Option.get\n in\n let text = \"showcase ready\" in\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n get\n (Client.link_window client initial.window ~session:linked.session ~index:7);\n get (Client.capture client)\n\nlet print_graph snapshot =\n Snapshot.sessions snapshot\n |> Iarray.iter (fun session ->\n Session.window_links session\n |> Iarray.iter (fun link ->\n let window = Window_link.window link in\n Printf.printf \"%s/%d %s: %d pane(s)\\n\" (Session.name session)\n (Window_link.index link) (Window.name window)\n (Iarray.length (Window.panes window))));\n assert (Iarray.length (Snapshot.sessions snapshot) = 2);\n assert (Iarray.length (Snapshot.windows snapshot) = 2);\n assert (Iarray.length (Snapshot.window_links snapshot) = 3);\n assert (Iarray.length (Snapshot.panes snapshot) = 2);\n print_endline \"graph: 2 sessions, 2 windows, 3 links, 2 panes\"\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let snapshot = with_demo binary capture_graph in\n print_graph snapshot\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_graph.ml","intro":"Navigate the typed object graph. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_graph.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"graph: 2 sessions, 2 windows, 3 links, 2 panes\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val capture :\n ?cancel:Cancellation.t -> t -> (Libtmux.Snapshot.t, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"}],"returns":"(Libtmux.Snapshot.t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-capture"},{"id":"Libtmux_unix.Client.capture_environment","publicId":"Libtmux_unix.Client.capture_environment","qualifiedName":"Libtmux_unix.Client.capture_environment","name":"capture_environment","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":376,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Acquire a bounded table through a read-only command process. Its response\n must identify the bound daemon while the original pidfd remains live.\n Unsupported external variable names fail decoding; they are not omitted.\n "],"declarations":[{"kind":"function","text":"val capture_environment :\n ?cancel:Cancellation.t ->\n ?hidden:bool ->\n t ->\n Libtmux.Environment.scope ->\n (Libtmux.Environment.t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":376,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Acquire a bounded table through a read-only command process. Its response must identify the bound daemon while the original pidfd remains live. Unsupported external variable names fail decoding; they are not omitted."},"signatures":[{"raw":"val capture_environment :\n ?cancel:Cancellation.t ->\n ?hidden:bool ->\n t ->\n Libtmux.Environment.scope ->\n (Libtmux.Environment.t, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"hidden","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Environment.scope"}],"returns":"(Libtmux.Environment.t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-capture_environment"},{"id":"Libtmux_unix.Client.capture_hooks","publicId":"Libtmux_unix.Client.capture_hooks","qualifiedName":"Libtmux_unix.Client.capture_hooks","name":"capture_hooks","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":473,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Capture locally configured built-in hooks. Command values are tmux's\n printed representation, retained as data. "],"declarations":[{"kind":"function","text":"val capture_hooks :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Options.scope ->\n (Libtmux.Options.t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":473,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Capture locally configured built-in hooks. Command values are tmux's printed representation, retained as data."},"signatures":[{"raw":"val capture_hooks :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Options.scope -> (Libtmux.Options.t, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"}],"returns":"(Libtmux.Options.t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-capture_hooks"},{"id":"Libtmux_unix.Client.capture_options","publicId":"Libtmux_unix.Client.capture_options","qualifiedName":"Libtmux_unix.Client.capture_options","name":"capture_options","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":416,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Acquire one bounded option table, excluding hooks. The default includes\n only local entries. Inherited table enumeration includes built-ins;\n inherited user options require [read_option] with their explicit name.\n Built-in descriptors cover every supported release from tmux 3.3a through\n 3.8; other versions return {!Libtmux.Error.Unsupported}. "],"declarations":[{"kind":"function","text":"val capture_options :\n ?cancel:Cancellation.t ->\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n (Libtmux.Options.t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":416,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Acquire one bounded option table, excluding hooks. The default includes only local entries. Inherited table enumeration includes built-ins; inherited user options require `read_option` with their explicit name. Built-in descriptors cover every supported release from tmux 3.3a through 3.8; other versions return {!Libtmux.Error.Unsupported}."},"signatures":[{"raw":"val capture_options :\n ?cancel:Cancellation.t ->\n ?include_inherited:bool ->\n t -> Libtmux.Options.scope -> (Libtmux.Options.t, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"include_inherited","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"}],"returns":"(Libtmux.Options.t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-capture_options"},{"id":"Libtmux_unix.Client.capture_text","publicId":"Libtmux_unix.Client.capture_text","qualifiedName":"Libtmux_unix.Client.capture_text","name":"capture_text","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":280,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Capture ordinary rendered screen rows, inclusively, via an owned paste\n buffer and private file. Reject applicable capture/save hooks. The scratch\n directory defaults to [/tmp] and must be local storage shared with the\n daemon. Pending and alternate-screen byte modes are unsupported. This\n observes an interval and establishes no stream continuity barrier. "],"declarations":[{"kind":"function","text":"val capture_text :\n ?cancel:Cancellation.t ->\n ?scratch_dir:string ->\n t ->\n Libtmux.Pane.t ->\n start:int ->\n end_:int ->\n (Rendered.t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":280,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Capture ordinary rendered screen rows, inclusively, via an owned paste buffer and private file. Reject applicable capture/save hooks. The scratch directory defaults to `/tmp` and must be local storage shared with the daemon. Pending and alternate-screen byte modes are unsupported. This observes an interval and establishes no stream continuity barrier."},"signatures":[{"raw":"val capture_text :\n ?cancel:Cancellation.t ->\n ?scratch_dir:string ->\n t ->\n Libtmux.Pane.t ->\n start:int -> end_:int -> (Rendered.t, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"scratch_dir","type":"string","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.t"},{"name":"start","type":"int","keywordOnly":true},{"name":"end_","type":"int","keywordOnly":true}],"returns":"(Rendered.t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-capture_text"},{"id":"Libtmux_unix.Client.cleanup","publicId":"Libtmux_unix.Client.cleanup","qualifiedName":"Libtmux_unix.Client.cleanup","name":"cleanup","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":198,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read the report supplied at connection time, or its fresh default.\n {!Cleanup.inspect} remains available after close. "],"declarations":[{"kind":"function","text":"val cleanup : t -> Cleanup.t","source":{"file":"unix/libtmux_unix.mli","line":198,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Read the report supplied at connection time, or its fresh default. {!Cleanup.inspect} remains available after close."},"signatures":[{"raw":"val cleanup : t -> Cleanup.t","params":[{"name":"arg1","type":"t"}],"returns":"Cleanup.t"}],"slug":"libtmux_unix-client-cleanup"},{"id":"Libtmux_unix.Client.clear_history","publicId":"Libtmux_unix.Client.clear_history","qualifiedName":"Libtmux_unix.Client.clear_history","name":"clear_history","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":745,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Clear stored scrollback for this pane. The visible screen and running\n process remain; later captures cannot recover discarded history. "],"declarations":[{"kind":"function","text":"val clear_history :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":745,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Clear stored scrollback for this pane. The visible screen and running process remain; later captures cannot recover discarded history."},"signatures":[{"raw":"val clear_history :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-clear_history"},{"id":"Libtmux_unix.Client.clear_option_array","publicId":"Libtmux_unix.Client.clear_option_array","qualifiedName":"Libtmux_unix.Client.clear_option_array","name":"clear_option_array","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":465,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set a local empty array, masking inheritance. "],"declarations":[{"kind":"function","text":"val clear_option_array :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":465,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Set a local empty array, masking inheritance."},"signatures":[{"raw":"val clear_option_array :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Options.scope -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-clear_option_array"},{"id":"Libtmux_unix.Client.close","publicId":"Libtmux_unix.Client.close","qualifiedName":"Libtmux_unix.Client.close","name":"close","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":755,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Close owned control clients and descriptors on the owning domain. Later\n calls retain the original cleanup result, including failure. Each owned\n helper gets 200 ms of TERM grace, followed by KILL if needed and reaping.\n This is not a whole-client deadline or a bound on uninterruptible kernel\n work. No signal targets the daemon. tmux's [exit-unattached] and\n [exit-empty] policies can end the daemon after its clients or sessions\n disappear. "],"declarations":[{"kind":"function","text":"val close : t -> (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":755,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Close owned control clients and descriptors on the owning domain. Later calls retain the original cleanup result, including failure. Each owned helper gets 200 ms of TERM grace, followed by KILL if needed and reaping. This is not a whole-client deadline or a bound on uninterruptible kernel work. No signal targets the daemon. tmux's `exit-unattached` and `exit-empty` policies can end the daemon after its clients or sessions disappear."},"signatures":[{"raw":"val close : t -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-close"},{"id":"Libtmux_unix.Client.connect","publicId":"Libtmux_unix.Client.connect","qualifiedName":"Libtmux_unix.Client.connect","name":"connect","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":185,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Attach to an existing local daemon with at least one session. The caller\n and daemon must share the PID namespace and filesystem. A local socket\n pathname alone does not establish these preconditions. [timeout] is the\n maximum seconds per control exchange, defaulting to one second. Requires\n Linux pidfd support. The client belongs to the current domain. Initial and\n auxiliary attachments suppress tmux's [update-environment] behavior. "],"declarations":[{"kind":"function","text":"val connect :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?timeout:float ->\n Libtmux.Endpoint.t ->\n (t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":185,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Attach to an existing local daemon with at least one session. The caller and daemon must share the PID namespace and filesystem. A local socket pathname alone does not establish these preconditions. `timeout` is the maximum seconds per control exchange, defaulting to one second. Requires Linux pidfd support. The client belongs to the current domain. Initial and auxiliary attachments suppress tmux's `update-environment` behavior."},"signatures":[{"raw":"val connect :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?timeout:float -> Libtmux.Endpoint.t -> (t, Libtmux.Error.t) result","params":[{"name":"cleanup","type":"Cleanup.t","optional":true,"keywordOnly":true},{"name":"binary","type":"string","optional":true,"keywordOnly":true},{"name":"timeout","type":"float","optional":true,"keywordOnly":true},{"name":"arg1","type":"Libtmux.Endpoint.t"}],"returns":"(t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-connect"},{"id":"Libtmux_unix.Client.create_session","publicId":"Libtmux_unix.Client.create_session","qualifiedName":"Libtmux_unix.Client.create_session","name":"create_session","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":531,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Create a detached session on the bound daemon. Name collisions fail. "],"declarations":[{"kind":"function","text":"val create_session :\n ?cancel:Cancellation.t ->\n ?window_name:string ->\n ?width:int ->\n ?height:int ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n name:string ->\n unit ->\n (Libtmux.Created.t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":531,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Create a detached session on the bound daemon. Name collisions fail."},"signatures":[{"raw":"val create_session :\n ?cancel:Cancellation.t ->\n ?window_name:string ->\n ?width:int ->\n ?height:int ->\n ?spawn:Libtmux.Spawn.t ->\n t -> name:string -> unit -> (Libtmux.Created.t, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"window_name","type":"string","optional":true,"keywordOnly":true},{"name":"width","type":"int","optional":true,"keywordOnly":true},{"name":"height","type":"int","optional":true,"keywordOnly":true},{"name":"spawn","type":"Libtmux.Spawn.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"name","type":"string","keywordOnly":true},{"name":"arg2","type":"unit"}],"returns":"(Libtmux.Created.t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-create_session"},{"id":"Libtmux_unix.Client.create_window","publicId":"Libtmux_unix.Client.create_window","qualifiedName":"Libtmux_unix.Client.create_window","name":"create_window","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":543,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Create detached, rejecting an occupied explicit index. "],"declarations":[{"kind":"function","text":"val create_window :\n ?cancel:Cancellation.t ->\n ?index:int ->\n ?name:string ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n Libtmux.Session.target ->\n (Libtmux.Created.t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":543,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Create detached, rejecting an occupied explicit index.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet create_window client (initial : Created.t) spawn =\n let created =\n get (Client.create_window client initial.session ~name:\"logs\" ~spawn)\n in\n let window =\n Snapshot.find_window\n (get (Client.capture client))\n (Window.Target.id created.window)\n |> Option.get\n in\n assert (Window.name window = \"logs\");\n Printf.printf \"created: %s\\n\" (Window.name window)\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary create_window\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_create_window.ml","intro":"Create a window. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_create_window.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"created: logs\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val create_window :\n ?cancel:Cancellation.t ->\n ?index:int ->\n ?name:string ->\n ?spawn:Libtmux.Spawn.t ->\n t -> Libtmux.Session.target -> (Libtmux.Created.t, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"name","type":"string","optional":true,"keywordOnly":true},{"name":"spawn","type":"Libtmux.Spawn.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Session.target"}],"returns":"(Libtmux.Created.t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-create_window"},{"id":"Libtmux_unix.Client.cycle_layout","publicId":"Libtmux_unix.Client.cycle_layout","qualifiedName":"Libtmux_unix.Client.cycle_layout","name":"cycle_layout","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":689,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Select the next or previous tmux preset layout for this window. "],"declarations":[{"kind":"function","text":"val cycle_layout :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n [ `Next | `Previous ] ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":689,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Select the next or previous tmux preset layout for this window."},"signatures":[{"raw":"val cycle_layout :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n [ `Next | `Previous ] -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"},{"name":"arg3","type":"[ `Next | `Previous ]"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-cycle_layout"},{"id":"Libtmux_unix.Client.kill_pane","publicId":"Libtmux_unix.Client.kill_pane","qualifiedName":"Libtmux_unix.Client.kill_pane","name":"kill_pane","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":593,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Destroy the target pane and its running process. tmux removes a window\n that becomes empty and may remove its now-empty sessions. "],"declarations":[{"kind":"function","text":"val kill_pane :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":593,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Destroy the target pane and its running process. tmux removes a window that becomes empty and may remove its now-empty sessions."},"signatures":[{"raw":"val kill_pane :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-kill_pane"},{"id":"Libtmux_unix.Client.kill_session","publicId":"Libtmux_unix.Client.kill_session","qualifiedName":"Libtmux_unix.Client.kill_session","name":"kill_session","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":577,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove the session and its window links. Windows with no other links and\n their panes are destroyed. Removing the last session may stop tmux. "],"declarations":[{"kind":"function","text":"val kill_session :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Session.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":577,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Remove the session and its window links. Windows with no other links and their panes are destroyed. Removing the last session may stop tmux."},"signatures":[{"raw":"val kill_session :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Session.target -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Session.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-kill_session"},{"id":"Libtmux_unix.Client.kill_window","publicId":"Libtmux_unix.Client.kill_window","qualifiedName":"Libtmux_unix.Client.kill_window","name":"kill_window","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":585,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Destroy the window, all its session links and every contained pane. This\n acts on the global window, not a single contextual link. "],"declarations":[{"kind":"function","text":"val kill_window :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":585,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Destroy the window, all its session links and every contained pane. This acts on the global window, not a single contextual link."},"signatures":[{"raw":"val kill_window :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Window.target -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-kill_window"},{"id":"Libtmux_unix.Client.link_window","publicId":"Libtmux_unix.Client.link_window","qualifiedName":"Libtmux_unix.Client.link_window","name":"link_window","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":620,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Add a session-specific link to the global window at [index], rejecting an\n occupied index. The source window and its panes stay shared. "],"declarations":[{"kind":"function","text":"val link_window :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n session:Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":620,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Add a session-specific link to the global window at `index`, rejecting an occupied index. The source window and its panes stay shared."},"signatures":[{"raw":"val link_window :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n session:Libtmux.Session.target ->\n index:int -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"},{"name":"session","type":"Libtmux.Session.target","keywordOnly":true},{"name":"index","type":"int","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-link_window"},{"id":"Libtmux_unix.Client.move_pane","publicId":"Libtmux_unix.Client.move_pane","qualifiedName":"Libtmux_unix.Client.move_pane","name":"move_pane","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":697,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Move the source pane beside another pane, optionally setting the split\n size. Both targets must belong to the same bound generation. An emptied\n source window is removed by tmux. "],"declarations":[{"kind":"function","text":"val move_pane :\n ?cancel:Cancellation.t ->\n ?size:Libtmux.Geometry.size ->\n t ->\n Libtmux.Pane.target ->\n beside:Libtmux.Pane.target ->\n direction:Libtmux.Geometry.direction ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":697,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Move the source pane beside another pane, optionally setting the split size. Both targets must belong to the same bound generation. An emptied source window is removed by tmux."},"signatures":[{"raw":"val move_pane :\n ?cancel:Cancellation.t ->\n ?size:Libtmux.Geometry.size ->\n t ->\n Libtmux.Pane.target ->\n beside:Libtmux.Pane.target ->\n direction:Libtmux.Geometry.direction -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"size","type":"Libtmux.Geometry.size","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"beside","type":"Libtmux.Pane.target","keywordOnly":true},{"name":"direction","type":"Libtmux.Geometry.direction","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-move_pane"},{"id":"Libtmux_unix.Client.move_window_at","publicId":"Libtmux_unix.Client.move_window_at","qualifiedName":"Libtmux_unix.Client.move_window_at","name":"move_window_at","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":630,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Move the source session's current link at [from_index]. Destination\n collisions fail. "],"declarations":[{"kind":"function","text":"val move_window_at :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Session.target ->\n from_index:int ->\n session:Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":630,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Move the source session's current link at `from_index`. Destination collisions fail.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet move_window client (initial : Created.t) spawn =\n let moving =\n get (Client.create_window client initial.session ~name:\"build\" ~spawn)\n in\n let destination =\n get\n (Client.create_session client ~name:\"destination\" ~window_name:\"landing\"\n ~spawn ())\n in\n get\n (Client.move_window_at client initial.session\n ~from_index:moving.window_index ~session:destination.session ~index:7);\n let window =\n Snapshot.find_window\n (get (Client.capture client))\n (Window.Target.id moving.window)\n |> Option.get\n in\n let link =\n Query.exactly_one (Iarray.to_seq (Window.links window)) |> Result.get_ok\n in\n assert (Window_link.index link = 7);\n assert (\n Session.Id.equal\n (Session.id (Window_link.session link))\n (Session.Target.id destination.session));\n Printf.printf \"moved: %s at %d\\n\" (Window.name window)\n (Window_link.index link)\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary move_window\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_move_window.ml","intro":"Move a window between sessions. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_move_window.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"moved: build at 7\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val move_window_at :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Session.target ->\n from_index:int ->\n session:Libtmux.Session.target ->\n index:int -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Session.target"},{"name":"from_index","type":"int","keywordOnly":true},{"name":"session","type":"Libtmux.Session.target","keywordOnly":true},{"name":"index","type":"int","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-move_window_at"},{"id":"Libtmux_unix.Client.read_hook","publicId":"Libtmux_unix.Client.read_hook","qualifiedName":"Libtmux_unix.Client.read_hook","name":"read_hook","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":481,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read an exact hook name. Inheritance is included by default; [None] means\n no entry under the selected policy. Missing targets remain errors. "],"declarations":[{"kind":"function","text":"val read_hook :\n ?cancel:Cancellation.t ->\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (Libtmux.Options.value option, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":481,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Read an exact hook name. Inheritance is included by default; `None` means no entry under the selected policy. Missing targets remain errors."},"signatures":[{"raw":"val read_hook :\n ?cancel:Cancellation.t ->\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n string -> (Libtmux.Options.value option, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"include_inherited","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"arg3","type":"string"}],"returns":"(Libtmux.Options.value option, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-read_hook"},{"id":"Libtmux_unix.Client.read_option","publicId":"Libtmux_unix.Client.read_option","qualifiedName":"Libtmux_unix.Client.read_option","name":"read_option","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":428,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read one exact name, including user-option inheritance. [None] means no\n entry under the selected policy. An invalid target remains an error. The\n default follows inheritance; this does not identify the defining parent\n scope. "],"declarations":[{"kind":"function","text":"val read_option :\n ?cancel:Cancellation.t ->\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (Libtmux.Options.value option, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":428,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Read one exact name, including user-option inheritance. `None` means no entry under the selected policy. An invalid target remains an error. The default follows inheritance; this does not identify the defining parent scope."},"signatures":[{"raw":"val read_option :\n ?cancel:Cancellation.t ->\n ?include_inherited:bool ->\n t ->\n Libtmux.Options.scope ->\n string -> (Libtmux.Options.value option, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"include_inherited","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"arg3","type":"string"}],"returns":"(Libtmux.Options.value option, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-read_option"},{"id":"Libtmux_unix.Client.refresh_client_at","publicId":"Libtmux_unix.Client.refresh_client_at","qualifiedName":"Libtmux_unix.Client.refresh_client_at","name":"refresh_client_at","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":333,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Request a redraw; no terminal-rendering completion is implied. "],"declarations":[{"kind":"function","text":"val refresh_client_at :\n ?cancel:Cancellation.t ->\n ?status_only:bool ->\n t ->\n Libtmux.Client_name.t ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":333,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Request a redraw; no terminal-rendering completion is implied."},"signatures":[{"raw":"val refresh_client_at :\n ?cancel:Cancellation.t ->\n ?status_only:bool ->\n t -> Libtmux.Client_name.t -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"status_only","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Client_name.t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-refresh_client_at"},{"id":"Libtmux_unix.Client.remove_environment","publicId":"Libtmux_unix.Client.remove_environment","qualifiedName":"Libtmux_unix.Client.remove_environment","name":"remove_environment","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":408,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Store a removal marker, excluding the variable from future panes. "],"declarations":[{"kind":"function","text":"val remove_environment :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Environment.scope ->\n string ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":408,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Store a removal marker, excluding the variable from future panes."},"signatures":[{"raw":"val remove_environment :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Environment.scope -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Environment.scope"},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-remove_environment"},{"id":"Libtmux_unix.Client.remove_hook","publicId":"Libtmux_unix.Client.remove_hook","qualifiedName":"Libtmux_unix.Client.remove_hook","name":"remove_hook","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":508,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove the local hook or one indexed array entry. An inherited hook may\n become effective again; this does not stop work it already started. "],"declarations":[{"kind":"function","text":"val remove_hook :\n ?cancel:Cancellation.t ->\n ?index:int ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":508,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Remove the local hook or one indexed array entry. An inherited hook may become effective again; this does not stop work it already started."},"signatures":[{"raw":"val remove_hook :\n ?cancel:Cancellation.t ->\n ?index:int ->\n t -> Libtmux.Options.scope -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-remove_hook"},{"id":"Libtmux_unix.Client.rename_session","publicId":"Libtmux_unix.Client.rename_session","qualifiedName":"Libtmux_unix.Client.rename_session","name":"rename_session","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":304,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set the session name, rejecting a conflicting existing name. Bound IDs\n remain usable; existing snapshots retain their captured names. "],"declarations":[{"kind":"function","text":"val rename_session :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Session.target ->\n name:string ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":304,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Set the session name, rejecting a conflicting existing name. Bound IDs remain usable; existing snapshots retain their captured names."},"signatures":[{"raw":"val rename_session :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Session.target -> name:string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Session.target"},{"name":"name","type":"string","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-rename_session"},{"id":"Libtmux_unix.Client.rename_window","publicId":"Libtmux_unix.Client.rename_window","qualifiedName":"Libtmux_unix.Client.rename_window","name":"rename_window","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":295,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set the global window name. Every session link observes the new name on\n its next capture; existing snapshots retain the old value. "],"declarations":[{"kind":"function","text":"val rename_window :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n name:string ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":295,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Set the global window name. Every session link observes the new name on its next capture; existing snapshots retain the old value.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet rename_window client (initial : Created.t) _spawn =\n let before =\n Snapshot.find_window\n (get (Client.capture client))\n (Window.Target.id initial.window)\n |> Option.get\n in\n get (Client.rename_window client initial.window ~name:\"editor-main\");\n let after =\n Snapshot.find_window (get (Client.capture client)) (Window.id before)\n |> Option.get\n in\n assert (Window.name before = \"editor\");\n assert (Window.name after = \"editor-main\");\n Printf.printf \"renamed: %s\\n\" (Window.name after)\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary rename_window\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_rename_window.ml","intro":"Rename a window. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_rename_window.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"renamed: editor-main\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val rename_window :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Window.target -> name:string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"},{"name":"name","type":"string","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-rename_window"},{"id":"Libtmux_unix.Client.request_detach_client_at","publicId":"Libtmux_unix.Client.request_detach_client_at","qualifiedName":"Libtmux_unix.Client.request_detach_client_at","name":"request_detach_client_at","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":324,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Request detachment of the client currently bearing this name. Success\n confirms request processing, not peer exit. Detaching the library's own\n primary lane can lose the response and retire its generation. "],"declarations":[{"kind":"function","text":"val request_detach_client_at :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Client_name.t ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":324,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Request detachment of the client currently bearing this name. Success confirms request processing, not peer exit. Detaching the library's own primary lane can lose the response and retire its generation."},"signatures":[{"raw":"val request_detach_client_at :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Client_name.t -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Client_name.t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-request_detach_client_at"},{"id":"Libtmux_unix.Client.resize_control_client_at","publicId":"Libtmux_unix.Client.resize_control_client_at","qualifiedName":"Libtmux_unix.Client.resize_control_client_at","name":"resize_control_client_at","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":341,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set a control client's reported size. tmux rejects terminal clients. "],"declarations":[{"kind":"function","text":"val resize_control_client_at :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Client_name.t ->\n width:int ->\n height:int ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":341,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Set a control client's reported size. tmux rejects terminal clients."},"signatures":[{"raw":"val resize_control_client_at :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Client_name.t ->\n width:int -> height:int -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Client_name.t"},{"name":"width","type":"int","keywordOnly":true},{"name":"height","type":"int","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-resize_control_client_at"},{"id":"Libtmux_unix.Client.resize_pane","publicId":"Libtmux_unix.Client.resize_pane","qualifiedName":"Libtmux_unix.Client.resize_pane","name":"resize_pane","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":658,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Request positive cell dimensions, supplying at least one dimension. Omit\n either dimension to retain it. tmux can constrain the result to the\n available layout. Capture again to observe the actual dimensions. "],"declarations":[{"kind":"function","text":"val resize_pane :\n ?cancel:Cancellation.t ->\n ?width:int ->\n ?height:int ->\n t ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":658,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Request positive cell dimensions, supplying at least one dimension. Omit either dimension to retain it. tmux can constrain the result to the available layout. Capture again to observe the actual dimensions."},"signatures":[{"raw":"val resize_pane :\n ?cancel:Cancellation.t ->\n ?width:int ->\n ?height:int -> t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"width","type":"int","optional":true,"keywordOnly":true},{"name":"height","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-resize_pane"},{"id":"Libtmux_unix.Client.resize_window","publicId":"Libtmux_unix.Client.resize_window","qualifiedName":"Libtmux_unix.Client.resize_window","name":"resize_window","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":669,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Request positive cell dimensions, supplying at least one dimension. Omit\n either dimension to retain it. Client-size and window-size policies can\n affect subsequent sizing. "],"declarations":[{"kind":"function","text":"val resize_window :\n ?cancel:Cancellation.t ->\n ?width:int ->\n ?height:int ->\n t ->\n Libtmux.Window.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":669,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Request positive cell dimensions, supplying at least one dimension. Omit either dimension to retain it. Client-size and window-size policies can affect subsequent sizing."},"signatures":[{"raw":"val resize_window :\n ?cancel:Cancellation.t ->\n ?width:int ->\n ?height:int -> t -> Libtmux.Window.target -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"width","type":"int","optional":true,"keywordOnly":true},{"name":"height","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-resize_window"},{"id":"Libtmux_unix.Client.respawn_pane","publicId":"Libtmux_unix.Client.respawn_pane","qualifiedName":"Libtmux_unix.Client.respawn_pane","name":"respawn_pane","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":734,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Start the supplied command in the existing pane. A running process causes\n failure unless [kill_running:true] explicitly replaces it. The pane ID\n remains unchanged. "],"declarations":[{"kind":"function","text":"val respawn_pane :\n ?cancel:Cancellation.t ->\n ?kill_running:bool ->\n t ->\n Libtmux.Pane.target ->\n Libtmux.Spawn.t ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":734,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Start the supplied command in the existing pane. A running process causes failure unless `kill_running:true` explicitly replaces it. The pane ID remains unchanged."},"signatures":[{"raw":"val respawn_pane :\n ?cancel:Cancellation.t ->\n ?kill_running:bool ->\n t ->\n Libtmux.Pane.target -> Libtmux.Spawn.t -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"kill_running","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"arg3","type":"Libtmux.Spawn.t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-respawn_pane"},{"id":"Libtmux_unix.Client.rotate_panes","publicId":"Libtmux_unix.Client.rotate_panes","qualifiedName":"Libtmux_unix.Client.rotate_panes","name":"rotate_panes","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":718,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Rotate pane positions in the selected direction. Pane identities and\n running processes remain attached to their panes. "],"declarations":[{"kind":"function","text":"val rotate_panes :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n [ `Forward | `Backward ] ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":718,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Rotate pane positions in the selected direction. Pane identities and running processes remain attached to their panes."},"signatures":[{"raw":"val rotate_panes :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n [ `Backward | `Forward ] -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"},{"name":"arg3","type":"[ `Backward | `Forward ]"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-rotate_panes"},{"id":"Libtmux_unix.Client.run","publicId":"Libtmux_unix.Client.run","qualifiedName":"Libtmux_unix.Client.run","name":"run","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":266,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Submit and await. Use the two calls separately to retain an operation\n handle. "],"declarations":[{"kind":"function","text":"val run :\n ?cancel:Cancellation.t ->\n t ->\n 'a Libtmux.Command.t ->\n ('a, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":266,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Submit and await. Use the two calls separately to retain an operation handle."},"signatures":[{"raw":"val run :\n ?cancel:Cancellation.t ->\n t -> 'a Libtmux.Command.t -> ('a, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"'a Libtmux.Command.t"}],"returns":"('a, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-run"},{"id":"Libtmux_unix.Client.run_hook","publicId":"Libtmux_unix.Client.run_hook","qualifiedName":"Libtmux_unix.Client.run_hook","name":"run_hook","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":518,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Run the effective hook in an explicit session, window or pane context. A\n successful result follows completion of its synchronous command queue.\n Background work started by a hook has its own lifetime. A later hook\n failure returns an uncertain outcome; preceding effects remain. Named [@]\n hooks return [Unsupported] because tmux can hide their parse failures in\n the server log. Configuration and inspection remain available. "],"declarations":[{"kind":"function","text":"val run_hook :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":518,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Run the effective hook in an explicit session, window or pane context. A successful result follows completion of its synchronous command queue. Background work started by a hook has its own lifetime. A later hook failure returns an uncertain outcome; preceding effects remain. Named `@` hooks return `Unsupported` because tmux can hide their parse failures in the server log. Configuration and inspection remain available."},"signatures":[{"raw":"val run_hook :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Options.scope -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-run_hook"},{"id":"Libtmux_unix.Client.select_layout","publicId":"Libtmux_unix.Client.select_layout","qualifiedName":"Libtmux_unix.Client.select_layout","name":"select_layout","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":680,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Apply a preset or validated custom layout to the window. Pane geometry\n follows tmux layout rules; capture again to observe the result. "],"declarations":[{"kind":"function","text":"val select_layout :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target ->\n Libtmux.Layout.t ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":680,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Apply a preset or validated custom layout to the window. Pane geometry follows tmux layout rules; capture again to observe the result.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet set_layout client (initial : Created.t) spawn =\n ignore\n (get\n (Client.split_pane client initial.pane ~direction:Geometry.Right ~spawn));\n ignore\n (get\n (Client.split_pane client initial.pane ~direction:Geometry.Right ~spawn));\n get (Client.select_layout client initial.window Layout.Even_horizontal);\n let window =\n Snapshot.find_window\n (get (Client.capture client))\n (Window.Target.id initial.window)\n |> Option.get\n in\n let panes = Window.panes window in\n assert (Iarray.length panes = 3);\n assert (\n Iarray.for_all\n (fun pane -> Pane.top pane = 0 && Pane.height pane = Window.height window)\n panes);\n assert (\n Iarray.fold_left (fun width pane -> width + Pane.width pane) 2 panes\n = Window.width window);\n print_endline \"layout: 3 horizontal panes\"\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary set_layout\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_layout.ml","intro":"Apply a layout. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_layout.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"layout: 3 horizontal panes\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val select_layout :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Window.target -> Libtmux.Layout.t -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Window.target"},{"name":"arg3","type":"Libtmux.Layout.t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-select_layout"},{"id":"Libtmux_unix.Client.select_pane","publicId":"Libtmux_unix.Client.select_pane","qualifiedName":"Libtmux_unix.Client.select_pane","name":"select_pane","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":641,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Make the pane active in its containing window. This does not open or\n attach a terminal client. "],"declarations":[{"kind":"function","text":"val select_pane :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":641,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Make the pane active in its containing window. This does not open or attach a terminal client."},"signatures":[{"raw":"val select_pane :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-select_pane"},{"id":"Libtmux_unix.Client.select_window_at","publicId":"Libtmux_unix.Client.select_window_at","qualifiedName":"Libtmux_unix.Client.select_window_at","name":"select_window_at","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":601,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Operate on the session's current index at execution, not an old link\n incarnation. "],"declarations":[{"kind":"function","text":"val select_window_at :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":601,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Operate on the session's current index at execution, not an old link incarnation."},"signatures":[{"raw":"val select_window_at :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Session.target -> index:int -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Session.target"},{"name":"index","type":"int","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-select_window_at"},{"id":"Libtmux_unix.Client.send_keys","publicId":"Libtmux_unix.Client.send_keys","qualifiedName":"Libtmux_unix.Client.send_keys","name":"send_keys","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":358,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Send named tmux keys in order, without an implicit Enter. Use {!send_text}\n for literal bytes rather than key interpretation. "],"declarations":[{"kind":"function","text":"val send_keys :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n Libtmux.Key.t list ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":358,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Send named tmux keys in order, without an implicit Enter. Use {!send_text} for literal bytes rather than key interpretation.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet send_keys client (initial : Created.t) _spawn =\n let text = \"literal: $HOME; #{pane_id}\" in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n get (Client.send_text client (Pane.target pane) ~text);\n get (Client.send_keys client (Pane.target pane) [ Key.Enter ]);\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n Printf.printf \"sent: %s\\n\" text\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary send_keys\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_send_keys.ml","intro":"Send literal input and keys. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_send_keys.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"sent: literal: $HOME; #{pane_id}\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val send_keys :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target -> Libtmux.Key.t list -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"arg3","type":"Libtmux.Key.t list"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-send_keys"},{"id":"Libtmux_unix.Client.send_text","publicId":"Libtmux_unix.Client.send_text","qualifiedName":"Libtmux_unix.Client.send_text","name":"send_text","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":350,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Literal bytes, without an implicit Enter. NUL is rejected at admission. "],"declarations":[{"kind":"function","text":"val send_text :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n text:string ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":350,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Literal bytes, without an implicit Enter. NUL is rejected at admission.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet send_keys client (initial : Created.t) _spawn =\n let text = \"literal: $HOME; #{pane_id}\" in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n get (Client.send_text client (Pane.target pane) ~text);\n get (Client.send_keys client (Pane.target pane) [ Key.Enter ]);\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n Printf.printf \"sent: %s\\n\" text\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary send_keys\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_send_keys.ml","intro":"Send literal input and keys. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_send_keys.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"sent: literal: $HOME; #{pane_id}\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val send_text :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Pane.target -> text:string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"text","type":"string","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-send_text"},{"id":"Libtmux_unix.Client.set_environment","publicId":"Libtmux_unix.Client.set_environment","qualifiedName":"Libtmux_unix.Client.set_environment","name":"set_environment","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":387,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set a local environment value for future pane processes. [hidden] defaults\n to false; hidden values remain internal to tmux. Existing processes keep\n their environment. "],"declarations":[{"kind":"function","text":"val set_environment :\n ?cancel:Cancellation.t ->\n ?hidden:bool ->\n t ->\n Libtmux.Environment.scope ->\n name:string ->\n string ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":387,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Set a local environment value for future pane processes. `hidden` defaults to false; hidden values remain internal to tmux. Existing processes keep their environment."},"signatures":[{"raw":"val set_environment :\n ?cancel:Cancellation.t ->\n ?hidden:bool ->\n t ->\n Libtmux.Environment.scope ->\n name:string -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"hidden","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Environment.scope"},{"name":"name","type":"string","keywordOnly":true},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-set_environment"},{"id":"Libtmux_unix.Client.set_hook","publicId":"Libtmux_unix.Client.set_hook","qualifiedName":"Libtmux_unix.Client.set_hook","name":"set_hook","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":491,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set a hook to a nonempty command list. Without an index, replace the whole\n hook array, or fill the lowest free index when appending. An explicit\n [@name] custom hook stores command text as a user option; it requires\n complete replacement and has no array indexes. [read_hook] returns its\n [Libtmux.Options.Text] value; bulk hook capture includes built-ins.\n Commands may cause arbitrary tmux effects when triggered. Hooks that print\n output are outside the supported control transport contract. "],"declarations":[{"kind":"function","text":"val set_hook :\n ?cancel:Cancellation.t ->\n ?index:int ->\n ?append:bool ->\n t ->\n Libtmux.Options.scope ->\n name:string ->\n Libtmux.Hook.command list ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":491,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Set a hook to a nonempty command list. Without an index, replace the whole hook array, or fill the lowest free index when appending. An explicit `@name` custom hook stores command text as a user option; it requires complete replacement and has no array indexes. `read_hook` returns its `Libtmux.Options.Text` value; bulk hook capture includes built-ins. Commands may cause arbitrary tmux effects when triggered. Hooks that print output are outside the supported control transport contract."},"signatures":[{"raw":"val set_hook :\n ?cancel:Cancellation.t ->\n ?index:int ->\n ?append:bool ->\n t ->\n Libtmux.Options.scope ->\n name:string -> Libtmux.Hook.command list -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"append","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"name","type":"string","keywordOnly":true},{"name":"arg3","type":"Libtmux.Hook.command list"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-set_hook"},{"id":"Libtmux_unix.Client.set_option","publicId":"Libtmux_unix.Client.set_option","qualifiedName":"Libtmux_unix.Client.set_option","name":"set_option","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":440,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Validate the scope and scalar kind before admission. Array values require\n an index, or [append:true]. Without an index, tmux splits appended text\n using the option's separator and fills the lowest unused indexes. Text is\n literal; tmux format expansion is disabled. Hooks use a separate\n operation. "],"declarations":[{"kind":"function","text":"val set_option :\n ?cancel:Cancellation.t ->\n ?index:int ->\n ?append:bool ->\n t ->\n Libtmux.Options.scope ->\n name:string ->\n Libtmux.Options.scalar ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":440,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Validate the scope and scalar kind before admission. Array values require an index, or `append:true`. Without an index, tmux splits appended text using the option's separator and fills the lowest unused indexes. Text is literal; tmux format expansion is disabled. Hooks use a separate operation."},"signatures":[{"raw":"val set_option :\n ?cancel:Cancellation.t ->\n ?index:int ->\n ?append:bool ->\n t ->\n Libtmux.Options.scope ->\n name:string -> Libtmux.Options.scalar -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"append","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"name","type":"string","keywordOnly":true},{"name":"arg3","type":"Libtmux.Options.scalar"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-set_option"},{"id":"Libtmux_unix.Client.set_pane_title","publicId":"Libtmux_unix.Client.set_pane_title","qualifiedName":"Libtmux_unix.Client.set_pane_title","name":"set_pane_title","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":649,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Set the pane title as literal text, without tmux format expansion. A\n running terminal application can subsequently replace the title. "],"declarations":[{"kind":"function","text":"val set_pane_title :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n title:string ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":649,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Set the pane title as literal text, without tmux format expansion. A running terminal application can subsequently replace the title."},"signatures":[{"raw":"val set_pane_title :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Pane.target -> title:string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"title","type":"string","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-set_pane_title"},{"id":"Libtmux_unix.Client.signal","publicId":"Libtmux_unix.Client.signal","qualifiedName":"Libtmux_unix.Client.signal","name":"signal","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":371,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Signal a named tmux semaphore, releasing a waiter or retaining the signal\n for a later {!wait_for}. This does not signal an OS process. "],"declarations":[{"kind":"function","text":"val signal :\n ?cancel:Cancellation.t -> t -> string -> (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":371,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Signal a named tmux semaphore, releasing a waiter or retaining the signal for a later {!wait_for}. This does not signal an OS process."},"signatures":[{"raw":"val signal :\n ?cancel:Cancellation.t -> t -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-signal"},{"id":"Libtmux_unix.Client.source","publicId":"Libtmux_unix.Client.source","qualifiedName":"Libtmux_unix.Client.source","name":"source","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":202,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read the retained endpoint, daemon PID and connection generation without\n I/O. "],"declarations":[{"kind":"function","text":"val source : t -> Libtmux.Source.t","source":{"file":"unix/libtmux_unix.mli","line":202,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Read the retained endpoint, daemon PID and connection generation without I/O."},"signatures":[{"raw":"val source : t -> Libtmux.Source.t","params":[{"name":"arg1","type":"t"}],"returns":"Libtmux.Source.t"}],"slug":"libtmux_unix-client-source"},{"id":"Libtmux_unix.Client.split_pane","publicId":"Libtmux_unix.Client.split_pane","qualifiedName":"Libtmux_unix.Client.split_pane","name":"split_pane","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":553,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Create a detached pane beside the target and return the IDs reported by\n tmux. Omitted [size] lets tmux choose the split; tmux rejects splits when\n no space remains. "],"declarations":[{"kind":"function","text":"val split_pane :\n ?cancel:Cancellation.t ->\n ?size:Libtmux.Geometry.size ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n Libtmux.Pane.target ->\n direction:Libtmux.Geometry.direction ->\n (Libtmux.Created.t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":553,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Create a detached pane beside the target and return the IDs reported by tmux. Omitted `size` lets tmux choose the split; tmux rejects splits when no space remains."},"signatures":[{"raw":"val split_pane :\n ?cancel:Cancellation.t ->\n ?size:Libtmux.Geometry.size ->\n ?spawn:Libtmux.Spawn.t ->\n t ->\n Libtmux.Pane.target ->\n direction:Libtmux.Geometry.direction ->\n (Libtmux.Created.t, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"size","type":"Libtmux.Geometry.size","optional":true,"keywordOnly":true},{"name":"spawn","type":"Libtmux.Spawn.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"direction","type":"Libtmux.Geometry.direction","keywordOnly":true}],"returns":"(Libtmux.Created.t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-split_pane"},{"id":"Libtmux_unix.Client.submit","publicId":"Libtmux_unix.Client.submit","qualifiedName":"Libtmux_unix.Client.submit","name":"submit","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":251,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Validate and reserve queue capacity without I/O. "],"declarations":[{"kind":"function","text":"val submit :\n t -> 'a Libtmux.Command.t -> ('a Operation.t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":251,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Validate and reserve queue capacity without I/O."},"signatures":[{"raw":"val submit :\n t -> 'a Libtmux.Command.t -> ('a Operation.t, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"'a Libtmux.Command.t"}],"returns":"('a Operation.t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-submit"},{"id":"Libtmux_unix.Client.subscribe","publicId":"Libtmux_unix.Client.subscribe","qualifiedName":"Libtmux_unix.Client.subscribe","name":"subscribe","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":209,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Acquire verified coverage of the pane's observed session/window. Choose\n the least session ID unless explicitly supplied. Reuse one lane per\n session. Defaults: 1 MiB and 1024 queued events per subscriber; at most 16\n subscribers and eight client lanes including commands. Reserve payload\n against the shared 32 MiB budget before admission.\n\n Queue capacities remain reserved while empty. Captures and reads need\n additional scratch space; their admission can return\n {!Libtmux.Error.Capacity} below the subscriber-count limit. See the\n {{:https://github.com/libtmux/libtmux-ocaml/blob/master/docs/streaming.md#plan-shared-capacity}shared\n capacity guide} for the combined reservations and process slots.\n\n Data starts after admission's marker. Layout/membership changes end\n continuity conservatively. Overflow emits Gap then End, without blocking\n another subscriber. Blocking delivery advances during Subscription.next.\n There is no snapshot/history barrier or automatic recovery. "],"declarations":[{"kind":"function","text":"val subscribe :\n ?session:Libtmux.Session.target ->\n ?capacity_bytes:int ->\n ?capacity_events:int ->\n t ->\n Libtmux.Pane.t ->\n (Subscription.t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":209,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Acquire verified coverage of the pane's observed session/window. Choose the least session ID unless explicitly supplied. Reuse one lane per session. Defaults: 1 MiB and 1024 queued events per subscriber; at most 16 subscribers and eight client lanes including commands. Reserve payload against the shared 32 MiB budget before admission.","body":"Queue capacities remain reserved while empty. Captures and reads need additional scratch space; their admission can return {!Libtmux.Error.Capacity} below the subscriber-count limit. See the [shared capacity guide](https://github.com/libtmux/libtmux-ocaml/blob/master/docs/streaming.md#plan-shared-capacity) for the combined reservations and process slots.\n\nData starts after admission's marker. Layout/membership changes end continuity conservatively. Overflow emits Gap then End, without blocking another subscriber. Blocking delivery advances during Subscription.next. There is no snapshot/history barrier or automatic recovery."},"signatures":[{"raw":"val subscribe :\n ?session:Libtmux.Session.target ->\n ?capacity_bytes:int ->\n ?capacity_events:int ->\n t -> Libtmux.Pane.t -> (Subscription.t, Libtmux.Error.t) result","params":[{"name":"session","type":"Libtmux.Session.target","optional":true,"keywordOnly":true},{"name":"capacity_bytes","type":"int","optional":true,"keywordOnly":true},{"name":"capacity_events","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.t"}],"returns":"(Subscription.t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-subscribe"},{"id":"Libtmux_unix.Client.swap_panes","publicId":"Libtmux_unix.Client.swap_panes","qualifiedName":"Libtmux_unix.Client.swap_panes","name":"swap_panes","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":709,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Exchange pane positions without exchanging their identities or running\n processes. Both targets must belong to the same bound generation. "],"declarations":[{"kind":"function","text":"val swap_panes :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":709,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Exchange pane positions without exchanging their identities or running processes. Both targets must belong to the same bound generation."},"signatures":[{"raw":"val swap_panes :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"},{"name":"arg3","type":"Libtmux.Pane.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-swap_panes"},{"id":"Libtmux_unix.Client.switch_client_at","publicId":"Libtmux_unix.Client.switch_client_at","qualifiedName":"Libtmux_unix.Client.switch_client_at","name":"switch_client_at","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":313,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Switch the client currently bearing this name to the bound session.\n Environment updates are disabled by default. This can move either a\n terminal client or a control client; it does not open a new terminal. "],"declarations":[{"kind":"function","text":"val switch_client_at :\n ?cancel:Cancellation.t ->\n ?update_environment:bool ->\n t ->\n Libtmux.Client_name.t ->\n session:Libtmux.Session.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":313,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Switch the client currently bearing this name to the bound session. Environment updates are disabled by default. This can move either a terminal client or a control client; it does not open a new terminal."},"signatures":[{"raw":"val switch_client_at :\n ?cancel:Cancellation.t ->\n ?update_environment:bool ->\n t ->\n Libtmux.Client_name.t ->\n session:Libtmux.Session.target -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"update_environment","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Client_name.t"},{"name":"session","type":"Libtmux.Session.target","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-switch_client_at"},{"id":"Libtmux_unix.Client.t","publicId":"Libtmux_unix.Client.t","qualifiedName":"Libtmux_unix.Client.t","name":"t","kind":"typealias","package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":183,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"unix/libtmux_unix.mli","line":183,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux_unix-client-t"},{"id":"Libtmux_unix.Client.unlink_window_at","publicId":"Libtmux_unix.Client.unlink_window_at","qualifiedName":"Libtmux_unix.Client.unlink_window_at","name":"unlink_window_at","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":610,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Without [allow_kill], tmux rejects removal of the last link to a window.\n "],"declarations":[{"kind":"function","text":"val unlink_window_at :\n ?cancel:Cancellation.t ->\n ?allow_kill:bool ->\n t ->\n Libtmux.Session.target ->\n index:int ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":610,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Without `allow_kill`, tmux rejects removal of the last link to a window."},"signatures":[{"raw":"val unlink_window_at :\n ?cancel:Cancellation.t ->\n ?allow_kill:bool ->\n t -> Libtmux.Session.target -> index:int -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"allow_kill","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Session.target"},{"name":"index","type":"int","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-unlink_window_at"},{"id":"Libtmux_unix.Client.unset_environment","publicId":"Libtmux_unix.Client.unset_environment","qualifiedName":"Libtmux_unix.Client.unset_environment","name":"unset_environment","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":399,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove the local entry, allowing a global value to apply to future panes.\n "],"declarations":[{"kind":"function","text":"val unset_environment :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Environment.scope ->\n string ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":399,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Remove the local entry, allowing a global value to apply to future panes."},"signatures":[{"raw":"val unset_environment :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Environment.scope -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Environment.scope"},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-unset_environment"},{"id":"Libtmux_unix.Client.unset_option","publicId":"Libtmux_unix.Client.unset_option","qualifiedName":"Libtmux_unix.Client.unset_option","name":"unset_option","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":455,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove a local override or one array element. Global built-ins reset to\n their tmux defaults; this does not recursively unset child overrides. "],"declarations":[{"kind":"function","text":"val unset_option :\n ?cancel:Cancellation.t ->\n ?index:int ->\n t ->\n Libtmux.Options.scope ->\n string ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":455,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Remove a local override or one array element. Global built-ins reset to their tmux defaults; this does not recursively unset child overrides."},"signatures":[{"raw":"val unset_option :\n ?cancel:Cancellation.t ->\n ?index:int ->\n t -> Libtmux.Options.scope -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"index","type":"int","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Options.scope"},{"name":"arg3","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-unset_option"},{"id":"Libtmux_unix.Client.version","publicId":"Libtmux_unix.Client.version","qualifiedName":"Libtmux_unix.Client.version","name":"version","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":206,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Read the bound daemon's observed version without I/O. "],"declarations":[{"kind":"function","text":"val version : t -> string","source":{"file":"unix/libtmux_unix.mli","line":206,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Read the bound daemon's observed version without I/O."},"signatures":[{"raw":"val version : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux_unix-client-version"},{"id":"Libtmux_unix.Client.wait_for","publicId":"Libtmux_unix.Client.wait_for","qualifiedName":"Libtmux_unix.Client.wait_for","name":"wait_for","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":367,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Wait on a named tmux semaphore using a dedicated bound lane. "],"declarations":[{"kind":"function","text":"val wait_for :\n ?cancel:Cancellation.t -> t -> string -> (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":367,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Wait on a named tmux semaphore using a dedicated bound lane."},"signatures":[{"raw":"val wait_for :\n ?cancel:Cancellation.t -> t -> string -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"string"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-wait_for"},{"id":"Libtmux_unix.Client.wait_for_text","publicId":"Libtmux_unix.Client.wait_for_text","qualifiedName":"Libtmux_unix.Client.wait_for_text","name":"wait_for_text","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":233,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Subscribe, capture the ordinary screen immediately, and recapture after\n output. Membership/overflow gaps trigger explicit fresh capture and new\n coverage in the same binding. Maximum pattern: 64 KiB. Success returns a\n capture that contains the text. Transient text between captures may be\n missed. Check the deadline between bounded acquisitions; in-flight I/O\n retains the client's exchange timeout. Release the temporary subscription\n without replacing an earlier error or cancellation; inspect {!cleanup} for\n secondary failures. Otherwise cleanup failure prevents success or renewed\n coverage. No capture/stream barrier exists. "],"declarations":[{"kind":"function","text":"val wait_for_text :\n ?cancel:Cancellation.t ->\n ?timeout:float ->\n ?scratch_dir:string ->\n t ->\n Libtmux.Pane.t ->\n text:string ->\n (Rendered.t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":233,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Subscribe, capture the ordinary screen immediately, and recapture after output. Membership/overflow gaps trigger explicit fresh capture and new coverage in the same binding. Maximum pattern: 64 KiB. Success returns a capture that contains the text. Transient text between captures may be missed. Check the deadline between bounded acquisitions; in-flight I/O retains the client's exchange timeout. Release the temporary subscription without replacing an earlier error or cancellation; inspect {!cleanup} for secondary failures. Otherwise cleanup failure prevents success or renewed coverage. No capture/stream barrier exists."},"signatures":[{"raw":"val wait_for_text :\n ?cancel:Cancellation.t ->\n ?timeout:float ->\n ?scratch_dir:string ->\n t -> Libtmux.Pane.t -> text:string -> (Rendered.t, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"timeout","type":"float","optional":true,"keywordOnly":true},{"name":"scratch_dir","type":"string","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.t"},{"name":"text","type":"string","keywordOnly":true}],"returns":"(Rendered.t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-wait_for_text"},{"id":"Libtmux_unix.Client.zoom_pane","publicId":"Libtmux_unix.Client.zoom_pane","qualifiedName":"Libtmux_unix.Client.zoom_pane","name":"zoom_pane","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":727,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Toggle the window's zoom state around this pane. "],"declarations":[{"kind":"function","text":"val zoom_pane :\n ?cancel:Cancellation.t ->\n t ->\n Libtmux.Pane.target ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":727,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Client","doc":{"summary":"Toggle the window's zoom state around this pane."},"signatures":[{"raw":"val zoom_pane :\n ?cancel:Cancellation.t ->\n t -> Libtmux.Pane.target -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Pane.target"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-client-zoom_pane"},{"id":"Libtmux_unix.Operation","publicId":"Libtmux_unix.Operation","qualifiedName":"Libtmux_unix.Operation","name":"Operation","kind":"module","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":112,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" A retained admitted command. A cancelled waiter does not erase its eventual\n success, failure or uncertainty. "],"declarations":[{"kind":"module","text":"module Operation : sig\n type 'a t\n\n type cleanup_receipt = {\n cause : Libtmux.Error.t;\n owned_buffers : string list;\n created : Libtmux.Created.t list;\n }\n (** [created] retains IDs reported before a later hook or completion failure.\n It does not prove those resources still exist or authorize retry. *)\n\n type 'a state =\n | Queued\n | Not_started\n | Written\n | Acknowledged\n | Finished of ('a, Libtmux.Error.t) result\n | Outcome_unknown of cleanup_receipt\n\n val id : 'a t -> string\n\n val inspect : 'a t -> ('a state, Libtmux.Error.t) result\n (** No I/O. Results remain inspectable after client closure, on the owning\n domain. *)\n\n val cancel : 'a t -> (unit, Libtmux.Error.t) result\n (** Remove queued work before it is written. Admitted commands retain their\n owner and are drained by {!Client.await}; cancellation does not undo\n effects. Returns [Busy] while another blocking caller owns the client; use\n a {!Cancellation.t} token to interrupt that caller. *)\nend","source":{"file":"unix/libtmux_unix.mli","line":112,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix","doc":{"summary":"A retained admitted command. A cancelled waiter does not erase its eventual success, failure or uncertainty."},"slug":"libtmux_unix-operation"},{"id":"Libtmux_unix.Operation.cancel","publicId":"Libtmux_unix.Operation.cancel","qualifiedName":"Libtmux_unix.Operation.cancel","name":"cancel","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":137,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove queued work before it is written. Admitted commands retain their\n owner and are drained by {!Client.await}; cancellation does not undo\n effects. Returns [Busy] while another blocking caller owns the client; use\n a {!Cancellation.t} token to interrupt that caller. "],"declarations":[{"kind":"function","text":"val cancel : 'a t -> (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":137,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation","doc":{"summary":"Remove queued work before it is written. Admitted commands retain their owner and are drained by {!Client.await}; cancellation does not undo effects. Returns `Busy` while another blocking caller owns the client; use a {!Cancellation.t} token to interrupt that caller."},"signatures":[{"raw":"val cancel : 'a t -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"'a t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-operation-cancel"},{"id":"Libtmux_unix.Operation.cleanup_receipt","publicId":"Libtmux_unix.Operation.cleanup_receipt","qualifiedName":"Libtmux_unix.Operation.cleanup_receipt","name":"cleanup_receipt","kind":"struct","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":115,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" [created] retains IDs reported before a later hook or completion failure.\n It does not prove those resources still exist or authorize retry. "],"declarations":[{"kind":"struct","text":"type cleanup_receipt = {\n cause : Libtmux.Error.t;\n owned_buffers : string list;\n created : Libtmux.Created.t list;\n }","source":{"file":"unix/libtmux_unix.mli","line":115,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation","doc":{"summary":"`created` retains IDs reported before a later hook or completion failure. It does not prove those resources still exist or authorize retry."},"signatures":[{"raw":"type cleanup_receipt =\n {\n cause: Libtmux.Error.t ;\n owned_buffers: string list ;\n created: Libtmux.Created.t list }","params":[]}],"slug":"libtmux_unix-operation-cleanup_receipt"},{"id":"Libtmux_unix.Operation.cleanup_receipt.cause","publicId":"Libtmux_unix.Operation.cleanup_receipt.cause","name":"cause","kind":"attribute","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":116,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"cause : Libtmux.Error.t;","source":{"file":"unix/libtmux_unix.mli","line":116,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation.cleanup_receipt","type":"Libtmux.Error.t","qualifiedName":"Libtmux_unix.Operation.cause","slug":"libtmux_unix-operation-cleanup_receipt-cause"},{"id":"Libtmux_unix.Operation.cleanup_receipt.created","publicId":"Libtmux_unix.Operation.cleanup_receipt.created","name":"created","kind":"attribute","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":118,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"created : Libtmux.Created.t list;","source":{"file":"unix/libtmux_unix.mli","line":118,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation.cleanup_receipt","type":"Libtmux.Created.t list","qualifiedName":"Libtmux_unix.Operation.created","slug":"libtmux_unix-operation-cleanup_receipt-created"},{"id":"Libtmux_unix.Operation.cleanup_receipt.owned_buffers","publicId":"Libtmux_unix.Operation.cleanup_receipt.owned_buffers","name":"owned_buffers","kind":"attribute","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":117,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"owned_buffers : string list;","source":{"file":"unix/libtmux_unix.mli","line":117,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation.cleanup_receipt","type":"string list","qualifiedName":"Libtmux_unix.Operation.owned_buffers","slug":"libtmux_unix-operation-cleanup_receipt-owned_buffers"},{"id":"Libtmux_unix.Operation.id","publicId":"Libtmux_unix.Operation.id","qualifiedName":"Libtmux_unix.Operation.id","name":"id","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":131,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val id : 'a t -> string","source":{"file":"unix/libtmux_unix.mli","line":131,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation","signatures":[{"raw":"val id : 'a t -> string","params":[{"name":"arg1","type":"'a t"}],"returns":"string"}],"slug":"libtmux_unix-operation-id"},{"id":"Libtmux_unix.Operation.inspect","publicId":"Libtmux_unix.Operation.inspect","qualifiedName":"Libtmux_unix.Operation.inspect","name":"inspect","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":133,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" No I/O. Results remain inspectable after client closure, on the owning\n domain. "],"declarations":[{"kind":"function","text":"val inspect : 'a t -> ('a state, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":133,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation","doc":{"summary":"No I/O. Results remain inspectable after client closure, on the owning domain."},"signatures":[{"raw":"val inspect : 'a t -> ('a state, Libtmux.Error.t) result","params":[{"name":"arg1","type":"'a t"}],"returns":"('a state, Libtmux.Error.t) result"}],"slug":"libtmux_unix-operation-inspect"},{"id":"Libtmux_unix.Operation.state","publicId":"Libtmux_unix.Operation.state","qualifiedName":"Libtmux_unix.Operation.state","name":"state","kind":"enum","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":123,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type 'a state =\n | Queued\n | Not_started\n | Written\n | Acknowledged\n | Finished of ('a, Libtmux.Error.t) result\n | Outcome_unknown of cleanup_receipt","source":{"file":"unix/libtmux_unix.mli","line":123,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation","signatures":[{"raw":"type 'a state =\n | Queued \n | Not_started \n | Written \n | Acknowledged \n | Finished of ('a, Libtmux.Error.t) result \n | Outcome_unknown of cleanup_receipt ","params":[]}],"slug":"libtmux_unix-operation-state"},{"id":"Libtmux_unix.Operation.state.Acknowledged","publicId":"Libtmux_unix.Operation.state.Acknowledged","name":"Acknowledged","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":127,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Acknowledged","source":{"file":"unix/libtmux_unix.mli","line":127,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation.state","variant":"unit","qualifiedName":"Libtmux_unix.Operation.Acknowledged","slug":"libtmux_unix-operation-state-acknowledged"},{"id":"Libtmux_unix.Operation.state.Finished","publicId":"Libtmux_unix.Operation.state.Finished","name":"Finished","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":128,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Finished of ('a, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":128,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation.state","variant":"tuple","qualifiedName":"Libtmux_unix.Operation.Finished","slug":"libtmux_unix-operation-state-finished"},{"id":"Libtmux_unix.Operation.state.Not_started","publicId":"Libtmux_unix.Operation.state.Not_started","name":"Not_started","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":125,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Not_started","source":{"file":"unix/libtmux_unix.mli","line":125,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation.state","variant":"unit","qualifiedName":"Libtmux_unix.Operation.Not_started","slug":"libtmux_unix-operation-state-not_started"},{"id":"Libtmux_unix.Operation.state.Outcome_unknown","publicId":"Libtmux_unix.Operation.state.Outcome_unknown","name":"Outcome_unknown","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":129,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Outcome_unknown of cleanup_receipt","source":{"file":"unix/libtmux_unix.mli","line":129,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation.state","variant":"tuple","qualifiedName":"Libtmux_unix.Operation.Outcome_unknown","slug":"libtmux_unix-operation-state-outcome_unknown"},{"id":"Libtmux_unix.Operation.state.Queued","publicId":"Libtmux_unix.Operation.state.Queued","name":"Queued","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":124,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Queued","source":{"file":"unix/libtmux_unix.mli","line":124,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation.state","variant":"unit","qualifiedName":"Libtmux_unix.Operation.Queued","slug":"libtmux_unix-operation-state-queued"},{"id":"Libtmux_unix.Operation.state.Written","publicId":"Libtmux_unix.Operation.state.Written","name":"Written","kind":"constant","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":126,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Written","source":{"file":"unix/libtmux_unix.mli","line":126,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation.state","variant":"unit","qualifiedName":"Libtmux_unix.Operation.Written","slug":"libtmux_unix-operation-state-written"},{"id":"Libtmux_unix.Operation.t","publicId":"Libtmux_unix.Operation.t","qualifiedName":"Libtmux_unix.Operation.t","name":"t","kind":"typealias","package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":113,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type 'a t","source":{"file":"unix/libtmux_unix.mli","line":113,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Operation","signatures":[{"raw":"type 'a t","params":[]}],"modifiers":["opaque"],"slug":"libtmux_unix-operation-t"},{"id":"Libtmux_unix.Rendered","publicId":"Libtmux_unix.Rendered","qualifiedName":"Libtmux_unix.Rendered","name":"Rendered","kind":"module","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":60,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Blocking native Linux transport. No Eio scheduler is started. "],"declarations":[{"kind":"module","text":"module Rendered = Libtmux.Captured_text","source":{"file":"unix/libtmux_unix.mli","line":60,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix","doc":{"summary":"Blocking native Linux transport. No Eio scheduler is started."},"exportedFrom":"Libtmux.Captured_text","slug":"libtmux_unix-rendered"},{"id":"Libtmux_unix.Subscription","publicId":"Libtmux_unix.Subscription","qualifiedName":"Libtmux_unix.Subscription","name":"Subscription","kind":"module","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":146,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Bounded future-byte observation with Data/Gap/End and local cursors. Polling\n is local; waiting and admission belong to the backend. "],"declarations":[{"kind":"module","text":"module Subscription : sig\n type t\n\n val poll : t -> (Libtmux.Output.event option, Libtmux.Error.t) result\n (** Remove a queued event without I/O. Owning domain only, including after\n client closure. [None] means no queued event, not proof of continuity. *)\n\n val next :\n ?cancel:Cancellation.t ->\n ?timeout:float ->\n t ->\n (Libtmux.Output.event option, Libtmux.Error.t) result\n (** Pump all subscription lanes until one event is available. Default deadline\n is one second. [None] follows a consumed End. A deadline keeps the\n subscription active; cancellation closes it and raises Cancelled. *)\n\n val close : t -> (unit, Libtmux.Error.t) result\n (** End an active subscription with Cancelled and discard pending data.\n Preserve an already ended subscription's terminal reason. Release and reap\n an unused lane; later calls retain cleanup failures. Does not stop the\n daemon. {!poll} can still read the terminal event. *)\n\n val wait_for_bytes :\n ?cancel:Cancellation.t ->\n ?timeout:float ->\n t ->\n text:string ->\n (Libtmux.Output.cursor, Libtmux.Output.wait_error) result\n (** Consume future bytes until the nonempty pattern matches, including across\n Data boundaries. Maximum pattern: 64 KiB. Return the cursor at the match's\n end within its consumed event. Gaps stop matching; no rendered or earlier\n output is searched. Timeout leaves the subscription active. *)\nend","source":{"file":"unix/libtmux_unix.mli","line":146,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix","doc":{"summary":"Bounded future-byte observation with Data/Gap/End and local cursors. Polling is local; waiting and admission belong to the backend."},"slug":"libtmux_unix-subscription"},{"id":"Libtmux_unix.Subscription.close","publicId":"Libtmux_unix.Subscription.close","qualifiedName":"Libtmux_unix.Subscription.close","name":"close","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":162,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" End an active subscription with Cancelled and discard pending data.\n Preserve an already ended subscription's terminal reason. Release and reap\n an unused lane; later calls retain cleanup failures. Does not stop the\n daemon. {!poll} can still read the terminal event. "],"declarations":[{"kind":"function","text":"val close : t -> (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":162,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Subscription","doc":{"summary":"End an active subscription with Cancelled and discard pending data. Preserve an already ended subscription's terminal reason. Release and reap an unused lane; later calls retain cleanup failures. Does not stop the daemon. {!poll} can still read the terminal event."},"signatures":[{"raw":"val close : t -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-subscription-close"},{"id":"Libtmux_unix.Subscription.next","publicId":"Libtmux_unix.Subscription.next","qualifiedName":"Libtmux_unix.Subscription.next","name":"next","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":153,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Pump all subscription lanes until one event is available. Default deadline\n is one second. [None] follows a consumed End. A deadline keeps the\n subscription active; cancellation closes it and raises Cancelled. "],"declarations":[{"kind":"function","text":"val next :\n ?cancel:Cancellation.t ->\n ?timeout:float ->\n t ->\n (Libtmux.Output.event option, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":153,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Subscription","doc":{"summary":"Pump all subscription lanes until one event is available. Default deadline is one second. `None` follows a consumed End. A deadline keeps the subscription active; cancellation closes it and raises Cancelled."},"signatures":[{"raw":"val next :\n ?cancel:Cancellation.t ->\n ?timeout:float ->\n t -> (Libtmux.Output.event option, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"timeout","type":"float","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"}],"returns":"(Libtmux.Output.event option, Libtmux.Error.t) result"}],"slug":"libtmux_unix-subscription-next"},{"id":"Libtmux_unix.Subscription.poll","publicId":"Libtmux_unix.Subscription.poll","qualifiedName":"Libtmux_unix.Subscription.poll","name":"poll","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":149,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Remove a queued event without I/O. Owning domain only, including after\n client closure. [None] means no queued event, not proof of continuity. "],"declarations":[{"kind":"function","text":"val poll : t -> (Libtmux.Output.event option, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":149,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Subscription","doc":{"summary":"Remove a queued event without I/O. Owning domain only, including after client closure. `None` means no queued event, not proof of continuity."},"signatures":[{"raw":"val poll : t -> (Libtmux.Output.event option, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"}],"returns":"(Libtmux.Output.event option, Libtmux.Error.t) result"}],"slug":"libtmux_unix-subscription-poll"},{"id":"Libtmux_unix.Subscription.t","publicId":"Libtmux_unix.Subscription.t","qualifiedName":"Libtmux_unix.Subscription.t","name":"t","kind":"typealias","package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":147,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"unix/libtmux_unix.mli","line":147,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Subscription","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux_unix-subscription-t"},{"id":"Libtmux_unix.Subscription.wait_for_bytes","publicId":"Libtmux_unix.Subscription.wait_for_bytes","qualifiedName":"Libtmux_unix.Subscription.wait_for_bytes","name":"wait_for_bytes","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":168,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Consume future bytes until the nonempty pattern matches, including across\n Data boundaries. Maximum pattern: 64 KiB. Return the cursor at the match's\n end within its consumed event. Gaps stop matching; no rendered or earlier\n output is searched. Timeout leaves the subscription active. "],"declarations":[{"kind":"function","text":"val wait_for_bytes :\n ?cancel:Cancellation.t ->\n ?timeout:float ->\n t ->\n text:string ->\n (Libtmux.Output.cursor, Libtmux.Output.wait_error) result","source":{"file":"unix/libtmux_unix.mli","line":168,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Subscription","doc":{"summary":"Consume future bytes until the nonempty pattern matches, including across Data boundaries. Maximum pattern: 64 KiB. Return the cursor at the match's end within its consumed event. Gaps stop matching; no rendered or earlier output is searched. Timeout leaves the subscription active."},"signatures":[{"raw":"val wait_for_bytes :\n ?cancel:Cancellation.t ->\n ?timeout:float ->\n t ->\n text:string -> (Libtmux.Output.cursor, Libtmux.Output.wait_error) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"timeout","type":"float","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"},{"name":"text","type":"string","keywordOnly":true}],"returns":"(Libtmux.Output.cursor, Libtmux.Output.wait_error) result"}],"slug":"libtmux_unix-subscription-wait_for_bytes"},{"id":"Libtmux_unix.Terminal","publicId":"Libtmux_unix.Terminal","qualifiedName":"Libtmux_unix.Terminal","name":"Terminal","kind":"module","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":81,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Interactive attachment using borrowed application streams. This utility\n addresses the current daemon explicitly and does not reuse captured targets.\n"],"declarations":[{"kind":"module","text":"module Terminal : sig\n val attach_current :\n ?cancel:Cancellation.t ->\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?read_only:bool ->\n ?update_environment:bool ->\n ?stdin:Unix.file_descr ->\n ?stdout:Unix.file_descr ->\n ?stderr:Unix.file_descr ->\n Libtmux.Endpoint.t ->\n session:Libtmux.Session.Id.t ->\n (unit, Libtmux.Error.t) result\n (** Run an interactive terminal client until it exits. Select the exact\n session ID on the daemon currently listening at [endpoint]; this is\n explicitly unbound and accepts no captured target. No retry or daemon\n startup occurs. A successful result proves client exit, not continued\n attachment. Diagnostics go to [stderr].\n\n Descriptors default to the application's standard streams and remain\n caller-owned. [stdin] must be a terminal. Environment updates and\n read-only mode are disabled by default; inherited [TMUX] and [TMUX_PANE]\n are removed. Cancellation terminates and reaps this terminal client,\n leaves the daemon running, then raises {!Cancellation.Cancelled}. TERM\n gets 200 ms of cooperative grace before KILL and reaping. Scheduling and\n uninterruptible kernel work can add time. Supply [cleanup] before the call\n to retain secondary failures after cancellation. *)\nend","source":{"file":"unix/libtmux_unix.mli","line":81,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix","doc":{"summary":"Interactive attachment using borrowed application streams. This utility addresses the current daemon explicitly and does not reuse captured targets."},"slug":"libtmux_unix-terminal"},{"id":"Libtmux_unix.Terminal.attach_current","publicId":"Libtmux_unix.Terminal.attach_current","qualifiedName":"Libtmux_unix.Terminal.attach_current","name":"attach_current","kind":"function","modifiers":[],"package":"libtmux-unix","product":"core","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":82,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Run an interactive terminal client until it exits. Select the exact\n session ID on the daemon currently listening at [endpoint]; this is\n explicitly unbound and accepts no captured target. No retry or daemon\n startup occurs. A successful result proves client exit, not continued\n attachment. Diagnostics go to [stderr].\n\n Descriptors default to the application's standard streams and remain\n caller-owned. [stdin] must be a terminal. Environment updates and\n read-only mode are disabled by default; inherited [TMUX] and [TMUX_PANE]\n are removed. Cancellation terminates and reaps this terminal client,\n leaves the daemon running, then raises {!Cancellation.Cancelled}. TERM\n gets 200 ms of cooperative grace before KILL and reaping. Scheduling and\n uninterruptible kernel work can add time. Supply [cleanup] before the call\n to retain secondary failures after cancellation. "],"declarations":[{"kind":"function","text":"val attach_current :\n ?cancel:Cancellation.t ->\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?read_only:bool ->\n ?update_environment:bool ->\n ?stdin:Unix.file_descr ->\n ?stdout:Unix.file_descr ->\n ?stderr:Unix.file_descr ->\n Libtmux.Endpoint.t ->\n session:Libtmux.Session.Id.t ->\n (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":82,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Terminal","doc":{"summary":"Run an interactive terminal client until it exits. Select the exact session ID on the daemon currently listening at `endpoint`; this is explicitly unbound and accepts no captured target. No retry or daemon startup occurs. A successful result proves client exit, not continued attachment. Diagnostics go to `stderr`.","body":"Descriptors default to the application's standard streams and remain caller-owned. `stdin` must be a terminal. Environment updates and read-only mode are disabled by default; inherited `TMUX` and `TMUX_PANE` are removed. Cancellation terminates and reaps this terminal client, leaves the daemon running, then raises {!Cancellation.Cancelled}. TERM gets 200 ms of cooperative grace before KILL and reaping. Scheduling and uninterruptible kernel work can add time. Supply `cleanup` before the call to retain secondary failures after cancellation."},"signatures":[{"raw":"val attach_current :\n ?cancel:Cancellation.t ->\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?read_only:bool ->\n ?update_environment:bool ->\n ?stdin:Unix.file_descr ->\n ?stdout:Unix.file_descr ->\n ?stderr:Unix.file_descr ->\n Libtmux.Endpoint.t ->\n session:Libtmux.Session.Id.t -> (unit, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"cleanup","type":"Cleanup.t","optional":true,"keywordOnly":true},{"name":"binary","type":"string","optional":true,"keywordOnly":true},{"name":"read_only","type":"bool","optional":true,"keywordOnly":true},{"name":"update_environment","type":"bool","optional":true,"keywordOnly":true},{"name":"stdin","type":"Unix.file_descr","optional":true,"keywordOnly":true},{"name":"stdout","type":"Unix.file_descr","optional":true,"keywordOnly":true},{"name":"stderr","type":"Unix.file_descr","optional":true,"keywordOnly":true},{"name":"arg1","type":"Libtmux.Endpoint.t"},{"name":"session","type":"Libtmux.Session.Id.t","keywordOnly":true}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-terminal-attach_current"},{"id":"Libtmux_unix.Workspace","publicId":"Libtmux_unix.Workspace","qualifiedName":"Libtmux_unix.Workspace","name":"Workspace","kind":"module","modifiers":[],"package":"libtmux-unix","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":768,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Apply validated plans with blocking I/O and scoped cancellation tokens.\n Execution handles retain journals and borrow existing clients; bootstrap\n handles own their newly bound clients without owning the daemon. "],"declarations":[{"kind":"module","text":"module Workspace : sig\n type t\n\n val submit :\n Client.t -> Libtmux_workspace.Plan.t -> (t, Libtmux.Error.t) result\n (** Allocate a generation-bound execution handle without I/O. The caller owns\n the supplied client; closing this handle leaves that client open. *)\n\n val submit_bootstrap :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?timeout:float ->\n Libtmux_workspace.Plan.t ->\n (t, Libtmux.Error.t) result\n (** Allocate a handle for a missing-endpoint plan. Awaiting it starts control\n new-session and binds the same connection. The handle owns its new client;\n it never acquires ownership of the daemon. *)\n\n val await :\n ?cancel:Cancellation.t ->\n ?compensate_on_failure:bool ->\n t ->\n (Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result\n (** Expected apply failures are retained receipts. Cancellation propagates\n after recording progress and at most 500 ms of protected compensation. *)\n\n val inspect :\n t -> (Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result\n\n val client : t -> Client.t option\n (** Borrow the existing or bootstrapped {!Client.t} without I/O for subsequent\n actions or recovery. {!close} releases a client owned by this workspace\n execution handle. *)\n\n val close : t -> (unit, Libtmux.Error.t) result\n (** Release an owned client through {!Client.close}. Active await returns\n Busy. Completed journals remain readable after close. *)\nend","source":{"file":"unix/libtmux_unix.mli","line":768,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix","doc":{"summary":"Apply validated plans with blocking I/O and scoped cancellation tokens. Execution handles retain journals and borrow existing clients; bootstrap handles own their newly bound clients without owning the daemon."},"slug":"libtmux_unix-workspace"},{"id":"Libtmux_unix.Workspace.await","publicId":"Libtmux_unix.Workspace.await","qualifiedName":"Libtmux_unix.Workspace.await","name":"await","kind":"function","modifiers":[],"package":"libtmux-unix","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":786,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Expected apply failures are retained receipts. Cancellation propagates\n after recording progress and at most 500 ms of protected compensation. "],"declarations":[{"kind":"function","text":"val await :\n ?cancel:Cancellation.t ->\n ?compensate_on_failure:bool ->\n t ->\n (Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":786,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Workspace","doc":{"summary":"Expected apply failures are retained receipts. Cancellation propagates after recording progress and at most 500 ms of protected compensation.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet checked pp = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" pp error)\n\nlet get result = checked Error.pp result\n\nlet protect ~finally use =\n match use () with\n | value ->\n finally ();\n value\n | exception error ->\n let backtrace = Printexc.get_raw_backtrace () in\n (try finally ()\n with cleanup ->\n Format.eprintf \"cleanup failed: %s@.\" (Printexc.to_string cleanup));\n Printexc.raise_with_backtrace error backtrace\n\n(* docs:begin bootstrap *)\nlet bootstrap ~binary ~version ~directory endpoint =\n let spawn = Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\" ] }) in\n let config =\n Config.make ~directory ~session:\"bootstrap-demo\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n |> checked Config.pp_error\n in\n let plan =\n Plan.make ~endpoint ~version ~observed:None config |> checked Plan.pp_error\n in\n get (Workspace.submit_bootstrap ~binary plan)\n(* docs:end bootstrap *)\n\nlet require_success (receipt : Execution.receipt) =\n if receipt.status <> Execution.Succeeded then (\n Format.eprintf \"workspace %s did not complete@.\" receipt.operation_id;\n (match receipt.status with\n | Execution.Rejected error -> Format.eprintf \"%a@.\" Plan.pp_error error\n | Execution.Unavailable error -> Format.eprintf \"%a@.\" Error.pp error\n | _ -> ());\n Iarray.iter\n (fun (step : Execution.step) ->\n match step.status with\n | Execution.Failed error | Execution.Uncertain error ->\n Format.eprintf \"step %d: %a@.\" step.index Error.pp error\n | _ -> ())\n receipt.steps;\n Option.iter\n (fun error -> Format.eprintf \"compensation: %a@.\" Error.pp error)\n receipt.cleanup_error;\n Iarray.iter\n (fun (cleanup : Execution.cleanup) ->\n match cleanup.outcome with\n | Ok () -> ()\n | Error error -> Format.eprintf \"cleanup: %a@.\" Error.pp error)\n receipt.cleanup;\n failwith \"bootstrap incomplete; no automatic retry\")\n\nlet local_version binary =\n let input = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n protect\n ~finally:(fun () ->\n if Unix.close_process_in input <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line input))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n String.sub version 5 (String.length version - 5)\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let execution =\n bootstrap ~binary:wrapper ~version:(local_version binary) ~directory\n (Endpoint.socket_path socket)\n in\n (* docs:begin await-bootstrap *)\n let snapshot =\n protect\n ~finally:(fun () -> get (Workspace.close execution))\n (fun () ->\n let receipt = get (Workspace.await execution) in\n require_success receipt;\n let client = Option.get (Workspace.client execution) in\n get (Client.capture client))\n (* docs:end await-bootstrap *)\n in\n assert (Iarray.length (Snapshot.sessions snapshot) = 1);\n assert (Iarray.length (Snapshot.windows snapshot) = 1);\n assert (Iarray.length (Snapshot.panes snapshot) = 1);\n assert (\n Session.name (Iarray.get (Snapshot.sessions snapshot) 0)\n = \"bootstrap-demo\");\n assert (Window.name (Iarray.get (Snapshot.windows snapshot) 0) = \"editor\");\n Printf.printf \"socket=%s\\n\" socket;\n print_endline \"bootstrapped: 1 session, 1 window, 1 pane\")\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_bootstrap.ml","intro":"Start a private server and capture its first session. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_bootstrap.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"bootstrapped: 1 session, 1 window, 1 pane\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val await :\n ?cancel:Cancellation.t ->\n ?compensate_on_failure:bool ->\n t -> (Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result","params":[{"name":"cancel","type":"Cancellation.t","optional":true,"keywordOnly":true},{"name":"compensate_on_failure","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"}],"returns":"(Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result"}],"slug":"libtmux_unix-workspace-await"},{"id":"Libtmux_unix.Workspace.client","publicId":"Libtmux_unix.Workspace.client","qualifiedName":"Libtmux_unix.Workspace.client","name":"client","kind":"function","modifiers":[],"package":"libtmux-unix","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":797,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Borrow the existing or bootstrapped {!Client.t} without I/O for subsequent\n actions or recovery. {!close} releases a client owned by this workspace\n execution handle. "],"declarations":[{"kind":"function","text":"val client : t -> Client.t option","source":{"file":"unix/libtmux_unix.mli","line":797,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Workspace","doc":{"summary":"Borrow the existing or bootstrapped {!Client.t} without I/O for subsequent actions or recovery. {!close} releases a client owned by this workspace execution handle.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet checked pp = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" pp error)\n\nlet get result = checked Error.pp result\n\nlet protect ~finally use =\n match use () with\n | value ->\n finally ();\n value\n | exception error ->\n let backtrace = Printexc.get_raw_backtrace () in\n (try finally ()\n with cleanup ->\n Format.eprintf \"cleanup failed: %s@.\" (Printexc.to_string cleanup));\n Printexc.raise_with_backtrace error backtrace\n\n(* docs:begin bootstrap *)\nlet bootstrap ~binary ~version ~directory endpoint =\n let spawn = Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\" ] }) in\n let config =\n Config.make ~directory ~session:\"bootstrap-demo\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n |> checked Config.pp_error\n in\n let plan =\n Plan.make ~endpoint ~version ~observed:None config |> checked Plan.pp_error\n in\n get (Workspace.submit_bootstrap ~binary plan)\n(* docs:end bootstrap *)\n\nlet require_success (receipt : Execution.receipt) =\n if receipt.status <> Execution.Succeeded then (\n Format.eprintf \"workspace %s did not complete@.\" receipt.operation_id;\n (match receipt.status with\n | Execution.Rejected error -> Format.eprintf \"%a@.\" Plan.pp_error error\n | Execution.Unavailable error -> Format.eprintf \"%a@.\" Error.pp error\n | _ -> ());\n Iarray.iter\n (fun (step : Execution.step) ->\n match step.status with\n | Execution.Failed error | Execution.Uncertain error ->\n Format.eprintf \"step %d: %a@.\" step.index Error.pp error\n | _ -> ())\n receipt.steps;\n Option.iter\n (fun error -> Format.eprintf \"compensation: %a@.\" Error.pp error)\n receipt.cleanup_error;\n Iarray.iter\n (fun (cleanup : Execution.cleanup) ->\n match cleanup.outcome with\n | Ok () -> ()\n | Error error -> Format.eprintf \"cleanup: %a@.\" Error.pp error)\n receipt.cleanup;\n failwith \"bootstrap incomplete; no automatic retry\")\n\nlet local_version binary =\n let input = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n protect\n ~finally:(fun () ->\n if Unix.close_process_in input <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line input))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n String.sub version 5 (String.length version - 5)\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let execution =\n bootstrap ~binary:wrapper ~version:(local_version binary) ~directory\n (Endpoint.socket_path socket)\n in\n (* docs:begin await-bootstrap *)\n let snapshot =\n protect\n ~finally:(fun () -> get (Workspace.close execution))\n (fun () ->\n let receipt = get (Workspace.await execution) in\n require_success receipt;\n let client = Option.get (Workspace.client execution) in\n get (Client.capture client))\n (* docs:end await-bootstrap *)\n in\n assert (Iarray.length (Snapshot.sessions snapshot) = 1);\n assert (Iarray.length (Snapshot.windows snapshot) = 1);\n assert (Iarray.length (Snapshot.panes snapshot) = 1);\n assert (\n Session.name (Iarray.get (Snapshot.sessions snapshot) 0)\n = \"bootstrap-demo\");\n assert (Window.name (Iarray.get (Snapshot.windows snapshot) 0) = \"editor\");\n Printf.printf \"socket=%s\\n\" socket;\n print_endline \"bootstrapped: 1 session, 1 window, 1 pane\")\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_bootstrap.ml","intro":"Start a private server and capture its first session. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_bootstrap.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"bootstrapped: 1 session, 1 window, 1 pane\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val client : t -> Client.t option","params":[{"name":"arg1","type":"t"}],"returns":"Client.t option"}],"slug":"libtmux_unix-workspace-client"},{"id":"Libtmux_unix.Workspace.close","publicId":"Libtmux_unix.Workspace.close","qualifiedName":"Libtmux_unix.Workspace.close","name":"close","kind":"function","modifiers":[],"package":"libtmux-unix","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":802,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Release an owned client through {!Client.close}. Active await returns\n Busy. Completed journals remain readable after close. "],"declarations":[{"kind":"function","text":"val close : t -> (unit, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":802,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Workspace","doc":{"summary":"Release an owned client through {!Client.close}. Active await returns Busy. Completed journals remain readable after close."},"signatures":[{"raw":"val close : t -> (unit, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"}],"returns":"(unit, Libtmux.Error.t) result"}],"slug":"libtmux_unix-workspace-close"},{"id":"Libtmux_unix.Workspace.inspect","publicId":"Libtmux_unix.Workspace.inspect","qualifiedName":"Libtmux_unix.Workspace.inspect","name":"inspect","kind":"function","modifiers":[],"package":"libtmux-unix","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":794,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val inspect :\n t -> (Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":794,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Workspace","signatures":[{"raw":"val inspect :\n t -> (Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result","params":[{"name":"arg1","type":"t"}],"returns":"(Libtmux_workspace.Execution.receipt, Libtmux.Error.t) result"}],"slug":"libtmux_unix-workspace-inspect"},{"id":"Libtmux_unix.Workspace.submit","publicId":"Libtmux_unix.Workspace.submit","qualifiedName":"Libtmux_unix.Workspace.submit","name":"submit","kind":"function","modifiers":[],"package":"libtmux-unix","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":771,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Allocate a generation-bound execution handle without I/O. The caller owns\n the supplied client; closing this handle leaves that client open. "],"declarations":[{"kind":"function","text":"val submit :\n Client.t -> Libtmux_workspace.Plan.t -> (t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":771,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Workspace","doc":{"summary":"Allocate a generation-bound execution handle without I/O. The caller owns the supplied client; closing this handle leaves that client open."},"signatures":[{"raw":"val submit :\n Client.t -> Libtmux_workspace.Plan.t -> (t, Libtmux.Error.t) result","params":[{"name":"arg1","type":"Client.t"},{"name":"arg2","type":"Libtmux_workspace.Plan.t"}],"returns":"(t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-workspace-submit"},{"id":"Libtmux_unix.Workspace.submit_bootstrap","publicId":"Libtmux_unix.Workspace.submit_bootstrap","qualifiedName":"Libtmux_unix.Workspace.submit_bootstrap","name":"submit_bootstrap","kind":"function","modifiers":[],"package":"libtmux-unix","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":776,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Allocate a handle for a missing-endpoint plan. Awaiting it starts control\n new-session and binds the same connection. The handle owns its new client;\n it never acquires ownership of the daemon. "],"declarations":[{"kind":"function","text":"val submit_bootstrap :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?timeout:float ->\n Libtmux_workspace.Plan.t ->\n (t, Libtmux.Error.t) result","source":{"file":"unix/libtmux_unix.mli","line":776,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Workspace","doc":{"summary":"Allocate a handle for a missing-endpoint plan. Awaiting it starts control new-session and binds the same connection. The handle owns its new client; it never acquires ownership of the daemon.","examples":[{"lang":"ocaml","code":"open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet checked pp = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" pp error)\n\nlet get result = checked Error.pp result\n\nlet protect ~finally use =\n match use () with\n | value ->\n finally ();\n value\n | exception error ->\n let backtrace = Printexc.get_raw_backtrace () in\n (try finally ()\n with cleanup ->\n Format.eprintf \"cleanup failed: %s@.\" (Printexc.to_string cleanup));\n Printexc.raise_with_backtrace error backtrace\n\n(* docs:begin bootstrap *)\nlet bootstrap ~binary ~version ~directory endpoint =\n let spawn = Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\" ] }) in\n let config =\n Config.make ~directory ~session:\"bootstrap-demo\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n |> checked Config.pp_error\n in\n let plan =\n Plan.make ~endpoint ~version ~observed:None config |> checked Plan.pp_error\n in\n get (Workspace.submit_bootstrap ~binary plan)\n(* docs:end bootstrap *)\n\nlet require_success (receipt : Execution.receipt) =\n if receipt.status <> Execution.Succeeded then (\n Format.eprintf \"workspace %s did not complete@.\" receipt.operation_id;\n (match receipt.status with\n | Execution.Rejected error -> Format.eprintf \"%a@.\" Plan.pp_error error\n | Execution.Unavailable error -> Format.eprintf \"%a@.\" Error.pp error\n | _ -> ());\n Iarray.iter\n (fun (step : Execution.step) ->\n match step.status with\n | Execution.Failed error | Execution.Uncertain error ->\n Format.eprintf \"step %d: %a@.\" step.index Error.pp error\n | _ -> ())\n receipt.steps;\n Option.iter\n (fun error -> Format.eprintf \"compensation: %a@.\" Error.pp error)\n receipt.cleanup_error;\n Iarray.iter\n (fun (cleanup : Execution.cleanup) ->\n match cleanup.outcome with\n | Ok () -> ()\n | Error error -> Format.eprintf \"cleanup: %a@.\" Error.pp error)\n receipt.cleanup;\n failwith \"bootstrap incomplete; no automatic retry\")\n\nlet local_version binary =\n let input = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n protect\n ~finally:(fun () ->\n if Unix.close_process_in input <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line input))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n String.sub version 5 (String.length version - 5)\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let execution =\n bootstrap ~binary:wrapper ~version:(local_version binary) ~directory\n (Endpoint.socket_path socket)\n in\n (* docs:begin await-bootstrap *)\n let snapshot =\n protect\n ~finally:(fun () -> get (Workspace.close execution))\n (fun () ->\n let receipt = get (Workspace.await execution) in\n require_success receipt;\n let client = Option.get (Workspace.client execution) in\n get (Client.capture client))\n (* docs:end await-bootstrap *)\n in\n assert (Iarray.length (Snapshot.sessions snapshot) = 1);\n assert (Iarray.length (Snapshot.windows snapshot) = 1);\n assert (Iarray.length (Snapshot.panes snapshot) = 1);\n assert (\n Session.name (Iarray.get (Snapshot.sessions snapshot) 0)\n = \"bootstrap-demo\");\n assert (Window.name (Iarray.get (Snapshot.windows snapshot) 0) = \"editor\");\n Printf.printf \"socket=%s\\n\" socket;\n print_endline \"bootstrapped: 1 session, 1 window, 1 pane\")\n","sourceUrl":"https://github.com/libtmux/libtmux-ocaml/blob/6b814a3ae27b6a700b5d45ff1ef654565a1f1605/examples/showcase_bootstrap.ml","intro":"Start a private server and capture its first session. This complete program creates a private daemon, checks its result and closes its clients. Use OCaml 5.5.2 on Linux with tmux 3.3a through 3.8. Run it from the source checkout after following the installation guide."},{"lang":"console","code":"$ opam exec -- dune exec examples/showcase_bootstrap.exe -- tmux\n","intro":"Run the recorded entry point:"},{"lang":"text","code":"bootstrapped: 1 session, 1 window, 1 pane\n","intro":"Expected outcome line, after the temporary socket path:"}]},"signatures":[{"raw":"val submit_bootstrap :\n ?cleanup:Cleanup.t ->\n ?binary:string ->\n ?timeout:float -> Libtmux_workspace.Plan.t -> (t, Libtmux.Error.t) result","params":[{"name":"cleanup","type":"Cleanup.t","optional":true,"keywordOnly":true},{"name":"binary","type":"string","optional":true,"keywordOnly":true},{"name":"timeout","type":"float","optional":true,"keywordOnly":true},{"name":"arg1","type":"Libtmux_workspace.Plan.t"}],"returns":"(t, Libtmux.Error.t) result"}],"slug":"libtmux_unix-workspace-submit_bootstrap"},{"id":"Libtmux_unix.Workspace.t","publicId":"Libtmux_unix.Workspace.t","qualifiedName":"Libtmux_unix.Workspace.t","name":"t","kind":"typealias","package":"libtmux-unix","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_unix","source":{"file":"unix/libtmux_unix.mli","line":769,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"unix/libtmux_unix.mli","line":769,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_unix.Workspace","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux_unix-workspace-t"},{"id":"Libtmux_workspace","publicId":"Libtmux_workspace","qualifiedName":"Libtmux_workspace","name":"Libtmux_workspace","kind":"module","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":1,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" {!Config} validates workspace descriptions and {!Plan} previews their\n actions without I/O. {!Execution} delegates effects to an explicit executor\n and retains a recovery journal. See the\n {{:https://github.com/libtmux/libtmux-ocaml/blob/master/docs/workspaces.md}workspace\n guide} for JSON loading, preview, apply and receipt inspection. "],"declarations":[{"kind":"module","text":"","source":{"file":"workspace/libtmux_workspace.mli","line":1,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"doc":{"summary":"{!Config} validates workspace descriptions and {!Plan} previews their actions without I/O. {!Execution} delegates effects to an explicit executor and retains a recovery journal. See the [workspace guide](https://github.com/libtmux/libtmux-ocaml/blob/master/docs/workspaces.md) for JSON loading, preview, apply and receipt inspection."},"slug":"libtmux_workspace"},{"id":"Libtmux_workspace.Config","publicId":"Libtmux_workspace.Config","qualifiedName":"Libtmux_workspace.Config","name":"Config","kind":"module","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":10,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Validate native workspace values without contacting tmux or reading the\n filesystem. Relative directories resolve against the document directory;\n only declared variables participate in expansion. "],"declarations":[{"kind":"module","text":"module Config : sig\n type error = { path : string; message : string }\n\n val pp_error : Format.formatter -> error -> unit\n\n type setting = {\n name : string;\n index : int option;\n value : Libtmux.Options.scalar;\n }\n\n type pane = {\n spawn : Libtmux.Spawn.t;\n options : setting list;\n startup : string list;\n direction : Libtmux.Geometry.direction;\n size : Libtmux.Geometry.size option;\n }\n\n type window = {\n name : string;\n cwd : string option;\n environment : (string * string) list;\n options : setting list;\n panes : pane list;\n layout : Libtmux.Layout.t option;\n }\n\n type t\n\n val pane :\n ?spawn:Libtmux.Spawn.t ->\n ?options:setting list ->\n ?startup:string list ->\n ?direction:Libtmux.Geometry.direction ->\n ?size:Libtmux.Geometry.size ->\n unit ->\n pane\n\n val window :\n ?cwd:string ->\n ?environment:(string * string) list ->\n ?options:setting list ->\n ?layout:Libtmux.Layout.t ->\n name:string ->\n pane list ->\n window\n (** Builders are unchecked descriptions; {!make} validates the whole document.\n *)\n\n val make :\n ?cwd:string ->\n ?environment:(string * string) list ->\n ?options:setting list ->\n ?variables:(string * string) list ->\n ?width:int ->\n ?height:int ->\n directory:string ->\n session:string ->\n window list ->\n (t, error) result\n (** Resolve relative working directories against the absolute document\n directory. Explicit variables expand [${NAME}] in directories only; they\n never read the process environment. Cycles and unknown names fail. Command\n arguments, shell code, startup text and environment values remain literal.\n\n At most 64 windows, 256 total panes and 1 MiB of text are accepted. Names\n and settings must be unique in their scope. No filesystem is consulted. *)\n\n val session : t -> string\n val windows : t -> window Iarray.t\n val environment : t -> (string * string) list\n val options : t -> setting list\n val dimensions : t -> int * int\nend","source":{"file":"workspace/libtmux_workspace.mli","line":10,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace","doc":{"summary":"Validate native workspace values without contacting tmux or reading the filesystem. Relative directories resolve against the document directory; only declared variables participate in expansion."},"slug":"libtmux_workspace-config"},{"id":"Libtmux_workspace.Config.dimensions","publicId":"Libtmux_workspace.Config.dimensions","qualifiedName":"Libtmux_workspace.Config.dimensions","name":"dimensions","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":83,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val dimensions : t -> int * int","source":{"file":"workspace/libtmux_workspace.mli","line":83,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","signatures":[{"raw":"val dimensions : t -> int * int","params":[{"name":"arg1","type":"t"}],"returns":"int * int"}],"slug":"libtmux_workspace-config-dimensions"},{"id":"Libtmux_workspace.Config.environment","publicId":"Libtmux_workspace.Config.environment","qualifiedName":"Libtmux_workspace.Config.environment","name":"environment","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":81,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val environment : t -> (string * string) list","source":{"file":"workspace/libtmux_workspace.mli","line":81,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","signatures":[{"raw":"val environment : t -> (string * string) list","params":[{"name":"arg1","type":"t"}],"returns":"(string * string) list"}],"slug":"libtmux_workspace-config-environment"},{"id":"Libtmux_workspace.Config.error","publicId":"Libtmux_workspace.Config.error","qualifiedName":"Libtmux_workspace.Config.error","name":"error","kind":"struct","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":11,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type error = { path : string; message : string }","source":{"file":"workspace/libtmux_workspace.mli","line":11,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","signatures":[{"raw":"type error = {\n path: string ;\n message: string }","params":[]}],"slug":"libtmux_workspace-config-error"},{"id":"Libtmux_workspace.Config.error.message","publicId":"Libtmux_workspace.Config.error.message","name":"message","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":11,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"message : string","source":{"file":"workspace/libtmux_workspace.mli","line":11,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.error","type":"string","qualifiedName":"Libtmux_workspace.Config.message","slug":"libtmux_workspace-config-error-message"},{"id":"Libtmux_workspace.Config.error.path","publicId":"Libtmux_workspace.Config.error.path","name":"path","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":11,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"path : string;","source":{"file":"workspace/libtmux_workspace.mli","line":11,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.error","type":"string","qualifiedName":"Libtmux_workspace.Config.path","slug":"libtmux_workspace-config-error-path"},{"id":"Libtmux_workspace.Config.make","publicId":"Libtmux_workspace.Config.make","qualifiedName":"Libtmux_workspace.Config.make","name":"make","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":60,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Resolve relative working directories against the absolute document\n directory. Explicit variables expand [${NAME}] in directories only; they\n never read the process environment. Cycles and unknown names fail. Command\n arguments, shell code, startup text and environment values remain literal.\n\n At most 64 windows, 256 total panes and 1 MiB of text are accepted. Names\n and settings must be unique in their scope. No filesystem is consulted. "],"declarations":[{"kind":"function","text":"val make :\n ?cwd:string ->\n ?environment:(string * string) list ->\n ?options:setting list ->\n ?variables:(string * string) list ->\n ?width:int ->\n ?height:int ->\n directory:string ->\n session:string ->\n window list ->\n (t, error) result","source":{"file":"workspace/libtmux_workspace.mli","line":60,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","doc":{"summary":"Resolve relative working directories against the absolute document directory. Explicit variables expand `${NAME}` in directories only; they never read the process environment. Cycles and unknown names fail. Command arguments, shell code, startup text and environment values remain literal.","body":"At most 64 windows, 256 total panes and 1 MiB of text are accepted. Names and settings must be unique in their scope. No filesystem is consulted."},"signatures":[{"raw":"val make :\n ?cwd:string ->\n ?environment:(string * string) list ->\n ?options:setting list ->\n ?variables:(string * string) list ->\n ?width:int ->\n ?height:int ->\n directory:string -> session:string -> window list -> (t, error) result","params":[{"name":"cwd","type":"string","optional":true,"keywordOnly":true},{"name":"environment","type":"(string * string) list","optional":true,"keywordOnly":true},{"name":"options","type":"setting list","optional":true,"keywordOnly":true},{"name":"variables","type":"(string * string) list","optional":true,"keywordOnly":true},{"name":"width","type":"int","optional":true,"keywordOnly":true},{"name":"height","type":"int","optional":true,"keywordOnly":true},{"name":"directory","type":"string","keywordOnly":true},{"name":"session","type":"string","keywordOnly":true},{"name":"arg1","type":"window list"}],"returns":"(t, error) result"}],"slug":"libtmux_workspace-config-make"},{"id":"Libtmux_workspace.Config.options","publicId":"Libtmux_workspace.Config.options","qualifiedName":"Libtmux_workspace.Config.options","name":"options","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":82,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val options : t -> setting list","source":{"file":"workspace/libtmux_workspace.mli","line":82,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","signatures":[{"raw":"val options : t -> setting list","params":[{"name":"arg1","type":"t"}],"returns":"setting list"}],"slug":"libtmux_workspace-config-options"},{"id":"Libtmux_workspace.Config.pane","publicId":"Libtmux_workspace.Config.pane","qualifiedName":"Libtmux_workspace.Config.pane","name":"pane","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":40,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pane :\n ?spawn:Libtmux.Spawn.t ->\n ?options:setting list ->\n ?startup:string list ->\n ?direction:Libtmux.Geometry.direction ->\n ?size:Libtmux.Geometry.size ->\n unit ->\n pane","source":{"file":"workspace/libtmux_workspace.mli","line":40,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","signatures":[{"raw":"val pane :\n ?spawn:Libtmux.Spawn.t ->\n ?options:setting list ->\n ?startup:string list ->\n ?direction:Libtmux.Geometry.direction ->\n ?size:Libtmux.Geometry.size -> unit -> pane","params":[{"name":"spawn","type":"Libtmux.Spawn.t","optional":true,"keywordOnly":true},{"name":"options","type":"setting list","optional":true,"keywordOnly":true},{"name":"startup","type":"string list","optional":true,"keywordOnly":true},{"name":"direction","type":"Libtmux.Geometry.direction","optional":true,"keywordOnly":true},{"name":"size","type":"Libtmux.Geometry.size","optional":true,"keywordOnly":true},{"name":"arg1","type":"unit"}],"returns":"pane"}],"slug":"libtmux_workspace-config-pane"},{"id":"Libtmux_workspace.Config.pane:type","publicId":"Libtmux_workspace.Config.pane:type","qualifiedName":"Libtmux_workspace.Config.pane","name":"pane","kind":"struct","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":21,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type pane = {\n spawn : Libtmux.Spawn.t;\n options : setting list;\n startup : string list;\n direction : Libtmux.Geometry.direction;\n size : Libtmux.Geometry.size option;\n }","source":{"file":"workspace/libtmux_workspace.mli","line":21,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","signatures":[{"raw":"type pane =\n {\n spawn: Libtmux.Spawn.t ;\n options: setting list ;\n startup: string list ;\n direction: Libtmux.Geometry.direction ;\n size: Libtmux.Geometry.size option }","params":[]}],"slug":"libtmux_workspace-config-pane-type"},{"id":"Libtmux_workspace.Config.pane:type.direction","publicId":"Libtmux_workspace.Config.pane:type.direction","name":"direction","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":25,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"direction : Libtmux.Geometry.direction;","source":{"file":"workspace/libtmux_workspace.mli","line":25,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.pane:type","type":"Libtmux.Geometry.direction","qualifiedName":"Libtmux_workspace.Config.direction","slug":"libtmux_workspace-config-pane-type-direction"},{"id":"Libtmux_workspace.Config.pane:type.options","publicId":"Libtmux_workspace.Config.pane:type.options","name":"options","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":23,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"options : setting list;","source":{"file":"workspace/libtmux_workspace.mli","line":23,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.pane:type","type":"setting list","qualifiedName":"Libtmux_workspace.Config.options","slug":"libtmux_workspace-config-pane-type-options"},{"id":"Libtmux_workspace.Config.pane:type.size","publicId":"Libtmux_workspace.Config.pane:type.size","name":"size","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":26,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"size : Libtmux.Geometry.size option;","source":{"file":"workspace/libtmux_workspace.mli","line":26,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.pane:type","type":"Libtmux.Geometry.size option","qualifiedName":"Libtmux_workspace.Config.size","slug":"libtmux_workspace-config-pane-type-size"},{"id":"Libtmux_workspace.Config.pane:type.spawn","publicId":"Libtmux_workspace.Config.pane:type.spawn","name":"spawn","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":22,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"spawn : Libtmux.Spawn.t;","source":{"file":"workspace/libtmux_workspace.mli","line":22,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.pane:type","type":"Libtmux.Spawn.t","qualifiedName":"Libtmux_workspace.Config.spawn","slug":"libtmux_workspace-config-pane-type-spawn"},{"id":"Libtmux_workspace.Config.pane:type.startup","publicId":"Libtmux_workspace.Config.pane:type.startup","name":"startup","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":24,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"startup : string list;","source":{"file":"workspace/libtmux_workspace.mli","line":24,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.pane:type","type":"string list","qualifiedName":"Libtmux_workspace.Config.startup","slug":"libtmux_workspace-config-pane-type-startup"},{"id":"Libtmux_workspace.Config.pp_error","publicId":"Libtmux_workspace.Config.pp_error","qualifiedName":"Libtmux_workspace.Config.pp_error","name":"pp_error","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":13,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pp_error : Format.formatter -> error -> unit","source":{"file":"workspace/libtmux_workspace.mli","line":13,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","signatures":[{"raw":"val pp_error : Format.formatter -> error -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"error"}],"returns":"unit"}],"slug":"libtmux_workspace-config-pp_error"},{"id":"Libtmux_workspace.Config.session","publicId":"Libtmux_workspace.Config.session","qualifiedName":"Libtmux_workspace.Config.session","name":"session","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":79,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val session : t -> string","source":{"file":"workspace/libtmux_workspace.mli","line":79,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","signatures":[{"raw":"val session : t -> string","params":[{"name":"arg1","type":"t"}],"returns":"string"}],"slug":"libtmux_workspace-config-session"},{"id":"Libtmux_workspace.Config.setting","publicId":"Libtmux_workspace.Config.setting","qualifiedName":"Libtmux_workspace.Config.setting","name":"setting","kind":"struct","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":15,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type setting = {\n name : string;\n index : int option;\n value : Libtmux.Options.scalar;\n }","source":{"file":"workspace/libtmux_workspace.mli","line":15,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","signatures":[{"raw":"type setting =\n {\n name: string ;\n index: int option ;\n value: Libtmux.Options.scalar }","params":[]}],"slug":"libtmux_workspace-config-setting"},{"id":"Libtmux_workspace.Config.setting.index","publicId":"Libtmux_workspace.Config.setting.index","name":"index","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":17,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"index : int option;","source":{"file":"workspace/libtmux_workspace.mli","line":17,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.setting","type":"int option","qualifiedName":"Libtmux_workspace.Config.index","slug":"libtmux_workspace-config-setting-index"},{"id":"Libtmux_workspace.Config.setting.name","publicId":"Libtmux_workspace.Config.setting.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":16,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"workspace/libtmux_workspace.mli","line":16,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.setting","type":"string","qualifiedName":"Libtmux_workspace.Config.name","slug":"libtmux_workspace-config-setting-name"},{"id":"Libtmux_workspace.Config.setting.value","publicId":"Libtmux_workspace.Config.setting.value","name":"value","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":18,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"value : Libtmux.Options.scalar;","source":{"file":"workspace/libtmux_workspace.mli","line":18,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.setting","type":"Libtmux.Options.scalar","qualifiedName":"Libtmux_workspace.Config.value","slug":"libtmux_workspace-config-setting-value"},{"id":"Libtmux_workspace.Config.t","publicId":"Libtmux_workspace.Config.t","qualifiedName":"Libtmux_workspace.Config.t","name":"t","kind":"typealias","package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":38,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"workspace/libtmux_workspace.mli","line":38,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux_workspace-config-t"},{"id":"Libtmux_workspace.Config.window","publicId":"Libtmux_workspace.Config.window","qualifiedName":"Libtmux_workspace.Config.window","name":"window","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":49,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Builders are unchecked descriptions; {!make} validates the whole document.\n "],"declarations":[{"kind":"function","text":"val window :\n ?cwd:string ->\n ?environment:(string * string) list ->\n ?options:setting list ->\n ?layout:Libtmux.Layout.t ->\n name:string ->\n pane list ->\n window","source":{"file":"workspace/libtmux_workspace.mli","line":49,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","doc":{"summary":"Builders are unchecked descriptions; {!make} validates the whole document."},"signatures":[{"raw":"val window :\n ?cwd:string ->\n ?environment:(string * string) list ->\n ?options:setting list ->\n ?layout:Libtmux.Layout.t -> name:string -> pane list -> window","params":[{"name":"cwd","type":"string","optional":true,"keywordOnly":true},{"name":"environment","type":"(string * string) list","optional":true,"keywordOnly":true},{"name":"options","type":"setting list","optional":true,"keywordOnly":true},{"name":"layout","type":"Libtmux.Layout.t","optional":true,"keywordOnly":true},{"name":"name","type":"string","keywordOnly":true},{"name":"arg1","type":"pane list"}],"returns":"window"}],"slug":"libtmux_workspace-config-window"},{"id":"Libtmux_workspace.Config.window:type","publicId":"Libtmux_workspace.Config.window:type","qualifiedName":"Libtmux_workspace.Config.window","name":"window","kind":"struct","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":29,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type window = {\n name : string;\n cwd : string option;\n environment : (string * string) list;\n options : setting list;\n panes : pane list;\n layout : Libtmux.Layout.t option;\n }","source":{"file":"workspace/libtmux_workspace.mli","line":29,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","signatures":[{"raw":"type window =\n {\n name: string ;\n cwd: string option ;\n environment: (string * string) list ;\n options: setting list ;\n panes: pane list ;\n layout: Libtmux.Layout.t option }","params":[]}],"slug":"libtmux_workspace-config-window-type"},{"id":"Libtmux_workspace.Config.window:type.cwd","publicId":"Libtmux_workspace.Config.window:type.cwd","name":"cwd","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":31,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"cwd : string option;","source":{"file":"workspace/libtmux_workspace.mli","line":31,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.window:type","type":"string option","qualifiedName":"Libtmux_workspace.Config.cwd","slug":"libtmux_workspace-config-window-type-cwd"},{"id":"Libtmux_workspace.Config.window:type.environment","publicId":"Libtmux_workspace.Config.window:type.environment","name":"environment","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":32,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"environment : (string * string) list;","source":{"file":"workspace/libtmux_workspace.mli","line":32,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.window:type","type":"(string * string) list","qualifiedName":"Libtmux_workspace.Config.environment","slug":"libtmux_workspace-config-window-type-environment"},{"id":"Libtmux_workspace.Config.window:type.layout","publicId":"Libtmux_workspace.Config.window:type.layout","name":"layout","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":35,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"layout : Libtmux.Layout.t option;","source":{"file":"workspace/libtmux_workspace.mli","line":35,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.window:type","type":"Libtmux.Layout.t option","qualifiedName":"Libtmux_workspace.Config.layout","slug":"libtmux_workspace-config-window-type-layout"},{"id":"Libtmux_workspace.Config.window:type.name","publicId":"Libtmux_workspace.Config.window:type.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":30,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"workspace/libtmux_workspace.mli","line":30,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.window:type","type":"string","qualifiedName":"Libtmux_workspace.Config.name","slug":"libtmux_workspace-config-window-type-name"},{"id":"Libtmux_workspace.Config.window:type.options","publicId":"Libtmux_workspace.Config.window:type.options","name":"options","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":33,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"options : setting list;","source":{"file":"workspace/libtmux_workspace.mli","line":33,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.window:type","type":"setting list","qualifiedName":"Libtmux_workspace.Config.options","slug":"libtmux_workspace-config-window-type-options"},{"id":"Libtmux_workspace.Config.window:type.panes","publicId":"Libtmux_workspace.Config.window:type.panes","name":"panes","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":34,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"panes : pane list;","source":{"file":"workspace/libtmux_workspace.mli","line":34,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config.window:type","type":"pane list","qualifiedName":"Libtmux_workspace.Config.panes","slug":"libtmux_workspace-config-window-type-panes"},{"id":"Libtmux_workspace.Config.windows","publicId":"Libtmux_workspace.Config.windows","qualifiedName":"Libtmux_workspace.Config.windows","name":"windows","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":80,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val windows : t -> window Iarray.t","source":{"file":"workspace/libtmux_workspace.mli","line":80,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Config","signatures":[{"raw":"val windows : t -> window Iarray.t","params":[{"name":"arg1","type":"t"}],"returns":"window Iarray.t"}],"slug":"libtmux_workspace-config-windows"},{"id":"Libtmux_workspace.Execution","publicId":"Libtmux_workspace.Execution","qualifiedName":"Libtmux_workspace.Execution","name":"Execution","kind":"module","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":165,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Apply a plan once per handle and retain effects, uncertainty and cleanup.\n The journal lives in process memory while its execution handle is retained;\n {!Execution.val-inspect} returns immutable copies. It survives waiter\n cancellation and client closure, but supplies no crash-durable recovery or\n cross-invocation deduplication. Ordinary applications use their backend's\n Workspace module; executors below integrate another transport. "],"declarations":[{"kind":"module","text":"module Execution : sig\n type hint = {\n session : Libtmux.Session.Id.t;\n window : Libtmux.Window.Id.t;\n pane : Libtmux.Pane.Id.t;\n window_index : int;\n pane_index : int;\n server_pid : int;\n }\n (** A creation row received before daemon binding finished. Hints are not\n operational targets and are never eligible for automatic compensation. *)\n\n type certainty = Not_started | Applied | Unknown\n\n type observation = {\n certainty : certainty;\n created : Libtmux.Created.t list;\n unbound : hint option;\n }\n\n type executor = {\n source : unit -> Libtmux.Source.t option;\n capture : unit -> (Libtmux.Snapshot.t, Libtmux.Error.t) result;\n run : 'a. 'a Libtmux.Command.t -> ('a, Libtmux.Error.t) result;\n bootstrap : Config.t -> (Libtmux.Created.t, Libtmux.Error.t) result;\n inspect : unit -> unit -> observation;\n protect : (unit -> unit) -> (unit, Libtmux.Error.t) result;\n }\n (** Backend integration: [inspect] returns a callback tied to the latest\n operation, reading only its retained state even after later submissions.\n [protect] bounds compensation and shields it from caller cancellation,\n reporting expected failures as [Error]. Ordinary callers use their\n backend's Workspace API. *)\n\n type step_status =\n | Pending\n | Running\n | Completed\n | Failed of Libtmux.Error.t\n | Skipped\n | Uncertain of Libtmux.Error.t\n\n type step = {\n index : int;\n action : Plan.action;\n status : step_status;\n created : Libtmux.Created.t list;\n unbound : hint option;\n }\n\n type cleanup = {\n pane : Libtmux.Pane.target;\n outcome : (unit, Libtmux.Error.t) result;\n }\n\n type status =\n | Queued\n | Applying\n | Succeeded\n | Partial\n | Interrupted\n | Rejected of Plan.error\n | Unavailable of Libtmux.Error.t\n\n type receipt = {\n operation_id : string;\n source : Libtmux.Source.t option;\n status : status;\n steps : step Iarray.t;\n cleanup : cleanup Iarray.t;\n cleanup_error : Libtmux.Error.t option;\n }\n\n type t\n\n val create :\n operation_id:string ->\n executor:executor ->\n Plan.t ->\n (t, Libtmux.Error.t) result\n (** Allocate a retained handle without I/O. IDs have 1..64 ASCII letters,\n digits, underscores or hyphens. [operation_id] correlates receipts; it\n does not deduplicate handles. A new handle starts a new execution even if\n its ID matches an earlier one. *)\n\n val inspect : t -> receipt\n (** Return an immutable copy of the retained journal without I/O. *)\n\n val await : ?compensate_on_failure:bool -> t -> receipt\n (** Execute once per handle, rechecking generation and captured preconditions\n first. Expected failures return a partial journal. Exceptions, including\n native cancellation, propagate after recording progress and bounded\n compensation. Subsequent calls only return the retained receipt; mutations\n never retry.\n\n Compensation kills only panes reported by completed creation commands, in\n reverse creation order. tmux removes windows and sessions that become\n empty. Containers with foreign panes or window links remain; adding a\n borrowed pane never makes it eligible for cleanup. Cleanup failures have\n separate outcomes. Compensation cannot undo external effects of programs\n started inside the panes. *)\nend","source":{"file":"workspace/libtmux_workspace.mli","line":165,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace","doc":{"summary":"Apply a plan once per handle and retain effects, uncertainty and cleanup. The journal lives in process memory while its execution handle is retained; {!Execution.val-inspect} returns immutable copies. It survives waiter cancellation and client closure, but supplies no crash-durable recovery or cross-invocation deduplication. Ordinary applications use their backend's Workspace module; executors below integrate another transport."},"slug":"libtmux_workspace-execution"},{"id":"Libtmux_workspace.Execution.await","publicId":"Libtmux_workspace.Execution.await","qualifiedName":"Libtmux_workspace.Execution.await","name":"await","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":253,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Execute once per handle, rechecking generation and captured preconditions\n first. Expected failures return a partial journal. Exceptions, including\n native cancellation, propagate after recording progress and bounded\n compensation. Subsequent calls only return the retained receipt; mutations\n never retry.\n\n Compensation kills only panes reported by completed creation commands, in\n reverse creation order. tmux removes windows and sessions that become\n empty. Containers with foreign panes or window links remain; adding a\n borrowed pane never makes it eligible for cleanup. Cleanup failures have\n separate outcomes. Compensation cannot undo external effects of programs\n started inside the panes. "],"declarations":[{"kind":"function","text":"val await : ?compensate_on_failure:bool -> t -> receipt","source":{"file":"workspace/libtmux_workspace.mli","line":253,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","doc":{"summary":"Execute once per handle, rechecking generation and captured preconditions first. Expected failures return a partial journal. Exceptions, including native cancellation, propagate after recording progress and bounded compensation. Subsequent calls only return the retained receipt; mutations never retry.","body":"Compensation kills only panes reported by completed creation commands, in reverse creation order. tmux removes windows and sessions that become empty. Containers with foreign panes or window links remain; adding a borrowed pane never makes it eligible for cleanup. Cleanup failures have separate outcomes. Compensation cannot undo external effects of programs started inside the panes."},"signatures":[{"raw":"val await : ?compensate_on_failure:bool -> t -> receipt","params":[{"name":"compensate_on_failure","type":"bool","optional":true,"keywordOnly":true},{"name":"arg1","type":"t"}],"returns":"receipt"}],"slug":"libtmux_workspace-execution-await"},{"id":"Libtmux_workspace.Execution.certainty","publicId":"Libtmux_workspace.Execution.certainty","qualifiedName":"Libtmux_workspace.Execution.certainty","name":"certainty","kind":"enum","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":177,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type certainty = Not_started | Applied | Unknown","source":{"file":"workspace/libtmux_workspace.mli","line":177,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","signatures":[{"raw":"type certainty =\n | Not_started \n | Applied \n | Unknown ","params":[]}],"slug":"libtmux_workspace-execution-certainty"},{"id":"Libtmux_workspace.Execution.certainty.Applied","publicId":"Libtmux_workspace.Execution.certainty.Applied","name":"Applied","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":177,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Applied","source":{"file":"workspace/libtmux_workspace.mli","line":177,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.certainty","variant":"unit","qualifiedName":"Libtmux_workspace.Execution.Applied","slug":"libtmux_workspace-execution-certainty-applied"},{"id":"Libtmux_workspace.Execution.certainty.Not_started","publicId":"Libtmux_workspace.Execution.certainty.Not_started","name":"Not_started","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":177,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Not_started","source":{"file":"workspace/libtmux_workspace.mli","line":177,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.certainty","variant":"unit","qualifiedName":"Libtmux_workspace.Execution.Not_started","slug":"libtmux_workspace-execution-certainty-not_started"},{"id":"Libtmux_workspace.Execution.certainty.Unknown","publicId":"Libtmux_workspace.Execution.certainty.Unknown","name":"Unknown","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":177,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unknown","source":{"file":"workspace/libtmux_workspace.mli","line":177,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.certainty","variant":"unit","qualifiedName":"Libtmux_workspace.Execution.Unknown","slug":"libtmux_workspace-execution-certainty-unknown"},{"id":"Libtmux_workspace.Execution.cleanup","publicId":"Libtmux_workspace.Execution.cleanup","qualifiedName":"Libtmux_workspace.Execution.cleanup","name":"cleanup","kind":"struct","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":215,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type cleanup = {\n pane : Libtmux.Pane.target;\n outcome : (unit, Libtmux.Error.t) result;\n }","source":{"file":"workspace/libtmux_workspace.mli","line":215,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","signatures":[{"raw":"type cleanup =\n {\n pane: Libtmux.Pane.target ;\n outcome: (unit, Libtmux.Error.t) result }","params":[]}],"slug":"libtmux_workspace-execution-cleanup"},{"id":"Libtmux_workspace.Execution.cleanup.outcome","publicId":"Libtmux_workspace.Execution.cleanup.outcome","name":"outcome","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":217,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"outcome : (unit, Libtmux.Error.t) result;","source":{"file":"workspace/libtmux_workspace.mli","line":217,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.cleanup","type":"(unit, Libtmux.Error.t) result","qualifiedName":"Libtmux_workspace.Execution.outcome","slug":"libtmux_workspace-execution-cleanup-outcome"},{"id":"Libtmux_workspace.Execution.cleanup.pane","publicId":"Libtmux_workspace.Execution.cleanup.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":216,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : Libtmux.Pane.target;","source":{"file":"workspace/libtmux_workspace.mli","line":216,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.cleanup","type":"Libtmux.Pane.target","qualifiedName":"Libtmux_workspace.Execution.pane","slug":"libtmux_workspace-execution-cleanup-pane"},{"id":"Libtmux_workspace.Execution.create","publicId":"Libtmux_workspace.Execution.create","qualifiedName":"Libtmux_workspace.Execution.create","name":"create","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":240,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Allocate a retained handle without I/O. IDs have 1..64 ASCII letters,\n digits, underscores or hyphens. [operation_id] correlates receipts; it\n does not deduplicate handles. A new handle starts a new execution even if\n its ID matches an earlier one. "],"declarations":[{"kind":"function","text":"val create :\n operation_id:string ->\n executor:executor ->\n Plan.t ->\n (t, Libtmux.Error.t) result","source":{"file":"workspace/libtmux_workspace.mli","line":240,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","doc":{"summary":"Allocate a retained handle without I/O. IDs have 1..64 ASCII letters, digits, underscores or hyphens. `operation_id` correlates receipts; it does not deduplicate handles. A new handle starts a new execution even if its ID matches an earlier one."},"signatures":[{"raw":"val create :\n operation_id:string ->\n executor:executor -> Plan.t -> (t, Libtmux.Error.t) result","params":[{"name":"operation_id","type":"string","keywordOnly":true},{"name":"executor","type":"executor","keywordOnly":true},{"name":"arg1","type":"Plan.t"}],"returns":"(t, Libtmux.Error.t) result"}],"slug":"libtmux_workspace-execution-create"},{"id":"Libtmux_workspace.Execution.executor","publicId":"Libtmux_workspace.Execution.executor","qualifiedName":"Libtmux_workspace.Execution.executor","name":"executor","kind":"struct","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":185,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Backend integration: [inspect] returns a callback tied to the latest\n operation, reading only its retained state even after later submissions.\n [protect] bounds compensation and shields it from caller cancellation,\n reporting expected failures as [Error]. Ordinary callers use their\n backend's Workspace API. "],"declarations":[{"kind":"struct","text":"type executor = {\n source : unit -> Libtmux.Source.t option;\n capture : unit -> (Libtmux.Snapshot.t, Libtmux.Error.t) result;\n run : 'a. 'a Libtmux.Command.t -> ('a, Libtmux.Error.t) result;\n bootstrap : Config.t -> (Libtmux.Created.t, Libtmux.Error.t) result;\n inspect : unit -> unit -> observation;\n protect : (unit -> unit) -> (unit, Libtmux.Error.t) result;\n }","source":{"file":"workspace/libtmux_workspace.mli","line":185,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","doc":{"summary":"Backend integration: `inspect` returns a callback tied to the latest operation, reading only its retained state even after later submissions. `protect` bounds compensation and shields it from caller cancellation, reporting expected failures as `Error`. Ordinary callers use their backend's Workspace API."},"signatures":[{"raw":"type executor =\n {\n source: unit -> Libtmux.Source.t option ;\n capture: unit -> (Libtmux.Snapshot.t, Libtmux.Error.t) result ;\n run: 'a . 'a Libtmux.Command.t -> ('a, Libtmux.Error.t) result ;\n bootstrap: Config.t -> (Libtmux.Created.t, Libtmux.Error.t) result ;\n inspect: unit -> unit -> observation ;\n protect: (unit -> unit) -> (unit, Libtmux.Error.t) result }","params":[]}],"slug":"libtmux_workspace-execution-executor"},{"id":"Libtmux_workspace.Execution.executor.bootstrap","publicId":"Libtmux_workspace.Execution.executor.bootstrap","name":"bootstrap","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":189,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"bootstrap : Config.t -> (Libtmux.Created.t, Libtmux.Error.t) result;","source":{"file":"workspace/libtmux_workspace.mli","line":189,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.executor","type":"Config.t -> (Libtmux.Created.t, Libtmux.Error.t) result","qualifiedName":"Libtmux_workspace.Execution.bootstrap","slug":"libtmux_workspace-execution-executor-bootstrap"},{"id":"Libtmux_workspace.Execution.executor.capture","publicId":"Libtmux_workspace.Execution.executor.capture","name":"capture","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":187,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"capture : unit -> (Libtmux.Snapshot.t, Libtmux.Error.t) result;","source":{"file":"workspace/libtmux_workspace.mli","line":187,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.executor","type":"unit -> (Libtmux.Snapshot.t, Libtmux.Error.t) result","qualifiedName":"Libtmux_workspace.Execution.capture","slug":"libtmux_workspace-execution-executor-capture"},{"id":"Libtmux_workspace.Execution.executor.inspect","publicId":"Libtmux_workspace.Execution.executor.inspect","name":"inspect","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":190,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"inspect : unit -> unit -> observation;","source":{"file":"workspace/libtmux_workspace.mli","line":190,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.executor","type":"unit -> unit -> observation","qualifiedName":"Libtmux_workspace.Execution.inspect","slug":"libtmux_workspace-execution-executor-inspect"},{"id":"Libtmux_workspace.Execution.executor.protect","publicId":"Libtmux_workspace.Execution.executor.protect","name":"protect","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":191,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"protect : (unit -> unit) -> (unit, Libtmux.Error.t) result;","source":{"file":"workspace/libtmux_workspace.mli","line":191,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.executor","type":"(unit -> unit) -> (unit, Libtmux.Error.t) result","qualifiedName":"Libtmux_workspace.Execution.protect","slug":"libtmux_workspace-execution-executor-protect"},{"id":"Libtmux_workspace.Execution.executor.run","publicId":"Libtmux_workspace.Execution.executor.run","name":"run","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":188,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"run : 'a. 'a Libtmux.Command.t -> ('a, Libtmux.Error.t) result;","source":{"file":"workspace/libtmux_workspace.mli","line":188,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.executor","type":"'a. 'a Libtmux.Command.t -> ('a, Libtmux.Error.t) result","qualifiedName":"Libtmux_workspace.Execution.run","slug":"libtmux_workspace-execution-executor-run"},{"id":"Libtmux_workspace.Execution.executor.source","publicId":"Libtmux_workspace.Execution.executor.source","name":"source","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":186,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"source : unit -> Libtmux.Source.t option;","source":{"file":"workspace/libtmux_workspace.mli","line":186,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.executor","type":"unit -> Libtmux.Source.t option","qualifiedName":"Libtmux_workspace.Execution.source","slug":"libtmux_workspace-execution-executor-source"},{"id":"Libtmux_workspace.Execution.hint","publicId":"Libtmux_workspace.Execution.hint","qualifiedName":"Libtmux_workspace.Execution.hint","name":"hint","kind":"struct","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":166,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" A creation row received before daemon binding finished. Hints are not\n operational targets and are never eligible for automatic compensation. "],"declarations":[{"kind":"struct","text":"type hint = {\n session : Libtmux.Session.Id.t;\n window : Libtmux.Window.Id.t;\n pane : Libtmux.Pane.Id.t;\n window_index : int;\n pane_index : int;\n server_pid : int;\n }","source":{"file":"workspace/libtmux_workspace.mli","line":166,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","doc":{"summary":"A creation row received before daemon binding finished. Hints are not operational targets and are never eligible for automatic compensation."},"signatures":[{"raw":"type hint =\n {\n session: Libtmux.Session.Id.t ;\n window: Libtmux.Window.Id.t ;\n pane: Libtmux.Pane.Id.t ;\n window_index: int ;\n pane_index: int ;\n server_pid: int }","params":[]}],"slug":"libtmux_workspace-execution-hint"},{"id":"Libtmux_workspace.Execution.hint.pane","publicId":"Libtmux_workspace.Execution.hint.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":169,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : Libtmux.Pane.Id.t;","source":{"file":"workspace/libtmux_workspace.mli","line":169,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.hint","type":"Libtmux.Pane.Id.t","qualifiedName":"Libtmux_workspace.Execution.pane","slug":"libtmux_workspace-execution-hint-pane"},{"id":"Libtmux_workspace.Execution.hint.pane_index","publicId":"Libtmux_workspace.Execution.hint.pane_index","name":"pane_index","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":171,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane_index : int;","source":{"file":"workspace/libtmux_workspace.mli","line":171,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.hint","type":"int","qualifiedName":"Libtmux_workspace.Execution.pane_index","slug":"libtmux_workspace-execution-hint-pane_index"},{"id":"Libtmux_workspace.Execution.hint.server_pid","publicId":"Libtmux_workspace.Execution.hint.server_pid","name":"server_pid","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":172,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"server_pid : int;","source":{"file":"workspace/libtmux_workspace.mli","line":172,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.hint","type":"int","qualifiedName":"Libtmux_workspace.Execution.server_pid","slug":"libtmux_workspace-execution-hint-server_pid"},{"id":"Libtmux_workspace.Execution.hint.session","publicId":"Libtmux_workspace.Execution.hint.session","name":"session","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":167,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"session : Libtmux.Session.Id.t;","source":{"file":"workspace/libtmux_workspace.mli","line":167,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.hint","type":"Libtmux.Session.Id.t","qualifiedName":"Libtmux_workspace.Execution.session","slug":"libtmux_workspace-execution-hint-session"},{"id":"Libtmux_workspace.Execution.hint.window","publicId":"Libtmux_workspace.Execution.hint.window","name":"window","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":168,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window : Libtmux.Window.Id.t;","source":{"file":"workspace/libtmux_workspace.mli","line":168,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.hint","type":"Libtmux.Window.Id.t","qualifiedName":"Libtmux_workspace.Execution.window","slug":"libtmux_workspace-execution-hint-window"},{"id":"Libtmux_workspace.Execution.hint.window_index","publicId":"Libtmux_workspace.Execution.hint.window_index","name":"window_index","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":170,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window_index : int;","source":{"file":"workspace/libtmux_workspace.mli","line":170,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.hint","type":"int","qualifiedName":"Libtmux_workspace.Execution.window_index","slug":"libtmux_workspace-execution-hint-window_index"},{"id":"Libtmux_workspace.Execution.inspect","publicId":"Libtmux_workspace.Execution.inspect","qualifiedName":"Libtmux_workspace.Execution.inspect","name":"inspect","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":250,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Return an immutable copy of the retained journal without I/O. "],"declarations":[{"kind":"function","text":"val inspect : t -> receipt","source":{"file":"workspace/libtmux_workspace.mli","line":250,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","doc":{"summary":"Return an immutable copy of the retained journal without I/O."},"signatures":[{"raw":"val inspect : t -> receipt","params":[{"name":"arg1","type":"t"}],"returns":"receipt"}],"slug":"libtmux_workspace-execution-inspect"},{"id":"Libtmux_workspace.Execution.observation","publicId":"Libtmux_workspace.Execution.observation","qualifiedName":"Libtmux_workspace.Execution.observation","name":"observation","kind":"struct","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":179,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type observation = {\n certainty : certainty;\n created : Libtmux.Created.t list;\n unbound : hint option;\n }","source":{"file":"workspace/libtmux_workspace.mli","line":179,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","signatures":[{"raw":"type observation =\n {\n certainty: certainty ;\n created: Libtmux.Created.t list ;\n unbound: hint option }","params":[]}],"slug":"libtmux_workspace-execution-observation"},{"id":"Libtmux_workspace.Execution.observation.certainty","publicId":"Libtmux_workspace.Execution.observation.certainty","name":"certainty","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":180,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"certainty : certainty;","source":{"file":"workspace/libtmux_workspace.mli","line":180,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.observation","type":"certainty","qualifiedName":"Libtmux_workspace.Execution.certainty","slug":"libtmux_workspace-execution-observation-certainty"},{"id":"Libtmux_workspace.Execution.observation.created","publicId":"Libtmux_workspace.Execution.observation.created","name":"created","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":181,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"created : Libtmux.Created.t list;","source":{"file":"workspace/libtmux_workspace.mli","line":181,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.observation","type":"Libtmux.Created.t list","qualifiedName":"Libtmux_workspace.Execution.created","slug":"libtmux_workspace-execution-observation-created"},{"id":"Libtmux_workspace.Execution.observation.unbound","publicId":"Libtmux_workspace.Execution.observation.unbound","name":"unbound","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":182,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"unbound : hint option;","source":{"file":"workspace/libtmux_workspace.mli","line":182,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.observation","type":"hint option","qualifiedName":"Libtmux_workspace.Execution.unbound","slug":"libtmux_workspace-execution-observation-unbound"},{"id":"Libtmux_workspace.Execution.receipt","publicId":"Libtmux_workspace.Execution.receipt","qualifiedName":"Libtmux_workspace.Execution.receipt","name":"receipt","kind":"struct","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":229,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type receipt = {\n operation_id : string;\n source : Libtmux.Source.t option;\n status : status;\n steps : step Iarray.t;\n cleanup : cleanup Iarray.t;\n cleanup_error : Libtmux.Error.t option;\n }","source":{"file":"workspace/libtmux_workspace.mli","line":229,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","signatures":[{"raw":"type receipt =\n {\n operation_id: string ;\n source: Libtmux.Source.t option ;\n status: status ;\n steps: step Iarray.t ;\n cleanup: cleanup Iarray.t ;\n cleanup_error: Libtmux.Error.t option }","params":[]}],"slug":"libtmux_workspace-execution-receipt"},{"id":"Libtmux_workspace.Execution.receipt.cleanup","publicId":"Libtmux_workspace.Execution.receipt.cleanup","name":"cleanup","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":234,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"cleanup : cleanup Iarray.t;","source":{"file":"workspace/libtmux_workspace.mli","line":234,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.receipt","type":"cleanup Iarray.t","qualifiedName":"Libtmux_workspace.Execution.cleanup","slug":"libtmux_workspace-execution-receipt-cleanup"},{"id":"Libtmux_workspace.Execution.receipt.cleanup_error","publicId":"Libtmux_workspace.Execution.receipt.cleanup_error","name":"cleanup_error","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":235,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"cleanup_error : Libtmux.Error.t option;","source":{"file":"workspace/libtmux_workspace.mli","line":235,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.receipt","type":"Libtmux.Error.t option","qualifiedName":"Libtmux_workspace.Execution.cleanup_error","slug":"libtmux_workspace-execution-receipt-cleanup_error"},{"id":"Libtmux_workspace.Execution.receipt.operation_id","publicId":"Libtmux_workspace.Execution.receipt.operation_id","name":"operation_id","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":230,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"operation_id : string;","source":{"file":"workspace/libtmux_workspace.mli","line":230,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.receipt","type":"string","qualifiedName":"Libtmux_workspace.Execution.operation_id","slug":"libtmux_workspace-execution-receipt-operation_id"},{"id":"Libtmux_workspace.Execution.receipt.source","publicId":"Libtmux_workspace.Execution.receipt.source","name":"source","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":231,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"source : Libtmux.Source.t option;","source":{"file":"workspace/libtmux_workspace.mli","line":231,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.receipt","type":"Libtmux.Source.t option","qualifiedName":"Libtmux_workspace.Execution.source","slug":"libtmux_workspace-execution-receipt-source"},{"id":"Libtmux_workspace.Execution.receipt.status","publicId":"Libtmux_workspace.Execution.receipt.status","name":"status","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":232,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"status : status;","source":{"file":"workspace/libtmux_workspace.mli","line":232,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.receipt","type":"status","qualifiedName":"Libtmux_workspace.Execution.status","slug":"libtmux_workspace-execution-receipt-status"},{"id":"Libtmux_workspace.Execution.receipt.steps","publicId":"Libtmux_workspace.Execution.receipt.steps","name":"steps","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":233,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"steps : step Iarray.t;","source":{"file":"workspace/libtmux_workspace.mli","line":233,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.receipt","type":"step Iarray.t","qualifiedName":"Libtmux_workspace.Execution.steps","slug":"libtmux_workspace-execution-receipt-steps"},{"id":"Libtmux_workspace.Execution.status","publicId":"Libtmux_workspace.Execution.status","qualifiedName":"Libtmux_workspace.Execution.status","name":"status","kind":"enum","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":220,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type status =\n | Queued\n | Applying\n | Succeeded\n | Partial\n | Interrupted\n | Rejected of Plan.error\n | Unavailable of Libtmux.Error.t","source":{"file":"workspace/libtmux_workspace.mli","line":220,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","signatures":[{"raw":"type status =\n | Queued \n | Applying \n | Succeeded \n | Partial \n | Interrupted \n | Rejected of Plan.error \n | Unavailable of Libtmux.Error.t ","params":[]}],"slug":"libtmux_workspace-execution-status"},{"id":"Libtmux_workspace.Execution.status.Applying","publicId":"Libtmux_workspace.Execution.status.Applying","name":"Applying","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":222,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Applying","source":{"file":"workspace/libtmux_workspace.mli","line":222,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.status","variant":"unit","qualifiedName":"Libtmux_workspace.Execution.Applying","slug":"libtmux_workspace-execution-status-applying"},{"id":"Libtmux_workspace.Execution.status.Interrupted","publicId":"Libtmux_workspace.Execution.status.Interrupted","name":"Interrupted","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":225,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Interrupted","source":{"file":"workspace/libtmux_workspace.mli","line":225,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.status","variant":"unit","qualifiedName":"Libtmux_workspace.Execution.Interrupted","slug":"libtmux_workspace-execution-status-interrupted"},{"id":"Libtmux_workspace.Execution.status.Partial","publicId":"Libtmux_workspace.Execution.status.Partial","name":"Partial","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":224,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Partial","source":{"file":"workspace/libtmux_workspace.mli","line":224,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.status","variant":"unit","qualifiedName":"Libtmux_workspace.Execution.Partial","slug":"libtmux_workspace-execution-status-partial"},{"id":"Libtmux_workspace.Execution.status.Queued","publicId":"Libtmux_workspace.Execution.status.Queued","name":"Queued","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":221,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Queued","source":{"file":"workspace/libtmux_workspace.mli","line":221,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.status","variant":"unit","qualifiedName":"Libtmux_workspace.Execution.Queued","slug":"libtmux_workspace-execution-status-queued"},{"id":"Libtmux_workspace.Execution.status.Rejected","publicId":"Libtmux_workspace.Execution.status.Rejected","name":"Rejected","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":226,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Rejected of Plan.error","source":{"file":"workspace/libtmux_workspace.mli","line":226,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.status","variant":"tuple","qualifiedName":"Libtmux_workspace.Execution.Rejected","slug":"libtmux_workspace-execution-status-rejected"},{"id":"Libtmux_workspace.Execution.status.Succeeded","publicId":"Libtmux_workspace.Execution.status.Succeeded","name":"Succeeded","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":223,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Succeeded","source":{"file":"workspace/libtmux_workspace.mli","line":223,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.status","variant":"unit","qualifiedName":"Libtmux_workspace.Execution.Succeeded","slug":"libtmux_workspace-execution-status-succeeded"},{"id":"Libtmux_workspace.Execution.status.Unavailable","publicId":"Libtmux_workspace.Execution.status.Unavailable","name":"Unavailable","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":227,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unavailable of Libtmux.Error.t","source":{"file":"workspace/libtmux_workspace.mli","line":227,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.status","variant":"tuple","qualifiedName":"Libtmux_workspace.Execution.Unavailable","slug":"libtmux_workspace-execution-status-unavailable"},{"id":"Libtmux_workspace.Execution.step","publicId":"Libtmux_workspace.Execution.step","qualifiedName":"Libtmux_workspace.Execution.step","name":"step","kind":"struct","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":207,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"struct","text":"type step = {\n index : int;\n action : Plan.action;\n status : step_status;\n created : Libtmux.Created.t list;\n unbound : hint option;\n }","source":{"file":"workspace/libtmux_workspace.mli","line":207,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","signatures":[{"raw":"type step =\n {\n index: int ;\n action: Plan.action ;\n status: step_status ;\n created: Libtmux.Created.t list ;\n unbound: hint option }","params":[]}],"slug":"libtmux_workspace-execution-step"},{"id":"Libtmux_workspace.Execution.step.action","publicId":"Libtmux_workspace.Execution.step.action","name":"action","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":209,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"action : Plan.action;","source":{"file":"workspace/libtmux_workspace.mli","line":209,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.step","type":"Plan.action","qualifiedName":"Libtmux_workspace.Execution.action","slug":"libtmux_workspace-execution-step-action"},{"id":"Libtmux_workspace.Execution.step.created","publicId":"Libtmux_workspace.Execution.step.created","name":"created","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":211,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"created : Libtmux.Created.t list;","source":{"file":"workspace/libtmux_workspace.mli","line":211,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.step","type":"Libtmux.Created.t list","qualifiedName":"Libtmux_workspace.Execution.created","slug":"libtmux_workspace-execution-step-created"},{"id":"Libtmux_workspace.Execution.step.index","publicId":"Libtmux_workspace.Execution.step.index","name":"index","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":208,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"index : int;","source":{"file":"workspace/libtmux_workspace.mli","line":208,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.step","type":"int","qualifiedName":"Libtmux_workspace.Execution.index","slug":"libtmux_workspace-execution-step-index"},{"id":"Libtmux_workspace.Execution.step.status","publicId":"Libtmux_workspace.Execution.step.status","name":"status","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":210,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"status : step_status;","source":{"file":"workspace/libtmux_workspace.mli","line":210,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.step","type":"step_status","qualifiedName":"Libtmux_workspace.Execution.status","slug":"libtmux_workspace-execution-step-status"},{"id":"Libtmux_workspace.Execution.step.unbound","publicId":"Libtmux_workspace.Execution.step.unbound","name":"unbound","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":212,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"unbound : hint option;","source":{"file":"workspace/libtmux_workspace.mli","line":212,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.step","type":"hint option","qualifiedName":"Libtmux_workspace.Execution.unbound","slug":"libtmux_workspace-execution-step-unbound"},{"id":"Libtmux_workspace.Execution.step_status","publicId":"Libtmux_workspace.Execution.step_status","qualifiedName":"Libtmux_workspace.Execution.step_status","name":"step_status","kind":"enum","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":199,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type step_status =\n | Pending\n | Running\n | Completed\n | Failed of Libtmux.Error.t\n | Skipped\n | Uncertain of Libtmux.Error.t","source":{"file":"workspace/libtmux_workspace.mli","line":199,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","signatures":[{"raw":"type step_status =\n | Pending \n | Running \n | Completed \n | Failed of Libtmux.Error.t \n | Skipped \n | Uncertain of Libtmux.Error.t ","params":[]}],"slug":"libtmux_workspace-execution-step_status"},{"id":"Libtmux_workspace.Execution.step_status.Completed","publicId":"Libtmux_workspace.Execution.step_status.Completed","name":"Completed","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":202,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Completed","source":{"file":"workspace/libtmux_workspace.mli","line":202,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.step_status","variant":"unit","qualifiedName":"Libtmux_workspace.Execution.Completed","slug":"libtmux_workspace-execution-step_status-completed"},{"id":"Libtmux_workspace.Execution.step_status.Failed","publicId":"Libtmux_workspace.Execution.step_status.Failed","name":"Failed","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":203,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Failed of Libtmux.Error.t","source":{"file":"workspace/libtmux_workspace.mli","line":203,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.step_status","variant":"tuple","qualifiedName":"Libtmux_workspace.Execution.Failed","slug":"libtmux_workspace-execution-step_status-failed"},{"id":"Libtmux_workspace.Execution.step_status.Pending","publicId":"Libtmux_workspace.Execution.step_status.Pending","name":"Pending","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":200,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Pending","source":{"file":"workspace/libtmux_workspace.mli","line":200,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.step_status","variant":"unit","qualifiedName":"Libtmux_workspace.Execution.Pending","slug":"libtmux_workspace-execution-step_status-pending"},{"id":"Libtmux_workspace.Execution.step_status.Running","publicId":"Libtmux_workspace.Execution.step_status.Running","name":"Running","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":201,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Running","source":{"file":"workspace/libtmux_workspace.mli","line":201,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.step_status","variant":"unit","qualifiedName":"Libtmux_workspace.Execution.Running","slug":"libtmux_workspace-execution-step_status-running"},{"id":"Libtmux_workspace.Execution.step_status.Skipped","publicId":"Libtmux_workspace.Execution.step_status.Skipped","name":"Skipped","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":204,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Skipped","source":{"file":"workspace/libtmux_workspace.mli","line":204,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.step_status","variant":"unit","qualifiedName":"Libtmux_workspace.Execution.Skipped","slug":"libtmux_workspace-execution-step_status-skipped"},{"id":"Libtmux_workspace.Execution.step_status.Uncertain","publicId":"Libtmux_workspace.Execution.step_status.Uncertain","name":"Uncertain","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":205,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Uncertain of Libtmux.Error.t","source":{"file":"workspace/libtmux_workspace.mli","line":205,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution.step_status","variant":"tuple","qualifiedName":"Libtmux_workspace.Execution.Uncertain","slug":"libtmux_workspace-execution-step_status-uncertain"},{"id":"Libtmux_workspace.Execution.t","publicId":"Libtmux_workspace.Execution.t","qualifiedName":"Libtmux_workspace.Execution.t","name":"t","kind":"typealias","package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":238,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"workspace/libtmux_workspace.mli","line":238,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Execution","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux_workspace-execution-t"},{"id":"Libtmux_workspace.Plan","publicId":"Libtmux_workspace.Plan","qualifiedName":"Libtmux_workspace.Plan","name":"Plan","kind":"module","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":89,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[" Preview ordered workspace actions against one observed daemon generation. A\n plan retains collision policy and bound targets; it is not a portable\n command script. "],"declarations":[{"kind":"module","text":"module Plan : sig\n type server_policy = Create_if_missing | Require_existing_server\n type window_collision = Reject\n\n type collision_policy =\n | Fail_if_session_exists\n | Append_new_windows of { window_collision : window_collision }\n\n type error =\n | Missing_endpoint\n | Session_conflict of string\n | Window_conflict of string\n | Append_session_options\n | Too_many_steps\n | Unsupported_setting of Config.error\n | Stale\n\n val pp_error : Format.formatter -> error -> unit\n\n type scope = Session | Window of int | Pane of { window : int; pane : int }\n\n type action =\n | Create_session of {\n bootstrap : bool;\n name : string;\n window_name : string;\n spawn : Libtmux.Spawn.t;\n width : int;\n height : int;\n }\n | Create_window of { window : int; name : string; spawn : Libtmux.Spawn.t }\n | Split_pane of {\n window : int;\n pane : int;\n spawn : Libtmux.Spawn.t;\n direction : Libtmux.Geometry.direction;\n size : Libtmux.Geometry.size option;\n }\n | Set_environment of string * string\n | Set_option of scope * Config.setting\n | Send_text of { window : int; pane : int; text : string }\n | Send_enter of { window : int; pane : int }\n | Select_layout of int * Libtmux.Layout.t\n\n type t\n\n val make :\n ?server_policy:server_policy ->\n ?collision_policy:collision_policy ->\n endpoint:Libtmux.Endpoint.t ->\n version:string ->\n observed:Libtmux.Snapshot.t option ->\n Config.t ->\n (t, error) result\n (** [None] means an explicitly observed missing endpoint. It is not an empty\n successful snapshot. A plan does not start a server. Append rejects any\n existing requested window name and never changes session options.\n [version] selects the generated option catalog. *)\n\n val endpoint : t -> Libtmux.Endpoint.t\n val source : t -> Libtmux.Source.t option\n val existing_session : t -> Libtmux.Session.target option\n val actions : t -> action Iarray.t\n val config : t -> Config.t\n\n val check_source : t -> Libtmux.Source.t option -> (unit, error) result\n (** Operational plans are ephemeral and bound to one connection generation. A\n printed or serialized preview cannot supply operational targets. *)\nend","source":{"file":"workspace/libtmux_workspace.mli","line":89,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace","doc":{"summary":"Preview ordered workspace actions against one observed daemon generation. A plan retains collision policy and bound targets; it is not a portable command script."},"slug":"libtmux_workspace-plan"},{"id":"Libtmux_workspace.Plan.action","publicId":"Libtmux_workspace.Plan.action","qualifiedName":"Libtmux_workspace.Plan.action","name":"action","kind":"enum","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":110,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type action =\n | Create_session of {\n bootstrap : bool;\n name : string;\n window_name : string;\n spawn : Libtmux.Spawn.t;\n width : int;\n height : int;\n }\n | Create_window of { window : int; name : string; spawn : Libtmux.Spawn.t }\n | Split_pane of {\n window : int;\n pane : int;\n spawn : Libtmux.Spawn.t;\n direction : Libtmux.Geometry.direction;\n size : Libtmux.Geometry.size option;\n }\n | Set_environment of string * string\n | Set_option of scope * Config.setting\n | Send_text of { window : int; pane : int; text : string }\n | Send_enter of { window : int; pane : int }\n | Select_layout of int * Libtmux.Layout.t","source":{"file":"workspace/libtmux_workspace.mli","line":110,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"type action =\n | Create_session of\n {\n bootstrap: bool ;\n name: string ;\n window_name: string ;\n spawn: Libtmux.Spawn.t ;\n width: int ;\n height: int } \n | Create_window of {\n window: int ;\n name: string ;\n spawn: Libtmux.Spawn.t } \n | Split_pane of\n {\n window: int ;\n pane: int ;\n spawn: Libtmux.Spawn.t ;\n direction: Libtmux.Geometry.direction ;\n size: Libtmux.Geometry.size option } \n | Set_environment of string * string \n | Set_option of scope * Config.setting \n | Send_text of {\n window: int ;\n pane: int ;\n text: string } \n | Send_enter of {\n window: int ;\n pane: int } \n | Select_layout of int * Libtmux.Layout.t ","params":[]}],"slug":"libtmux_workspace-plan-action"},{"id":"Libtmux_workspace.Plan.action.Create_session","publicId":"Libtmux_workspace.Plan.action.Create_session","name":"Create_session","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":111,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Create_session of {\n bootstrap : bool;\n name : string;\n window_name : string;\n spawn : Libtmux.Spawn.t;\n width : int;\n height : int;\n }","source":{"file":"workspace/libtmux_workspace.mli","line":111,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action","variant":"struct","qualifiedName":"Libtmux_workspace.Plan.Create_session","slug":"libtmux_workspace-plan-action-create_session"},{"id":"Libtmux_workspace.Plan.action.Create_session.bootstrap","publicId":"Libtmux_workspace.Plan.action.Create_session.bootstrap","name":"bootstrap","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":112,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"bootstrap : bool;","source":{"file":"workspace/libtmux_workspace.mli","line":112,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Create_session","type":"bool","qualifiedName":"Libtmux_workspace.Plan.bootstrap","slug":"libtmux_workspace-plan-action-create_session-bootstrap"},{"id":"Libtmux_workspace.Plan.action.Create_session.height","publicId":"Libtmux_workspace.Plan.action.Create_session.height","name":"height","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":117,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"height : int;","source":{"file":"workspace/libtmux_workspace.mli","line":117,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Create_session","type":"int","qualifiedName":"Libtmux_workspace.Plan.height","slug":"libtmux_workspace-plan-action-create_session-height"},{"id":"Libtmux_workspace.Plan.action.Create_session.name","publicId":"Libtmux_workspace.Plan.action.Create_session.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":113,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"workspace/libtmux_workspace.mli","line":113,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Create_session","type":"string","qualifiedName":"Libtmux_workspace.Plan.name","slug":"libtmux_workspace-plan-action-create_session-name"},{"id":"Libtmux_workspace.Plan.action.Create_session.spawn","publicId":"Libtmux_workspace.Plan.action.Create_session.spawn","name":"spawn","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":115,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"spawn : Libtmux.Spawn.t;","source":{"file":"workspace/libtmux_workspace.mli","line":115,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Create_session","type":"Libtmux.Spawn.t","qualifiedName":"Libtmux_workspace.Plan.spawn","slug":"libtmux_workspace-plan-action-create_session-spawn"},{"id":"Libtmux_workspace.Plan.action.Create_session.width","publicId":"Libtmux_workspace.Plan.action.Create_session.width","name":"width","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":116,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"width : int;","source":{"file":"workspace/libtmux_workspace.mli","line":116,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Create_session","type":"int","qualifiedName":"Libtmux_workspace.Plan.width","slug":"libtmux_workspace-plan-action-create_session-width"},{"id":"Libtmux_workspace.Plan.action.Create_session.window_name","publicId":"Libtmux_workspace.Plan.action.Create_session.window_name","name":"window_name","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":114,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window_name : string;","source":{"file":"workspace/libtmux_workspace.mli","line":114,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Create_session","type":"string","qualifiedName":"Libtmux_workspace.Plan.window_name","slug":"libtmux_workspace-plan-action-create_session-window_name"},{"id":"Libtmux_workspace.Plan.action.Create_window","publicId":"Libtmux_workspace.Plan.action.Create_window","name":"Create_window","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":119,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Create_window of { window : int; name : string; spawn : Libtmux.Spawn.t }","source":{"file":"workspace/libtmux_workspace.mli","line":119,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action","variant":"struct","qualifiedName":"Libtmux_workspace.Plan.Create_window","slug":"libtmux_workspace-plan-action-create_window"},{"id":"Libtmux_workspace.Plan.action.Create_window.name","publicId":"Libtmux_workspace.Plan.action.Create_window.name","name":"name","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":119,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"name : string;","source":{"file":"workspace/libtmux_workspace.mli","line":119,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Create_window","type":"string","qualifiedName":"Libtmux_workspace.Plan.name","slug":"libtmux_workspace-plan-action-create_window-name"},{"id":"Libtmux_workspace.Plan.action.Create_window.spawn","publicId":"Libtmux_workspace.Plan.action.Create_window.spawn","name":"spawn","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":119,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"spawn : Libtmux.Spawn.t","source":{"file":"workspace/libtmux_workspace.mli","line":119,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Create_window","type":"Libtmux.Spawn.t","qualifiedName":"Libtmux_workspace.Plan.spawn","slug":"libtmux_workspace-plan-action-create_window-spawn"},{"id":"Libtmux_workspace.Plan.action.Create_window.window","publicId":"Libtmux_workspace.Plan.action.Create_window.window","name":"window","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":119,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window : int;","source":{"file":"workspace/libtmux_workspace.mli","line":119,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Create_window","type":"int","qualifiedName":"Libtmux_workspace.Plan.window","slug":"libtmux_workspace-plan-action-create_window-window"},{"id":"Libtmux_workspace.Plan.action.Select_layout","publicId":"Libtmux_workspace.Plan.action.Select_layout","name":"Select_layout","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":131,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Select_layout of int * Libtmux.Layout.t","source":{"file":"workspace/libtmux_workspace.mli","line":131,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action","variant":"tuple","qualifiedName":"Libtmux_workspace.Plan.Select_layout","slug":"libtmux_workspace-plan-action-select_layout"},{"id":"Libtmux_workspace.Plan.action.Send_enter","publicId":"Libtmux_workspace.Plan.action.Send_enter","name":"Send_enter","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":130,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Send_enter of { window : int; pane : int }","source":{"file":"workspace/libtmux_workspace.mli","line":130,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action","variant":"struct","qualifiedName":"Libtmux_workspace.Plan.Send_enter","slug":"libtmux_workspace-plan-action-send_enter"},{"id":"Libtmux_workspace.Plan.action.Send_enter.pane","publicId":"Libtmux_workspace.Plan.action.Send_enter.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":130,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : int","source":{"file":"workspace/libtmux_workspace.mli","line":130,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Send_enter","type":"int","qualifiedName":"Libtmux_workspace.Plan.pane","slug":"libtmux_workspace-plan-action-send_enter-pane"},{"id":"Libtmux_workspace.Plan.action.Send_enter.window","publicId":"Libtmux_workspace.Plan.action.Send_enter.window","name":"window","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":130,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window : int;","source":{"file":"workspace/libtmux_workspace.mli","line":130,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Send_enter","type":"int","qualifiedName":"Libtmux_workspace.Plan.window","slug":"libtmux_workspace-plan-action-send_enter-window"},{"id":"Libtmux_workspace.Plan.action.Send_text","publicId":"Libtmux_workspace.Plan.action.Send_text","name":"Send_text","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":129,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Send_text of { window : int; pane : int; text : string }","source":{"file":"workspace/libtmux_workspace.mli","line":129,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action","variant":"struct","qualifiedName":"Libtmux_workspace.Plan.Send_text","slug":"libtmux_workspace-plan-action-send_text"},{"id":"Libtmux_workspace.Plan.action.Send_text.pane","publicId":"Libtmux_workspace.Plan.action.Send_text.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":129,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : int;","source":{"file":"workspace/libtmux_workspace.mli","line":129,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Send_text","type":"int","qualifiedName":"Libtmux_workspace.Plan.pane","slug":"libtmux_workspace-plan-action-send_text-pane"},{"id":"Libtmux_workspace.Plan.action.Send_text.text","publicId":"Libtmux_workspace.Plan.action.Send_text.text","name":"text","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":129,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"text : string","source":{"file":"workspace/libtmux_workspace.mli","line":129,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Send_text","type":"string","qualifiedName":"Libtmux_workspace.Plan.text","slug":"libtmux_workspace-plan-action-send_text-text"},{"id":"Libtmux_workspace.Plan.action.Send_text.window","publicId":"Libtmux_workspace.Plan.action.Send_text.window","name":"window","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":129,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window : int;","source":{"file":"workspace/libtmux_workspace.mli","line":129,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Send_text","type":"int","qualifiedName":"Libtmux_workspace.Plan.window","slug":"libtmux_workspace-plan-action-send_text-window"},{"id":"Libtmux_workspace.Plan.action.Set_environment","publicId":"Libtmux_workspace.Plan.action.Set_environment","name":"Set_environment","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":127,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Set_environment of string * string","source":{"file":"workspace/libtmux_workspace.mli","line":127,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action","variant":"tuple","qualifiedName":"Libtmux_workspace.Plan.Set_environment","slug":"libtmux_workspace-plan-action-set_environment"},{"id":"Libtmux_workspace.Plan.action.Set_option","publicId":"Libtmux_workspace.Plan.action.Set_option","name":"Set_option","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":128,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Set_option of scope * Config.setting","source":{"file":"workspace/libtmux_workspace.mli","line":128,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action","variant":"tuple","qualifiedName":"Libtmux_workspace.Plan.Set_option","slug":"libtmux_workspace-plan-action-set_option"},{"id":"Libtmux_workspace.Plan.action.Split_pane","publicId":"Libtmux_workspace.Plan.action.Split_pane","name":"Split_pane","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":120,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Split_pane of {\n window : int;\n pane : int;\n spawn : Libtmux.Spawn.t;\n direction : Libtmux.Geometry.direction;\n size : Libtmux.Geometry.size option;\n }","source":{"file":"workspace/libtmux_workspace.mli","line":120,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action","variant":"struct","qualifiedName":"Libtmux_workspace.Plan.Split_pane","slug":"libtmux_workspace-plan-action-split_pane"},{"id":"Libtmux_workspace.Plan.action.Split_pane.direction","publicId":"Libtmux_workspace.Plan.action.Split_pane.direction","name":"direction","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":124,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"direction : Libtmux.Geometry.direction;","source":{"file":"workspace/libtmux_workspace.mli","line":124,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Split_pane","type":"Libtmux.Geometry.direction","qualifiedName":"Libtmux_workspace.Plan.direction","slug":"libtmux_workspace-plan-action-split_pane-direction"},{"id":"Libtmux_workspace.Plan.action.Split_pane.pane","publicId":"Libtmux_workspace.Plan.action.Split_pane.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":122,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : int;","source":{"file":"workspace/libtmux_workspace.mli","line":122,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Split_pane","type":"int","qualifiedName":"Libtmux_workspace.Plan.pane","slug":"libtmux_workspace-plan-action-split_pane-pane"},{"id":"Libtmux_workspace.Plan.action.Split_pane.size","publicId":"Libtmux_workspace.Plan.action.Split_pane.size","name":"size","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":125,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"size : Libtmux.Geometry.size option;","source":{"file":"workspace/libtmux_workspace.mli","line":125,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Split_pane","type":"Libtmux.Geometry.size option","qualifiedName":"Libtmux_workspace.Plan.size","slug":"libtmux_workspace-plan-action-split_pane-size"},{"id":"Libtmux_workspace.Plan.action.Split_pane.spawn","publicId":"Libtmux_workspace.Plan.action.Split_pane.spawn","name":"spawn","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":123,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"spawn : Libtmux.Spawn.t;","source":{"file":"workspace/libtmux_workspace.mli","line":123,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Split_pane","type":"Libtmux.Spawn.t","qualifiedName":"Libtmux_workspace.Plan.spawn","slug":"libtmux_workspace-plan-action-split_pane-spawn"},{"id":"Libtmux_workspace.Plan.action.Split_pane.window","publicId":"Libtmux_workspace.Plan.action.Split_pane.window","name":"window","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":121,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window : int;","source":{"file":"workspace/libtmux_workspace.mli","line":121,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.action.Split_pane","type":"int","qualifiedName":"Libtmux_workspace.Plan.window","slug":"libtmux_workspace-plan-action-split_pane-window"},{"id":"Libtmux_workspace.Plan.actions","publicId":"Libtmux_workspace.Plan.actions","qualifiedName":"Libtmux_workspace.Plan.actions","name":"actions","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":151,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val actions : t -> action Iarray.t","source":{"file":"workspace/libtmux_workspace.mli","line":151,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"val actions : t -> action Iarray.t","params":[{"name":"arg1","type":"t"}],"returns":"action Iarray.t"}],"slug":"libtmux_workspace-plan-actions"},{"id":"Libtmux_workspace.Plan.check_source","publicId":"Libtmux_workspace.Plan.check_source","qualifiedName":"Libtmux_workspace.Plan.check_source","name":"check_source","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":154,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" Operational plans are ephemeral and bound to one connection generation. A\n printed or serialized preview cannot supply operational targets. "],"declarations":[{"kind":"function","text":"val check_source : t -> Libtmux.Source.t option -> (unit, error) result","source":{"file":"workspace/libtmux_workspace.mli","line":154,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","doc":{"summary":"Operational plans are ephemeral and bound to one connection generation. A printed or serialized preview cannot supply operational targets."},"signatures":[{"raw":"val check_source : t -> Libtmux.Source.t option -> (unit, error) result","params":[{"name":"arg1","type":"t"},{"name":"arg2","type":"Libtmux.Source.t option"}],"returns":"(unit, error) result"}],"slug":"libtmux_workspace-plan-check_source"},{"id":"Libtmux_workspace.Plan.collision_policy","publicId":"Libtmux_workspace.Plan.collision_policy","qualifiedName":"Libtmux_workspace.Plan.collision_policy","name":"collision_policy","kind":"enum","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":93,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type collision_policy =\n | Fail_if_session_exists\n | Append_new_windows of { window_collision : window_collision }","source":{"file":"workspace/libtmux_workspace.mli","line":93,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"type collision_policy =\n | Fail_if_session_exists \n | Append_new_windows of {\n window_collision: window_collision } ","params":[]}],"slug":"libtmux_workspace-plan-collision_policy"},{"id":"Libtmux_workspace.Plan.collision_policy.Append_new_windows","publicId":"Libtmux_workspace.Plan.collision_policy.Append_new_windows","name":"Append_new_windows","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":95,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Append_new_windows of { window_collision : window_collision }","source":{"file":"workspace/libtmux_workspace.mli","line":95,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.collision_policy","variant":"struct","qualifiedName":"Libtmux_workspace.Plan.Append_new_windows","slug":"libtmux_workspace-plan-collision_policy-append_new_windows"},{"id":"Libtmux_workspace.Plan.collision_policy.Append_new_windows.window_collision","publicId":"Libtmux_workspace.Plan.collision_policy.Append_new_windows.window_collision","name":"window_collision","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":95,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window_collision : window_collision","source":{"file":"workspace/libtmux_workspace.mli","line":95,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.collision_policy.Append_new_windows","type":"window_collision","qualifiedName":"Libtmux_workspace.Plan.window_collision","slug":"libtmux_workspace-plan-collision_policy-append_new_windows-window_collision"},{"id":"Libtmux_workspace.Plan.collision_policy.Fail_if_session_exists","publicId":"Libtmux_workspace.Plan.collision_policy.Fail_if_session_exists","name":"Fail_if_session_exists","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":94,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Fail_if_session_exists","source":{"file":"workspace/libtmux_workspace.mli","line":94,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.collision_policy","variant":"unit","qualifiedName":"Libtmux_workspace.Plan.Fail_if_session_exists","slug":"libtmux_workspace-plan-collision_policy-fail_if_session_exists"},{"id":"Libtmux_workspace.Plan.config","publicId":"Libtmux_workspace.Plan.config","qualifiedName":"Libtmux_workspace.Plan.config","name":"config","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":152,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val config : t -> Config.t","source":{"file":"workspace/libtmux_workspace.mli","line":152,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"val config : t -> Config.t","params":[{"name":"arg1","type":"t"}],"returns":"Config.t"}],"slug":"libtmux_workspace-plan-config"},{"id":"Libtmux_workspace.Plan.endpoint","publicId":"Libtmux_workspace.Plan.endpoint","qualifiedName":"Libtmux_workspace.Plan.endpoint","name":"endpoint","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":148,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val endpoint : t -> Libtmux.Endpoint.t","source":{"file":"workspace/libtmux_workspace.mli","line":148,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"val endpoint : t -> Libtmux.Endpoint.t","params":[{"name":"arg1","type":"t"}],"returns":"Libtmux.Endpoint.t"}],"slug":"libtmux_workspace-plan-endpoint"},{"id":"Libtmux_workspace.Plan.error","publicId":"Libtmux_workspace.Plan.error","qualifiedName":"Libtmux_workspace.Plan.error","name":"error","kind":"enum","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":97,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type error =\n | Missing_endpoint\n | Session_conflict of string\n | Window_conflict of string\n | Append_session_options\n | Too_many_steps\n | Unsupported_setting of Config.error\n | Stale","source":{"file":"workspace/libtmux_workspace.mli","line":97,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"type error =\n | Missing_endpoint \n | Session_conflict of string \n | Window_conflict of string \n | Append_session_options \n | Too_many_steps \n | Unsupported_setting of Config.error \n | Stale ","params":[]}],"slug":"libtmux_workspace-plan-error"},{"id":"Libtmux_workspace.Plan.error.Append_session_options","publicId":"Libtmux_workspace.Plan.error.Append_session_options","name":"Append_session_options","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":101,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Append_session_options","source":{"file":"workspace/libtmux_workspace.mli","line":101,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.error","variant":"unit","qualifiedName":"Libtmux_workspace.Plan.Append_session_options","slug":"libtmux_workspace-plan-error-append_session_options"},{"id":"Libtmux_workspace.Plan.error.Missing_endpoint","publicId":"Libtmux_workspace.Plan.error.Missing_endpoint","name":"Missing_endpoint","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":98,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Missing_endpoint","source":{"file":"workspace/libtmux_workspace.mli","line":98,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.error","variant":"unit","qualifiedName":"Libtmux_workspace.Plan.Missing_endpoint","slug":"libtmux_workspace-plan-error-missing_endpoint"},{"id":"Libtmux_workspace.Plan.error.Session_conflict","publicId":"Libtmux_workspace.Plan.error.Session_conflict","name":"Session_conflict","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":99,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Session_conflict of string","source":{"file":"workspace/libtmux_workspace.mli","line":99,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.error","variant":"tuple","qualifiedName":"Libtmux_workspace.Plan.Session_conflict","slug":"libtmux_workspace-plan-error-session_conflict"},{"id":"Libtmux_workspace.Plan.error.Stale","publicId":"Libtmux_workspace.Plan.error.Stale","name":"Stale","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":104,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Stale","source":{"file":"workspace/libtmux_workspace.mli","line":104,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.error","variant":"unit","qualifiedName":"Libtmux_workspace.Plan.Stale","slug":"libtmux_workspace-plan-error-stale"},{"id":"Libtmux_workspace.Plan.error.Too_many_steps","publicId":"Libtmux_workspace.Plan.error.Too_many_steps","name":"Too_many_steps","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":102,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Too_many_steps","source":{"file":"workspace/libtmux_workspace.mli","line":102,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.error","variant":"unit","qualifiedName":"Libtmux_workspace.Plan.Too_many_steps","slug":"libtmux_workspace-plan-error-too_many_steps"},{"id":"Libtmux_workspace.Plan.error.Unsupported_setting","publicId":"Libtmux_workspace.Plan.error.Unsupported_setting","name":"Unsupported_setting","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":103,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Unsupported_setting of Config.error","source":{"file":"workspace/libtmux_workspace.mli","line":103,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.error","variant":"tuple","qualifiedName":"Libtmux_workspace.Plan.Unsupported_setting","slug":"libtmux_workspace-plan-error-unsupported_setting"},{"id":"Libtmux_workspace.Plan.error.Window_conflict","publicId":"Libtmux_workspace.Plan.error.Window_conflict","name":"Window_conflict","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":100,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Window_conflict of string","source":{"file":"workspace/libtmux_workspace.mli","line":100,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.error","variant":"tuple","qualifiedName":"Libtmux_workspace.Plan.Window_conflict","slug":"libtmux_workspace-plan-error-window_conflict"},{"id":"Libtmux_workspace.Plan.existing_session","publicId":"Libtmux_workspace.Plan.existing_session","qualifiedName":"Libtmux_workspace.Plan.existing_session","name":"existing_session","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":150,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val existing_session : t -> Libtmux.Session.target option","source":{"file":"workspace/libtmux_workspace.mli","line":150,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"val existing_session : t -> Libtmux.Session.target option","params":[{"name":"arg1","type":"t"}],"returns":"Libtmux.Session.target option"}],"slug":"libtmux_workspace-plan-existing_session"},{"id":"Libtmux_workspace.Plan.make","publicId":"Libtmux_workspace.Plan.make","qualifiedName":"Libtmux_workspace.Plan.make","name":"make","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":135,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[" [None] means an explicitly observed missing endpoint. It is not an empty\n successful snapshot. A plan does not start a server. Append rejects any\n existing requested window name and never changes session options.\n [version] selects the generated option catalog. "],"declarations":[{"kind":"function","text":"val make :\n ?server_policy:server_policy ->\n ?collision_policy:collision_policy ->\n endpoint:Libtmux.Endpoint.t ->\n version:string ->\n observed:Libtmux.Snapshot.t option ->\n Config.t ->\n (t, error) result","source":{"file":"workspace/libtmux_workspace.mli","line":135,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","doc":{"summary":"`None` means an explicitly observed missing endpoint. It is not an empty successful snapshot. A plan does not start a server. Append rejects any existing requested window name and never changes session options. `version` selects the generated option catalog."},"signatures":[{"raw":"val make :\n ?server_policy:server_policy ->\n ?collision_policy:collision_policy ->\n endpoint:Libtmux.Endpoint.t ->\n version:string ->\n observed:Libtmux.Snapshot.t option -> Config.t -> (t, error) result","params":[{"name":"server_policy","type":"server_policy","optional":true,"keywordOnly":true},{"name":"collision_policy","type":"collision_policy","optional":true,"keywordOnly":true},{"name":"endpoint","type":"Libtmux.Endpoint.t","keywordOnly":true},{"name":"version","type":"string","keywordOnly":true},{"name":"observed","type":"Libtmux.Snapshot.t option","keywordOnly":true},{"name":"arg1","type":"Config.t"}],"returns":"(t, error) result"}],"slug":"libtmux_workspace-plan-make"},{"id":"Libtmux_workspace.Plan.pp_error","publicId":"Libtmux_workspace.Plan.pp_error","qualifiedName":"Libtmux_workspace.Plan.pp_error","name":"pp_error","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":106,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val pp_error : Format.formatter -> error -> unit","source":{"file":"workspace/libtmux_workspace.mli","line":106,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"val pp_error : Format.formatter -> error -> unit","params":[{"name":"arg1","type":"Format.formatter"},{"name":"arg2","type":"error"}],"returns":"unit"}],"slug":"libtmux_workspace-plan-pp_error"},{"id":"Libtmux_workspace.Plan.scope","publicId":"Libtmux_workspace.Plan.scope","qualifiedName":"Libtmux_workspace.Plan.scope","name":"scope","kind":"enum","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":108,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type scope = Session | Window of int | Pane of { window : int; pane : int }","source":{"file":"workspace/libtmux_workspace.mli","line":108,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"type scope =\n | Session \n | Window of int \n | Pane of {\n window: int ;\n pane: int } ","params":[]}],"slug":"libtmux_workspace-plan-scope"},{"id":"Libtmux_workspace.Plan.scope.Pane","publicId":"Libtmux_workspace.Plan.scope.Pane","name":"Pane","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":108,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Pane of { window : int; pane : int }","source":{"file":"workspace/libtmux_workspace.mli","line":108,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.scope","variant":"struct","qualifiedName":"Libtmux_workspace.Plan.Pane","slug":"libtmux_workspace-plan-scope-pane"},{"id":"Libtmux_workspace.Plan.scope.Pane.pane","publicId":"Libtmux_workspace.Plan.scope.Pane.pane","name":"pane","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":108,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"pane : int","source":{"file":"workspace/libtmux_workspace.mli","line":108,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.scope.Pane","type":"int","qualifiedName":"Libtmux_workspace.Plan.pane","slug":"libtmux_workspace-plan-scope-pane-pane"},{"id":"Libtmux_workspace.Plan.scope.Pane.window","publicId":"Libtmux_workspace.Plan.scope.Pane.window","name":"window","kind":"attribute","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":108,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"attribute","text":"window : int;","source":{"file":"workspace/libtmux_workspace.mli","line":108,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.scope.Pane","type":"int","qualifiedName":"Libtmux_workspace.Plan.window","slug":"libtmux_workspace-plan-scope-pane-window"},{"id":"Libtmux_workspace.Plan.scope.Session","publicId":"Libtmux_workspace.Plan.scope.Session","name":"Session","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":108,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Session","source":{"file":"workspace/libtmux_workspace.mli","line":108,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.scope","variant":"unit","qualifiedName":"Libtmux_workspace.Plan.Session","slug":"libtmux_workspace-plan-scope-session"},{"id":"Libtmux_workspace.Plan.scope.Window","publicId":"Libtmux_workspace.Plan.scope.Window","name":"Window","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":108,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Window of int","source":{"file":"workspace/libtmux_workspace.mli","line":108,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.scope","variant":"tuple","qualifiedName":"Libtmux_workspace.Plan.Window","slug":"libtmux_workspace-plan-scope-window"},{"id":"Libtmux_workspace.Plan.server_policy","publicId":"Libtmux_workspace.Plan.server_policy","qualifiedName":"Libtmux_workspace.Plan.server_policy","name":"server_policy","kind":"enum","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":90,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type server_policy = Create_if_missing | Require_existing_server","source":{"file":"workspace/libtmux_workspace.mli","line":90,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"type server_policy =\n | Create_if_missing \n | Require_existing_server ","params":[]}],"slug":"libtmux_workspace-plan-server_policy"},{"id":"Libtmux_workspace.Plan.server_policy.Create_if_missing","publicId":"Libtmux_workspace.Plan.server_policy.Create_if_missing","name":"Create_if_missing","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":90,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Create_if_missing","source":{"file":"workspace/libtmux_workspace.mli","line":90,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.server_policy","variant":"unit","qualifiedName":"Libtmux_workspace.Plan.Create_if_missing","slug":"libtmux_workspace-plan-server_policy-create_if_missing"},{"id":"Libtmux_workspace.Plan.server_policy.Require_existing_server","publicId":"Libtmux_workspace.Plan.server_policy.Require_existing_server","name":"Require_existing_server","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":90,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"| Require_existing_server","source":{"file":"workspace/libtmux_workspace.mli","line":90,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.server_policy","variant":"unit","qualifiedName":"Libtmux_workspace.Plan.Require_existing_server","slug":"libtmux_workspace-plan-server_policy-require_existing_server"},{"id":"Libtmux_workspace.Plan.source","publicId":"Libtmux_workspace.Plan.source","qualifiedName":"Libtmux_workspace.Plan.source","name":"source","kind":"function","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":149,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"function","text":"val source : t -> Libtmux.Source.t option","source":{"file":"workspace/libtmux_workspace.mli","line":149,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"val source : t -> Libtmux.Source.t option","params":[{"name":"arg1","type":"t"}],"returns":"Libtmux.Source.t option"}],"slug":"libtmux_workspace-plan-source"},{"id":"Libtmux_workspace.Plan.t","publicId":"Libtmux_workspace.Plan.t","qualifiedName":"Libtmux_workspace.Plan.t","name":"t","kind":"typealias","package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":133,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"typealias","text":"type t","source":{"file":"workspace/libtmux_workspace.mli","line":133,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"type t","params":[]}],"modifiers":["opaque"],"slug":"libtmux_workspace-plan-t"},{"id":"Libtmux_workspace.Plan.window_collision","publicId":"Libtmux_workspace.Plan.window_collision","qualifiedName":"Libtmux_workspace.Plan.window_collision","name":"window_collision","kind":"enum","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":91,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"nativeDocumentation":[],"declarations":[{"kind":"enum","text":"type window_collision = Reject","source":{"file":"workspace/libtmux_workspace.mli","line":91,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan","signatures":[{"raw":"type window_collision =\n | Reject ","params":[]}],"slug":"libtmux_workspace-plan-window_collision"},{"id":"Libtmux_workspace.Plan.window_collision.Reject","publicId":"Libtmux_workspace.Plan.window_collision.Reject","name":"Reject","kind":"constant","modifiers":[],"package":"libtmux-workspace","product":"workspace","apiScope":"exported","publicOwner":"Libtmux_workspace","source":{"file":"workspace/libtmux_workspace.mli","line":91,"repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","extractedRevision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"},"signatures":[],"nativeDocumentation":[],"declarations":[{"kind":"constant","text":"Reject","source":{"file":"workspace/libtmux_workspace.mli","line":91,"repo":"https://github.com/libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605"}}],"parent":"Libtmux_workspace.Plan.window_collision","variant":"unit","qualifiedName":"Libtmux_workspace.Plan.Reject","slug":"libtmux_workspace-plan-window_collision-reject"}]} diff --git a/site/src/data/api/ocaml.nav.json b/site/src/data/api/ocaml.nav.json new file mode 100644 index 000000000..2b82332bd --- /dev/null +++ b/site/src/data/api/ocaml.nav.json @@ -0,0 +1 @@ +{"port":"ocaml","buckets":[{"id":"server","label":"Server","collapsed":false,"target":{"id":"Libtmux_unix.Client","name":"Client","slug":"libtmux_unix-client","kind":"module"}},{"id":"session","label":"Session","collapsed":false},{"id":"window","label":"Window","collapsed":false},{"id":"pane","label":"Pane","collapsed":false},{"id":"client","label":"Client","collapsed":false},{"id":"hooks","label":"Hooks","collapsed":false},{"id":"options","label":"Options","collapsed":false,"children":[{"id":"options-functions","label":"Functions","collapsed":false},{"id":"options-constants","label":"Constants and variables","collapsed":false}]},{"id":"keys","label":"Keys and bindings","collapsed":false},{"id":"buffers","label":"Buffers","collapsed":false},{"id":"layout","label":"Layout and geometry","collapsed":false},{"id":"environment","label":"Environment","collapsed":false},{"id":"capabilities","label":"Terminal capabilities","collapsed":false},{"id":"version","label":"Versions","collapsed":false},{"id":"commands","label":"Commands","collapsed":false},{"id":"control","label":"Control mode","collapsed":false},{"id":"formats","label":"Formats","collapsed":false},{"id":"queries","label":"Queries","collapsed":false,"children":[{"id":"queries-fields","label":"Fields","collapsed":false},{"id":"queries-operators","label":"Operators","collapsed":false},{"id":"queries-expressions","label":"Expressions","collapsed":false}]},{"id":"snapshots","label":"Snapshots","collapsed":false},{"id":"workspace","label":"Workspaces","collapsed":false,"children":[{"id":"workspace-plan","label":"Plans","collapsed":false},{"id":"workspace-steps","label":"Steps","collapsed":false},{"id":"workspace-targets","label":"Targets and slots","collapsed":false},{"id":"workspace-session","label":"Session","collapsed":false},{"id":"workspace-window","label":"Window","collapsed":false},{"id":"workspace-pane","label":"Pane","collapsed":false},{"id":"workspace-functions","label":"Functions","collapsed":false},{"id":"workspace-constants","label":"Constants and variables","collapsed":false}]},{"id":"requests","label":"Requests","collapsed":true,"children":[{"id":"requests-server","label":"Server","collapsed":false},{"id":"requests-session","label":"Session","collapsed":false},{"id":"requests-window","label":"Window","collapsed":false},{"id":"requests-pane","label":"Pane","collapsed":false},{"id":"requests-client","label":"Client","collapsed":false}]},{"id":"errors","label":"Errors","collapsed":true,"children":[{"id":"errors-server","label":"Server","collapsed":false},{"id":"errors-session","label":"Session","collapsed":false},{"id":"errors-window","label":"Window","collapsed":false},{"id":"errors-pane","label":"Pane","collapsed":false}]},{"id":"constants","label":"Constants and enums","collapsed":true,"children":[{"id":"constants-server","label":"Server","collapsed":false},{"id":"constants-session","label":"Session","collapsed":false},{"id":"constants-window","label":"Window","collapsed":false},{"id":"constants-pane","label":"Pane","collapsed":false},{"id":"constants-client","label":"Client","collapsed":false}]},{"id":"runtime","label":"Runtime adapters","collapsed":false},{"id":"async","label":"Async","collapsed":false},{"id":"mcp","label":"MCP","collapsed":true,"children":[{"id":"mcp-functions","label":"Functions","collapsed":false},{"id":"mcp-constants","label":"Constants and variables","collapsed":false}]},{"id":"testing","label":"Testing utilities","collapsed":true},{"id":"internal","label":"Internal","collapsed":true,"children":[{"id":"internal-commands","label":"Commands","collapsed":false},{"id":"internal-options","label":"Options","collapsed":false}]}],"assignments":{"server":[{"id":"Libtmux_unix.Client","name":"Client","slug":"libtmux_unix-client","kind":"module"},{"id":"Libtmux_eio.Client","name":"Client","slug":"libtmux_eio-client","kind":"module"},{"id":"Libtmux.Endpoint","name":"Endpoint","slug":"libtmux-endpoint","kind":"module"},{"id":"Libtmux.Source","name":"Source","slug":"libtmux-source","kind":"module"},{"id":"Libtmux.Generation","name":"Generation","slug":"libtmux-generation","kind":"module"}],"session":[{"id":"Libtmux.Session","name":"Session","slug":"libtmux-session","kind":"module"}],"window":[{"id":"Libtmux.Window","name":"Window","slug":"libtmux-window","kind":"module"},{"id":"Libtmux.Window_link","name":"Window_link","slug":"libtmux-window_link","kind":"module"}],"pane":[{"id":"Libtmux.Pane","name":"Pane","slug":"libtmux-pane","kind":"module"}],"client":[{"id":"Libtmux.Client_name","name":"Client_name","slug":"libtmux-client_name","kind":"module"},{"id":"Libtmux.Client_observation","name":"Client_observation","slug":"libtmux-client_observation","kind":"module"}],"hooks":[{"id":"Libtmux.Hook","name":"Hook","slug":"libtmux-hook","kind":"module"}],"options":[{"id":"Libtmux.Options","name":"Options","slug":"libtmux-options","kind":"module"}],"options-functions":[],"options-constants":[],"keys":[{"id":"Libtmux.Key","name":"Key","slug":"libtmux-key","kind":"module"}],"buffers":[],"layout":[{"id":"Libtmux.Geometry","name":"Geometry","slug":"libtmux-geometry","kind":"module"},{"id":"Libtmux.Layout","name":"Layout","slug":"libtmux-layout","kind":"module"}],"environment":[{"id":"Libtmux.Environment","name":"Environment","slug":"libtmux-environment","kind":"module"}],"capabilities":[{"id":"Libtmux_eio.Terminal","name":"Terminal","slug":"libtmux_eio-terminal","kind":"module"},{"id":"Libtmux_unix.Terminal","name":"Terminal","slug":"libtmux_unix-terminal","kind":"module"}],"version":[],"commands":[{"id":"Libtmux","name":"Libtmux","slug":"libtmux","kind":"module"},{"id":"Libtmux.Command","name":"Command","slug":"libtmux-command","kind":"module"},{"id":"Libtmux.Created","name":"Created","slug":"libtmux-created","kind":"module"},{"id":"Libtmux.ID","name":"ID","slug":"libtmux-id","kind":"interface"},{"id":"Libtmux.Operations","name":"Operations","slug":"libtmux-operations","kind":"module"},{"id":"Libtmux.Spawn","name":"Spawn","slug":"libtmux-spawn","kind":"module"}],"control":[{"id":"Libtmux.Output","name":"Output","slug":"libtmux-output","kind":"module"},{"id":"Libtmux_eio.Operation","name":"Operation","slug":"libtmux_eio-operation","kind":"module"},{"id":"Libtmux_eio.Subscription","name":"Subscription","slug":"libtmux_eio-subscription","kind":"module"},{"id":"Libtmux_unix.Cancellation","name":"Cancellation","slug":"libtmux_unix-cancellation","kind":"module"},{"id":"Libtmux_unix.Operation","name":"Operation","slug":"libtmux_unix-operation","kind":"module"},{"id":"Libtmux_unix.Subscription","name":"Subscription","slug":"libtmux_unix-subscription","kind":"module"}],"formats":[{"id":"Libtmux.Formats","name":"Formats","slug":"libtmux-formats","kind":"module"}],"queries":[{"id":"Libtmux.Cardinality","name":"Cardinality","slug":"libtmux-cardinality","kind":"module"},{"id":"Libtmux.Model","name":"Model","slug":"libtmux-model","kind":"module"},{"id":"Libtmux.Plan","name":"Plan","slug":"libtmux-plan","kind":"module"},{"id":"Libtmux.Query","name":"Query","slug":"libtmux-query","kind":"module"},{"id":"Libtmux.Relation","name":"Relation","slug":"libtmux-relation","kind":"module"}],"queries-fields":[{"id":"Libtmux.Field","name":"Field","slug":"libtmux-field","kind":"module"}],"queries-operators":[],"queries-expressions":[{"id":"Libtmux.Expr","name":"Expr","slug":"libtmux-expr","kind":"module"},{"id":"Libtmux_json.Expr","name":"Expr","slug":"libtmux_json-expr","kind":"module"}],"snapshots":[{"id":"Libtmux.Captured_text","name":"Captured_text","slug":"libtmux-captured_text","kind":"module"},{"id":"Libtmux.Snapshot","name":"Snapshot","slug":"libtmux-snapshot","kind":"module"},{"id":"Libtmux_eio.Rendered","name":"Rendered","slug":"libtmux_eio-rendered","kind":"module"},{"id":"Libtmux_unix.Rendered","name":"Rendered","slug":"libtmux_unix-rendered","kind":"module"}],"workspace":[{"id":"Libtmux_workspace","name":"Libtmux_workspace","slug":"libtmux_workspace","kind":"module"},{"id":"Libtmux_workspace.Config","name":"Config","slug":"libtmux_workspace-config","kind":"module"},{"id":"Libtmux_workspace.Execution","name":"Execution","slug":"libtmux_workspace-execution","kind":"module"}],"workspace-plan":[{"id":"Libtmux_eio.Workspace","name":"Workspace","slug":"libtmux_eio-workspace","kind":"module"},{"id":"Libtmux_json.Workspace","name":"Workspace","slug":"libtmux_json-workspace","kind":"module"},{"id":"Libtmux_unix.Workspace","name":"Workspace","slug":"libtmux_unix-workspace","kind":"module"},{"id":"Libtmux_workspace.Plan","name":"Plan","slug":"libtmux_workspace-plan","kind":"module"}],"workspace-steps":[],"workspace-targets":[],"workspace-session":[],"workspace-window":[],"workspace-pane":[],"workspace-functions":[],"workspace-constants":[],"requests":[],"requests-server":[],"requests-session":[],"requests-window":[],"requests-pane":[],"requests-client":[],"errors":[{"id":"Libtmux.Error","name":"Error","slug":"libtmux-error","kind":"module"},{"id":"Libtmux_eio.Cleanup","name":"Cleanup","slug":"libtmux_eio-cleanup","kind":"module"},{"id":"Libtmux_json.Decode_error","name":"Decode_error","slug":"libtmux_json-decode_error","kind":"module"},{"id":"Libtmux_json.Error","name":"Error","slug":"libtmux_json-error","kind":"module"},{"id":"Libtmux_unix.Cleanup","name":"Cleanup","slug":"libtmux_unix-cleanup","kind":"module"}],"errors-server":[],"errors-session":[],"errors-window":[],"errors-pane":[],"constants":[],"constants-server":[],"constants-session":[],"constants-window":[],"constants-pane":[],"constants-client":[],"runtime":[{"id":"Libtmux_eio","name":"Libtmux_eio","slug":"libtmux_eio","kind":"module"},{"id":"Libtmux_json","name":"Libtmux_json","slug":"libtmux_json","kind":"module"},{"id":"Libtmux_unix","name":"Libtmux_unix","slug":"libtmux_unix","kind":"module"}],"async":[],"mcp":[],"mcp-functions":[],"mcp-constants":[],"testing":[],"internal":[],"internal-commands":[],"internal-options":[]},"placement":{"Libtmux.Endpoint":"server","Libtmux.Generation":"server","Libtmux.Source":"server","Libtmux_eio.Client":"server","Libtmux_unix.Client":"server","Libtmux.Session":"session","Libtmux.Window":"window","Libtmux.Window_link":"window","Libtmux.Pane":"pane","Libtmux.Client_name":"client","Libtmux.Client_observation":"client","Libtmux.Hook":"hooks","Libtmux.Options":"options","Libtmux.Key":"keys","Libtmux.Geometry":"layout","Libtmux.Layout":"layout","Libtmux.Environment":"environment","Libtmux_eio.Terminal":"capabilities","Libtmux_unix.Terminal":"capabilities","Libtmux":"commands","Libtmux.Command":"commands","Libtmux.Created":"commands","Libtmux.ID":"commands","Libtmux.Operations":"commands","Libtmux.Spawn":"commands","Libtmux.Output":"control","Libtmux_eio.Operation":"control","Libtmux_eio.Subscription":"control","Libtmux_unix.Cancellation":"control","Libtmux_unix.Operation":"control","Libtmux_unix.Subscription":"control","Libtmux.Formats":"formats","Libtmux.Cardinality":"queries","Libtmux.Model":"queries","Libtmux.Plan":"queries","Libtmux.Query":"queries","Libtmux.Relation":"queries","Libtmux.Field":"queries-fields","Libtmux.Expr":"queries-expressions","Libtmux_json.Expr":"queries-expressions","Libtmux.Captured_text":"snapshots","Libtmux.Snapshot":"snapshots","Libtmux_eio.Rendered":"snapshots","Libtmux_unix.Rendered":"snapshots","Libtmux_workspace":"workspace","Libtmux_workspace.Config":"workspace","Libtmux_workspace.Execution":"workspace","Libtmux_eio.Workspace":"workspace-plan","Libtmux_json.Workspace":"workspace-plan","Libtmux_unix.Workspace":"workspace-plan","Libtmux_workspace.Plan":"workspace-plan","Libtmux.Error":"errors","Libtmux_eio.Cleanup":"errors","Libtmux_json.Decode_error":"errors","Libtmux_json.Error":"errors","Libtmux_unix.Cleanup":"errors","Libtmux_eio":"runtime","Libtmux_json":"runtime","Libtmux_unix":"runtime"},"unplaced":[],"diagnostics":{"unmatched":[],"deadBuckets":["options-functions","options-constants","buffers","version","queries-operators","workspace-steps","workspace-targets","workspace-session","workspace-window","workspace-pane","workspace-functions","workspace-constants","requests","requests-server","requests-session","requests-window","requests-pane","requests-client","errors-server","errors-session","errors-window","errors-pane","constants","constants-server","constants-session","constants-window","constants-pane","constants-client","async","mcp","mcp-functions","mcp-constants","testing","internal","internal-commands","internal-options"],"ambiguous":[],"staleUnsettled":[]}} diff --git a/site/src/data/api/ocaml.paths.json b/site/src/data/api/ocaml.paths.json new file mode 100644 index 000000000..889649ed7 --- /dev/null +++ b/site/src/data/api/ocaml.paths.json @@ -0,0 +1 @@ +{"port":"ocaml","repo":"libtmux/libtmux-ocaml","revision":"6b814a3ae27b6a700b5d45ff1ef654565a1f1605","paths":[".github/CONTRIBUTING.md",".github/WRITING.md",".github/actions/build-tmux/action.yml",".github/scripts/tmux_build.py",".github/social-preview.png",".github/tmux-releases.toml",".github/workflows/docs.yml",".github/workflows/ocaml.yml",".gitignore",".ocamlformat",".tool-versions","AGENTS.md","CHANGELOG.md","CLAUDE.md","LICENSE","README.md","bench/capture.ml","bench/capture.py","bench/concurrency.ml","bench/concurrency.py","bench/control.ml","bench/control.py","bench/dune","bench/mixed.ml","bench/mixed.py","bench/results/capture-3.3-4x4.json","bench/results/capture-3.3.json","bench/results/capture-3.3a-4x4.json","bench/results/capture-3.3a.json","bench/results/capture-3.4-4x4.json","bench/results/capture-3.4.json","bench/results/capture-3.8-16x16.json","bench/results/capture-3.8-1x1.json","bench/results/capture-3.8-4x4.json","bench/results/capture-3.8-8x8.json","bench/results/capture-3.8.json","bench/results/concurrency-3.3-c8.json","bench/results/concurrency-3.3a-c8.json","bench/results/concurrency-3.4-c8.json","bench/results/concurrency-3.8-c1.json","bench/results/concurrency-3.8-c16.json","bench/results/concurrency-3.8-c64.json","bench/results/concurrency-3.8-c8.json","bench/results/control-3.3a-128-1-8-32.json","bench/results/control-3.8-128-1-8-32.json","bench/results/mixed-20261108.json","bench/results/mixed-3.3-current-20261108.json.gz","bench/results/mixed-3.3-qualified-20261108.json.gz","bench/results/mixed-3.3a-current-20261108.json.gz","bench/results/mixed-3.4-crash-analysis-20261108.json","bench/results/mixed-3.4-qualified-20261108.json.gz","bench/results/mixed-3.8-current-20261108.json.gz","bench/results/mixed-3.8-current-interrupted-20261108.json.gz","bench/results/retention-3.8-16x1.json","bench/results/retention-3.8-1x1.json","bench/results/retention-3.8-64x1-25-captures.json","bench/results/retention-3.8-64x1.json","bench/retention.ml","bench/retention.py","catalog/fields.json","catalog/formats.json","catalog/operations.json","catalog/options.json","catalog/releases.json","cli/CHANGELOG.md","cli/dune","cli/main.ml","cli/runtime.ml","docs/README.md","docs/api.md","docs/assets/app-icon-1024-dark.png","docs/assets/app-icon-1024-light.png","docs/assets/apple-touch-icon-dark.png","docs/assets/apple-touch-icon-light.png","docs/assets/browserconfig-dark.xml","docs/assets/browserconfig.xml","docs/assets/favicon.ico","docs/assets/logo-1024.png","docs/assets/logo-128.png","docs/assets/logo-144.png","docs/assets/logo-152.png","docs/assets/logo-16.png","docs/assets/logo-167.png","docs/assets/logo-180.png","docs/assets/logo-192.png","docs/assets/logo-24.png","docs/assets/logo-256.png","docs/assets/logo-32.png","docs/assets/logo-384.png","docs/assets/logo-48.png","docs/assets/logo-512.png","docs/assets/logo-64.png","docs/assets/logo-96.png","docs/assets/logo.svg","docs/assets/maskable-192-dark.png","docs/assets/maskable-192-light.png","docs/assets/maskable-512-dark.png","docs/assets/maskable-512-light.png","docs/assets/mstile-150-dark.png","docs/assets/mstile-150-light.png","docs/assets/mstile-310-dark.png","docs/assets/mstile-310-light.png","docs/assets/opengraph-dark.jpg","docs/assets/opengraph-dark.png","docs/assets/opengraph-light.jpg","docs/assets/opengraph-light.png","docs/assets/safari-pinned-tab.svg","docs/assets/site-dark.webmanifest","docs/assets/site.webmanifest","docs/assets/social-square-dark.png","docs/assets/social-square-light.png","docs/assets/source.json","docs/assets/twitter-dark.png","docs/assets/twitter-light.png","docs/benchmarking.md","docs/bootstrap.md","docs/branding.md","docs/compatibility.md","docs/control.md","docs/dev/adr/0001-native-ocaml-suite.md","docs/dev/adr/README.md","docs/fields.md","docs/formats.md","docs/getting-started.md","docs/graph.md","docs/operations.md","docs/options.md","docs/packages.md","docs/queries.md","docs/query-interchange.md","docs/recovery.md","docs/showcases.md","docs/status.md","docs/streaming.md","docs/testing.md","docs/workspaces.md","dune","dune-project","eio/CHANGELOG.md","eio/README.md","eio/dune","eio/generated_operations.ml","eio/index.mld","eio/libtmux_eio.ml","eio/libtmux_eio.mli","eio/owned_process.ml","eio/runtime.ml","examples/dune","examples/native_build.ml","examples/native_capture.ml","examples/native_graph.ml","examples/native_query.ml","examples/native_recovery.ml","examples/native_stream_recovery.ml","examples/native_wait.ml","examples/native_watch.ml","examples/query_description.ml","examples/query_json.ml","examples/showcase.json","examples/showcase_bootstrap.ml","examples/showcase_create_window.ml","examples/showcase_graph.ml","examples/showcase_layout.ml","examples/showcase_move_window.ml","examples/showcase_rename_window.ml","examples/showcase_send_keys.ml","examples/showcase_watch.ml","examples/workspace/project.json","json/CHANGELOG.md","json/README.md","json/document.ml","json/dune","json/index.mld","json/libtmux_json.ml","json/libtmux_json.mli","json/workspace_json.ml","json/workspace_output.ml","lib/CHANGELOG.md","lib/README.md","lib/commands.ml","lib/dune","lib/endpoint.ml","lib/error.ml","lib/filter.ml","lib/format_catalog.ml","lib/formats.ml","lib/generated_fields.ml","lib/graph.ml","lib/index.mld","lib/libtmux.ml","lib/libtmux.mli","lib/option_catalog.ml","lib/options.ml","lib/output.ml","lib/planner.ml","lib/protocol.ml","libtmux-eio.opam","libtmux-json.opam","libtmux-unix.opam","libtmux-workspace-cli.opam","libtmux-workspace.opam","libtmux.opam","test/api_export_test.py","test/binding_peer.ml","test/binding_test.py","test/blocking_cancel_peer.ml","test/blocking_peer.ml","test/blocking_test.py","test/bootstrap_peer.ml","test/bootstrap_test.py","test/capture_cancel_peer.ml","test/capture_cancel_test.py","test/capture_peer.ml","test/capture_proxy.py","test/capture_test.py","test/cleanup_test.ml","test/client_operations_peer.ml","test/client_operations_test.py","test/codec_peer.ml","test/conformance/FilterPeer.java","test/conformance/README.md","test/conformance/artifacts.gradle","test/conformance/cases.json","test/conformance/dune","test/conformance/filter_peer.ml","test/conformance/prepare.py","test/conformance/run.py","test/conformance/runner_test.py","test/core_test.ml","test/diagnostics_expect.ml","test/dune","test/eio_peer.ml","test/eio_test.py","test/environment_peer.ml","test/environment_test.py","test/fixture_test.py","test/installed_consumer.py","test/installed_consumer_diagnostics_test.py","test/json_test.ml","test/model_fixture.ml","test/model_test.ml","test/native_suite.py","test/operations_peer.ml","test/operations_test.py","test/options_peer.ml","test/options_test.py","test/ownership_peer.ml","test/pid_race_peer.ml","test/pid_race_test.py","test/pid_race_tmux.py","test/plan_peer.ml","test/plan_test.py","test/protocol_test.ml","test/protocol_test.py","test/query_test.ml","test/read_process_peer.ml","test/read_process_proxy.py","test/read_process_test.py","test/runtime_test.ml","test/showcase_test.py","test/shutdown_peer.ml","test/shutdown_test.py","test/stream_fault_peer.ml","test/stream_fault_test.py","test/streaming_peer.ml","test/streaming_test.py","test/support/readme_walkthrough.py","test/support/tmux_fixture.py","test/terminal_peer.ml","test/terminal_test.py","test/tmux_cache_test.py","test/type_test.py","test/workspace_cli_test.py","test/workspace_docs_test.py","test/workspace_document_test.py","test/workspace_eio_peer.ml","test/workspace_json_test.ml","test/workspace_pane_ready.ml","test/workspace_peer.ml","test/workspace_scenarios.ml","test/workspace_test.ml","test/workspace_test.py","tools/api_doc.ml","tools/api_export.ml","tools/api_modules.json","tools/check.py","tools/docs_snippets.py","tools/dune","tools/export_api.py","tools/generate_fields.py","tools/generate_formats.py","tools/generate_operations.py","tools/generate_options.py","tools/setup_tmux.py","unix/CHANGELOG.md","unix/README.md","unix/acquisition.ml","unix/bootstrap.ml","unix/byte_pattern.ml","unix/cancellation.ml","unix/capture_file.ml","unix/cleanup.ml","unix/cleanup.mli","unix/command_encoding.ml","unix/connection.ml","unix/dune","unix/engine.ml","unix/environment_io.ml","unix/generated_operations.ml","unix/index.mld","unix/libtmux_unix.ml","unix/libtmux_unix.mli","unix/linux.ml","unix/linux_stubs.c","unix/observation_wait.ml","unix/options_io.ml","unix/read_process.ml","unix/rendered.ml","unix/runtime_io.ml","unix/streaming.ml","unix/terminal.ml","unix/workspace_runner.ml","workspace/CHANGELOG.md","workspace/README.md","workspace/assets/app-icon-1024-dark.png","workspace/assets/app-icon-1024-light.png","workspace/assets/apple-touch-icon-dark.png","workspace/assets/apple-touch-icon-light.png","workspace/assets/browserconfig-dark.xml","workspace/assets/browserconfig.xml","workspace/assets/favicon.ico","workspace/assets/logo-1024.png","workspace/assets/logo-128.png","workspace/assets/logo-144.png","workspace/assets/logo-152.png","workspace/assets/logo-16.png","workspace/assets/logo-167.png","workspace/assets/logo-180.png","workspace/assets/logo-192.png","workspace/assets/logo-24.png","workspace/assets/logo-256.png","workspace/assets/logo-32.png","workspace/assets/logo-384.png","workspace/assets/logo-48.png","workspace/assets/logo-512.png","workspace/assets/logo-64.png","workspace/assets/logo-96.png","workspace/assets/logo.svg","workspace/assets/maskable-192-dark.png","workspace/assets/maskable-192-light.png","workspace/assets/maskable-512-dark.png","workspace/assets/maskable-512-light.png","workspace/assets/mstile-150-dark.png","workspace/assets/mstile-150-light.png","workspace/assets/mstile-310-dark.png","workspace/assets/mstile-310-light.png","workspace/assets/opengraph-dark.jpg","workspace/assets/opengraph-dark.png","workspace/assets/opengraph-light.jpg","workspace/assets/opengraph-light.png","workspace/assets/safari-pinned-tab.svg","workspace/assets/site-dark.webmanifest","workspace/assets/site.webmanifest","workspace/assets/social-square-dark.png","workspace/assets/social-square-light.png","workspace/assets/source.json","workspace/assets/twitter-dark.png","workspace/assets/twitter-light.png","workspace/config.ml","workspace/dune","workspace/execution.ml","workspace/index.mld","workspace/libtmux_workspace.ml","workspace/libtmux_workspace.mli","workspace/plan.ml"]} diff --git a/site/src/data/core-apis.json b/site/src/data/core-apis.json index 80ee4612c..1a2e7ba4b 100644 --- a/site/src/data/core-apis.json +++ b/site/src/data/core-apis.json @@ -179,5 +179,47 @@ "tmux.Running.StreamTo", "tmux.Running.Kill" ] + }, + "ocaml": { + "typed-graph": [ + "Libtmux.Snapshot.sessions", + "Libtmux.Session.window_links", + "Libtmux.Window_link.window", + "Libtmux.Window.panes", + "Libtmux_unix.Client.capture", + "Libtmux_unix.Client.create_session", + "Libtmux_unix.Client.link_window" + ], + "watch": [ + "Libtmux_eio.Client.connect", + "Libtmux_eio.Client.subscribe", + "Libtmux_eio.Subscription.wait_for_bytes", + "Libtmux_eio.Client.send_text" + ], + "send-keys": [ + "Libtmux_unix.Client.send_text", + "Libtmux_unix.Client.send_keys", + "Libtmux_unix.Client.wait_for_text" + ], + "rename-windows": [ + "Libtmux_unix.Client.rename_window", + "Libtmux.Snapshot.find_window", + "Libtmux.Window.name" + ], + "create-windows": [ + "Libtmux_unix.Client.create_window", + "Libtmux.Snapshot.find_window" + ], + "move-windows": [ + "Libtmux_unix.Client.move_window_at", + "Libtmux.Window.links", + "Libtmux.Window_link.index", + "Libtmux.Query.exactly_one" + ], + "set-layouts": [ + "Libtmux_unix.Client.split_pane", + "Libtmux_unix.Client.select_layout", + "Libtmux.Pane.width" + ] } } diff --git a/site/src/data/core-capabilities.json b/site/src/data/core-capabilities.json index 1ff9e4c01..f58e2e773 100644 --- a/site/src/data/core-capabilities.json +++ b/site/src/data/core-capabilities.json @@ -212,5 +212,182 @@ } ] } + }, + "ocaml": { + "typed-graph": { + "file": "examples/showcase_graph.ml", + "lang": "ocaml", + "tmux": "3.3+", + "ci": { + "workflow": ".github/workflows/ocaml.yml", + "job": "native", + "step": "Execute installed documentation and standalone programs", + "command": "opam exec -- python3 test/showcase_test.py \"$TMUX_BINARY\"" + }, + "checkedBy": [ + { + "file": "test/showcase_test.py", + "contains": "assert process.returncode == 0 and not error" + }, + { + "file": "test/showcase_test.py", + "contains": "entry[\"expected_stdout_line\"].encode() in output.splitlines()" + }, + { + "file": "examples/showcase.json", + "contains": "graph: 2 sessions, 2 windows, 3 links, 2 panes" + } + ] + }, + "watch": { + "file": "examples/showcase_watch.ml", + "lang": "ocaml", + "tmux": "3.3+", + "ci": { + "workflow": ".github/workflows/ocaml.yml", + "job": "native", + "step": "Execute installed documentation and standalone programs", + "command": "opam exec -- python3 test/showcase_test.py \"$TMUX_BINARY\"" + }, + "checkedBy": [ + { + "file": "test/showcase_test.py", + "contains": "assert process.returncode == 0 and not error" + }, + { + "file": "test/showcase_test.py", + "contains": "entry[\"expected_stdout_line\"].encode() in output.splitlines()" + }, + { + "file": "examples/showcase.json", + "contains": "observed: changed" + } + ] + }, + "send-keys": { + "file": "examples/showcase_send_keys.ml", + "lang": "ocaml", + "tmux": "3.3+", + "ci": { + "workflow": ".github/workflows/ocaml.yml", + "job": "native", + "step": "Execute installed documentation and standalone programs", + "command": "opam exec -- python3 test/showcase_test.py \"$TMUX_BINARY\"" + }, + "checkedBy": [ + { + "file": "test/showcase_test.py", + "contains": "assert process.returncode == 0 and not error" + }, + { + "file": "test/showcase_test.py", + "contains": "entry[\"expected_stdout_line\"].encode() in output.splitlines()" + }, + { + "file": "examples/showcase.json", + "contains": "sent: literal: $HOME; #{pane_id}" + } + ] + }, + "rename-windows": { + "file": "examples/showcase_rename_window.ml", + "lang": "ocaml", + "tmux": "3.3+", + "ci": { + "workflow": ".github/workflows/ocaml.yml", + "job": "native", + "step": "Execute installed documentation and standalone programs", + "command": "opam exec -- python3 test/showcase_test.py \"$TMUX_BINARY\"" + }, + "checkedBy": [ + { + "file": "test/showcase_test.py", + "contains": "assert process.returncode == 0 and not error" + }, + { + "file": "test/showcase_test.py", + "contains": "entry[\"expected_stdout_line\"].encode() in output.splitlines()" + }, + { + "file": "examples/showcase.json", + "contains": "renamed: editor-main" + } + ] + }, + "create-windows": { + "file": "examples/showcase_create_window.ml", + "lang": "ocaml", + "tmux": "3.3+", + "ci": { + "workflow": ".github/workflows/ocaml.yml", + "job": "native", + "step": "Execute installed documentation and standalone programs", + "command": "opam exec -- python3 test/showcase_test.py \"$TMUX_BINARY\"" + }, + "checkedBy": [ + { + "file": "test/showcase_test.py", + "contains": "assert process.returncode == 0 and not error" + }, + { + "file": "test/showcase_test.py", + "contains": "entry[\"expected_stdout_line\"].encode() in output.splitlines()" + }, + { + "file": "examples/showcase.json", + "contains": "created: logs" + } + ] + }, + "move-windows": { + "file": "examples/showcase_move_window.ml", + "lang": "ocaml", + "tmux": "3.3+", + "ci": { + "workflow": ".github/workflows/ocaml.yml", + "job": "native", + "step": "Execute installed documentation and standalone programs", + "command": "opam exec -- python3 test/showcase_test.py \"$TMUX_BINARY\"" + }, + "checkedBy": [ + { + "file": "test/showcase_test.py", + "contains": "assert process.returncode == 0 and not error" + }, + { + "file": "test/showcase_test.py", + "contains": "entry[\"expected_stdout_line\"].encode() in output.splitlines()" + }, + { + "file": "examples/showcase.json", + "contains": "moved: build at 7" + } + ] + }, + "set-layouts": { + "file": "examples/showcase_layout.ml", + "lang": "ocaml", + "tmux": "3.3+", + "ci": { + "workflow": ".github/workflows/ocaml.yml", + "job": "native", + "step": "Execute installed documentation and standalone programs", + "command": "opam exec -- python3 test/showcase_test.py \"$TMUX_BINARY\"" + }, + "checkedBy": [ + { + "file": "test/showcase_test.py", + "contains": "assert process.returncode == 0 and not error" + }, + { + "file": "test/showcase_test.py", + "contains": "entry[\"expected_stdout_line\"].encode() in output.splitlines()" + }, + { + "file": "examples/showcase.json", + "contains": "layout: 3 horizontal panes" + } + ] + } } } diff --git a/site/src/data/core-home.json b/site/src/data/core-home.json index 65d8dde3f..2a936acd4 100644 --- a/site/src/data/core-home.json +++ b/site/src/data/core-home.json @@ -322,5 +322,31 @@ "control-mode": "ControlSession", "capture": "Server.capture(_:includingHistory:)" } + }, + "ocaml": { + "objects": { + "server": "Libtmux_unix.Client.t", + "session": "Libtmux.Session.t", + "window": "Libtmux.Window.t", + "pane": "Libtmux.Pane.t" + }, + "wraps": { + "server": "A connection to one tmux server", + "window": "A shared tmux window" + }, + "capabilities": { + "objects": "Libtmux.Pane", + "ids": "Libtmux.Pane.Id", + "queries": "Libtmux.Expr", + "errors": "Libtmux.Error", + "servers": "Libtmux_unix.Client.connect", + "traversal": "Libtmux.Snapshot.panes", + "send-keys": "Libtmux_unix.Client.send_keys", + "control-mode": "Libtmux_eio.Client.subscribe", + "capture": "Libtmux_unix.Client.capture_text", + "argv": "Libtmux.Command", + "version-gate": "Libtmux.Error.t.Unsupported_version", + "async": "Libtmux_eio.Client.capture" + } } } diff --git a/site/src/data/destination-evidence.json b/site/src/data/destination-evidence.json index bcf528df9..e03a27d5f 100644 --- a/site/src/data/destination-evidence.json +++ b/site/src/data/destination-evidence.json @@ -1,6 +1,6 @@ { "schema": 1, - "checkedAt": "2026-11-03", + "checkedAt": "2026-11-07", "destinations": [ { "url": "https://central.sonatype.com/artifact/io.github.libtmux/libtmux", @@ -1508,6 +1508,132 @@ "lua:libtmux" ] }, + { + "url": "https://github.com/libtmux/libtmux-ocaml/tree/master/cli", + "kinds": [ + "source" + ], + "host": "github", + "ok": true, + "status": 200, + "requested": "https://github.com/libtmux/libtmux-ocaml/tree/master/cli", + "identity": "libtmux/libtmux-ocaml/cli", + "versionChecks": [ + { + "check": "unsupported", + "note": "a branch link names no release" + } + ], + "checkedAt": "2026-11-07", + "entries": [ + "ocaml:libtmux-workspace-cli" + ] + }, + { + "url": "https://github.com/libtmux/libtmux-ocaml/tree/master/eio", + "kinds": [ + "source" + ], + "host": "github", + "ok": true, + "status": 200, + "requested": "https://github.com/libtmux/libtmux-ocaml/tree/master/eio", + "identity": "libtmux/libtmux-ocaml/eio", + "versionChecks": [ + { + "check": "unsupported", + "note": "a branch link names no release" + } + ], + "checkedAt": "2026-11-07", + "entries": [ + "ocaml:libtmux-eio" + ] + }, + { + "url": "https://github.com/libtmux/libtmux-ocaml/tree/master/json", + "kinds": [ + "source" + ], + "host": "github", + "ok": true, + "status": 200, + "requested": "https://github.com/libtmux/libtmux-ocaml/tree/master/json", + "identity": "libtmux/libtmux-ocaml/json", + "versionChecks": [ + { + "check": "unsupported", + "note": "a branch link names no release" + } + ], + "checkedAt": "2026-11-07", + "entries": [ + "ocaml:libtmux-json" + ] + }, + { + "url": "https://github.com/libtmux/libtmux-ocaml/tree/master/lib", + "kinds": [ + "source" + ], + "host": "github", + "ok": true, + "status": 200, + "requested": "https://github.com/libtmux/libtmux-ocaml/tree/master/lib", + "identity": "libtmux/libtmux-ocaml/lib", + "versionChecks": [ + { + "check": "unsupported", + "note": "a branch link names no release" + } + ], + "checkedAt": "2026-11-07", + "entries": [ + "ocaml:libtmux" + ] + }, + { + "url": "https://github.com/libtmux/libtmux-ocaml/tree/master/unix", + "kinds": [ + "source" + ], + "host": "github", + "ok": true, + "status": 200, + "requested": "https://github.com/libtmux/libtmux-ocaml/tree/master/unix", + "identity": "libtmux/libtmux-ocaml/unix", + "versionChecks": [ + { + "check": "unsupported", + "note": "a branch link names no release" + } + ], + "checkedAt": "2026-11-07", + "entries": [ + "ocaml:libtmux-unix" + ] + }, + { + "url": "https://github.com/libtmux/libtmux-ocaml/tree/master/workspace", + "kinds": [ + "source" + ], + "host": "github", + "ok": true, + "status": 200, + "requested": "https://github.com/libtmux/libtmux-ocaml/tree/master/workspace", + "identity": "libtmux/libtmux-ocaml/workspace", + "versionChecks": [ + { + "check": "unsupported", + "note": "a branch link names no release" + } + ], + "checkedAt": "2026-11-07", + "entries": [ + "ocaml:libtmux-workspace" + ] + }, { "url": "https://github.com/libtmux/libtmux-powershell", "kinds": [ diff --git a/site/src/data/example-sources.json b/site/src/data/example-sources.json index c171de058..bb12e40fd 100644 --- a/site/src/data/example-sources.json +++ b/site/src/data/example-sources.json @@ -149,6 +149,66 @@ "sha256": "4c2c130f34507c5983d266f6bd47a4af87dbc558e021a2cd2d07b7eddaf4fe56", "content": "local adapter = require(\"libtmux.runtime.luv\")\n\nlocal function must(value, err)\n if err ~= nil then\n error(err, 0)\n end\n return value\nend\n\nmust(adapter.run(function(runtime)\n local server = must(runtime\n :connect({\n binary = assert(os.getenv(\"TMUX_BIN\"), \"set TMUX_BIN to an absolute tmux executable\"),\n socket_path = assert(os.getenv(\"TMUX_SOCKET\"), \"set TMUX_SOCKET to an explicit socket\"),\n })\n :await())\n local snapshot = must(server:snapshot({ strict = true }):await())\n for _, pane in ipairs(snapshot.panes) do\n io.stdout:write(pane.id, \"\\t\", pane.window_id, \"\\n\")\n end\n must(server:close():await())\n return true\nend))\n" }, + "ocaml:examples/showcase_create_window.ml": { + "repository": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605", + "sha256": "ea2d5ff182bb80b2f8115d4d2c43cf8e32f7989626fa9d6dfda666b76dc8217b", + "content": "open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet create_window client (initial : Created.t) spawn =\n let created =\n get (Client.create_window client initial.session ~name:\"logs\" ~spawn)\n in\n let window =\n Snapshot.find_window\n (get (Client.capture client))\n (Window.Target.id created.window)\n |> Option.get\n in\n assert (Window.name window = \"logs\");\n Printf.printf \"created: %s\\n\" (Window.name window)\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary create_window\n" + }, + "ocaml:examples/showcase_graph.ml": { + "repository": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605", + "sha256": "daa3c08e96c7aa366f6ac798b41a09e2f967c2fcf6c343df194c4e7fc4627a26", + "content": "open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet capture_graph client (initial : Created.t) spawn =\n let linked =\n get\n (Client.create_session client ~name:\"linked\" ~window_name:\"linked-home\"\n ~spawn ())\n in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id linked.pane)\n |> Option.get\n in\n let text = \"showcase ready\" in\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n get\n (Client.link_window client initial.window ~session:linked.session ~index:7);\n get (Client.capture client)\n\nlet print_graph snapshot =\n Snapshot.sessions snapshot\n |> Iarray.iter (fun session ->\n Session.window_links session\n |> Iarray.iter (fun link ->\n let window = Window_link.window link in\n Printf.printf \"%s/%d %s: %d pane(s)\\n\" (Session.name session)\n (Window_link.index link) (Window.name window)\n (Iarray.length (Window.panes window))));\n assert (Iarray.length (Snapshot.sessions snapshot) = 2);\n assert (Iarray.length (Snapshot.windows snapshot) = 2);\n assert (Iarray.length (Snapshot.window_links snapshot) = 3);\n assert (Iarray.length (Snapshot.panes snapshot) = 2);\n print_endline \"graph: 2 sessions, 2 windows, 3 links, 2 panes\"\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let snapshot = with_demo binary capture_graph in\n print_graph snapshot\n" + }, + "ocaml:examples/showcase_layout.ml": { + "repository": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605", + "sha256": "dca905f7b9b91858ec642fa21c2bd7c544f3a7684223f7fafd5a46f2b997cfd0", + "content": "open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet set_layout client (initial : Created.t) spawn =\n ignore\n (get\n (Client.split_pane client initial.pane ~direction:Geometry.Right ~spawn));\n ignore\n (get\n (Client.split_pane client initial.pane ~direction:Geometry.Right ~spawn));\n get (Client.select_layout client initial.window Layout.Even_horizontal);\n let window =\n Snapshot.find_window\n (get (Client.capture client))\n (Window.Target.id initial.window)\n |> Option.get\n in\n let panes = Window.panes window in\n assert (Iarray.length panes = 3);\n assert (\n Iarray.for_all\n (fun pane -> Pane.top pane = 0 && Pane.height pane = Window.height window)\n panes);\n assert (\n Iarray.fold_left (fun width pane -> width + Pane.width pane) 2 panes\n = Window.width window);\n print_endline \"layout: 3 horizontal panes\"\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary set_layout\n" + }, + "ocaml:examples/showcase_move_window.ml": { + "repository": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605", + "sha256": "da767e573f7188350a328c78b9417610a2bc62992e1892b501435a6328e21cc5", + "content": "open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet move_window client (initial : Created.t) spawn =\n let moving =\n get (Client.create_window client initial.session ~name:\"build\" ~spawn)\n in\n let destination =\n get\n (Client.create_session client ~name:\"destination\" ~window_name:\"landing\"\n ~spawn ())\n in\n get\n (Client.move_window_at client initial.session\n ~from_index:moving.window_index ~session:destination.session ~index:7);\n let window =\n Snapshot.find_window\n (get (Client.capture client))\n (Window.Target.id moving.window)\n |> Option.get\n in\n let link =\n Query.exactly_one (Iarray.to_seq (Window.links window)) |> Result.get_ok\n in\n assert (Window_link.index link = 7);\n assert (\n Session.Id.equal\n (Session.id (Window_link.session link))\n (Session.Target.id destination.session));\n Printf.printf \"moved: %s at %d\\n\" (Window.name window)\n (Window_link.index link)\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary move_window\n" + }, + "ocaml:examples/showcase_rename_window.ml": { + "repository": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605", + "sha256": "8722c7cd933fa53a18b41b5fb2de7d6a99fcfa1f70e8c14164c85bebf9efc6d5", + "content": "open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet rename_window client (initial : Created.t) _spawn =\n let before =\n Snapshot.find_window\n (get (Client.capture client))\n (Window.Target.id initial.window)\n |> Option.get\n in\n get (Client.rename_window client initial.window ~name:\"editor-main\");\n let after =\n Snapshot.find_window (get (Client.capture client)) (Window.id before)\n |> Option.get\n in\n assert (Window.name before = \"editor\");\n assert (Window.name after = \"editor-main\");\n Printf.printf \"renamed: %s\\n\" (Window.name after)\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary rename_window\n" + }, + "ocaml:examples/showcase_send_keys.ml": { + "repository": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605", + "sha256": "680f6772040e12a16b93bd0c6d582d0a5e8f4e70de303372ba924be6e0237f09", + "content": "open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet send_keys client (initial : Created.t) _spawn =\n let text = \"literal: $HOME; #{pane_id}\" in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n get (Client.send_text client (Pane.target pane) ~text);\n get (Client.send_keys client (Pane.target pane) [ Key.Enter ]);\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n Printf.printf \"sent: %s\\n\" text\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary send_keys\n" + }, + "ocaml:examples/showcase_watch.ml": { + "repository": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605", + "sha256": "98fa6d843a98a4d98bbdd398108704805e852a262df0e54b43c08d3f2e299f8f", + "content": "open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet watch_output binary blocking (initial : Created.t) _spawn =\n Eio_main.run @@ fun env ->\n Eio.Switch.run @@ fun sw ->\n let module Client = Libtmux_eio.Client in\n let module Subscription = Libtmux_eio.Subscription in\n let client =\n get\n (Client.connect ~sw ~binary\n ~process_mgr:(Eio.Stdenv.process_mgr env)\n ~mono_clock:(Eio.Stdenv.mono_clock env)\n (Source.endpoint (Libtmux_unix.Client.source blocking)))\n in\n Fun.protect\n ~finally:(fun () ->\n Eio.Cancel.protect (fun () -> get (Client.close client)))\n (fun () ->\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n let subscription =\n get (Client.subscribe ~capacity_bytes:4096 client pane)\n in\n Fun.protect\n ~finally:(fun () ->\n Eio.Cancel.protect (fun () -> get (Subscription.close subscription)))\n (fun () ->\n let cursor, () =\n Eio.Fiber.pair\n (fun () ->\n match\n Subscription.wait_for_bytes ~timeout:0.5 subscription\n ~text:\"changed\"\n with\n | Ok cursor -> cursor\n | Error (Output.Failure error) ->\n failwith (Format.asprintf \"%a\" Error.pp error)\n | Error (Output.Ended reason) ->\n failwith (Format.asprintf \"%a\" Output.reason_pp reason))\n (fun () ->\n get (Client.send_text client (Pane.target pane) ~text:\"changed\");\n get (Client.send_keys client (Pane.target pane) [ Key.Enter ]))\n in\n assert (cursor.offset >= 7L);\n print_endline \"observed: changed\"))\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n with_demo binary (watch_output binary)\n" + }, + "ocaml:examples/showcase.json": { + "repository": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605", + "sha256": "8f81b5d13e12bab22bc1f58e64e016f3391b22fac8980af3a270b67058942416", + "content": "{\n \"schema\": \"libtmux.showcase/1\",\n \"tmux_floor\": \"3.3a\",\n \"ci\": {\n \"workflow\": \".github/workflows/ocaml.yml\",\n \"job\": \"native\",\n \"runner\": \"test/showcase_test.py\"\n },\n \"examples\": [\n {\n \"capability\": \"bootstrap\",\n \"title\": \"Start a private server and capture its first session\",\n \"file\": \"examples/showcase_bootstrap.ml\",\n \"whole_file\": true,\n \"command\": [\n \"opam\",\n \"exec\",\n \"--\",\n \"dune\",\n \"exec\",\n \"examples/showcase_bootstrap.exe\",\n \"--\",\n \"tmux\"\n ],\n \"expected_stdout_line\": \"bootstrapped: 1 session, 1 window, 1 pane\",\n \"success_exit_code\": 0\n },\n {\n \"capability\": \"graph\",\n \"title\": \"Navigate the typed object graph\",\n \"file\": \"examples/showcase_graph.ml\",\n \"whole_file\": true,\n \"command\": [\n \"opam\",\n \"exec\",\n \"--\",\n \"dune\",\n \"exec\",\n \"examples/showcase_graph.exe\",\n \"--\",\n \"tmux\"\n ],\n \"expected_stdout_line\": \"graph: 2 sessions, 2 windows, 3 links, 2 panes\",\n \"success_exit_code\": 0\n },\n {\n \"capability\": \"watch\",\n \"title\": \"Observe future output with Eio\",\n \"file\": \"examples/showcase_watch.ml\",\n \"whole_file\": true,\n \"command\": [\n \"opam\",\n \"exec\",\n \"--\",\n \"dune\",\n \"exec\",\n \"examples/showcase_watch.exe\",\n \"--\",\n \"tmux\"\n ],\n \"expected_stdout_line\": \"observed: changed\",\n \"success_exit_code\": 0\n },\n {\n \"capability\": \"send-keys\",\n \"title\": \"Send literal input and keys\",\n \"file\": \"examples/showcase_send_keys.ml\",\n \"whole_file\": true,\n \"command\": [\n \"opam\",\n \"exec\",\n \"--\",\n \"dune\",\n \"exec\",\n \"examples/showcase_send_keys.exe\",\n \"--\",\n \"tmux\"\n ],\n \"expected_stdout_line\": \"sent: literal: $HOME; #{pane_id}\",\n \"success_exit_code\": 0\n },\n {\n \"capability\": \"rename-window\",\n \"title\": \"Rename a window\",\n \"file\": \"examples/showcase_rename_window.ml\",\n \"whole_file\": true,\n \"command\": [\n \"opam\",\n \"exec\",\n \"--\",\n \"dune\",\n \"exec\",\n \"examples/showcase_rename_window.exe\",\n \"--\",\n \"tmux\"\n ],\n \"expected_stdout_line\": \"renamed: editor-main\",\n \"success_exit_code\": 0\n },\n {\n \"capability\": \"create-window\",\n \"title\": \"Create a window\",\n \"file\": \"examples/showcase_create_window.ml\",\n \"whole_file\": true,\n \"command\": [\n \"opam\",\n \"exec\",\n \"--\",\n \"dune\",\n \"exec\",\n \"examples/showcase_create_window.exe\",\n \"--\",\n \"tmux\"\n ],\n \"expected_stdout_line\": \"created: logs\",\n \"success_exit_code\": 0\n },\n {\n \"capability\": \"move-window\",\n \"title\": \"Move a window between sessions\",\n \"file\": \"examples/showcase_move_window.ml\",\n \"whole_file\": true,\n \"command\": [\n \"opam\",\n \"exec\",\n \"--\",\n \"dune\",\n \"exec\",\n \"examples/showcase_move_window.exe\",\n \"--\",\n \"tmux\"\n ],\n \"expected_stdout_line\": \"moved: build at 7\",\n \"success_exit_code\": 0\n },\n {\n \"capability\": \"layout\",\n \"title\": \"Apply a layout\",\n \"file\": \"examples/showcase_layout.ml\",\n \"whole_file\": true,\n \"command\": [\n \"opam\",\n \"exec\",\n \"--\",\n \"dune\",\n \"exec\",\n \"examples/showcase_layout.exe\",\n \"--\",\n \"tmux\"\n ],\n \"expected_stdout_line\": \"layout: 3 horizontal panes\",\n \"success_exit_code\": 0\n }\n ]\n}\n" + }, + "ocaml:test/showcase_test.py": { + "repository": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605", + "sha256": "44e60a7fe50d8686abde4ac046ea38c8e14a43555c15284140cadf4ee5aef753", + "content": "\"\"\"Outer: compile whole showcase programs against installed packages and run their entry points.\"\"\"\nimport ctypes\nimport json\nimport os\nfrom pathlib import Path\nimport selectors\nimport shutil\nimport signal\nimport subprocess\nimport sys\nimport tempfile\n\nroot = Path(__file__).resolve().parents[1]\nmanifest = json.loads((root / \"examples/showcase.json\").read_text())\nprograms = {}\nfor entry in manifest[\"examples\"]:\n path = (root / entry[\"file\"]).resolve()\n assert path.parent == root / \"examples\" and path.suffix == \".ml\"\n assert entry[\"whole_file\"] and entry[\"success_exit_code\"] == 0\n executable = str(Path(entry[\"file\"]).with_suffix(\".exe\"))\n assert entry[\"command\"] == [\"opam\", \"exec\", \"--\", \"dune\", \"exec\", executable, \"--\", \"tmux\"], \\\n \"showcase command does not execute its recorded source\"\n assert path.stem not in programs, \"duplicate showcase program\"\n programs[path.stem] = entry\nlibc = ctypes.CDLL(None, use_errno=True)\nif libc.prctl(36, 1, 0, 0, 0):\n raise OSError(ctypes.get_errno(), \"PR_SET_CHILD_SUBREAPER\")\nchild_file = Path(f\"/proc/self/task/{os.getpid()}/children\")\n\n\ndef children():\n return set(map(int, child_file.read_text().split()))\n\n\nwith tempfile.TemporaryDirectory(prefix=\"libtmux-ocaml-showcase-consumer-\") as temporary:\n temporary = Path(temporary)\n prefix = temporary / \"installed\"\n packages = [\"libtmux\", \"libtmux-workspace\", \"libtmux-unix\", \"libtmux-eio\"]\n subprocess.run([\"dune\", \"install\", \"--sections=lib,stublibs\", \"--prefix\", str(prefix), *packages],\n cwd=root, check=True, capture_output=True)\n project = temporary / \"consumer\"\n project.mkdir()\n runtime_temp = temporary / \"runtime-temp\"\n runtime_temp.mkdir(mode=0o700)\n (project / \"dune-project\").write_text(\"(lang dune 3.24)\\n\")\n examples = project / \"examples\"\n examples.mkdir()\n blocking = \" \".join(name for name in programs if name != \"showcase_watch\")\n (examples / \"dune\").write_text(\"(executables (names \" + blocking + \") (modules \" + blocking +\n \") (libraries libtmux libtmux-workspace libtmux-unix unix))\\n\" +\n \"(executable (name showcase_watch) (modules showcase_watch) \" +\n \"(libraries libtmux libtmux-workspace libtmux-unix libtmux-eio eio_main unix))\\n\")\n for name in programs:\n source = root / \"examples\" / f\"{name}.ml\"\n assert source.is_file(), f\"missing standalone showcase: {name}\"\n (examples / source.name).write_bytes(source.read_bytes())\n environment = dict(os.environ, OCAMLPATH=str(prefix / \"lib\"), TMPDIR=str(runtime_temp),\n TMUX=\"/unrelated/server,99999,0\", TMUX_PANE=\"%99999\")\n for key in [\"DUNE_SOURCEROOT\", \"DUNE_WORKSPACE\"]:\n environment.pop(key, None)\n environment[\"OPAMSWITCH\"] = subprocess.check_output(\n [\"opam\", \"switch\", \"show\", \"--safe\"], cwd=root, env=environment, text=True).strip()\n resolved = subprocess.check_output([\"opam\", \"exec\", \"--\", \"ocamlfind\", \"query\", *packages],\n cwd=project, env=environment, text=True).splitlines()\n assert list(map(Path, resolved)) == [prefix / \"lib\" / package for package in packages]\n built = subprocess.run([\"dune\", \"build\", \"--root\", str(project)],\n cwd=project, env=environment, capture_output=True)\n assert built.returncode == 0, (built.stdout + built.stderr).decode(errors=\"replace\")\n for index, binary in enumerate(sys.argv[1:]):\n actual = str(Path(binary).resolve(strict=True))\n fault = temporary / f\"fault-tmux-{index}\"\n audit = temporary / f\"fault-directory-{index}\"\n fault.write_text(\"#!/usr/bin/env python3\\nimport os,sys\\nfrom pathlib import Path\\n\" +\n \"args=sys.argv[1:]\\nif '-C' in args and 'new-session' in args:\\n\" +\n \" p=Path(args[args.index('-f')+1])\\n\" +\n f\" Path({str(audit)!r}).write_text(str(p.parent))\\n\" +\n \" with p.open('a') as output:\\n\" +\n \" session=os.environ['LIBTMUX_SHOWCASE_COLLISION']\\n\" +\n \" output.write(f'new-session -d -s {session} -- /bin/cat -u\\\\n')\\n\" +\n f\"os.execv({actual!r}, [{actual!r}, *args])\\n\")\n fault.chmod(0o700)\n cases = [(name, entry, actual, False) for name, entry in programs.items()]\n cases.append((\"showcase_create_window\", programs[\"showcase_create_window\"], str(fault), True))\n cases.append((\"showcase_bootstrap\", programs[\"showcase_bootstrap\"], str(fault), True))\n for name, entry, program, should_fail in cases:\n previous = children()\n command = [*entry[\"command\"][:-1], program]\n process = subprocess.Popen(command,\n cwd=project, env=dict(environment, LIBTMUX_SHOWCASE_COLLISION=\n \"bootstrap-demo\" if name == \"showcase_bootstrap\" else \"showcase\"),\n stdout=subprocess.PIPE,\n stderr=subprocess.PIPE)\n try:\n output, error = process.communicate(timeout=1)\n if should_fail:\n assert process.returncode == 2 and error, (name, process.returncode, output, error)\n assert entry[\"expected_stdout_line\"].encode() not in output.splitlines()\n if name == \"showcase_bootstrap\":\n assert b\"workspace \" in error and b\" did not complete\" in error, error\n assert b\"new-session\" in error and b\"no automatic retry\" in error, error\n directory = Path(audit.read_text())\n else:\n assert process.returncode == 0 and not error, (name, process.returncode, output, error)\n assert entry[\"expected_stdout_line\"].encode() in output.splitlines(), \\\n (name, \"missing expected outcome\", output)\n socket_line = next(line for line in output.splitlines() if line.startswith(b\"socket=\"))\n directory = Path(os.fsdecode(socket_line[len(b\"socket=\"):])).parent\n assert directory.name.startswith(\"libtmux-ocaml-showcase-\")\n assert not directory.exists(), \"showcase left its private directory\"\n for pid in children() - previous:\n descriptor = os.pidfd_open(pid)\n try:\n with selectors.DefaultSelector() as ready:\n ready.register(descriptor, selectors.EVENT_READ)\n assert ready.select(1), f\"{name} left owned child {pid} running\"\n os.waitpid(pid, 0)\n finally:\n os.close(descriptor)\n outcome = \"startup failure\" if should_fail else \"installed entry point\"\n print(f\"PASS {Path(binary).parent.name}: {name}, {outcome} and owned teardown\")\n finally:\n if process.poll() is None:\n process.kill()\n process.wait(timeout=1)\n while children() - previous:\n for pid in children() - previous:\n descriptor = os.pidfd_open(pid)\n try:\n try:\n signal.pidfd_send_signal(descriptor, signal.SIGTERM)\n except ProcessLookupError:\n pass\n with selectors.DefaultSelector() as ready:\n ready.register(descriptor, selectors.EVENT_READ)\n assert ready.select(1), \"owned showcase child did not terminate\"\n os.waitpid(pid, 0)\n finally:\n os.close(descriptor)\n process.stdout.close()\n process.stderr.close()\n for path in runtime_temp.iterdir():\n if path.is_dir():\n shutil.rmtree(path)\n else:\n path.unlink()\n" + }, + "ocaml/workspace:examples/showcase_graph.ml": { + "repository": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605", + "sha256": "daa3c08e96c7aa366f6ac798b41a09e2f967c2fcf6c343df194c4e7fc4627a26", + "content": "open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet capture_graph client (initial : Created.t) spawn =\n let linked =\n get\n (Client.create_session client ~name:\"linked\" ~window_name:\"linked-home\"\n ~spawn ())\n in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id linked.pane)\n |> Option.get\n in\n let text = \"showcase ready\" in\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n get\n (Client.link_window client initial.window ~session:linked.session ~index:7);\n get (Client.capture client)\n\nlet print_graph snapshot =\n Snapshot.sessions snapshot\n |> Iarray.iter (fun session ->\n Session.window_links session\n |> Iarray.iter (fun link ->\n let window = Window_link.window link in\n Printf.printf \"%s/%d %s: %d pane(s)\\n\" (Session.name session)\n (Window_link.index link) (Window.name window)\n (Iarray.length (Window.panes window))));\n assert (Iarray.length (Snapshot.sessions snapshot) = 2);\n assert (Iarray.length (Snapshot.windows snapshot) = 2);\n assert (Iarray.length (Snapshot.window_links snapshot) = 3);\n assert (Iarray.length (Snapshot.panes snapshot) = 2);\n print_endline \"graph: 2 sessions, 2 windows, 3 links, 2 panes\"\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let snapshot = with_demo binary capture_graph in\n print_graph snapshot\n" + }, "powershell/workspace:examples/Guides.ps1": { "repository": "libtmux/libtmux-powershell", "revision": "06233d3c99b40a5bce966c9e1d358f346ff4de55", diff --git a/site/src/data/home-examples.json b/site/src/data/home-examples.json index dd6366fc8..34d59af1b 100644 --- a/site/src/data/home-examples.json +++ b/site/src/data/home-examples.json @@ -599,5 +599,47 @@ "errors": "Mix.install([{:libtmux, \"0.1.1\"}])\n\nalias LibTmux.{Command, Pane, Ref, Selection, Server, Session, Snapshot, Window}\n\ntmux = System.find_executable(\"tmux\") || raise \"tmux is not on PATH\"\nid = Base.encode16(:crypto.strong_rand_bytes(8), case: :lower)\ndir = Path.join(System.tmp_dir!(), \"libtmux-\" <> id)\nsocket = Path.join(dir, \"tmux.sock\")\nFile.mkdir!(dir)\nFile.chmod!(dir, 0o700)\n\n# libtmux works on a running server, so tmux itself starts the private one.\ncreate = [\"new-session\", \"-d\", \"-s\", \"demo\"]\n{_, 0} = System.cmd(tmux, [\"-S\", socket, \"-f\", \"/dev/null\" | create])\nserver = Server.new(executable: tmux, socket: socket)\n\n# Lay out the session: name its window, split it, add a second window.\nsnapshot = Server.snapshot!(server)\nsession = snapshot |> Snapshot.sessions() |> Selection.one!()\neditor = Session.active_window(snapshot, session)\n{:ok, session_ref} = Ref.from_observation(session)\n{:ok, editor_ref} = Ref.from_observation(editor)\nWindow.rename!(server, editor_ref, \"editor\")\nleft =\n snapshot\n |> Snapshot.panes()\n |> Selection.one!(window_id: editor.id, active: true)\n{:ok, left_ref} = Ref.from_observation(left)\n%{id: right_id} = Pane.split!(server, left_ref, axis: :horizontal)\n%{id: logs_id} = Session.new_window!(server, session_ref, \"logs\")\n{:ok, right} = Ref.new(:pane, right_id, session.server_instance)\n\n# Type a command into the new pane and wait for what it prints.\nPane.send_text!(server, right, \"printf 'hello from %s\\\\n' tmux\")\nPane.send_keys!(server, right, [\"Enter\"])\n\nshown =\n Enum.find_value(1..250, fn _ ->\n screen = Pane.capture!(server, right)\n screen =~ \"hello from tmux\" || (Process.sleep(20) && nil)\n end)\n\nshown || raise \"the pane did not print hello from tmux\"\n\n# Move the focus an attached client sees: the pane, then the window.\nselect_pane = Command.new(\"select-pane\", [\"-t\", right_id])\nselect_window = Command.new(\"select-window\", [\"-t\", logs_id])\n{:ok, _} = Server.run(server, select_pane)\n{:ok, _} = Server.run(server, select_window)\n\n# Walk the objects: down from the server, then up from one pane.\nsnapshot = Server.snapshot!(server)\nsessions = Snapshot.sessions(snapshot)\n\nfor each <- sessions do\n IO.puts(\"session #{each.name}\")\n links = Snapshot.related(snapshot, :session, each.id, :window_links)\n\n for link <- Enum.sort_by(links, & &1.index) do\n {:ok, window} = Snapshot.fetch(snapshot, :window, link.window_id)\n panes = Window.panes(snapshot, window)\n ids = Enum.map_join(panes, \" \", & &1.id)\n IO.puts(\" window #{link.index}:#{window.name}: #{ids}\")\n end\nend\n\npane = snapshot |> Snapshot.panes() |> Selection.one!(id: right_id)\nwindow = Snapshot.related(snapshot, :pane, pane.id, :window)\n[owner] = Snapshot.related(snapshot, :window, window.id, :sessions)\nIO.puts(\"#{pane.id} is in window #{window.name} of session #{owner.name}\")\n", "cleanup": "Mix.install([{:libtmux, \"0.1.1\"}])\n\nalias LibTmux.{Command, Pane, Ref, Selection, Server, Session, Snapshot, Window}\n\ntmux = System.find_executable(\"tmux\") || raise \"tmux is not on PATH\"\nid = Base.encode16(:crypto.strong_rand_bytes(8), case: :lower)\ndir = Path.join(System.tmp_dir!(), \"libtmux-\" <> id)\nsocket = Path.join(dir, \"tmux.sock\")\nFile.mkdir!(dir)\nFile.chmod!(dir, 0o700)\n\ntry do\n # libtmux works on a running server, so tmux itself starts the private one.\n create = [\"new-session\", \"-d\", \"-s\", \"demo\"]\n {_, 0} = System.cmd(tmux, [\"-S\", socket, \"-f\", \"/dev/null\" | create])\n server = Server.new(executable: tmux, socket: socket)\n\n # Lay out the session: name its window, split it, add a second window.\n snapshot = Server.snapshot!(server)\n session = snapshot |> Snapshot.sessions() |> Selection.one!()\n editor = Session.active_window(snapshot, session)\n {:ok, session_ref} = Ref.from_observation(session)\n {:ok, editor_ref} = Ref.from_observation(editor)\n Window.rename!(server, editor_ref, \"editor\")\n left =\n snapshot\n |> Snapshot.panes()\n |> Selection.one!(window_id: editor.id, active: true)\n {:ok, left_ref} = Ref.from_observation(left)\n %{id: right_id} = Pane.split!(server, left_ref, axis: :horizontal)\n %{id: logs_id} = Session.new_window!(server, session_ref, \"logs\")\n {:ok, right} = Ref.new(:pane, right_id, session.server_instance)\n\n # Type a command into the new pane and wait for what it prints.\n Pane.send_text!(server, right, \"printf 'hello from %s\\\\n' tmux\")\n Pane.send_keys!(server, right, [\"Enter\"])\n\n shown =\n Enum.find_value(1..250, fn _ ->\n screen = Pane.capture!(server, right)\n screen =~ \"hello from tmux\" || (Process.sleep(20) && nil)\n end)\n\n shown || raise \"the pane did not print hello from tmux\"\n\n # Move the focus an attached client sees: the pane, then the window.\n select_pane = Command.new(\"select-pane\", [\"-t\", right_id])\n select_window = Command.new(\"select-window\", [\"-t\", logs_id])\n {:ok, _} = Server.run(server, select_pane)\n {:ok, _} = Server.run(server, select_window)\n\n # Walk the objects: down from the server, then up from one pane.\n snapshot = Server.snapshot!(server)\n sessions = Snapshot.sessions(snapshot)\n\n for each <- sessions do\n IO.puts(\"session #{each.name}\")\n links = Snapshot.related(snapshot, :session, each.id, :window_links)\n\n for link <- Enum.sort_by(links, & &1.index) do\n {:ok, window} = Snapshot.fetch(snapshot, :window, link.window_id)\n panes = Window.panes(snapshot, window)\n ids = Enum.map_join(panes, \" \", & &1.id)\n IO.puts(\" window #{link.index}:#{window.name}: #{ids}\")\n end\n end\n\n pane = snapshot |> Snapshot.panes() |> Selection.one!(id: right_id)\n window = Snapshot.related(snapshot, :pane, pane.id, :window)\n [owner] = Snapshot.related(snapshot, :window, window.id, :sessions)\n IO.puts(\"#{pane.id} is in window #{window.name} of session #{owner.name}\")\nafter\n System.cmd(tmux, [\"-S\", socket, \"kill-server\"], stderr_to_stdout: true)\n File.rm_rf(dir)\nend\n" } + }, + "ocaml": { + "lang": "ocaml", + "sourceRepository": "libtmux/libtmux-ocaml", + "sourceRevision": "6ef4ac3c255ce503270edba7640c5bd65cdc43a1", + "sourceTree": "2d3cfff8570f97d0498db2a3dbeb26124b1eeeba", + "program": "examples/showcase_graph.ml", + "excerpt": { + "startLine": 1, + "endLine": 123, + "dedent": 0, + "importsEndLine": 0 + }, + "files": [ + { + "name": "examples/showcase_graph.ml", + "lang": "ocaml", + "code": "open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet capture_graph client (initial : Created.t) spawn =\n let linked =\n get\n (Client.create_session client ~name:\"linked\" ~window_name:\"linked-home\"\n ~spawn ())\n in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id linked.pane)\n |> Option.get\n in\n let text = \"showcase ready\" in\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n get\n (Client.link_window client initial.window ~session:linked.session ~index:7);\n get (Client.capture client)\n\nlet print_graph snapshot =\n Snapshot.sessions snapshot\n |> Iarray.iter (fun session ->\n Session.window_links session\n |> Iarray.iter (fun link ->\n let window = Window_link.window link in\n Printf.printf \"%s/%d %s: %d pane(s)\\n\" (Session.name session)\n (Window_link.index link) (Window.name window)\n (Iarray.length (Window.panes window))));\n assert (Iarray.length (Snapshot.sessions snapshot) = 2);\n assert (Iarray.length (Snapshot.windows snapshot) = 2);\n assert (Iarray.length (Snapshot.window_links snapshot) = 3);\n assert (Iarray.length (Snapshot.panes snapshot) = 2);\n print_endline \"graph: 2 sessions, 2 windows, 3 links, 2 panes\"\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let snapshot = with_demo binary capture_graph in\n print_graph snapshot\n" + }, + { + "name": "dune-project", + "lang": "lisp", + "code": "(lang dune 3.24)\n" + }, + { + "name": "examples/dune", + "lang": "lisp", + "code": "(executable\n (name showcase_graph)\n (libraries libtmux libtmux-workspace libtmux-unix unix))\n" + } + ], + "prerequisites": "OCaml 5.5.2, Dune 3.24.2, Linux and tmux 3.3a through 3.8. Install libtmux, libtmux-workspace and libtmux-unix in the active opam switch, then save these files at their shown paths.", + "commands": [ + "opam exec -- dune exec examples/showcase_graph.exe" + ], + "expectedOutput": "graph: 2 sessions, 2 windows, 3 links, 2 panes\n", + "variants": { + "concise": "open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet capture_graph client (initial : Created.t) spawn =\n let linked =\n get\n (Client.create_session client ~name:\"linked\" ~window_name:\"linked-home\"\n ~spawn ())\n in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id linked.pane)\n |> Option.get\n in\n let text = \"showcase ready\" in\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n get\n (Client.link_window client initial.window ~session:linked.session ~index:7);\n get (Client.capture client)\n\nlet print_graph snapshot =\n Snapshot.sessions snapshot\n |> Iarray.iter (fun session ->\n Session.window_links session\n |> Iarray.iter (fun link ->\n let window = Window_link.window link in\n Printf.printf \"%s/%d %s: %d pane(s)\\n\" (Session.name session)\n (Window_link.index link) (Window.name window)\n (Iarray.length (Window.panes window))));\n print_endline \"graph: 2 sessions, 2 windows, 3 links, 2 panes\"\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let snapshot = with_demo binary capture_graph in\n print_graph snapshot\n", + "errors": "open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet capture_graph client (initial : Created.t) spawn =\n let linked =\n get\n (Client.create_session client ~name:\"linked\" ~window_name:\"linked-home\"\n ~spawn ())\n in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id linked.pane)\n |> Option.get\n in\n let text = \"showcase ready\" in\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n get\n (Client.link_window client initial.window ~session:linked.session ~index:7);\n get (Client.capture client)\n\nlet print_graph snapshot =\n Snapshot.sessions snapshot\n |> Iarray.iter (fun session ->\n Session.window_links session\n |> Iarray.iter (fun link ->\n let window = Window_link.window link in\n Printf.printf \"%s/%d %s: %d pane(s)\\n\" (Session.name session)\n (Window_link.index link) (Window.name window)\n (Iarray.length (Window.panes window))));\n print_endline \"graph: 2 sessions, 2 windows, 3 links, 2 panes\"\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let snapshot = with_demo binary capture_graph in\n print_graph snapshot\n", + "cleanup": "open Libtmux\nmodule Client = Libtmux_unix.Client\nmodule Workspace = Libtmux_unix.Workspace\nmodule Config = Libtmux_workspace.Config\nmodule Plan = Libtmux_workspace.Plan\nmodule Execution = Libtmux_workspace.Execution\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet capture_graph client (initial : Created.t) spawn =\n let linked =\n get\n (Client.create_session client ~name:\"linked\" ~window_name:\"linked-home\"\n ~spawn ())\n in\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id linked.pane)\n |> Option.get\n in\n let text = \"showcase ready\" in\n ignore (get (Client.wait_for_text ~timeout:0.5 client pane ~text));\n get\n (Client.link_window client initial.window ~session:linked.session ~index:7);\n get (Client.capture client)\n\nlet print_graph snapshot =\n Snapshot.sessions snapshot\n |> Iarray.iter (fun session ->\n Session.window_links session\n |> Iarray.iter (fun link ->\n let window = Window_link.window link in\n Printf.printf \"%s/%d %s: %d pane(s)\\n\" (Session.name session)\n (Window_link.index link) (Window.name window)\n (Iarray.length (Window.panes window))));\n assert (Iarray.length (Snapshot.sessions snapshot) = 2);\n assert (Iarray.length (Snapshot.windows snapshot) = 2);\n assert (Iarray.length (Snapshot.window_links snapshot) = 3);\n assert (Iarray.length (Snapshot.panes snapshot) = 2);\n print_endline \"graph: 2 sessions, 2 windows, 3 links, 2 panes\"\n\nlet with_demo binary use =\n let directory = Filename.temp_dir \"libtmux-ocaml-showcase-\" \"\" in\n Fun.protect\n ~finally:(fun () ->\n Sys.readdir directory\n |> Array.iter (fun name -> Sys.remove (Filename.concat directory name));\n Unix.rmdir directory)\n (fun () ->\n let socket = Filename.concat directory \"server\" in\n (* Give this private daemon a lifetime even if startup fails. *)\n let config_file = Filename.concat directory \"tmux.conf\" in\n Out_channel.with_open_text config_file (fun output ->\n output_string output \"set-option -s exit-unattached on\\n\");\n let wrapper = Filename.concat directory \"tmux\" in\n Out_channel.with_open_text wrapper (fun output ->\n Printf.fprintf output \"#!/bin/sh\\nexec %s -f %s \\\"$@\\\"\\n\"\n (Filename.quote binary)\n (Filename.quote config_file));\n Unix.chmod wrapper 0o700;\n let channel = Unix.open_process_args_in binary [| binary; \"-V\" |] in\n let version =\n Fun.protect\n ~finally:(fun () ->\n if Unix.close_process_in channel <> Unix.WEXITED 0 then\n failwith \"tmux version discovery failed\")\n (fun () -> String.trim (input_line channel))\n in\n if not (String.starts_with ~prefix:\"tmux \" version) then\n failwith \"invalid tmux version\";\n let version = String.sub version 5 (String.length version - 5) in\n let ready = Filename.concat directory \"ready.txt\" in\n Out_channel.with_open_text ready (fun output ->\n output_string output \"showcase ready\\n\");\n let spawn =\n Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\"; ready; \"-\" ] })\n in\n let config =\n match\n Config.make ~directory ~session:\"showcase\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Config.pp_error error)\n in\n let plan =\n match\n Plan.make\n ~endpoint:(Endpoint.socket_path socket)\n ~version ~observed:None config\n with\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Plan.pp_error error)\n in\n let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in\n Fun.protect\n ~finally:(fun () -> get (Workspace.close operation))\n (fun () ->\n let receipt = get (Workspace.await operation) in\n if receipt.status <> Execution.Succeeded then\n failwith \"workspace setup failed\";\n let client = Option.get (Workspace.client operation) in\n let initial = List.hd (Iarray.get receipt.steps 0).created in\n Printf.printf \"socket=%s\\n%!\" socket;\n let pane =\n Snapshot.find_pane\n (get (Client.capture client))\n (Pane.Target.id initial.pane)\n |> Option.get\n in\n ignore\n (get\n (Client.wait_for_text ~timeout:0.5 client pane\n ~text:\"showcase ready\"));\n use client initial spawn))\n\nlet () =\n let binary = if Array.length Sys.argv = 2 then Sys.argv.(1) else \"tmux\" in\n let snapshot = with_demo binary capture_graph in\n print_graph snapshot\n" + }, + "automaticCleanup": "Every view retains protected cleanup. A private exit-unattached configuration ends the owned daemon after its clients close.", + "withoutErrorHandling": "Every view already unwraps result values and retains protected cleanup. The detailed view also checks the captured graph cardinalities." } } diff --git a/site/src/data/landing-examples.json b/site/src/data/landing-examples.json index 84658d0ac..ce01008ee 100644 --- a/site/src/data/landing-examples.json +++ b/site/src/data/landing-examples.json @@ -241,5 +241,23 @@ "command": "swift test --package-path Examples" } } + }, + "ocaml": { + "workspace": { + "file": "examples/showcase_graph.ml", + "lang": "ocaml", + "from": "let config =", + "to": "let operation = get (Workspace.submit_bootstrap ~binary:wrapper plan) in", + "ci": { + "workflow": ".github/workflows/ocaml.yml", + "command": "opam exec -- python3 test/showcase_test.py \"$TMUX_BINARY\"" + }, + "more": [ + { + "from": "let receipt = get (Workspace.await operation) in", + "to": "let initial = List.hd (Iarray.get receipt.steps 0).created in" + } + ] + } } } diff --git a/site/src/data/manifest-packages.json b/site/src/data/manifest-packages.json index 1ed815c1e..86e409716 100644 --- a/site/src/data/manifest-packages.json +++ b/site/src/data/manifest-packages.json @@ -142,14 +142,14 @@ }, "elixir": { "repo": "libtmux/libtmux-elixir", - "revision": "149565c9f04e043836191c8a7ff32a8ac39572ab", + "revision": "6e6e88e886bdd9267fcd8be66f561dc5d5462476", "distributions": [ { "name": "libtmux", "version": "0.0.1-alpha.1", "manifest": "mix.exs", "repo": "libtmux/libtmux-elixir", - "revision": "149565c9f04e043836191c8a7ff32a8ac39572ab" + "revision": "6e6e88e886bdd9267fcd8be66f561dc5d5462476" } ], "units": [] @@ -735,6 +735,49 @@ "name": "TmuxWorkspace" } ] + }, + "ocaml": { + "repo": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605", + "distributions": [ + { + "name": "libtmux", + "manifest": "libtmux.opam", + "repo": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605" + }, + { + "name": "libtmux-eio", + "manifest": "libtmux-eio.opam", + "repo": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605" + }, + { + "name": "libtmux-json", + "manifest": "libtmux-json.opam", + "repo": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605" + }, + { + "name": "libtmux-unix", + "manifest": "libtmux-unix.opam", + "repo": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605" + }, + { + "name": "libtmux-workspace", + "manifest": "libtmux-workspace.opam", + "repo": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605" + }, + { + "name": "libtmux-workspace-cli", + "manifest": "libtmux-workspace-cli.opam", + "repo": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605" + } + ], + "units": [] } } } diff --git a/site/src/data/mentions.json b/site/src/data/mentions.json index 086eaf2b6..60d93de30 100644 --- a/site/src/data/mentions.json +++ b/site/src/data/mentions.json @@ -8372,6 +8372,398 @@ "title": "Topology operations", "section": "guides" }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client", + "page": "/ocaml/latest/guides/control/", + "title": "Submit actions and retain their outcomes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.await", + "page": "/ocaml/latest/guides/benchmarking/", + "title": "Measure capture, concurrency and output delivery", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Client.submit", + "page": "/ocaml/latest/guides/benchmarking/", + "title": "Measure capture, concurrency and output delivery", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_eio.Workspace", + "page": "/ocaml/latest/guides/packages/", + "title": "Choose the packages your application needs", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_json", + "page": "/ocaml/latest/workspace/reference/", + "title": "OCaml workspace API reference", + "section": "ports" + }, + { + "port": "ocaml", + "symbol": "Libtmux_json.Decode_error.category.Wrong_type", + "page": "/ocaml/latest/guides/query-interchange/", + "title": "Share a scalar pane query", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_json.Decode_error.t", + "page": "/ocaml/latest/guides/query-interchange/", + "title": "Share a scalar pane query", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_json.Expr", + "page": "/ocaml/latest/guides/query-interchange/", + "title": "Share a scalar pane query", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_json.Expr.decode", + "page": "/ocaml/latest/guides/query-interchange/", + "title": "Share a scalar pane query", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_json.Expr.of_string", + "page": "/ocaml/latest/guides/query-interchange/", + "title": "Share a scalar pane query", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_json.Workspace.of_string", + "page": "/ocaml/latest/workspace/source-guide/", + "title": "Workspace guide", + "section": "workspace" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Cancellation", + "page": "/ocaml/latest/guides/compatibility/", + "title": "Compatibility", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Cancellation.Cancelled", + "page": "/ocaml/latest/guides/compatibility/", + "title": "Compatibility", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Cancellation.with_", + "page": "/ocaml/latest/guides/control/", + "title": "Submit actions and retain their outcomes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Cleanup.create", + "page": "/ocaml/latest/guides/control/", + "title": "Submit actions and retain their outcomes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Cleanup.inspect", + "page": "/ocaml/latest/guides/control/", + "title": "Submit actions and retain their outcomes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Cleanup.phase.Open_pidfd", + "page": "/ocaml/latest/guides/control/", + "title": "Submit actions and retain their outcomes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Cleanup.phase.Unreaped_child", + "page": "/ocaml/latest/guides/compatibility/", + "title": "Compatibility", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Cleanup.phase.Unreaped_child", + "page": "/ocaml/latest/guides/control/", + "title": "Submit actions and retain their outcomes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Client", + "page": "/ocaml/latest/guides/control/", + "title": "Submit actions and retain their outcomes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_unix.Workspace", + "page": "/ocaml/latest/guides/packages/", + "title": "Choose the packages your application needs", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_workspace", + "page": "/ocaml/latest/workspace/reference/", + "title": "OCaml workspace API reference", + "section": "ports" + }, + { + "port": "ocaml", + "symbol": "Libtmux_workspace.Config.make", + "page": "/ocaml/latest/guides/bootstrap/", + "title": "Start a private tmux server from OCaml", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_workspace.Config.pane:type.startup", + "page": "/ocaml/latest/workspace/source-guide/", + "title": "Workspace guide", + "section": "workspace" + }, + { + "port": "ocaml", + "symbol": "Libtmux_workspace.Execution.executor.protect", + "page": "/ocaml/latest/guides/getting-started/", + "title": "Install and run your first capture", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_workspace.Execution.status", + "page": "/ocaml/latest/workspace/source-guide/", + "title": "Workspace guide", + "section": "workspace" + }, + { + "port": "ocaml", + "symbol": "Libtmux_workspace.Plan.make", + "page": "/ocaml/latest/guides/bootstrap/", + "title": "Start a private tmux server from OCaml", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux_workspace.Plan.make", + "page": "/ocaml/latest/workspace/source-guide/", + "title": "Workspace guide", + "section": "workspace" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Cardinality.error.No_match", + "page": "/ocaml/latest/guides/queries/", + "title": "Query captured data", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Cardinality.pp_error", + "page": "/ocaml/latest/guides/testing/", + "title": "Testing and CI", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Endpoint.named_socket", + "page": "/ocaml/latest/guides/getting-started/", + "title": "Install and run your first capture", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Endpoint.socket_path", + "page": "/ocaml/latest/guides/getting-started/", + "title": "Install and run your first capture", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Error.pp", + "page": "/ocaml/latest/guides/getting-started/", + "title": "Install and run your first capture", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Error.t", + "page": "/ocaml/latest/guides/control/", + "title": "Submit actions and retain their outcomes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Error.t.Capacity", + "page": "/ocaml/latest/guides/streaming/", + "title": "Observe output and wait for rendered text", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Error.t.Closed", + "page": "/ocaml/latest/guides/control/", + "title": "Submit actions and retain their outcomes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Error.t.Disconnected", + "page": "/ocaml/latest/guides/control/", + "title": "Submit actions and retain their outcomes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Expr.compile", + "page": "/ocaml/latest/guides/queries/", + "title": "Query captured data", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Expr.Rel.any", + "page": "/ocaml/latest/guides/queries/", + "title": "Query captured data", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Expr.Rel.none", + "page": "/ocaml/latest/guides/queries/", + "title": "Query captured data", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Formats.lookup", + "page": "/ocaml/latest/guides/compatibility/", + "title": "Compatibility", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Model.pane", + "page": "/ocaml/latest/guides/query-interchange/", + "title": "Share a scalar pane query", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Operations.set_option", + "page": "/ocaml/latest/guides/benchmarking/", + "title": "Measure capture, concurrency and output delivery", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Output.event.End", + "page": "/ocaml/latest/guides/benchmarking/", + "title": "Measure capture, concurrency and output delivery", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Plan.panes", + "page": "/ocaml/latest/guides/queries/", + "title": "Query captured data", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Plan.pushdown.Require_exact", + "page": "/ocaml/latest/guides/queries/", + "title": "Query captured data", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Plan.source_filter", + "page": "/ocaml/latest/guides/queries/", + "title": "Query captured data", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Query.exactly_one", + "page": "/ocaml/latest/guides/queries/", + "title": "Query captured data", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Query.matching", + "page": "/ocaml/latest/guides/queries/", + "title": "Query captured data", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Query.one_or_none", + "page": "/ocaml/latest/guides/queries/", + "title": "Query captured data", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Session.window_links", + "page": "/ocaml/latest/guides/graph/", + "title": "Sessions, window links and panes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Session.windows", + "page": "/ocaml/latest/guides/graph/", + "title": "Sessions, window links and panes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Snapshot.panes", + "page": "/ocaml/latest/guides/queries/", + "title": "Query captured data", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Spawn.command.Exec", + "page": "/ocaml/latest/guides/control/", + "title": "Submit actions and retain their outcomes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Spawn.command.Shell", + "page": "/ocaml/latest/guides/control/", + "title": "Submit actions and retain their outcomes", + "section": "guides" + }, + { + "port": "ocaml", + "symbol": "Libtmux.Window.panes", + "page": "/ocaml/latest/guides/graph/", + "title": "Sessions, window links and panes", + "section": "guides" + }, { "port": "powershell", "symbol": "LibTmux", diff --git a/site/src/data/port-guides/ocaml.json b/site/src/data/port-guides/ocaml.json new file mode 100644 index 000000000..59991ae94 --- /dev/null +++ b/site/src/data/port-guides/ocaml.json @@ -0,0 +1,68 @@ +{ + "source": { + "repository": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605" + }, + "guides": [ + { + "path": "docs/getting-started.md", + "content": "# Install and run your first capture\n\nUse the [README installation](../README.md#install-from-source) with OCaml\n5.5.2, opam and tmux on Linux. The native clients compile a small Linux C helper\nand require a C compiler and system headers. This source checkout installs the\nlibraries; no registry release is available yet.\n\nActivate the local switch in the current shell as shown in the README before\nchanging to a separate project. This exports the switch choice for `opam exec`\nwithout changing shell startup files or the global default switch.\n\n## Link an installed library\n\nFor a blocking program, use a Dune executable with `libtmux` and `libtmux-unix`:\n\n```dune\n(executable\n (name main)\n (libraries libtmux libtmux-unix))\n```\n\nFor the Eio examples, link the Eio backend and the application's runtime entry\npoint instead:\n\n```dune\n(executable\n (name main)\n (libraries libtmux libtmux-eio eio_main))\n```\n\nCreate `dune-project` with `(lang dune 3.24)`, save the\n[graph program](../examples/native_graph.ml) as `main.ml`, and build from that\nproject. The installed-example check does this outside the repository with a\nseparate install prefix; it does not depend on source-tree library resolution.\n\n```console\n$ opam exec -- dune build\n```\n\n## Select an endpoint explicitly\n\n`Endpoint.socket_path` accepts an absolute socket path; `Endpoint.named_socket`\ndescribes tmux's `-L` name. Constructing either performs no I/O. Ordinary\n`Client.connect` attaches to an existing daemon and does not start one.\n\nThe [private demo setup](../README.md#read-a-real-tmux-graph) creates an owned\nsocket and a `cat` pane. Run the graph program with the tmux binary and socket\npath, or copy its complete source into your project. It captures the graph,\ncloses its connection and prints retained observations.\n\nA connection identifies the daemon PID twice around pidfd acquisition. The\nclient and daemon must share a PID namespace and local scratch filesystem;\nan accessible socket by itself does not establish those conditions. A stale\nsource is an error, never permission to reconnect a mutation automatically.\n\n## Run a concurrent application\n\nThe [complete Eio example](../examples/native_watch.ml) calls `Eio_main.run`\nand `Eio.Switch.run`, then supplies `process_mgr` and `mono_clock` from the\napplication environment. Use that outer shape in your application. Capturing\nand querying values does not require adopting Eio in the pure core.\n\nExpected failures return `result` and print with `Error.pp`. Backend\ncancellation propagates separately. Clients and subscriptions belong to their\nconnecting domain; immutable observations can be shared. Close owned resources\nwith `Fun.protect` or the supplied Eio switch.\n\n[Object graph](graph.md) · [Queries](queries.md) · [Control](control.md) ·\n[API](api.md) · [Compatibility](compatibility.md)\n" + }, + { + "path": "docs/bootstrap.md", + "content": "# Start a private tmux server from OCaml\n\nUse `Workspace.submit_bootstrap` when the endpoint is known to be missing.\nIt creates the first session and binds a client through the same control\nconnection. The native workspace builder needs no JSON package;\n`Workspace.await` performs startup.\n\nFor an existing daemon, use `Client.connect`, capture its graph, and create a\nsession through that client. See [control and recovery](control.md).\n\n## Run the complete program\n\nComplete the [source installation](getting-started.md), then run from the\ncheckout:\n\n```console\n$ opam exec -- dune exec examples/showcase_bootstrap.exe -- tmux\n```\n\nThe program prints its temporary socket path followed by\n`bootstrapped: 1 session, 1 window, 1 pane`. It creates a `bootstrap-demo` session\nwhose `editor` window runs `/bin/cat -u`, captures the graph, and reads that\nsnapshot after closing its client.\n\nThe [complete source](../examples/showcase_bootstrap.ml) includes its private\ndirectory, tmux configuration, local version discovery and cleanup. To use the\nwhole program outside this checkout, save it as `main.ml` in the Dune project\nfrom [first use](getting-started.md#link-an-installed-library) with:\n\n```dune\n(executable\n (name main)\n (libraries libtmux libtmux-workspace libtmux-unix unix))\n```\n\nCI compiles that complete file against installed packages and checks its exact\noutcome line, graph assertions, directory cleanup and owned process exit on\ntmux 3.3a and 3.8. The [executed inventory](../examples/showcase.json) records\nits command and workflow.\n\n## Build, plan, await and capture\n\nThe central function receives the binary's discovered version and a new private\nsocket path. `Config.make`, `Plan.make` and submission perform no I/O; the\nfunction returns a retained execution handle:\n\n\n\n```ocaml\nlet bootstrap ~binary ~version ~directory endpoint =\n let spawn = Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\" ] }) in\n let config =\n Config.make ~directory ~session:\"bootstrap-demo\"\n [ Config.window ~name:\"editor\" [ Config.pane ~spawn () ] ]\n |> checked Config.pp_error\n in\n let plan =\n Plan.make ~endpoint ~version ~observed:None config |> checked Plan.pp_error\n in\n get (Workspace.submit_bootstrap ~binary plan)\n```\n\nPassing [`None`](https://ocaml.org/manual/5.5/api/Option.html#TYPEELTt.None) as the\n`observed` argument means the endpoint is known to be missing. The full program\nuses a newly created private directory to establish that precondition. A failed\ncapture must remain an error; treating it as a missing observation discards that\nfailure and produces the wrong plan. A plan remains advisory; another process\ncan still change the endpoint before execution.\n\nKeep that handle outside the cleanup scope. Await it, check the receipt, then\nborrow its client for the capture:\n\n\n\n```ocaml\nlet snapshot =\n protect\n ~finally:(fun () -> get (Workspace.close execution))\n (fun () ->\n let receipt = get (Workspace.await execution) in\n require_success receipt;\n let client = Option.get (Workspace.client execution) in\n get (Client.capture client))\n```\n\n`require_success` reports failed steps and compensation before raising. The\n[`protect` helper](../examples/showcase_bootstrap.ml#L14) keeps that primary\nexception if closing also fails, reporting the cleanup failure separately.\nBoth helpers are in the complete source.\n`Workspace.inspect execution` reads the retained journal after closure; inspect\nreported creations and uncertainty before choosing another action. The\nprogram stops without retrying. The\n[workspace guide](workspaces.md#collisions-and-recovery) explains those receipts.\n\n`Workspace.client` borrows the bootstrapped client. Close the workspace handle\nafter using that client; its snapshot stays readable.\n\n## Choose the daemon's lifetime\n\nBootstrapping owns the new client, not the tmux daemon. Closing the handle\nreleases that client. The example explicitly configures its private daemon\nwith `exit-unattached on`, supplied through a small shell exec wrapper. The\ndaemon and its demonstration pane exit after\nthe final client detaches. It then removes only its own temporary files.\n\nFor an application that keeps the server, choose its normal tmux lifetime\npolicy and retain the workspace handle while using the borrowed client. An\nexisting or newly visible daemon does not become owned merely because this\napplication connected to it. Cancellation and a partial bootstrap can leave\neffects; use [retained operation recovery](recovery.md) and the workspace\nreceipt rather than assuming closure undoes them.\n\n[Object graph](graph.md) · [Workspaces](workspaces.md) · [Guide](README.md)\n" + }, + { + "path": "docs/graph.md", + "content": "# Sessions, window links and panes\n\nA snapshot contains sessions, global windows, session-specific window links,\npanes and captured clients. Entity values are abstract immutable observations.\nThey remain readable after their client closes.\n\n```text\nSession ── Window_link ── Window ── Pane\n index │\n another link can share this window\n```\n\nA window can be linked to multiple sessions, or linked more than once within\none session. `Session.window_links` retains each context and index.\n`Session.windows` returns distinct global windows in first-link order.\n`Window.panes` contains that global window's captured panes. Local traversal\nperforms no I/O, lazy refresh or per-object subprocess calls. Captured client\nrows and attached-client counts include the library's control connection when\nit is present.\n\nThe [graph program](../examples/native_graph.ml) deliberately walks links. To\nsee the same window in two sessions, run the [README setup](../README.md#read-a-real-tmux-graph),\nthen create another session:\n\n```console\n$ env -u TMUX -u TMUX_PANE tmux \\\n -S \"$LIBTMUX_DEMO_DIR/server\" \\\n new-session \\\n -d \\\n -s linked \\\n -- \"exec cat\"\n```\n\nLink the demo's window at index 7 in the other session:\n\n```console\n$ env -u TMUX -u TMUX_PANE tmux \\\n -S \"$LIBTMUX_DEMO_DIR/server\" \\\n link-window \\\n -d \\\n -s @0 \\\n -t linked:7\n```\n\n```console\n$ opam exec -- dune exec examples/native_graph.exe -- \\\n tmux \"$LIBTMUX_DEMO_DIR/server\"\n```\n\nThe same window ID and pane ID appear under both sessions, at their respective\nlink indexes. The installed-example check asserts both appearances. Remove\nonly the additional session when finished:\n\n```console\n$ env -u TMUX -u TMUX_PANE tmux \\\n -S \"$LIBTMUX_DEMO_DIR/server\" \\\n kill-session -t '=linked'\n```\n\nAn entity ID is scoped to a connection source. `same_entity` requires the same\nbound source generation as well as the same entity ID; separate connections\ncompare unequal even when they observe the same daemon. `same_observation`\nalso distinguishes captures. Use those operations or explicit `Id.equal`,\nrather than polymorphic equality over observations. A valid target does not\nmake captured names, geometry or membership current.\nA link context is an observed session/index/window tuple, not a stable link\nincarnation across unlinking or reindexing.\n\nCapture provenance records an acquisition interval. Several tmux commands do\nnot form an atomic server transaction. Disappearing or conflicting objects\nproduce a capture error rather than a fabricated empty relationship.\n\nEach entity retains the complete snapshot graph so its relationships remain\navailable. Retaining one pane from every refresh therefore retains every one\nof those captures. Keep scalar summaries when navigation is unnecessary.\n`Pane.target` omits the graph but remains bound to its original connection\ngeneration; it is not a durable target for a future connection. Relationship\ntraversal can allocate wrapper arrays even when a query stops testing early.\nThe [retained-heap measurements](benchmarking.md#heap-retained-across-captures)\ncompare these choices across repeated real captures.\n\n[Queries](queries.md) · [Recovery](control.md) · [API](api.md)\n" + }, + { + "path": "docs/queries.md", + "content": "# Query captured data\n\nCapture once, then use standard collections. The [complete program](../examples/native_query.ml)\ncloses its blocking client before evaluating any of the functions below.\nFollow the [README setup](../README.md#read-a-real-tmux-graph) first.\n\n## Use a native predicate\n\n\n\n```ocaml\nlet active_ids snapshot =\n Snapshot.panes snapshot |> Iarray.to_seq |> Seq.filter Pane.active\n |> Seq.map Pane.id |> List.of_seq\n```\n\n`Snapshot.panes` returns an immutable array of captured panes. Converting it to\na sequence does not acquire anything. Repeated traversal sees captured values;\nstateful callbacks supplied by an application can still behave differently.\n\n## Describe a typed query\n\n\n\n```ocaml\nlet roomy_terminals : Pane.t Expr.t =\n Expr.all\n [\n Expr.Bool.is_true Pane.Fields.active;\n Expr.Text.is_in Pane.Fields.current_command\n [ \"cat\"; \"bash\"; \"zsh\"; \"nvim\" ];\n Expr.Int.ge Pane.Fields.width 80;\n ]\n\nlet roomy_ids snapshot =\n Snapshot.panes snapshot |> Iarray.to_seq\n |> Query.matching roomy_terminals\n |> Seq.map Pane.id |> List.of_seq\n```\n\n`Expr.compile` returns an ordinary predicate. `Query.matching` compiles once\nwhen constructed and preserves order and multiplicity. Field descriptors carry\nboth entity and value types, so invalid entity/operator combinations fail in\nthe compiler. Boolean `Expr.all []` is true and `Expr.any []` is false.\n\n## Follow relationships without fetching\n\n\n\n```ocaml\nlet sessions_with_room snapshot =\n let expression =\n Expr.Rel.any Session.Relations.windows\n (Expr.Rel.any Window.Relations.panes roomy_terminals)\n in\n Snapshot.sessions snapshot |> Iarray.to_seq |> Query.matching expression\n |> Seq.map Session.name |> List.of_seq\n```\n\nRelationships traverse the complete captured graph. `Expr.Rel.any` over no\nchildren is false; `all` and `none` over no children are true. Put conditions\ninside one `any` when the same child must satisfy both. Two independent\nexistentials can match different children.\n\n## Establish cardinality before acting\n\n`Query.exactly_one` returns `No_match` or `Multiple_matches {at_least=2}` instead\nof choosing the first element. It stops once it finds a second match; proving\nuniqueness exhausts the remaining finite sequence. `one_or_none` returns an\noption while retaining an ambiguity error. Duplicate entries count separately.\n\nSelect first, inspect the result, then submit a mutation. Selection does not\nlock tmux; a target can disappear between observation and action. The\n[control guide](control.md) explains that failure boundary.\n\n## Decode portable query data explicitly\n\n`Libtmux_json.Expr.of_string Model.pane` validates the shared scalar pane\nsubset of [`libtmux.filter/1`](query-interchange.md). It rejects duplicate/unknown\nkeys, wrong operand types, invalid UTF-8, oversized/deep documents and Java\nregex. Native closures stay in `Seq.filter`; they have no portable wire identity.\n\n`Libtmux.Plan.panes` compiles a source filter and retains the residual expression\nwithout I/O. Inspect `source_filter` and use `Require_exact` to reject unsupported\nlowering. Current client capture operations acquire the complete graph; they do\nnot execute these plans. The planner is a separate seam for acquisition adapters.\nConjunctions, disjunctions, negation and relationships require different lowering\nrules; local sequence processing never issues a tmux query implicitly.\n\nThe [native reference](../lib/index.mld) executes a pure planning example with MDX.\nThe [architecture capability table](dev/adr/0001-native-ocaml-suite.md#compose-ordinary-predicates-with-typed-query-data)\ndistinguishes observation accessors, native expressions, JSON, planning and\nclient acquisition. An available accessor or format name need not be a\nportable expression field.\n\n[Field reference](fields.md) · [API](api.md) · [Guide](README.md)\n" + }, + { + "path": "docs/query-interchange.md", + "content": "# Share a scalar pane query\n\n`Libtmux_json.Expr` reads and writes the following subset of\n[`libtmux.filter/1`][java-wire]. Use `Model.pane` as the model witness. This\ndocument defines the OCaml interoperability boundary; the\n[query guide](queries.md) shows local evaluation and the\n[complete JSON program](../examples/query_json.ml) demonstrates decoding,\nencoding and structured errors.\n\n## Document and nodes\n\nA document has exactly `\"schema\"`, `\"model\"` and `\"expr\"` properties. The supported\nvalues are `\"libtmux.filter/1\"` and `\"pane\"`. An expression is one of these nodes:\n\n| `\"node\"` | Other required properties | Meaning |\n| --- | --- | --- |\n| `\"compare\"` | `\"field\"`, `\"op\"`, `\"value\"` | Compare one canonical scalar field |\n| `\"and\"` | `\"operands\"`: expression array | Every operand matches; empty is true |\n| `\"or\"` | `\"operands\"`: expression array | Any operand matches; empty is false |\n| `\"not\"` | `\"operand\"`: expression | Negate one expression |\n\nProperty order is irrelevant. Duplicate, missing and unknown properties are\nerrors. Encoders preserve query meaning, not the original spelling: a\n`\"not_equals\"` comparison can encode as `\"not\"` around `\"equals\"`.\n\n## Fields and operators\n\nField names are case-sensitive canonical identities, not arbitrary accessors.\n\n| Value type | Fields | Operators |\n| --- | --- | --- |\n| String | `\"pane_id\"`, `\"pane_current_command\"`, `\"pane_title\"`, `\"pane_current_path\"` | `\"equals\"`, `\"not_equals\"`, `\"starts_with\"`, `\"ends_with\"`, `\"contains\"`, `\"in\"` |\n| Integer | `\"pane_index\"`, `\"pane_width\"`, `\"pane_height\"`, `\"pane_left\"`, `\"pane_top\"` | `\"equals\"`, `\"not_equals\"`, `\"less_than\"`, `\"at_most\"`, `\"greater_than\"`, `\"at_least\"` |\n| Boolean | `\"pane_active\"` | `\"equals\"`, `\"not_equals\"` |\n\n`\"value\"` has the field's JSON type. String `\"in\"` takes an array of strings and\nmatches equality with any member; an empty array matches nothing. Integers must\nbe integral JSON numbers in the signed 32-bit range, from −2,147,483,648 through\n2,147,483,647. Floating-point values are rejected.\n\nText is valid UTF-8 with exact, case-sensitive matching. The codec performs no\nnormalization or case folding. Native OCaml predicates can process arbitrary\nbytes, but invalid UTF-8 has no representation in this query schema.\n\nRelationships, other models, native extension fields such as `\"pane_dead\"`,\noptional fields such as `\"pane_pid\"`, integer membership and Java's `\"matches\"`\nregex operator are outside this subset. Use native expressions or ordinary\n`Seq.filter` for local behavior outside it.\n\n## Bounds and errors\n\nBoth decoding and encoding enforce these limits:\n\n| Resource | Limit |\n| --- | --- |\n| JSON document | 65,536 bytes |\n| JSON nesting | 32 levels |\n| Expression nodes | 1,024 |\n| String membership values | 256 |\n\n`Libtmux_json.Expr.of_string` checks input bytes and nesting before parsing.\n`Libtmux_json.Expr.decode` validates\nthe supplied Yojson tree, including duplicate properties and the size of its\ncompact JSON representation. Encoding applies the same subset and bounds.\n\nFailures return `Decode_error.t`: a JSON pointer, category and message. For\nexample, a string supplied to `\"pane_width\"` reports `Wrong_type` at\n`/expr/value`. The decoder returns the first detected error, not an aggregate\nvalidation report. It does not include the whole input in the error.\n\n## Reproduce the compatibility check\n\nThe [conformance procedure](../test/conformance/README.md) pins the Java source,\nverifies prepared artifacts, rebuilds the OCaml peer and exchanges queries in\nboth directions over the same fixture. The current 66 cases establish the\ntested scalar behavior. They do not imply support for the rest of Java's query\nlanguage or a Java runtime dependency for OCaml users.\n\n[java-wire]: https://github.com/libtmux/libtmux-java/blob/e8a39689d8d60968ac978a1dd2a89c6112333896/docs/guide/filtering.md\n" + }, + { + "path": "docs/control.md", + "content": "# Submit actions and retain their outcomes\n\nObservations are local values. Client calls perform explicit I/O, and mutations\nuse targets bound to the source that produced them. Closing a client releases\nits own transports. tmux then applies its configured lifetime: for example,\n[the standalone programs](showcases.md) enable `exit-unattached` on their\nprivate daemons so they exit after their final client detaches.\n\nThe [layout program](../examples/native_build.ml) creates a session, splits its\nfirst pane and adds a logs window. It passes argv through `Spawn.Exec`, a working\ndirectory and an environment value. `Spawn.Shell` explicitly requests shell\ncode. `send_text` is literal input; `send_keys [Key.Enter]` is a separate action.\n\nA creation response returns the reported session, window and pane IDs without\nan extra graph capture. Only the resource requested by that command is newly\ncreated. A split's returned session and window are pre-existing containers.\n\n## Choose a backend\n\nUse `Libtmux_unix.Client` in a blocking script. Use `Libtmux_eio.Client` inside\nan application-owned Eio switch, supplying the process manager and monotonic\nclock. Clients are affine to their connecting domain. Immutable captured values\ncan be read from other domains; live client handles cannot move between them.\n\nThe Eio backend has client-owned workers for command draining and stream\nreading. A cancelled waiter does not abandon a written request. Local scratch\nfilesystem work runs on a system thread. The blocking backend supports scoped\ncancellation tokens signalled from another domain or systhread.\n\n| Recovery concern | Eio | Blocking Unix |\n| --- | --- | --- |\n| Cancel one caller | Eio cancellation scope around `Client.await` | `Cancellation.with_` token passed to `Client.await` |\n| Return after cancellation | The waiter raises while a client-owned fiber drains admitted work | The call drains before raising; one exchange timeout after detection bounds transport work |\n| Inspect an outcome | `Operation.inspect`, on the connecting domain | `Operation.inspect`, on the connecting domain |\n| Release resources | Close the client inside its application-owned switch | Close the client after the call returns |\n\nThe blocking bound covers transport draining. Local scratch I/O must still\nfinish before the call returns.\n\nCaptures, reads and subscriptions share the client's payload budget and process\nslots. The [capacity guide](streaming.md#plan-shared-capacity) shows their combined\nreservations and how to leave headroom for service operations.\n\nEio `Client.close` rejects new command and subscription admission as soon as\nclosing starts. Concurrent closes wait for the same teardown result. A later\nclose retains an earlier teardown failure; the closed state alone does not\nprove resources were released. Inspect the client's `Cleanup` report for\nsecondary failures. Internal connection teardown also retains one completion,\nso a concurrent failure path cannot skip cleanup already in progress.\n\nThe [complete recovery example](recovery.md) cancels an active waiter, awaits\nthe same retained operation and checks server state before its next mutation.\n\n## Distinguish acknowledgement from completion\n\n`submit` validates and reserves capacity without writing. Retain the operation\nhandle before awaiting it. `Operation.inspect` reads its state without I/O:\nqueued, not started, written, acknowledged, finished, or outcome unknown.\n\nA reply can acknowledge a command while hooks or its completion marker remain\noutstanding. Sending keys confirms tmux accepted input; it does not prove a\nterminal program consumed it or completed work. A detach request does not prove\nthe peer exited. Use the relevant postcondition, rendered wait or external exit\nsignal for the task.\n\nExpected failures use `result` and `Error.t`. Backend cancellation propagates\nas cancellation. An uncertain result retains reported creation IDs and unresolved\nowned buffers; it never becomes an instruction to retry the mutation.\n\nWhen Eio's daemon watcher closes a connection, an in-flight operation retains\n`Error.Disconnected` as its cause. An idle-reader failure retains its library\nerror. Explicit client closure uses `Error.Closed`. Inspect the retained receipt\nto distinguish these reasons; each can leave an admitted mutation uncertain.\n\n`Client.cleanup` retains process and descriptor cleanup diagnostics after\nclosure. Supply a `Cleanup.create ()` report through `~cleanup` before connecting\nwhen diagnostics must survive failed setup or cancellation. The same option is\navailable on terminal attachment and workspace bootstrap. `Cleanup.inspect`\nreturns the cleanup phase, typed library error when available, original\nexception and backtrace without I/O. The report retains at most 64 entries and\ncounts further issues; exception payloads can still retain substantial memory.\nReports and their diagnostics belong to the creating domain.\n\nCleanup attempts independent releases even when one fails. A primary exception\nkeeps its identity and backtrace; secondary failures go to the report. If there\nis no primary failure, the first unrecovered cleanup failure is returned or\nraised normally. A recovered fallback can still leave a diagnostic after a\nsuccessful return: failure to open a child pidfd skips TERM grace, forces\ntermination and reaps, while retaining the `Open_pidfd` issue.\nFailed forced termination produces an `Unreaped_child` issue when exit cannot\nbe established without blocking. That issue does not prove resource release.\nThe [recovery example](recovery.md) keeps its report outside connection lifetime.\n\n## Recover deliberately\n\nA replacement daemon retires the connection generation. Reconnect explicitly,\ncapture again and establish cardinality before choosing a fresh target.\nOld captured values remain readable, but their targets cannot silently move to\nthe new server.\n\nPartial effects can remain after a later hook or command failure. Inspect the\nretained receipt and current server state. Compensate only resources whose\ncreation is proven. A snapshot is an observation over an interval, and a\nselection followed by mutation is not an atomic transaction.\n\nUse the [recovery walkthrough](recovery.md) to follow this sequence through a\ncomplete installed program, including cleanup of its own pane.\n\nSee [streaming](streaming.md) for Data/Gap/End and bounded queues, and\n[compatibility](compatibility.md) for hook, PID-namespace and scratch-file\nconstraints. [Guide](README.md) · [API](api.md)\n" + }, + { + "path": "docs/recovery.md", + "content": "# Recover an operation after cancelling its waiter\n\nRetain the operation handle before awaiting it. Cancelling one Eio waiter leaves\nadmitted work under the client's ownership. Inspect that handle, await its\noutcome and check the relevant server state before choosing another mutation.\n\nThis program uses a tmux `wait-for` barrier to keep an operation pending while\nits waiter is cancelled. It then signals the barrier once and awaits the same\nhandle. A fresh capture checks the window's name before renaming it. The barrier\ncoordinates this example; it does not establish completion of a terminal\nprogram. [Control](control.md) compares Eio and blocking cancellation timing.\n\n## Run the complete program\n\nComplete the [source installation](getting-started.md) and run from the cloned\nrepository. Start an empty private server:\n\n```console\n$ export LIBTMUX_RECOVERY_DIR=\"$(mktemp -d -t libtmux-ocaml-recovery.XXXXXX)\"\n```\n\n```console\n$ env -u TMUX -u TMUX_PANE tmux \\\n -S \"$LIBTMUX_RECOVERY_DIR/server\" \\\n -f /dev/null \\\n new-session \\\n -d \\\n -s recovery-demo \\\n -- \"exec cat\"\n```\n\nThe fresh server's session ID is `$0`; quote it to preserve the literal ID:\n\n```console\n$ opam exec -- dune exec examples/native_recovery.exe -- \\\n tmux \"$LIBTMUX_RECOVERY_DIR/server\" '$0'\n```\n\nExpected output is `waiter=cancelled; operation=retained`, followed by\n`operation=finished; postcondition=recovery-complete` and\n`cleanup-issues=0; omitted=0`. The program creates a window and removes its own pane afterward. It preserves the seed session and\nother panes, and closes its client on success or failure.\n\nRemove the private seed session and directory:\n\n```console\n$ env -u TMUX -u TMUX_PANE tmux \\\n -S \"$LIBTMUX_RECOVERY_DIR/server\" \\\n kill-session \\\n -t '=recovery-demo'\n```\n\n```console\n$ rm -f -- \"$LIBTMUX_RECOVERY_DIR/server\"\n```\n\n```console\n$ rmdir \"$LIBTMUX_RECOVERY_DIR\"\n```\n\n## Inspect before acting\n\nThe [complete source](../examples/native_recovery.ml) uses installed public\nlibraries. Its Eio cancellation scope covers only the waiter. Client ownership\nand cleanup remain outside that scope. A caller-owned `Cleanup` report is\ncreated before connecting and inspected after closing. It remains accessible\nif setup fails or cancellation prevents a client from being returned.\n\n\n\n```ocaml\nopen Libtmux\nmodule Client = Libtmux_eio.Client\nmodule Operation = Libtmux_eio.Operation\nmodule Cleanup = Libtmux_eio.Cleanup\n\nlet get = function\n | Ok value -> value\n | Error error -> failwith (Format.asprintf \"%a\" Error.pp error)\n\nlet protect ~finally use =\n match use () with\n | value ->\n finally ();\n value\n | exception error ->\n let backtrace = Printexc.get_raw_backtrace () in\n (try finally ()\n with cleanup ->\n Format.eprintf \"cleanup failed: %s@.\" (Printexc.to_string cleanup));\n Printexc.raise_with_backtrace error backtrace\n\nlet cancel_waiter operation =\n let entered, enter = Eio.Promise.create () in\n let context = ref None in\n Eio.Fiber.pair\n (fun () ->\n try\n Eio.Cancel.sub (fun current ->\n context := Some current;\n Eio.Promise.resolve enter ();\n ignore (get (Client.await operation));\n failwith \"wait completed before its release signal\")\n with Eio.Cancel.Cancelled Exit -> ())\n (fun () ->\n Eio.Promise.await entered;\n Eio.Cancel.cancel (Option.get !context) Exit)\n |> ignore\n\nlet recover client session =\n let created =\n get\n (Client.create_window client session ~name:\"recovery-pending\"\n ~spawn:(Spawn.make (Exec { program = \"/bin/cat\"; args = [ \"-u\" ] })))\n in\n let channel =\n \"libtmux-recovery-\"\n ^ Generation.to_string (Source.generation (Client.source client))\n in\n let pending = ref None and release_attempted = ref false in\n let release () =\n if not !release_attempted then (\n release_attempted := true;\n get (Client.signal client channel))\n in\n protect\n ~finally:(fun () ->\n Eio.Cancel.protect (fun () ->\n protect\n ~finally:(fun () -> get (Client.kill_pane client created.pane))\n (fun () ->\n match !pending with\n | None -> ()\n | Some operation -> (\n match get (Operation.inspect operation) with\n | Operation.Queued -> get (Operation.cancel operation)\n | Operation.Written | Operation.Acknowledged ->\n release ();\n get (Client.await operation)\n | Operation.Not_started | Operation.Finished _\n | Operation.Outcome_unknown _ ->\n ()))))\n (fun () ->\n let operation =\n get (Client.submit client (Operations.wait_for channel))\n in\n pending := Some operation;\n ignore (get (Operation.await_stage operation `Acknowledged));\n cancel_waiter operation;\n (match get (Operation.inspect operation) with\n | Operation.Written | Operation.Acknowledged -> ()\n | Operation.Outcome_unknown receipt ->\n failwith\n (Format.asprintf \"outcome unknown: %a\" Error.pp receipt.cause)\n | _ -> failwith \"expected a retained in-flight operation\");\n print_endline \"waiter=cancelled; operation=retained\";\n release ();\n get (Client.await operation);\n (match get (Operation.inspect operation) with\n | Operation.Finished (Ok ()) -> ()\n | _ -> failwith \"retained operation did not finish\");\n let window =\n Snapshot.find_window\n (get (Client.capture client))\n (Window.Target.id created.window)\n |> Option.get\n in\n if Window.name window <> \"recovery-pending\" then\n failwith \"postcondition changed; leave the next action to the caller\";\n get\n (Client.rename_window client (Window.target window)\n ~name:\"recovery-complete\");\n let after =\n Snapshot.find_window (get (Client.capture client)) (Window.id window)\n |> Option.get\n in\n assert (Window.name after = \"recovery-complete\");\n Printf.printf \"operation=finished; postcondition=%s\\n\" (Window.name after))\n\nlet () =\n if Array.length Sys.argv <> 4 then (\n prerr_endline \"usage: native_recovery TMUX_BINARY SOCKET_PATH SESSION_ID\";\n exit 2);\n Eio_main.run @@ fun env ->\n Eio.Switch.run @@ fun sw ->\n let cleanup = Cleanup.create () in\n protect\n ~finally:(fun () ->\n let report = get (Cleanup.inspect cleanup) in\n Iarray.iter\n (fun issue ->\n match issue.Cleanup.error with\n | Some error -> Format.eprintf \"cleanup: %a@.\" Error.pp error\n | None ->\n Format.eprintf \"cleanup: %s@.\"\n (Printexc.to_string issue.exception_))\n report.issues;\n Printf.printf \"cleanup-issues=%d; omitted=%d\\n\"\n (Iarray.length report.issues)\n report.omitted)\n (fun () ->\n let client =\n get\n (Client.connect ~cleanup ~sw ~binary:Sys.argv.(1)\n ~process_mgr:(Eio.Stdenv.process_mgr env)\n ~mono_clock:(Eio.Stdenv.mono_clock env)\n (Endpoint.socket_path Sys.argv.(2)))\n in\n protect\n ~finally:(fun () ->\n Eio.Cancel.protect (fun () -> get (Client.close client)))\n (fun () ->\n let id = get (Session.Id.of_string Sys.argv.(3)) in\n let session =\n Snapshot.find_session (get (Client.capture client)) id |> Option.get\n in\n recover client (Session.target session)))\n```\n\nThe release attempt is recorded before its I/O so cleanup cannot retry an\nuncertain signal. The finally block cancels queued work, releases and drains a\nlive barrier, and removes only the pane whose creation was reported. Existing\npanes remain outside that cleanup. A primary failure keeps its original\nexception and backtrace; a later cleanup failure is reported separately. Both clients and operations stay on the\nconnecting domain.\n\n## Interpret a retained state\n\n[`Libtmux_eio.Operation.inspect`](../eio/libtmux_eio.mli) performs no I/O and\nremains readable after client closure. A state describes this operation; it\ndoes not prove a terminal program consumed input or exited.\n\n| State | Next decision |\n| --- | --- |\n| `Queued` | Cancel before writing, or continue awaiting the same handle. |\n| `Not_started` | The operation made no admitted effect; establish fresh preconditions before a new action. |\n| `Written` or `Acknowledged` | Keep the handle. The client still owns completion; cancelling another waiter does not undo the write. |\n| `Finished (Ok value)` | Use the result and check the task's relevant postcondition. |\n| `Finished (Error error)` | Examine the error and current state; a later command or hook failure can follow an earlier effect. |\n| `Outcome_unknown receipt` | Preserve the cause and reported creations. Reacquire observations explicitly and resolve uncertainty before another mutation. |\n\nThe example exercises active-waiter cancellation and retained completion. Its\nunknown-outcome branch reports the cause and stops the next action. Transport\nloss, a replacement daemon and uncertain mutation recovery require the retained\nreceipt and fresh observation; this program does not simulate those failures.\nClosing a client does not terminate a borrowed tmux daemon.\n\nFor workspace automation, inspect the [execution receipt](workspaces.md#collisions-and-recovery)\nand compensate only proven creations. For stream continuity loss, handle the\n[Gap or End event](streaming.md) before choosing a fresh subscription.\n\n[First use](getting-started.md) · [Control](control.md) · [Guide](README.md)\n" + }, + { + "path": "docs/streaming.md", + "content": "# Observe output and wait for rendered text\n\nUse [native_watch.ml](../examples/native_watch.ml) for a complete concurrent\nliteral-send, future-byte match and rendered-screen check. Its application owns\nthe Eio scheduler and switch. Use [native_wait.ml](../examples/native_wait.ml) to capture exactly one pane and\nwait until its ordinary screen contains the supplied text. The example imports\nthe installed Eio client, owns its switch, uses an explicit socket, closes its\nclient and prints the matched pane ID. It requires an existing daemon and one\npane; absence and ambiguity remain errors.\n\n`Client.wait_for_text` first subscribes, then captures the screen immediately.\nOutput invalidates that observation. Queued Data events are coalesced before\nthe next bounded capture; a queued Gap stops that coalescing. Membership and\noverflow gaps cause fresh graph acquisition and subscription in the same\nconnection binding. A disconnected daemon or stream fails the wait.\n\nSuccess returns a captured screen containing the text. Text that appears and\ndisappears between captures may be missed. Deadlines are checked between\nacquisitions, whose in-flight I/O keeps the client's exchange timeout. A timed\nout wait does not prove that text was absent in the past.\n\nThe wait releases its temporary subscription on every exit. An earlier error or\ncancellation remains the primary result; `Client.cleanup` retains secondary\ncleanup failures. If cleanup fails after a match or during gap recovery, the\nwait fails instead of reporting success or opening another subscription.\n\nUse `Client.subscribe` and `Subscription.next` for future output bytes. Data\nretains every byte, including NUL and invalid UTF-8. Its cursor records a local\nsubscription generation and an observed byte offset. A cursor is neither a\nsnapshot timestamp nor a server-side history position. `poll` only removes a\nqueued event and performs no I/O.\n\n`Subscription.wait_for_bytes` consumes those future events and matches across\nevent boundaries. Its nonempty pattern is limited to 64 KiB. It returns the\nmatch's end cursor, possibly inside the last consumed Data event. A deadline\nleaves the subscription active. A Gap returns `Output.Ended reason`; later\nmatching requires an explicit fresh capture and new subscription.\n\nThe defaults are 1 MiB and 1024 queued events per subscriber, at most 16 active\nsubscribers, and eight total client lanes including command/wait lanes. Reuse\none verified lane per covered session. Admission reserves bytes against the\nshared 32 MiB budget. A full queue produces Gap then End rather than blocking\nanother subscriber or an independent command. Unknown loss has no byte count.\nThese limits apply together; [plan shared capacity](#plan-shared-capacity)\nbefore combining many observers with captures and reads.\n\nCoverage uses an observed session/window context and revalidates it during\nadmission. Layout or membership changes end continuity conservatively. Detaching\na stream leaves the primary client usable; a daemon replacement retires the\nwhole binding. New coverage always has a new subscription generation.\n\nEio readers belong to the client, use no application callbacks and keep running\nwhen a subscriber stalls. The blocking backend advances all stream lanes during\n`Subscription.next`. Cancellation closes the affected subscription and\npropagates through the backend's cancellation mechanism. Client close releases\nall owned lanes and retains terminal events; it leaves the daemon alive.\n\nWhen a subscription releases the last user of a lane, close waits for its\nowned helper to be reaped. Concurrent Eio subscription closes join that same\ncleanup. Repeated closes preserve the first terminal reason and any cleanup\nfailure; unconsumed terminal events remain readable through `Subscription.poll`.\n\nThe [recovery program](recovery.md) shows how to cancel one operation waiter\nwhile keeping its retained outcome available. Cancelling a subscription closes\nthat subscription; it does not cancel an already admitted command.\n\nNeither interface establishes an atomic capture/stream barrier or reconstructs\nterminal history. An immutable snapshot remains a separate captured value.\n\n## Plan shared capacity\n\nEvery client has its own bounded payload budget and process-slot pool. The\nblocking and Eio clients use the same accounting. An individually valid queue\nor command can still return `Error.Capacity` when another reservation consumes\nthe available headroom:\n\n| Resource | Current limit or reservation |\n| --- | --- |\n| Aggregate client payload | 32 MiB shared by queues, commands and operation scratch space |\n| Admitted commands | 64; encoded payload accounting remains charged until completion or cancellation before writing |\n| Admitted command bytes | 1 MiB shared across admitted operations; submission also temporarily reserves 2 MiB |\n| Client process slots | 8, including the primary control client; each auxiliary slot reserves 128 KiB |\n| Subscriptions | 16 active per client, sharing a verified stream lane per covered session |\n| Subscriber queue | 1 MiB / 1024 events by default; reserve the full configured byte capacity even when empty |\n| Graph or rendered capture | 16 MiB operation scratch reservation plus an 8 MiB control exchange |\n| Option, environment or hook read | 16 MiB scratch reservation plus a temporary process slot |\n\nThe payload budget tracks library reservations. Caller-retained snapshots,\ncompleted operation handles, receipts and exception payloads have their own\nlifetimes, alongside runtime overhead, child-process memory and tmux's\nallocations. See [observation retention](graph.md).\n\nFor example, sixteen default queues on one covered session reserve 16 MiB\nplus that session's auxiliary slot. A subsequent capture or read cannot obtain\nits scratch reservation. Even eight default queues leave insufficient room for\nthe capture's nested control exchange. Closing subscriptions releases their\nreservations; the client remains usable after a capacity error.\n\n| Empty queues, one covered session | Capture | Option read |\n| --- | --- | --- |\n| 16 × 1 MiB | `Capacity` | `Capacity` |\n| 8 × 1 MiB | `Capacity` | Fits the reservation budget |\n| 7 × 1 MiB | Fits the reservation budget | Fits the reservation budget |\n| 16 × 256 KiB | Fits the reservation budget | Fits the reservation budget |\n\nThese examples describe reservation accounting on a fixed one-pane graph.\nAdditional lanes, admitted commands and concurrent work consume more headroom.\nA budget that fits still needs valid targets, available data and a responsive\ndaemon.\n\nThe [complete watcher](../examples/native_watch.ml) chooses its queue explicitly:\n\n\n\n```ocaml\nlet subscription =\n get\n (Client.subscribe ~capacity_bytes:(256 * 1024) ~capacity_events:256 client\n pane)\n```\n\nIts full program includes the client, pane acquisition, result handling, Eio\nswitch and cleanup. Choose a capacity for the burst your application can\nconsume; a smaller queue reaches `Gap Overflow` sooner when its reader stalls.\n\nSlots need their own headroom. The primary client and seven distinct covered\nsessions fill all eight slots, leaving none for a read process or `wait_for`.\nIf an application needs those operations, it can cap distinct covered sessions\nat six while keeping one slot for service, accounting for any waits already\nusing slots. The library currently reserves no slot exclusively for service.\nSeveral panes in the same session can share its stream lane.\n\nReducing queue capacities does not free process slots. Closing the last active\nsubscriber for a covered session releases its lane after owned-helper cleanup.\nA separate client has its own budget and slots, but also its own source\ngeneration: acquire observations on that client before using its targets.\n\n## Recover after a gap\n\nClose the ended subscription, capture the graph again, and establish fresh\ncoverage for the observed pane. This recovers future observation. Bytes lost\nbefore the new subscription are still unavailable; a screen capture cannot\nreconstruct their history.\n\nThe [complete recovery program](../examples/native_stream_recovery.ml) creates\na window running `cat`, observes a reply, then splits the window to trigger a\nmembership gap. It handles that gap, removes the extra pane and closes the old\nsubscription. It captures the original pane again, subscribes, and observes\nnew input with a different cursor generation:\n\n\n\n```ocaml\nlet recover_coverage client id (previous : Output.cursor) =\n let fresh = capture_pane client id in\n let after =\n with_subscription client fresh (fun subscription ->\n echo client fresh subscription \"after-gap\")\n in\n if Generation.equal previous.generation after.generation then\n failwith \"new subscription reused the old cursor generation\";\n print_endline \"coverage=fresh; cursor-generation=new; future=after-gap\"\n```\n\nThe source contains the imports, scheduler, cleanup and matching helpers.\n`capture_pane` fails if the pane disappeared. `with_subscription` admits coverage\nbefore `echo` sends input and awaits its reply concurrently. The\nexample never reconnects, reuses an old cursor or retries an uncertain mutation.\nIt removes only panes whose creation returned successfully, leaving any foreign\npanes untouched. Primary exceptions survive secondary cleanup failures.\n\nCreation here uses convenience calls. Cancellation before one returns can leave\na creation whose ID the caller never received. For creation outcomes that must\nsurvive waiter cancellation, retain `Client.submit`'s handle before `Client.await`,\nas shown in [operation recovery](recovery.md). An uncertain outcome does not\nauthorize a retry or deletion of an unproven resource.\n\nAfter [installing from source](getting-started.md), run this walkthrough from\nthe clone. Create a private seed session:\n\n```console\n$ export LIBTMUX_STREAM_RECOVERY_DIR=\"$(mktemp -d -t libtmux-ocaml-stream-recovery.XXXXXX)\"\n```\n\n```console\n$ env -u TMUX -u TMUX_PANE tmux \\\n -S \"$LIBTMUX_STREAM_RECOVERY_DIR/server\" \\\n -f /dev/null \\\n new-session \\\n -d \\\n -s stream-demo \\\n -- \"exec cat\"\n```\n\nRun the program against the seed session's literal `$0` ID:\n\n```console\n$ opam exec -- dune exec examples/native_stream_recovery.exe -- \\\n tmux \"$LIBTMUX_STREAM_RECOVERY_DIR/server\" '$0'\n```\n\nExpected output is `gap=membership-changed; history=unavailable`, followed by\n`coverage=fresh; cursor-generation=new; future=after-gap`. The seed session\nremains, with no additional panes or clients. Remove that session and directory:\n\n```console\n$ env -u TMUX -u TMUX_PANE tmux \\\n -S \"$LIBTMUX_STREAM_RECOVERY_DIR/server\" \\\n kill-session \\\n -t '=stream-demo'\n```\n\n```console\n$ rm -f -- \"$LIBTMUX_STREAM_RECOVERY_DIR/server\"\n```\n\n```console\n$ rmdir \"$LIBTMUX_STREAM_RECOVERY_DIR\"\n```\n\nThis exercise uses a stable private daemon and a deliberate layout change.\nTransport loss, repeated membership changes or a missing pane can prevent fresh\ncoverage. Preserve those failures and choose the next action explicitly.\n\n[First use](getting-started.md) · [Control and recovery](control.md) ·\n[API](api.md) · [Guide](README.md)\n" + }, + { + "path": "docs/showcases.md", + "content": "# Run a complete capability example\n\nEach program creates a private tmux workspace, performs one task, verifies the\nresult and closes its clients. Copy the whole file into a Dune project or run\nit from this checkout after [installation](getting-started.md).\n\nThe programs use a minimal tmux configuration that makes their private daemon\nexit when its last client detaches. They accept an optional tmux binary,\nnot a borrowed server socket. Their setup uses the public workspace API; the\ntask uses the client API. The Eio example starts its scheduler after setup and\nsubscribes before sending the bytes it observes.\n\nFor a separate project, save a program as `main.ml` and use these Dune libraries:\n\n```dune\n(executable\n (name main)\n (libraries libtmux libtmux-workspace libtmux-unix unix))\n```\n\nThe watch program also needs `libtmux-eio` and `eio_main`. The\n[installation guide](getting-started.md) supplies the project and switch setup.\n\n| Task | Complete program | Expected outcome line |\n| --- | --- | --- |\n| Start a private server and its first session | [Bootstrap](../examples/showcase_bootstrap.ml) | `bootstrapped: 1 session, 1 window, 1 pane` |\n| Navigate sessions, shared windows and panes | [Graph](../examples/showcase_graph.ml) | `graph: 2 sessions, 2 windows, 3 links, 2 panes` |\n| Observe future bytes concurrently | [Watch](../examples/showcase_watch.ml) | `observed: changed` |\n| Send literal input and Enter | [Keys](../examples/showcase_send_keys.ml) | `sent: literal: $HOME; #{pane_id}` |\n| Rename a window and retain the old observation | [Rename](../examples/showcase_rename_window.ml) | `renamed: editor-main` |\n| Create a window and recapture its name | [Create](../examples/showcase_create_window.ml) | `created: logs` |\n| Move a window to another session's index | [Move](../examples/showcase_move_window.ml) | `moved: build at 7` |\n| Apply and verify horizontal pane geometry | [Layout](../examples/showcase_layout.ml) | `layout: 3 horizontal panes` |\n\nAll programs print their temporary socket path before the outcome. The\n[bootstrap walkthrough](bootstrap.md) explains the missing-endpoint precondition\nand ownership of the resulting client:\n\n```console\n$ opam exec -- dune exec examples/showcase_bootstrap.exe -- tmux\n```\n\nRun the graph example; it traverses the snapshot after the client and daemon\nclose:\n\n```console\n$ opam exec -- dune exec examples/showcase_graph.exe -- tmux\n```\n\nObserve future output with an application-owned Eio switch:\n\n```console\n$ opam exec -- dune exec examples/showcase_watch.exe -- tmux\n```\n\nSend a literal string containing shell and tmux format characters:\n\n```console\n$ opam exec -- dune exec examples/showcase_send_keys.exe -- tmux\n```\n\nRename the editor window:\n\n```console\n$ opam exec -- dune exec examples/showcase_rename_window.exe -- tmux\n```\n\nCreate a separate logs window:\n\n```console\n$ opam exec -- dune exec examples/showcase_create_window.exe -- tmux\n```\n\nMove a build window to index 7 in another session:\n\n```console\n$ opam exec -- dune exec examples/showcase_move_window.exe -- tmux\n```\n\nSplit a window and apply an even horizontal layout:\n\n```console\n$ opam exec -- dune exec examples/showcase_layout.exe -- tmux\n```\n\nThese examples support tmux 3.3a–3.8 on the qualified Linux environment.\nThe native CI job executes their real entry points on 3.3a and 3.8,\nusing a separate installation and Dune project. A nonzero exit, missing exact\noutcome line, leftover directory or surviving owned process fails the run.\n[`showcase.json`](../examples/showcase.json) records the whole files, commands,\nexpected lines, tmux floor, workflow, job and runner.\n\nSending keys confirms tmux accepted input. The rendered-text example observes\nthe resulting screen; it does not wait for an arbitrary application's exit\ncode. A future-byte subscription has no historical capture barrier. See\n[control outcomes](control.md) and [streaming](streaming.md) for those contracts.\n" + }, + { + "path": "docs/packages.md", + "content": "# Choose the packages your application needs\n\nThis repository is one Dune project with separately installable opam packages.\nEach package has an authored manifest. Internal dependencies require the same\npackage version, so a client or workspace adapter uses its matching core.\n\nThe core and pure workspace library have no third-party runtime dependencies.\nThey use OCaml 5.5.2's standard library, including `Iarray`, `Seq`, `List` and\n`result`. Test and documentation tools remain development dependencies.\n\n| Package | Role | Runtime dependencies |\n| --- | --- | --- |\n| `libtmux` | Immutable graph, typed queries, commands and observation values | OCaml standard library |\n| `libtmux-workspace` | Pure configuration validation, plans and execution journals | `libtmux` |\n| `libtmux-unix` | Blocking Linux transport and workspace executor | Core, workspace, standard `Unix`, private Linux bindings |\n| `libtmux-eio` | Concurrent transport and workspace executor | Core, workspace, blocking transport, Eio |\n| `libtmux-json` | Validated query and workspace JSON codecs | Core, workspace, Yojson |\n| `libtmux-workspace-cli` | Installed `tmux-workspace` command | The libraries above, Eio's entry point and Cmdliner |\n\nPure workspace planning depends on captured observations and an explicit tmux\nversion. It does not start a scheduler, read files or contact tmux. Execution\nuses the adapter supplied by `Libtmux_unix.Workspace` or `Libtmux_eio.Workspace`.\nThe CLI combines file loading, JSON decoding, planning and the Eio executor.\n\nAn application querying a captured graph needs only `libtmux`. A blocking\nscript chooses `libtmux-unix`; an Eio application chooses `libtmux-eio` and owns\nits scheduler and switch. Add `libtmux-json` for external query documents or JSON\nworkspaces. These integrations do not add dependencies to the pure core.\n\nSee [installation](getting-started.md), [workspace examples](workspaces.md) and\n[public interfaces](api.md). The source-install walkthrough installs all current\npackages; a consuming Dune project lists only the libraries it uses.\n\n## Scope policy\n\nPrefer standard-library types and ordinary functions. Keep transport, JSON and\nCLI dependencies at their integration boundaries. Use the current stable OCaml\ncompiler in 2026; older-compiler shims and compatibility matrices are excluded.\n\nMCP integration is outside this port's scope. The project does not ship or\nvendor an MCP SDK or server. Native OCaml APIs and the workspace CLI are its\nautomation interfaces; MCP discovery and conformance are excluded from the\nproject's adoption and completion criteria.\n" + }, + { + "path": "docs/compatibility.md", + "content": "# Compatibility\n\nThe compiler target is **OCaml 5.5.2**, exactly pinned. Older compilers are\noutside this implementation's scope. The development tools are Dune 3.24.2\nand opam 2.6.1.\n\nThe implementation supports Linux and **tmux 3.3a–3.8**, including every\nintermediate release. CI tests only the two endpoints, 3.3a and 3.8. Option and\nformat catalogs cover the entire range. Current evidence covers specific\ncomponents; final suite qualification has a separate acceptance gate. The table\nrecords the exercised fixtures, not every possible cleanup path.\n\n| Component | 3.3a | 3.8 |\n| --- | --- | --- |\n| Owned fixture teardown | PASS | PASS |\n| Exact Boolean pane filters | PASS | PASS |\n| Argument and metadata byte codecs | PASS | PASS |\n| Split control framing and command groups | PASS | PASS |\n| Bound graph capture and ordinary client teardown | PASS | PASS |\n| Replacement-daemon rejection | PASS | PASS |\n| Private-file capture and failed-save callbacks | PASS | PASS |\n| Eio waiter cancellation and retained outcomes | PASS | PASS |\n| Blocking cancellation and bounded drain | PASS | PASS |\n| Command and lane admission limits | PASS | PASS |\n| Environment bytes, scopes and read-process lifecycle | PASS | PASS |\n| Scoped options and built-in hook execution | PASS | PASS |\n| Current client names and detach-request semantics | PASS | PASS |\n| Interactive attachment, cancellation and child exit | PASS | PASS |\n| Versioned format availability and generated APIs | PASS | PASS |\n| Native operation inventory | PASS | PASS |\n| Data/Gap/End, stream limits and recovery | PASS | PASS |\n| Installed stream-gap walkthrough | FAIL | FAIL |\n| Rendered waits and future-byte matching | PASS | PASS |\n| Blocking/Eio workspace preconditions and compensation | PASS | PASS |\n| Public workspace bootstrap on fresh/existing daemons | PASS | PASS |\n| Installed workspace CLI, receipts, interruption and output faults | PASS | PASS |\n| Literal workspace guide and owned teardown | PASS | PASS |\n| Final suite qualification | UNVERIFIED | UNVERIFIED |\n\nThe [stream-gap walkthrough](streaming.md#recover-after-a-gap) reported an\nunknown operation outcome after its recovery output on tmux 3.3a in\n[hosted run 42516374421](https://github.com/libtmux/libtmux-ocaml/actions/runs/42516374421).\nA bounded diagnostic reproduced the failure with the owned daemon no longer\nalive. Its exit cause remains unresolved. Earlier component passes do not\nestablish that the affected workload is safe.\n\nOn tmux 3.8, the same walkthrough exited with status 2 in\n[hosted run 42533145236](https://github.com/libtmux/libtmux-ocaml/actions/runs/42533145236).\nIts harness captured but did not include the program's output in the raised\nexception, so the failure's cause is unestablished. That run passed the ordinary\nnative component suite before failing the installed example. Keep this result\nseparate from the earlier 3.3a daemon-exit evidence; it does not prove the same\ncause. The example runner now includes captured output and the original cause\nwhen a program fails or times out. Later passing runs do not close either\nfinding.\n\nThe current matrix uses only OCaml 5.5.2 and tmux 3.3a/3.8. Pure assertions\ncheck version rejection and catalog availability across the supported range.\nIntermediate releases remain supported without separate runtime CI cells;\nearlier runtime results remain evidence for their tested workloads. Development\ntmux 3.8a does not replace the published 3.8 cell. PID-acquisition races and\nmalformed replies after writing pass deterministic fault checks with real Linux\nchild processes. Cancellation at each capture transfer step and unresolved-buffer\nreceipts also pass on the\nrecorded release fixtures. Ready I/O still checks its deadline; busy pipes\ncannot bypass the timeout. These results remain evidence for those tested cases.\nMCP integration is outside this port's scope.\n\nOwned-child cleanup sends TERM, allows a 200 ms cooperative grace, then sends\nKILL if necessary and reaps the child. The policy covers control, read-process\nand terminal helpers; it never sends these signals to the daemon. Eio waits\nallow other fibers to progress. The grace applies per helper, not to the whole\nclient, and cannot bound uninterruptible kernel work or scratch-file completion.\nCaller-owned `Cleanup` reports retain secondary process and descriptor failures\nwithout replacing native cancellation or the primary exception. Independent\nreleases are still attempted. A failed KILL only permits a nonblocking exit\ncheck; an unconfirmed exit is reported as `Unreaped_child`. Concurrent Eio\nclient closes await one retained teardown result. The Eio runtime owns its pipe\nends explicitly and joins their readiness waiters before closing them. Process\nI/O rechecks closure after yielding, preventing access to reused descriptors.\nA private Eio process owner keeps its reaper alive through cancellation and\nswitch release; callers join its completed teardown. Shutdown regressions cover\nboth Eio's Linux and POSIX backends on Linux. This does not add platform support.\nNew commands and subscriptions are rejected as soon as client close starts.\nConnection and subscription teardown also retain one completion: overlapping\nEio callers join it, and later calls preserve its failure.\n\nThe shutdown regression checks stopped helpers and helpers that survive TERM\nand input closure, while keeping the parent and its Eio switch alive to verify\nreaping. These are injected helper failures, not naturally reproduced hangs in\na supported tmux daemon. Blocking readiness uses `poll`; ready reads, ready\nwrites and deadlines work above descriptor 1100. Terminal attachment and\ncancellation also have high-descriptor evidence on the previously tested\n3.3/3.3a/3.4/3.8 fixtures. See the\n[architecture's cleanup boundary](dev/adr/0001-native-ocaml-suite.md#share-protocol-semantics-while-preserving-each-runtimes-cancellation).\n\nThe near-limit [mixed workload](benchmarking.md#mixed-commands-stream-pressure-and-membership-changes)\nreproduces a tmux 3.4 daemon crash in the control-client detach notification\npath. The exact 3.8 source includes the upstream null-state guard. An earlier\n3.3 observer-command failure remains unattributed. Passing ordinary client\nchecks does not close either mixed-workload failure.\n\nThe I/O packages require Linux pidfds, the same PID namespace as the daemon,\nand shared local scratch storage. A socket pathname does not prove those\nconditions. Each connection has its own generation; a replacement daemon never\ninherits old targets. Closing a client releases its own processes and leaves\nthe daemon running.\n\nThe blocking client accepts a scoped `Cancellation` token that another domain\nor systhread can cancel. It drains admitted work before raising\n`Cancellation.Cancelled`. The drain has at most one exchange timeout from\ndetection; subsequent owned-child cleanup has its separate cooperative grace.\nThe operation handle retains success, failure or uncertainty. Eio cancellation\nreleases the waiter immediately while a client-owned fiber drains the work.\nLocal scratch I/O must finish in either case; Eio performs it on a system\nthread. Filesystem failures have a distinct error from transport disconnects.\n\nPane PIDs and client terminal heights can be absent. The model exposes these as\noptions; a control client without a started terminal has no reported height.\ntmux itself sanitizes names on older releases and rejects some names on newer\nreleases. Captures preserve the observed value rather than reconstructing the\nargument originally submitted by another client.\n\nControl commands use ASCII escapes for non-ASCII bytes because tmux 3.3's\ncommand-string lexer can confuse a signed `0xff` byte with EOF. Metadata uses\ntmux's `q` format modifier and preserves physical newlines. A fixed read probe\ndetects the additional visual escaping used by tmux 3.4 before decoding it.\nControl clients must request UTF-8 mode so locale-dependent sanitization cannot\nalter captured bytes.\n\nAn end guard acknowledges a command. Completion requires the operation's\npostcondition or a following marker on its lane. A control client may exit\nwith status 1 after an earlier command failed, even when later commands and\nshutdown succeeded. Tests retain that distinction.\n\nThe optional JSON codec supports the scalar pane registry and Boolean nodes\nfrom Java's [`libtmux.filter/1`](query-interchange.md) at revision\n`e8a39689d8d60968ac978a1dd2a89c6112333896`. Both implementations agree on 66\ncaptured-value cases and read each other's encoded queries. Numeric operands\nuse signed 32-bit bounds. Regex, relationship documents, numeric membership\nand native extension fields remain unsupported in this wire schema.\nThe [conformance procedure](../test/conformance/README.md) rebuilds the peers\nfrom identified inputs and retains both codec directions and artifact digests.\nIt is a separate qualification command, not part of ordinary hosted OCaml CI.\n\nReproduce native checks with the commands in\n[CONTRIBUTING.md](../.github/CONTRIBUTING.md). The fixture builders use official\nrelease archives and retain archive and binary digests under `scratch/tmux/`.\n\nEnvironment reads use a bounded read-only process on the same daemon. The\nclient checks its reported PID and the original pidfd after collecting the\ncomplete response. Values may contain control-marker text without entering\nthe control parser. Replacement, malformed data, truncated output and capacity\nfailures never become a successful empty table. This route does not execute\nmutations or reconnect the primary lane.\n\nScoped options preserve scalar types, sparse array indexes and local versus\ninherited entries. Bulk inherited enumeration follows tmux and includes only\nbuilt-ins; `read_option` resolves a named inherited user option. Descriptors are\nrecorded for every supported release in the [option catalog](options.md). tmux\nfills the lowest unused indexes when appending array elements.\n\nHook commands keep names and arguments separate. Built-in hook arrays report\nsynchronous failures; earlier effects remain after a later command fails. Named\n`@` hooks can be configured, read and removed, but `run_hook` rejects them because\ntmux may hide parse failures in the server log. Hooks that print arbitrary output\nremain outside the supported control transport contract.\n\nCaptured client names belong to a connection generation but may be reused within\nit. Operations address the client currently bearing that name. A detach request\nconfirms command processing, not peer exit; callers need separate exit evidence.\nSwitching an existing client does not create a new terminal.\n\n`Terminal.attach_current` opens an interactive terminal against an explicit\nendpoint and session ID. This separate utility is unbound: an ID can refer to a\ndifferent daemon if the endpoint changes. It accepts no captured target and\nnever retries or starts a daemon. Both backends wait for the terminal client to\nexit and reap it on cancellation. Supplied terminal streams remain caller-owned.\n\nThe generated [format catalog](formats.md) records exact-release availability\nand callback contexts. Local `Formats.lookup` distinguishes captured values,\nmissing values, unacquired fields and fields unsupported by that release.\nIt does not perform arbitrary format acquisition. Generated\n[operation conveniences](operations.md) share the same command constructors\nbetween Unix and Eio; the installed-consumer test exercises both adapters.\n" + }, + { + "path": "docs/testing.md", + "content": "# Testing and CI\n\nUse Alcotest for typed values and lifecycle invariants, `ppx_expect` for readable\noutput contracts, and QCheck for generated semantic cases. All three run through\nDune. The pure runtime library uses the standard library; the PPX is a test-only\ndependency.\n\nThe [cardinality tests](../test/core_test.ml) compare typed results using an\n[`Alcotest.testable`](https://mirage.github.io/alcotest/alcotest/Alcotest/index.html#type-testable)\nwith `Cardinality.pp_error`. A failure displays the expected\nand actual values, including the error variant's meaning. Comparing a Boolean\nexpression would only report `true` versus `false`. Keep testable printers small\nand show the values needed to understand the failure.\n\nThe [expect tests](../test/diagnostics_expect.ml) place expected diagnostic text\nbeside the code that prints it. A mismatch produces a diff and a `.corrected`\nfile. Inspect the changed meaning before promoting an expectation. Stable query\nexplanations, error messages and CLI output fit this style. Avoid snapshotting\ntimestamps, random IDs or whole server captures to test a small invariant.\n\n[QCheck cases](../test/query_test.ml) compare typed-expression evaluation against\nnative predicates with generated inputs. A fixed seed makes the current suite\nreproducible; shrinking helps explain counterexamples. Properties supplement the\nsmall authored edge cases and live tmux checks.\n\nRun the unit, expect, property and compile-failure suite:\n\n```console\n$ opam exec -- dune runtest --force\n```\n\nCold PPX driver compilation belongs to setup or an outer build. Time the warm\ntest command separately and retain the existing inner/mid budgets. Native and\ninstalled-consumer checks belong to the outer loop because they launch processes\nand own real tmux servers.\n\nRun the implemented native contract suite against one explicit release binary:\n\n```console\n$ opam exec -- python3 test/native_suite.py /path/to/tmux\n```\n\nThe [CI workflow](../.github/workflows/ocaml.yml) uses exactly OCaml 5.5.2,\nAlcotest 1.9.1, `ppx_expect` v0.17.3 and QCheck 0.91. It checks authored manifests,\nbuilds/odoc, generated files, formatting, unit/expect/property cases, and two\nnative release cells: tmux 3.3a (oldest supported) and 3.8 (newest stable).\nEvery intermediate release remains supported. Pure assertions check version\nboundaries and catalog availability throughout the range. Each native cell\ninstalls the packages into a temporary prefix and runs a consumer outside the\ncheckout. Consumer features still in development need their own later\nacceptance gates.\n\nThe [Java/OCaml conformance procedure](../test/conformance/README.md) prepares a\npinned Java peer separately, verifies artifact hashes and runs both evaluators\nand codec directions. Its fixtures and failure diagnostics are retained per\nrun. This qualification is outside ordinary OCaml CI and the fast test loops.\n\nThe CLI document check exercises regular files and piped input on both Eio\nbackends, including the inclusive 64 KiB boundary. Pass `--directory` to\nexercise a mounted filesystem using an owned temporary directory:\n\n```console\n$ opam exec -- python3 test/workspace_document_test.py\n```\n\n`ocaml/setup-ocaml` caches opam and the switch. The tmux composite action caches\nonly an installed prefix, keyed by source, runner image/version, architecture,\ncompiler, package versions and build/probe recipes. Dependencies are installed\nbefore validating either hits or misses. A restored binary must match its hash,\nreport the exact release and pass an owned-daemon probe with verified teardown.\nRejected caches rebuild; no broad restore key reuses a binary from another\nenvironment. Save a validated installation before running library tests.\n\nThe cache design adapts the [Go port's pinned implementation](https://github.com/libtmux/libtmux-go/blob/d8ea6f77ede9f75e96af78719c8c1707fc47bdfb/.github/scripts/tmux_build.py).\nThe APIs and testing styles follow the primary documentation for\n[setup-ocaml](https://github.com/ocaml/setup-ocaml/tree/ff66428f72b64472e749b22e0ad4dded4b2ddca6),\n[Alcotest](https://github.com/mirage/alcotest/tree/1.9.1),\n[ppx_expect](https://github.com/janestreet/ppx_expect/tree/v0.17.3), and\n[Dune tests](https://dune.readthedocs.io/en/stable/tests.html).\n\n## Executed documentation\n\nREADME and guide snippets name regions in the compiled programs under\n`examples/`; JSON includes use the complete shipped configuration. The source\nis authoritative; this check rejects drift:\n\n```console\n$ python3 tools/docs_snippets.py\n```\n\nThe installed-consumer test installs libraries into a separate prefix, builds\nevery shipped example in an independent Dune project and runs it against owned\ntmux servers. It checks linked-window contexts, typed/native query results,\ncreated layout geometry, options, pane titles, working directories, literal\ninput, future-byte matches, rendered-screen waits and zero remaining clients.\nOwned fixture teardown verifies pane and daemon exit.\n\nThe [standalone capability programs](showcases.md) include their own private\nserver setup. CI copies their whole source files into an independent Dune\nproject and executes the recorded `opam exec -- dune exec` commands against\ninstalled packages. Exact outcome lines and owned process/directory teardown\nare checked. The [inventory](../examples/showcase.json) records each source and\ncommand with its native workflow/job and tmux floor.\n\nEach native CI cell also runs the [workspace guide](workspaces.md) through real\n`opam exec` and an installed `tmux-workspace`. It executes the displayed setup,\nvalidation, plan, apply and cleanup commands, then checks receipt fields, pane\ndirectories, layout output, client closure and owned process exit. CLI fault\ntests pin their output pipe capacity so a larger host pipe cannot turn a\nstalled-consumer test into successful buffered delivery.\n\nThese are correctness checks and whole-command timings, not throughput\nbenchmarks. Do not derive performance comparisons from their durations.\n\n[Guide](README.md) · [API](api.md) · [Compatibility](compatibility.md)\n" + }, + { + "path": "docs/benchmarking.md", + "content": "# Measure capture, concurrency and output delivery\n\nThe [capture benchmark](../bench/capture.py) compares serial blocking and Eio\ncapture on one owned graph: one session, four windows and sixteen panes. Each\nsample captures the graph 100 times by default and selects active panes using both a\ncompiled expression and a native predicate over each same snapshot.\n\nThe harness checks exact ordered IDs across captures and modes, one observed\ntmux client and one child process per mode, and zero attached clients afterward.\nOwned fixture teardown verifies pane and daemon exit. Both modes reuse one\nbound connection for their captures; they perform no per-object acquisition.\n\n## Reproduce\n\nPrepare the [exact release fixture](../.github/CONTRIBUTING.md#owned-tmux-fixtures),\nthen build the benchmark outside normal test loops:\n\n```console\n$ opam exec -- dune build bench/capture.exe\n```\n\nRun it with Python 3.11 or newer. Choose a new output file each time:\n\n```console\n$ opam exec -- python3 bench/capture.py scratch/tmux/tmux-3.8/tmux \\\n --iterations 100 \\\n --repeat 5 \\\n --output scratch/capture-baseline.json\n```\n\nThe output records compiler and tmux versions, binary and behavior-source hashes,\nOS/architecture, CPU availability, starting load average, whole-command time,\nper-sample process time, client and daemon CPU usage, and OCaml heap allocation\nduring the capture loop. Samples include program startup, binding,\nthe capture loop and client closure. Fixture creation and compilation are\noutside the per-sample interval. Mode order alternates across repetitions.\n\n## Capture and graph size\n\nThese observations use OCaml 5.5.2 on one shared Linux host. Each table entry is\nmedian milliseconds for 50 captures, followed by its min–max across three\nsamples. The raw files retain the source commit, behavior hash and host load.\n\n| tmux | Blocking, ms | Eio, ms | Evidence |\n| --- | --- | --- | --- |\n| 3.3 | 49.7 (49.0–52.6) | 54.6 (53.9–55.2) | [Raw data](../bench/results/capture-3.3-4x4.json) |\n| 3.3a | 76.3 (76.3–76.3) | 86.6 (72.1–90.1) | [Raw data](../bench/results/capture-3.3a-4x4.json) |\n| 3.4 | 74.1 (72.6–76.0) | 75.8 (61.8–76.9) | [Raw data](../bench/results/capture-3.4-4x4.json) |\n| 3.8 | 52.0 (48.7–66.6) | 67.1 (52.4–69.0) | [Raw data](../bench/results/capture-3.8-4x4.json) |\n\nChange `--windows` and `--panes-per-window` to measure larger graphs. The same\ntmux 3.8 workload, with 50 captures and three samples per mode, produced:\n\n| Windows × panes per window | Blocking median, ms | Eio median, ms | Evidence |\n| --- | --- | --- | --- |\n| 1 × 1 | 28.5 | 28.0 | [Raw data](../bench/results/capture-3.8-1x1.json) |\n| 4 × 4 | 52.0 | 67.1 | [Raw data](../bench/results/capture-3.8-4x4.json) |\n| 8 × 8 | 113.8 | 114.9 | [Raw data](../bench/results/capture-3.8-8x8.json) |\n| 16 × 16 | 402.2 | 408.5 | [Raw data](../bench/results/capture-3.8-16x16.json) |\n\nThe largest graph has 256 panes. Each observation still uses batched graph\nacquisition. Allocation counters cover the OCaml heap during the capture loop;\nthey do not measure process RSS or tmux's allocations.\n\n## Heap retained across captures\n\nKeeping one pane keeps its captured graph reachable. The\n[retention benchmark](../bench/retention.py) measures this with a blocking\nclient and one session containing one pane per window. Each sample runs in a\nfresh process, warms the connection, then captures the same graph 100 times.\nIt measures live OCaml heap after full major collection before capture, while\nretained values remain reachable, and after releasing them.\n\nOn OCaml 5.5.2 and tmux 3.8, six samples per mode produced these live-heap\nincreases in KiB. Every sample had the same retained-byte count:\n\n| Windows | Every snapshot | One pane per capture | Latest pane only | Evidence |\n| --- | --- | --- | --- | --- |\n| 1 | 115.6 | 117.9 | 1.1 | [Raw data](../bench/results/retention-3.8-1x1.json) |\n| 16 | 982.8 | 985.1 | 9.8 | [Raw data](../bench/results/retention-3.8-16x1.json) |\n| 64 | 3757.8 | 3760.1 | 37.6 | [Raw data](../bench/results/retention-3.8-64x1.json) |\n\nRetaining 100 detached `(id, command, path)` summaries used 13.2 KiB in each\ngraph shape; 100 `Pane.target` values used 6.2 KiB. With 64 windows and\n[25 captures](../bench/results/retention-3.8-64x1-25-captures.json), retaining\none pane per capture used 940.0 KiB, while retaining only the latest pane\nstill used 37.6 KiB. Targets remain connection-bound; retaining one does not\nauthorize a future connection.\n\nThese are total live-heap differences, including list cells and projected\nvalues, not exact arena sizes. The discard control and every release phase\nreturned 40 bytes below the warm baseline, a small baseline-overhead offset.\nThis measurement does not cover process RSS, tmux memory, relationship-array\nallocation or a general leak guarantee. Mode order rotates across samples.\nThe harness verifies topology, retained value counts, detached clients and\nowned daemon/pane teardown. Sample durations include the client-exit check;\nwhole-command duration includes fixture setup and teardown.\n\nBuild the benchmark:\n\n```console\n$ opam exec -- dune build bench/retention.exe\n```\n\nRun the 64-window case with a new output path:\n\n```console\n$ opam exec -- python3 bench/retention.py scratch/tmux/tmux-3.8/tmux \\\n --windows 64 \\\n --captures 100 \\\n --repeat 6 \\\n --output scratch/retention.json\n```\n\n## Completed control-lane mutations\n\nThe [control benchmark](../bench/control.py) measures typed\n`Libtmux.Operations.set_option` mutations through one persistent Eio control\nclient. Each sample starts a fresh one-session, one-window, one-pane daemon,\nwarms the connection, then\ncompletes 128 distinct option writes with 1, 8 or 32 concurrent callers.\nSix samples per cell rotate the order of those caller counts.\n\nEvery handle must finish successfully. After the measured phase, an independent\nread checks every option name and value. Launch logs and process/client counts\nverify one persistent helper, with no subprocess per mutation. Owned teardown\nchecks helper, client, pane and daemon exit.\n\nBuild the executable outside normal test loops:\n\n```console\n$ opam exec -- dune build bench/control.exe\n```\n\nRun the complete matrix on one endpoint fixture:\n\n```console\n$ opam exec -- python3 bench/control.py scratch/tmux/tmux-3.8/tmux \\\n --requests 128 \\\n --concurrency 1 8 32 \\\n --repeat 6 \\\n --output scratch/control-baseline.json\n```\n\nOCaml 5.5.2 results on the two supported endpoints:\n\n| tmux | Callers | Median ops/s (min–max) | Submit-to-await p95, ms | Loop allocation, MiB |\n| --- | --- | --- | --- | --- |\n| 3.3a | 1 | 6068.2 (5016.1–7190.8) | 0.292 | 12.64 |\n| 3.3a | 8 | 6287.1 (4645.9–7017.5) | 2.020 | 13.30 |\n| 3.3a | 32 | 4961.3 (3640.1–7007.8) | 9.103 | 17.43 |\n| 3.8 | 1 | 3969.2 (3533.3–4966.2) | 0.435 | 12.64 |\n| 3.8 | 8 | 4100.4 (2949.3–5087.1) | 3.077 | 13.29 |\n| 3.8 | 32 | 3421.2 (2744.9–4300.8) | 13.175 | 17.42 |\n\nRaw [3.3a](../bench/results/control-3.3a-128-1-8-32.json) and\n[3.8](../bench/results/control-3.8-128-1-8-32.json) records retain all 768\noperation observations per cell, six sample durations, source/executable/binary\nhashes and platform details. One-minute host load started at 2.12 for 3.3a and\n9.14 for 3.8, with 12 available CPUs. Other host work was active. These samples\ndo not establish a release-speed comparison or a recommended caller count.\nIncreasing callers does not add lanes: the engine still serializes this client.\n\nThe native phase includes command construction, completion checks and result-row\nallocation. It excludes connection, warmup, observer probes, independent\nverification and teardown. Per-operation time starts immediately before\n`Libtmux_eio.Client.submit`, after a benchmark worker becomes available; it\nincludes admitted lane queueing and `Libtmux_eio.Client.await`, but excludes\nwaiting for that worker slot. The pooled p95 uses nearest rank over the 768\nobservations. Allocation includes the benchmark's\nown command and result values. The \"sample_seconds\" field includes setup and\nteardown; \"consumer_and_topology_cpu_seconds\" covers reaped children through\nconsumer exit, including the topology probe, rather than daemon or whole-sample\nCPU.\n\nThe raw \"whole_command_seconds\" field times the collector's entry point.\nTiming the outer command separately also includes Python and opam startup.\n\nThese results qualify this fixed mutation workload. They do not qualify the\nstream-gap or mixed-load failures in [compatibility](compatibility.md).\n\n## Concurrent reads, streaming and cancellation\n\nThe [Eio benchmark](../bench/concurrency.py) runs bounded concurrent option\nreads with distinct expected values. It checks response attribution and input\norder, then measures future output from an owned `cat` process with terminal\necho disabled. Output cursors must advance. Finally it cancels active byte\nwaits and checks subscription cleanup. One primary client becomes two while a\nstream lane is active; both observed client and child-process counts are\nchecked. No clients remain after closure, and owned pane/daemon exit is verified.\n\nEach option read starts a read-only tmux process inside the client's pump.\nThe request rates below include process launch and are separate from the\ncontrol-lane mutation measurements above.\n\nBuild the executable outside normal test loops:\n\n```console\n$ opam exec -- dune build bench/concurrency.exe\n```\n\nRun the three phases against an owned release fixture:\n\n```console\n$ opam exec -- python3 bench/concurrency.py scratch/tmux/tmux-3.8/tmux \\\n --requests 128 \\\n --concurrency 8 \\\n --streams 10 \\\n --cancels 10 \\\n --repeat 3 \\\n --output scratch/concurrency-baseline.json\n```\n\nRequest time includes queueing until the attributed response. Stream time runs\nfrom sending literal input through observing the process's output. Cancellation\ntime runs from the cancellation request through the observer receiving it,\nincluding subscription cleanup. The p95 uses nearest rank across all samples.\n\nOn tmux 3.8, each row contains 384 requests, 30 stream samples and 30 cancellations:\n\n| Concurrent requests | Median requests/s | Request p95, ms | Stream p95, ms | Cancel p95, ms | Evidence |\n| --- | --- | --- | --- | --- | --- |\n| 1 | 556.6 | 2.517 | 0.598 | 0.258 | [Raw data](../bench/results/concurrency-3.8-c1.json) |\n| 8 | 487.9 | 19.955 | 0.863 | 0.368 | [Raw data](../bench/results/concurrency-3.8-c8.json) |\n| 16 | 561.5 | 29.746 | 0.569 | 0.220 | [Raw data](../bench/results/concurrency-3.8-c16.json) |\n| 64 | 423.5 | 159.039 | 0.667 | 0.406 | [Raw data](../bench/results/concurrency-3.8-c64.json) |\n\nThe eight-request workload also passes on\n[3.3](../bench/results/concurrency-3.3-c8.json),\n[3.3a](../bench/results/concurrency-3.3a-c8.json) and\n[3.4](../bench/results/concurrency-3.4-c8.json).\nHigher concurrency increases queueing on the retained connection. These\nmeasurements come from a shared host running other work; compare raw sample\nranges and load before choosing a workload or drawing performance conclusions.\n\n## Mixed commands, stream pressure and membership changes\n\nThe [mixed-load benchmark](../bench/mixed.py) overlaps retained command\nsubmissions, seven fast stream readers, seven deliberately stalled readers,\nmembership changes and cancellation. Its default runs three waves with eight\ncommand workers and four attributed output frames per stream lane. It adds no\nwork to the unit-test loops.\n\nBuild the executable separately:\n\n```console\n$ opam exec -- dune build bench/mixed.exe\n```\n\nRun the bounded workload against one owned release fixture:\n\n```console\n$ opam exec -- python3 bench/mixed.py scratch/tmux/tmux-3.8/tmux \\\n --output scratch/mixed-baseline.json\n```\n\nEach wave submits 64 commands without yielding and requires the 65th to reject\nwith the declared admission limit. Eight queued operations are cancelled before\nwriting; their handles retain `Not_started`. Sixteen subscribers occupy seven\nshared session lanes. Together with the load connection's primary lane this\nreaches its eight-lane limit; a separate controller connection sends output and\nchanges membership. The seventeenth subscriber and an additional session lane\nmust reject with their specific capacity errors. These expected rejections are\nrecorded separately from correctness failures.\n\nCommands set unique user-option names and values. The receipt retains operation\nIDs, worker IDs, submission indexes and the actual order in which awaiters\nobserve results. It verifies every resulting option value, including absence\nfor cancelled operations. Ordinary mutations use the retained control lane;\n`read_option` verification runs afterward through its temporary subprocess route\nand has a separate phase duration. Each verified option emits its operation ID,\ncompleted count and read duration before the observer handshake. The validation\nphase includes those handshakes; individual read durations exclude them.\nThe observer acknowledgements and resource queries add measured overhead, so\nthese are instrumented workload timings.\n\nFast streams must deliver exact ordered bytes with continuous generation and\nbyte offsets. Tiny unconsumed queues must report `Gap Overflow`, then `End`.\nSplitting and removing a temporary pane changes a watched window's membership;\naffected readers must report `Gap Membership_changed`, then `End`. Explicit\nreadmission uses a fresh observation and generation. Unchanged lanes continue independently; the receipt requires observed stream\nprogress while commands remain pending in each wave. Each wave also cancels an active observer after\nits retained wait reaches `Acknowledged`, releases the wait through the\ncontroller, and checks the eventual result before and after client closure.\n\nNative event callbacks synchronously sample owned Linux process trees before\nyielding to telemetry, retaining their occurrence-time pending-command counts.\nProgress handshakes separately sample process trees and attached tmux clients,\nincluding while the churn pane is alive. Emission timestamps and counts stay\nseparate from event occurrence; queued telemetry cannot manufacture overlap. Raw records distinguish\nthe Python harness, OCaml process, daemon, command-client children and pane\nchildren. RSS/FD/process/client maxima are maxima of these observations;\nper-process RSS high-water marks come from the kernel. They do not establish\ncontinuous aggregate resource peaks. The controller contributes a primary client\nand, during its retained wait, an auxiliary client in addition to the load\nconnection's eight clients. The sampler's own retained pidfds affect its FD count.\n\nPer-worker receipts report completed quotas, cancellation counts, latency samples\nand first/last observation times. They characterize this bounded workload rather\nthan proving scheduler fairness, a service-level objective or general capacity.\nThe 1 MiB queued-byte and 32 MiB payload limits are recorded source constraints;\nthis workload pressures admission counts, subscriber counts and lane counts,\nnot those byte maxima. No automatic retries or timeout increases hide a failure.\n\nExercise teardown after interruption with a new output file:\n\n```console\n$ opam exec -- python3 bench/mixed.py scratch/tmux/tmux-3.8/tmux \\\n --rounds 1 \\\n --frames 2 \\\n --inject-failure \\\n --output scratch/mixed-interrupted.json\n```\n\n`EXPECTED_FAILURE` means the harness intentionally interrupted the native\nprocess while a temporary pane was alive. It still requires owned daemon,\npane and command-client exit, reaping, zero remaining children and removal of\nthe private fixture directory. Unexpected errors or failed cleanup produce\n`FAIL`; an interruption is not a successful workload measurement.\n\nThe [summary](../bench/results/mixed-20261108.json) records each outcome and\nsource identity. The linked gzip archives contain the complete JSON receipts;\nthe summary includes their compressed and uncompressed SHA-256 digests.\n\nRaw results retain exact source and executable hashes, fixture-helper hash,\nversions, command arguments, workload bounds, host load, resource observations\nand cleanup receipts. Keep failed receipts beside passing measurements when\nassessing a release. Current collector qualification is **PARTIAL** across the supported releases:\n\n| tmux | Mixed workload disposition | Raw evidence |\n| --- | --- | --- |\n| 3.3 | Current workload passed; an earlier observer-command failure remains unattributed. | [Current](../bench/results/mixed-3.3-current-20261108.json.gz), [earlier failure](../bench/results/mixed-3.3-qualified-20261108.json.gz) |\n| 3.3a | Current workload passed. | [Current](../bench/results/mixed-3.3a-current-20261108.json.gz) |\n| 3.4 | Reproduced daemon SIGSEGV: a null control state is dereferenced while notifying control clients of a detach. | [Failure](../bench/results/mixed-3.4-qualified-20261108.json.gz), [core analysis](../bench/results/mixed-3.4-crash-analysis-20261108.json) |\n| 3.8 | Current default workload and intentional interruption cleanup passed. | [Default](../bench/results/mixed-3.8-current-20261108.json.gz), [interruption](../bench/results/mixed-3.8-current-interrupted-20261108.json.gz) |\n\nEarlier records predate collector corrections; use their recorded source hashes.\nA later passing sample does not resolve an unexplained failure. These outcomes\nqualify this mixed benchmark separately from the existing native runtime tests.\n\nThe three 3.4 cores identify the same upstream write path. A later\n[tmux correction](https://github.com/tmux/tmux/commit/93169e2e6231853c61c33432bceebf4ffc91015b)\nguards null control state; that guard is present in the exact 3.8 source.\nThe precise triggering sequence remains unproved. The supported range is\n3.3a–3.8; the 3.3 measurements above are historical evidence. The 3.4 mixed\nworkload remains a failed qualification.\n\nBenchmarks are a separate tier. Correctness gates and test-loop timings are\nlisted in [testing](testing.md), not used as throughput measurements. Keep a\nsingle benchmark run under ten minutes and a complete sweep under one hour.\n\n[Compatibility](compatibility.md) · [Control](control.md) · [Guide](README.md)\n" + }, + { + "path": "docs/status.md", + "content": "# Current capabilities and adoption gaps\n\nThe immutable model, typed queries, native Linux clients and output observation\nhave real-tmux evidence at the active tmux endpoints, 3.3a and 3.8. Intermediate\nreleases remain supported throughout 3.3a–3.8. The installed\nworkspace CLI also passes those cells. The final suite review remains unfinished.\nNo package or hosted-documentation release has been published.\n\n## What an application can use\n\nCapture a complete graph, retain it after closing the client, traverse shared\nwindows through session-specific links, filter with native predicates or typed\nexpressions, and establish cardinality before an explicit mutation. Native\noperations cover sessions, windows, panes, captured clients, layouts,\nenvironment, options and hooks. Both blocking and Eio transports retain\noperation outcomes and expose bounded subscriptions.\n\nThe [compatibility table](compatibility.md) identifies qualified components.\nThe [examples](README.md) are installed, compiled and executed against owned\nservers; they cover graph links, query results, created resources, literal\ninput, streaming, rendered waits and client teardown.\n\n## What is still missing\n\n| Area | Required evidence before complete-suite adoption |\n| --- | --- |\n| Documentation site | Qualify the final hosted reference and verify its deployed links; public `.cmti` export and local rendering are implemented |\n| Known runtime findings | Account for the [recorded daemon-exit and observer failures](compatibility.md) when choosing a deployment workload |\n| Final qualification | Rerun every required component and exact release cell on the final source revision |\n| Package adoption | Obtain an independent caller-task review and resolve material findings |\n\n[Recorded benchmarks](benchmarking.md) cover blocking/Eio capture, graphs up to\n256 panes, concurrent requests, OCaml heap allocation, client/daemon CPU,\nfuture-output latency and cancellation cleanup. Their raw data preserves the\nworkload, source identities and host conditions.\n\nThe workspace model, JSON loader, blocking/Eio executors and installed CLI are\nimplemented. The [workspace guide](workspaces.md) executes the installed command\nthrough validation, planning, apply, receipt inspection and owned cleanup.\nLive tests cover partial effects, compensation, append isolation, stale plans,\ncancellation journals and bootstrap on fresh and existing daemons. Cleanup\ntargets only proven newly created panes; foreign panes moved into a new window\nremain. Versioned advisory plans and execution receipts preserve errors,\ncreation IDs and cleanup outcomes; output documents cannot be replayed as\noperational input. CLI checks also cover malformed input, collisions, missing\nendpoints, interrupted apply, changed documents and stalled or broken stdout.\n\n## Engineering assessment\n\nFor a Linux application needing immutable tmux observations and explicit native\ncontrol, the model and clients are candidates for adoption with the documented\nconstraints. Suite adoption still needs the documentation and qualification\nabove. Maintainer count and alpha status do not decide that\nassessment; observable behavior and recovery do.\n\nAn adopting engineer should expect explicit endpoint selection, client lifetime,\ncommand uncertainty and stream gaps. The package should keep these visible.\nImplicit reconnects, callback-driven property acquisition, a mandatory query\nwrapper or a required runtime for pure filtering would make the API harder to\nreason about.\n\nA 9.5/10 whole-package rating is not established. Hosted documentation and\nfinal qualification have open gates. Documentation\nquality cannot substitute for those results. [Testing](testing.md) describes\ncurrent evidence and how examples are kept in sync with source.\n\nMCP integration is excluded by project policy. Its SDK, conformance and host\nintegration are outside the adoption criteria. The supported automation\nsurfaces are native OCaml APIs and the workspace CLI; see\n[package boundaries](packages.md).\n" + }, + { + "path": "docs/workspaces.md", + "content": "# Create a workspace from JSON\n\n`tmux-workspace` validates a JSON configuration, previews an advisory plan, and\napplies a fresh plan to an explicit socket. Install it through the\n[source installation](../README.md#install-from-source); `opam install .`\nincludes the CLI. Run this guide from the repository root.\n\n`check` performs no tmux I/O. `plan` observes the endpoint and never starts a\ndaemon. `apply` rereads the document, checks current state, then executes ordered\nactions. A preview is not a transaction or an executable target.\n\n## Define the layout\n\nThe shipped [project.json](../examples/workspace/project.json) creates an\n`editor` window with two panes and a `logs` window with one. Each pane runs\n`/bin/cat -u` directly, keeping the demonstration alive without a shell command.\n\n\n\n```json\n{\n \"schema\": \"libtmux.workspace/1\",\n \"session\": \"ocaml-project\",\n \"cwd\": \".\",\n \"width\": 120,\n \"height\": 40,\n \"environment\": {\"PROJECT\": \"ocaml\"},\n \"options\": [{\"name\": \"@project\", \"kind\": \"text\", \"value\": \"ocaml\"}],\n \"windows\": [\n {\n \"name\": \"editor\",\n \"layout\": \"even-horizontal\",\n \"panes\": [\n {\"exec\": [\"/bin/cat\", \"-u\"]},\n {\"exec\": [\"/bin/cat\", \"-u\"], \"direction\": \"right\"}\n ]\n },\n {\"name\": \"logs\", \"panes\": [{\"exec\": [\"/bin/cat\", \"-u\"]}]}\n ]\n}\n```\n\nRelative directories resolve against the JSON file's directory. Environment\nvalues merge from session to window to pane. `exec` supplies literal argv;\n`shell` explicitly requests shell interpretation. They are mutually exclusive.\nOmitting both uses tmux's default command. `startup` entries send literal text\nfollowed by Enter; they do not wait for a command to finish.\n\n## Validate, preview and apply\n\nThis walkthrough uses a private server and an empty tmux configuration. The\n`seed` session keeps the server alive while the CLI creates the project.\nInherited `TMUX` and `TMUX_PANE` do not select the endpoint.\n\n\n\n```console\n$ export LIBTMUX_WORKSPACE_DIR=\"$(mktemp -d -t libtmux-ocaml-workspace.XXXXXX)\"\n```\n\nCopying the file also makes its working directory the private directory:\n\n```console\n$ cp examples/workspace/project.json \"$LIBTMUX_WORKSPACE_DIR/project.json\"\n```\n\n```console\n$ opam exec -- tmux-workspace check \"$LIBTMUX_WORKSPACE_DIR/project.json\"\n```\n\nExpected output: `Valid workspace \"ocaml-project\": 2 windows, 3 panes`.\n\n```console\n$ env -u TMUX -u TMUX_PANE tmux \\\n -S \"$LIBTMUX_WORKSPACE_DIR/server\" \\\n -f /dev/null \\\n new-session \\\n -d \\\n -s seed \\\n -- \"exec cat\"\n```\n\n```console\n$ opam exec -- tmux-workspace plan \\\n --socket \"$LIBTMUX_WORKSPACE_DIR/server\" \\\n --require-existing \\\n \"$LIBTMUX_WORKSPACE_DIR/project.json\"\n```\n\nThe plan lists session creation, settings, the split and layout, and the logs\nwindow. Applying it requires the original configuration:\n\n```console\n$ opam exec -- tmux-workspace apply \\\n --socket \"$LIBTMUX_WORKSPACE_DIR/server\" \\\n --require-existing \\\n --json \\\n \"$LIBTMUX_WORKSPACE_DIR/project.json\" \\\n > \"$LIBTMUX_WORKSPACE_DIR/receipt.json\"\n```\n\nThe receipt uses [`libtmux.workspace-receipt/1`](../json/libtmux_json.mli).\nOn success, `status` is\n`succeeded`; `failed`, `uncertain` and `skipped` are empty. Each creation records\nthe IDs returned by tmux. Check the resulting windows independently:\n\n```console\n$ env -u TMUX -u TMUX_PANE tmux \\\n -S \"$LIBTMUX_WORKSPACE_DIR/server\" \\\n list-windows \\\n -t '=ocaml-project' \\\n -F '#{window_name}:#{window_panes}'\n```\n\nExpected output is `editor:2` followed by `logs:1`.\n\nRemove only the sessions this walkthrough created:\n\n```console\n$ env -u TMUX -u TMUX_PANE tmux \\\n -S \"$LIBTMUX_WORKSPACE_DIR/server\" \\\n kill-session \\\n -t '=ocaml-project'\n```\n\n```console\n$ env -u TMUX -u TMUX_PANE tmux \\\n -S \"$LIBTMUX_WORKSPACE_DIR/server\" \\\n kill-session \\\n -t '=seed'\n```\n\n```console\n$ rm -f -- \"$LIBTMUX_WORKSPACE_DIR/server\" \\\n \"$LIBTMUX_WORKSPACE_DIR/project.json\" \\\n \"$LIBTMUX_WORKSPACE_DIR/receipt.json\"\n```\n\n```console\n$ rmdir \"$LIBTMUX_WORKSPACE_DIR\"\n```\n\n\n\nWithout `--require-existing`, `apply` can start a missing endpoint by creating\nthe requested session. That server uses the normal tmux configuration. Closing\nthe CLI's client leaves the server running; its appearance does not grant\ndaemon ownership. `plan` on a missing endpoint checks the local tmux version\nand returns a bootstrap plan without creating the socket.\n\n## Collisions and recovery\n\nAn existing session name fails with exit 4 by default. `--append` adds new\nwindows to that session and rejects window-name collisions. Append never\nchanges the existing session's options or environment; omit those session\nsettings from an append document. It preserves existing panes.\n\nUse `--json` on `check` or `plan` to obtain `document_digest`, then pass that\nvalue through `--expect-document` on apply. A changed document fails before\nendpoint I/O. The digest does not lock tmux state. Each apply builds and\nrechecks its own plan on the current connection generation.\n\nOn failure or SIGINT, inspect the receipt before deciding what to do next.\nDefault compensation kills only panes whose creation the journal proved, in\nreverse order. A foreign pane moved into a new window remains. `--keep-partial`\nretains proven creations instead. Cleanup failures and creations whose IDs\ncould not be bound remain explicit. Never rerun an uncertain mutation solely\nbecause its caller was interrupted.\n\nThe [native recovery example](recovery.md) demonstrates the cancellation,\ninspection and fresh-postcondition sequence for a retained operation. Workspace\ncallers use the same discipline with `Workspace.inspect`: read the available\njournal, identify proven effects, then choose compensation or another explicit\naction. A saved JSON receipt describes observations; it is not an executable\ntarget or a transaction to replay.\n\nThe execution journal is retained in process memory. `await` initiates steps\nonly once for a particular execution handle; a new handle or CLI invocation\nstarts a new execution. Operation IDs correlate receipts and do not suppress\nduplicates. Neither a retained handle nor an exported receipt is a durable\nwrite-ahead log. Compensation cannot undo files, network requests or other\neffects of the programs launched in panes.\n\n| Exit | Meaning |\n| --- | --- |\n| 0 | Validation, planning or apply succeeded |\n| 2 | Invalid arguments or document |\n| 3 | Required endpoint missing |\n| 4 | Collision, changed document or stale plan |\n| 5 | Failed, partial or uncertain apply; inspect the receipt |\n| 6 | Transport, capability or result-delivery failure |\n| 130 | SIGINT; the available journal is emitted within the cleanup bound |\n\nSIGINT does not undo admitted commands. Receipt output is bounded; a blocked or\nbroken stdout cannot produce a successful exit. Forced process termination\ncannot promise a delivered receipt. Expected failures are distinct from Eio\ncancellation in the native API, which propagates cancellation to the caller.\n\n## Bounds and native callers\n\nDocuments use UTF-8 JSON with a 64 KiB input bound and depth limit 32. Unknown\nand duplicate properties fail. Configurations allow at most 64 windows and 256\npanes; a plan allows at most 4096 actions. Plans and receipts have a 4 MiB output\nbound. Plans omit environment values, option values and startup text. They can\nstill contain command arguments and paths; treat them as application data.\n\nFor native code, use `Libtmux_json.Workspace.of_string`,\n`Libtmux_workspace.Plan.make`, and the backend's `Workspace.submit` or\n`Workspace.submit_bootstrap`. `inspect` reads the retained journal locally;\n`await` performs I/O. The application owns the Eio switch and scheduler.\nThe [native bootstrap walkthrough](bootstrap.md) starts one private session\nwithout a JSON dependency and captures its graph through the resulting client.\nSee the [API reference](api.md), [control outcomes](control.md) and\n[compatibility evidence](compatibility.md).\n" + } + ] +} diff --git a/site/src/data/registry.json b/site/src/data/registry.json index 86e3a7125..00aef885b 100644 --- a/site/src/data/registry.json +++ b/site/src/data/registry.json @@ -157,6 +157,13 @@ "version": "0.1.0", "release": "0.1.0", "tag": "0.1.0" + }, + "ocaml": { + "status": "unpublished", + "version": null, + "release": null, + "tag": null, + "maturity": "unreleased" } } } diff --git a/site/src/data/tmux-usage/ocaml.json b/site/src/data/tmux-usage/ocaml.json new file mode 100644 index 000000000..560222c10 --- /dev/null +++ b/site/src/data/tmux-usage/ocaml.json @@ -0,0 +1,1987 @@ +{ + "commands": [ + "attach-session", + "bind-key", + "break-pane", + "capture-pane", + "choose-buffer", + "choose-client", + "choose-tree", + "clear-history", + "clear-prompt-history", + "clock-mode", + "command-prompt", + "confirm-before", + "copy-mode", + "customize-mode", + "delete-buffer", + "detach-client", + "display-menu", + "display-message", + "display-panes", + "display-popup", + "find-window", + "has-session", + "if-shell", + "join-pane", + "kill-pane", + "kill-server", + "kill-session", + "kill-window", + "last-pane", + "last-window", + "link-window", + "list-buffers", + "list-clients", + "list-commands", + "list-keys", + "list-panes", + "list-sessions", + "list-windows", + "load-buffer", + "lock-client", + "lock-server", + "lock-session", + "move-pane", + "move-window", + "new-pane", + "new-session", + "new-window", + "next-layout", + "next-window", + "paste-buffer", + "pipe-pane", + "previous-layout", + "previous-window", + "refresh-client", + "rename-session", + "rename-window", + "resize-pane", + "resize-window", + "respawn-pane", + "respawn-window", + "rotate-window", + "run-shell", + "save-buffer", + "select-layout", + "select-pane", + "select-window", + "send-keys", + "send-prefix", + "server-access", + "set-buffer", + "set-environment", + "set-hook", + "set-option", + "set-window-option", + "show-buffer", + "show-environment", + "show-hooks", + "show-messages", + "show-options", + "show-prompt-history", + "show-window-options", + "source-file", + "split-window", + "start-server", + "suspend-client", + "swap-pane", + "swap-window", + "switch-client", + "unbind-key", + "unlink-window", + "wait-for" + ], + "port": "ocaml", + "repo": "libtmux/libtmux-ocaml", + "revision": "6b814a3ae27b6a700b5d45ff1ef654565a1f1605", + "schemaVersion": 1, + "symbols": { + "Libtmux_eio.Client.break_pane": [ + { + "command": "break-pane", + "evidence": [ + "unix/engine.ml:288", + "eio/generated_operations.ml:103", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:317", + "lib/commands.ml:318", + "unix/command_encoding.ml:389", + "unix/command_encoding.ml:390" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.capture": [ + { + "command": "list-clients", + "evidence": [ + "unix/acquisition.ml:118", + "eio/libtmux_eio.ml:373", + "eio/libtmux_eio.ml:362", + "unix/engine.ml:294" + ], + "reviewed": true, + "scope": null + }, + { + "command": "list-panes", + "evidence": [ + "unix/acquisition.ml:65", + "eio/libtmux_eio.ml:373", + "eio/libtmux_eio.ml:362", + "unix/engine.ml:294" + ], + "reviewed": true, + "scope": "server" + }, + { + "command": "list-sessions", + "evidence": [ + "unix/acquisition.ml:16", + "eio/libtmux_eio.ml:373", + "eio/libtmux_eio.ml:362", + "unix/engine.ml:294" + ], + "reviewed": true, + "scope": null + }, + { + "command": "list-windows", + "evidence": [ + "unix/acquisition.ml:30", + "eio/libtmux_eio.ml:373", + "eio/libtmux_eio.ml:362", + "unix/engine.ml:294" + ], + "reviewed": true, + "scope": "server" + } + ], + "Libtmux_eio.Client.capture_environment": [ + { + "command": "show-environment", + "evidence": [ + "unix/environment_io.ml:103", + "eio/generated_operations.ml:42", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:267", + "lib/commands.ml:268", + "unix/engine.ml:101", + "unix/engine.ml:103" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.capture_hooks": [ + { + "command": "show-hooks", + "evidence": [ + "unix/options_io.ml:199", + "eio/generated_operations.ml:73", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:294", + "lib/commands.ml:294", + "unix/engine.ml:120", + "unix/engine.ml:126" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.capture_options": [ + { + "command": "show-options", + "evidence": [ + "unix/options_io.ml:199", + "eio/generated_operations.ml:55", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:279", + "lib/commands.ml:280", + "unix/engine.ml:107", + "unix/engine.ml:110" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.capture_text": [ + { + "command": "capture-pane", + "evidence": [ + "unix/rendered.ml:88", + "eio/libtmux_eio.ml:382", + "eio/libtmux_eio.ml:362", + "unix/engine.ml:311" + ], + "reviewed": true, + "scope": null + }, + { + "command": "delete-buffer", + "evidence": [ + "unix/rendered.ml:81", + "eio/libtmux_eio.ml:382", + "eio/libtmux_eio.ml:362", + "unix/engine.ml:311" + ], + "incidental": true, + "reviewed": true, + "scope": null, + "when": "while the connection remains open" + }, + { + "command": "list-buffers", + "evidence": [ + "unix/rendered.ml:100", + "eio/libtmux_eio.ml:382", + "eio/libtmux_eio.ml:362", + "unix/engine.ml:311" + ], + "incidental": true, + "reviewed": true, + "scope": null + }, + { + "command": "save-buffer", + "evidence": [ + "unix/rendered.ml:125", + "eio/libtmux_eio.ml:382", + "eio/libtmux_eio.ml:362", + "unix/engine.ml:311" + ], + "incidental": true, + "reviewed": true, + "scope": null + }, + { + "command": "show-hooks", + "evidence": [ + "unix/rendered.ml:27", + "eio/libtmux_eio.ml:382", + "eio/libtmux_eio.ml:362", + "unix/engine.ml:311" + ], + "incidental": true, + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.clear_history": [ + { + "command": "clear-history", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:168", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:364", + "lib/commands.ml:364", + "unix/command_encoding.ml:285", + "unix/command_encoding.ml:285" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.clear_option_array": [ + { + "command": "set-option", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:70", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:291", + "lib/commands.ml:292", + "unix/command_encoding.ml:315", + "unix/command_encoding.ml:319" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.create_session": [ + { + "command": "new-session", + "evidence": [ + "unix/engine.ml:288", + "eio/generated_operations.ml:90", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:307", + "lib/commands.ml:309", + "unix/command_encoding.ml:356", + "unix/command_encoding.ml:360" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.create_window": [ + { + "command": "new-window", + "evidence": [ + "unix/engine.ml:288", + "eio/generated_operations.ml:95", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:311", + "lib/commands.ml:312", + "unix/command_encoding.ml:372", + "unix/command_encoding.ml:377" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.cycle_layout": [ + { + "command": "next-layout", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:148", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:348", + "lib/commands.ml:349", + "unix/command_encoding.ml:263", + "unix/command_encoding.ml:265" + ], + "reviewed": true, + "scope": null, + "when": "direction is `Next" + }, + { + "command": "previous-layout", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:148", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:348", + "lib/commands.ml:349", + "unix/command_encoding.ml:263", + "unix/command_encoding.ml:266" + ], + "reviewed": true, + "scope": null, + "when": "direction is `Previous" + } + ], + "Libtmux_eio.Client.kill_pane": [ + { + "command": "kill-pane", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:113", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:322", + "lib/commands.ml:322", + "unix/command_encoding.ml:242", + "unix/command_encoding.ml:242" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.kill_session": [ + { + "command": "kill-session", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:107", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:320", + "lib/commands.ml:320", + "unix/command_encoding.ml:240", + "unix/command_encoding.ml:240" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.kill_window": [ + { + "command": "kill-window", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:110", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:321", + "lib/commands.ml:321", + "unix/command_encoding.ml:241", + "unix/command_encoding.ml:241" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.link_window": [ + { + "command": "link-window", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:123", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:330", + "lib/commands.ml:331", + "unix/command_encoding.ml:248", + "unix/command_encoding.ml:249" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.move_pane": [ + { + "command": "move-pane", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:151", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:351", + "lib/commands.ml:352", + "unix/command_encoding.ml:268", + "unix/command_encoding.ml:269" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.move_window_at": [ + { + "command": "move-window", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:127", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:333", + "lib/commands.ml:334", + "unix/command_encoding.ml:250", + "unix/command_encoding.ml:251" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.read_hook": [ + { + "command": "show-options", + "evidence": [ + "unix/options_io.ml:223", + "eio/generated_operations.ml:76", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:296", + "lib/commands.ml:297", + "unix/engine.ml:127", + "unix/engine.ml:131" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.read_option": [ + { + "command": "show-options", + "evidence": [ + "unix/options_io.ml:223", + "eio/generated_operations.ml:59", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:282", + "lib/commands.ml:283", + "unix/engine.ml:113", + "unix/engine.ml:116" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.refresh_client_at": [ + { + "command": "refresh-client", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:22", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:256", + "lib/commands.ml:257", + "unix/command_encoding.ml:229", + "unix/command_encoding.ml:230" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.remove_environment": [ + { + "command": "set-environment", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:52", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:276", + "lib/commands.ml:277", + "unix/command_encoding.ml:295", + "unix/command_encoding.ml:297" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.remove_hook": [ + { + "command": "set-hook", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:84", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:302", + "lib/commands.ml:303", + "unix/command_encoding.ml:329", + "unix/command_encoding.ml:331" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.rename_session": [ + { + "command": "rename-session", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:12", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:248", + "lib/commands.ml:248", + "unix/engine.ml:154", + "unix/engine.ml:157" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.rename_window": [ + { + "command": "rename-window", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:9", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:247", + "lib/commands.ml:247", + "unix/engine.ml:145", + "unix/engine.ml:148" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.request_detach_client_at": [ + { + "command": "detach-client", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:19", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:253", + "lib/commands.ml:254", + "unix/command_encoding.ml:227", + "unix/command_encoding.ml:228" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.resize_control_client_at": [ + { + "command": "refresh-client", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:26", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:259", + "lib/commands.ml:260", + "unix/command_encoding.ml:232", + "unix/command_encoding.ml:233" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.resize_pane": [ + { + "command": "resize-pane", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:138", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:339", + "lib/commands.ml:340", + "unix/command_encoding.ml:257", + "unix/command_encoding.ml:258" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.resize_window": [ + { + "command": "resize-window", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:141", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:342", + "lib/commands.ml:343", + "unix/command_encoding.ml:259", + "unix/command_encoding.ml:260" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.respawn_pane": [ + { + "command": "respawn-pane", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:164", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:361", + "lib/commands.ml:362", + "unix/command_encoding.ml:279", + "unix/command_encoding.ml:281" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.rotate_panes": [ + { + "command": "rotate-window", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:158", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:356", + "lib/commands.ml:357", + "unix/command_encoding.ml:274", + "unix/command_encoding.ml:275" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.run_hook": [ + { + "command": "set-hook", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:87", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:305", + "lib/commands.ml:305", + "unix/command_encoding.ml:333", + "unix/command_encoding.ml:345" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.select_layout": [ + { + "command": "select-layout", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:145", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:345", + "lib/commands.ml:346", + "unix/command_encoding.ml:261", + "unix/command_encoding.ml:262" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.select_pane": [ + { + "command": "select-pane", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:132", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:336", + "lib/commands.ml:336", + "unix/command_encoding.ml:254", + "unix/command_encoding.ml:254" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.select_window_at": [ + { + "command": "select-window", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:116", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:324", + "lib/commands.ml:325", + "unix/command_encoding.ml:243", + "unix/command_encoding.ml:244" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.send_keys": [ + { + "command": "send-keys", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:33", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:263", + "lib/commands.ml:263", + "unix/engine.ml:165", + "unix/engine.ml:174" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.send_text": [ + { + "command": "send-keys", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:30", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:262", + "lib/commands.ml:262", + "unix/engine.ml:163", + "unix/engine.ml:164" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.set_environment": [ + { + "command": "set-environment", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:45", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:270", + "lib/commands.ml:271", + "unix/command_encoding.ml:286", + "unix/command_encoding.ml:288" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.set_hook": [ + { + "command": "set-hook", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:80", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:299", + "lib/commands.ml:300", + "unix/command_encoding.ml:320", + "unix/command_encoding.ml:325" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.set_option": [ + { + "command": "set-option", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:63", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:285", + "lib/commands.ml:286", + "unix/command_encoding.ml:298", + "unix/command_encoding.ml:307" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.set_pane_title": [ + { + "command": "select-pane", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:135", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:337", + "lib/commands.ml:337", + "unix/command_encoding.ml:255", + "unix/command_encoding.ml:256" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.signal": [ + { + "command": "wait-for", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:39", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:265", + "lib/commands.ml:265", + "unix/engine.ml:175", + "unix/engine.ml:183" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.split_pane": [ + { + "command": "split-window", + "evidence": [ + "unix/engine.ml:288", + "eio/generated_operations.ml:99", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:314", + "lib/commands.ml:315", + "unix/command_encoding.ml:381", + "unix/command_encoding.ml:384" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.subscribe": [ + { + "command": "display-message", + "evidence": [ + "unix/streaming.ml:374", + "eio/libtmux_eio.ml:368" + ], + "scope": null + }, + { + "command": "refresh-client", + "evidence": [ + "unix/streaming.ml:390", + "eio/libtmux_eio.ml:368" + ], + "scope": null, + "when": "when opening a new stream lane" + } + ], + "Libtmux_eio.Client.swap_panes": [ + { + "command": "swap-pane", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:155", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:354", + "lib/commands.ml:354", + "unix/command_encoding.ml:272", + "unix/command_encoding.ml:273" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.switch_client_at": [ + { + "command": "switch-client", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:15", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:250", + "lib/commands.ml:251", + "unix/command_encoding.ml:223", + "unix/command_encoding.ml:224" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.unlink_window_at": [ + { + "command": "unlink-window", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:119", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:327", + "lib/commands.ml:328", + "unix/command_encoding.ml:245", + "unix/command_encoding.ml:246" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.unset_environment": [ + { + "command": "set-environment", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:49", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:273", + "lib/commands.ml:274", + "unix/command_encoding.ml:292", + "unix/command_encoding.ml:294" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.unset_option": [ + { + "command": "set-option", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:67", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:288", + "lib/commands.ml:289", + "unix/command_encoding.ml:311", + "unix/command_encoding.ml:313" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.wait_for": [ + { + "command": "wait-for", + "evidence": [ + "unix/engine.ml:315", + "eio/generated_operations.ml:36", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:264", + "lib/commands.ml:264", + "unix/engine.ml:175", + "unix/engine.ml:183" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_eio.Client.zoom_pane": [ + { + "command": "resize-pane", + "evidence": [ + "unix/engine.ml:283", + "eio/generated_operations.ml:161", + "eio/libtmux_eio.ml:375", + "eio/libtmux_eio.ml:362", + "lib/commands.ml:359", + "lib/commands.ml:359", + "unix/command_encoding.ml:278", + "unix/command_encoding.ml:278" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.break_pane": [ + { + "command": "break-pane", + "evidence": [ + "unix/engine.ml:288", + "unix/generated_operations.ml:117", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:317", + "lib/commands.ml:318", + "unix/command_encoding.ml:389", + "unix/command_encoding.ml:390" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.capture": [ + { + "command": "list-clients", + "evidence": [ + "unix/acquisition.ml:118", + "unix/libtmux_unix.ml:109", + "unix/libtmux_unix.ml:101", + "unix/engine.ml:294" + ], + "reviewed": true, + "scope": null + }, + { + "command": "list-panes", + "evidence": [ + "unix/acquisition.ml:65", + "unix/libtmux_unix.ml:109", + "unix/libtmux_unix.ml:101", + "unix/engine.ml:294" + ], + "reviewed": true, + "scope": "server" + }, + { + "command": "list-sessions", + "evidence": [ + "unix/acquisition.ml:16", + "unix/libtmux_unix.ml:109", + "unix/libtmux_unix.ml:101", + "unix/engine.ml:294" + ], + "reviewed": true, + "scope": null + }, + { + "command": "list-windows", + "evidence": [ + "unix/acquisition.ml:30", + "unix/libtmux_unix.ml:109", + "unix/libtmux_unix.ml:101", + "unix/engine.ml:294" + ], + "reviewed": true, + "scope": "server" + } + ], + "Libtmux_unix.Client.capture_environment": [ + { + "command": "show-environment", + "evidence": [ + "unix/environment_io.ml:103", + "unix/generated_operations.ml:49", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:267", + "lib/commands.ml:268", + "unix/engine.ml:101", + "unix/engine.ml:103" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.capture_hooks": [ + { + "command": "show-hooks", + "evidence": [ + "unix/options_io.ml:199", + "unix/generated_operations.ml:85", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:294", + "lib/commands.ml:294", + "unix/engine.ml:120", + "unix/engine.ml:126" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.capture_options": [ + { + "command": "show-options", + "evidence": [ + "unix/options_io.ml:199", + "unix/generated_operations.ml:65", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:279", + "lib/commands.ml:280", + "unix/engine.ml:107", + "unix/engine.ml:110" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.capture_text": [ + { + "command": "capture-pane", + "evidence": [ + "unix/rendered.ml:88", + "unix/libtmux_unix.ml:118", + "unix/libtmux_unix.ml:101", + "unix/engine.ml:311" + ], + "reviewed": true, + "scope": null + }, + { + "command": "delete-buffer", + "evidence": [ + "unix/rendered.ml:81", + "unix/libtmux_unix.ml:118", + "unix/libtmux_unix.ml:101", + "unix/engine.ml:311" + ], + "incidental": true, + "reviewed": true, + "scope": null, + "when": "while the connection remains open" + }, + { + "command": "list-buffers", + "evidence": [ + "unix/rendered.ml:100", + "unix/libtmux_unix.ml:118", + "unix/libtmux_unix.ml:101", + "unix/engine.ml:311" + ], + "incidental": true, + "reviewed": true, + "scope": null + }, + { + "command": "save-buffer", + "evidence": [ + "unix/rendered.ml:125", + "unix/libtmux_unix.ml:118", + "unix/libtmux_unix.ml:101", + "unix/engine.ml:311" + ], + "incidental": true, + "reviewed": true, + "scope": null + }, + { + "command": "show-hooks", + "evidence": [ + "unix/rendered.ml:27", + "unix/libtmux_unix.ml:118", + "unix/libtmux_unix.ml:101", + "unix/engine.ml:311" + ], + "incidental": true, + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.clear_history": [ + { + "command": "clear-history", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:189", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:364", + "lib/commands.ml:364", + "unix/command_encoding.ml:285", + "unix/command_encoding.ml:285" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.clear_option_array": [ + { + "command": "set-option", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:81", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:291", + "lib/commands.ml:292", + "unix/command_encoding.ml:315", + "unix/command_encoding.ml:319" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.create_session": [ + { + "command": "new-session", + "evidence": [ + "unix/engine.ml:288", + "unix/generated_operations.ml:104", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:307", + "lib/commands.ml:309", + "unix/command_encoding.ml:356", + "unix/command_encoding.ml:360" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.create_window": [ + { + "command": "new-window", + "evidence": [ + "unix/engine.ml:288", + "unix/generated_operations.ml:109", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:311", + "lib/commands.ml:312", + "unix/command_encoding.ml:372", + "unix/command_encoding.ml:377" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.cycle_layout": [ + { + "command": "next-layout", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:167", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:348", + "lib/commands.ml:349", + "unix/command_encoding.ml:263", + "unix/command_encoding.ml:265" + ], + "reviewed": true, + "scope": null, + "when": "direction is `Next" + }, + { + "command": "previous-layout", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:167", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:348", + "lib/commands.ml:349", + "unix/command_encoding.ml:263", + "unix/command_encoding.ml:266" + ], + "reviewed": true, + "scope": null, + "when": "direction is `Previous" + } + ], + "Libtmux_unix.Client.kill_pane": [ + { + "command": "kill-pane", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:127", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:322", + "lib/commands.ml:322", + "unix/command_encoding.ml:242", + "unix/command_encoding.ml:242" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.kill_session": [ + { + "command": "kill-session", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:121", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:320", + "lib/commands.ml:320", + "unix/command_encoding.ml:240", + "unix/command_encoding.ml:240" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.kill_window": [ + { + "command": "kill-window", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:124", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:321", + "lib/commands.ml:321", + "unix/command_encoding.ml:241", + "unix/command_encoding.ml:241" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.link_window": [ + { + "command": "link-window", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:138", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:330", + "lib/commands.ml:331", + "unix/command_encoding.ml:248", + "unix/command_encoding.ml:249" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.move_pane": [ + { + "command": "move-pane", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:171", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:351", + "lib/commands.ml:352", + "unix/command_encoding.ml:268", + "unix/command_encoding.ml:269" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.move_window_at": [ + { + "command": "move-window", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:143", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:333", + "lib/commands.ml:334", + "unix/command_encoding.ml:250", + "unix/command_encoding.ml:251" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.read_hook": [ + { + "command": "show-options", + "evidence": [ + "unix/options_io.ml:223", + "unix/generated_operations.ml:88", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:296", + "lib/commands.ml:297", + "unix/engine.ml:127", + "unix/engine.ml:131" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.read_option": [ + { + "command": "show-options", + "evidence": [ + "unix/options_io.ml:223", + "unix/generated_operations.ml:69", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:282", + "lib/commands.ml:283", + "unix/engine.ml:113", + "unix/engine.ml:116" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.refresh_client_at": [ + { + "command": "refresh-client", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:29", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:256", + "lib/commands.ml:257", + "unix/command_encoding.ml:229", + "unix/command_encoding.ml:230" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.remove_environment": [ + { + "command": "set-environment", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:61", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:276", + "lib/commands.ml:277", + "unix/command_encoding.ml:295", + "unix/command_encoding.ml:297" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.remove_hook": [ + { + "command": "set-hook", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:96", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:302", + "lib/commands.ml:303", + "unix/command_encoding.ml:329", + "unix/command_encoding.ml:331" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.rename_session": [ + { + "command": "rename-session", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:17", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:248", + "lib/commands.ml:248", + "unix/engine.ml:154", + "unix/engine.ml:157" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.rename_window": [ + { + "command": "rename-window", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:13", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:247", + "lib/commands.ml:247", + "unix/engine.ml:145", + "unix/engine.ml:148" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.request_detach_client_at": [ + { + "command": "detach-client", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:25", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:253", + "lib/commands.ml:254", + "unix/command_encoding.ml:227", + "unix/command_encoding.ml:228" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.resize_control_client_at": [ + { + "command": "refresh-client", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:33", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:259", + "lib/commands.ml:260", + "unix/command_encoding.ml:232", + "unix/command_encoding.ml:233" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.resize_pane": [ + { + "command": "resize-pane", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:155", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:339", + "lib/commands.ml:340", + "unix/command_encoding.ml:257", + "unix/command_encoding.ml:258" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.resize_window": [ + { + "command": "resize-window", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:159", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:342", + "lib/commands.ml:343", + "unix/command_encoding.ml:259", + "unix/command_encoding.ml:260" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.respawn_pane": [ + { + "command": "respawn-pane", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:185", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:361", + "lib/commands.ml:362", + "unix/command_encoding.ml:279", + "unix/command_encoding.ml:281" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.rotate_panes": [ + { + "command": "rotate-window", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:178", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:356", + "lib/commands.ml:357", + "unix/command_encoding.ml:274", + "unix/command_encoding.ml:275" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.run_hook": [ + { + "command": "set-hook", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:100", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:305", + "lib/commands.ml:305", + "unix/command_encoding.ml:333", + "unix/command_encoding.ml:345" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.select_layout": [ + { + "command": "select-layout", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:163", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:345", + "lib/commands.ml:346", + "unix/command_encoding.ml:261", + "unix/command_encoding.ml:262" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.select_pane": [ + { + "command": "select-pane", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:148", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:336", + "lib/commands.ml:336", + "unix/command_encoding.ml:254", + "unix/command_encoding.ml:254" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.select_window_at": [ + { + "command": "select-window", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:130", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:324", + "lib/commands.ml:325", + "unix/command_encoding.ml:243", + "unix/command_encoding.ml:244" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.send_keys": [ + { + "command": "send-keys", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:40", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:263", + "lib/commands.ml:263", + "unix/engine.ml:165", + "unix/engine.ml:174" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.send_text": [ + { + "command": "send-keys", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:37", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:262", + "lib/commands.ml:262", + "unix/engine.ml:163", + "unix/engine.ml:164" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.set_environment": [ + { + "command": "set-environment", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:53", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:270", + "lib/commands.ml:271", + "unix/command_encoding.ml:286", + "unix/command_encoding.ml:288" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.set_hook": [ + { + "command": "set-hook", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:92", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:299", + "lib/commands.ml:300", + "unix/command_encoding.ml:320", + "unix/command_encoding.ml:325" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.set_option": [ + { + "command": "set-option", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:73", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:285", + "lib/commands.ml:286", + "unix/command_encoding.ml:298", + "unix/command_encoding.ml:307" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.set_pane_title": [ + { + "command": "select-pane", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:151", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:337", + "lib/commands.ml:337", + "unix/command_encoding.ml:255", + "unix/command_encoding.ml:256" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.signal": [ + { + "command": "wait-for", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:46", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:265", + "lib/commands.ml:265", + "unix/engine.ml:175", + "unix/engine.ml:183" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.split_pane": [ + { + "command": "split-window", + "evidence": [ + "unix/engine.ml:288", + "unix/generated_operations.ml:113", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:314", + "lib/commands.ml:315", + "unix/command_encoding.ml:381", + "unix/command_encoding.ml:384" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.subscribe": [ + { + "command": "display-message", + "evidence": [ + "unix/streaming.ml:374", + "unix/libtmux_unix.ml:106" + ], + "scope": null + }, + { + "command": "refresh-client", + "evidence": [ + "unix/streaming.ml:390", + "unix/libtmux_unix.ml:106" + ], + "scope": null, + "when": "when opening a new stream lane" + } + ], + "Libtmux_unix.Client.swap_panes": [ + { + "command": "swap-pane", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:175", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:354", + "lib/commands.ml:354", + "unix/command_encoding.ml:272", + "unix/command_encoding.ml:273" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.switch_client_at": [ + { + "command": "switch-client", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:21", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:250", + "lib/commands.ml:251", + "unix/command_encoding.ml:223", + "unix/command_encoding.ml:224" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.unlink_window_at": [ + { + "command": "unlink-window", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:134", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:327", + "lib/commands.ml:328", + "unix/command_encoding.ml:245", + "unix/command_encoding.ml:246" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.unset_environment": [ + { + "command": "set-environment", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:57", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:273", + "lib/commands.ml:274", + "unix/command_encoding.ml:292", + "unix/command_encoding.ml:294" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.unset_option": [ + { + "command": "set-option", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:77", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:288", + "lib/commands.ml:289", + "unix/command_encoding.ml:311", + "unix/command_encoding.ml:313" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.wait_for": [ + { + "command": "wait-for", + "evidence": [ + "unix/engine.ml:315", + "unix/generated_operations.ml:43", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:264", + "lib/commands.ml:264", + "unix/engine.ml:175", + "unix/engine.ml:183" + ], + "reviewed": true, + "scope": null + } + ], + "Libtmux_unix.Client.zoom_pane": [ + { + "command": "resize-pane", + "evidence": [ + "unix/engine.ml:283", + "unix/generated_operations.ml:182", + "unix/libtmux_unix.ml:111", + "unix/libtmux_unix.ml:101", + "lib/commands.ml:359", + "lib/commands.ml:359", + "unix/command_encoding.ml:278", + "unix/command_encoding.ml:278" + ], + "reviewed": true, + "scope": null + } + ] + } +} diff --git a/site/src/lib/api-glossary-native.ts b/site/src/lib/api-glossary-native.ts index 76e1d3218..0eba44033 100644 --- a/site/src/lib/api-glossary-native.ts +++ b/site/src/lib/api-glossary-native.ts @@ -24,6 +24,19 @@ const elixirDocs = (page: string) => `https://elixir.hexdocs.pm/${page}` const swiftBook = (page: string) => `https://docs.swift.org/latest/documentation/the-swift-programming-language/${page}/` export const NATIVE_API_GLOSSARIES: Record> = { + ocaml: { + package: term('An installable OCaml library package. Its public modules supply the declarations in this reference.', 'OCaml libraries with Dune', 'https://ocaml.org/docs/libraries-dune', 'A package name and an OCaml module path are distinct: libtmux-unix provides Libtmux_unix.'), + module: term('An OCaml module exposing values, types and nested modules through a signature.', 'OCaml module types', 'https://ocaml.org/manual/5.5/modtypes.html#s:modtypes'), + interface: term('An OCaml module type specifying the declarations a module must provide.', 'OCaml module types', 'https://ocaml.org/manual/5.5/modtypes.html#s:modtypes'), + typealias: term('An OCaml type declaration. A declaration without an equation or representation is abstract.', 'OCaml type and exception definitions', 'https://ocaml.org/manual/5.5/typedecl.html#s:tydef'), + opaque: term('An abstract OCaml type whose representation is hidden by its public signature.', 'OCaml module types', 'https://ocaml.org/manual/5.5/modtypes.html#s:modtypes'), + enum: term('An OCaml variant type with named constructors, which can carry values.', 'OCaml type and exception definitions', 'https://ocaml.org/manual/5.5/typedecl.html#s:tydef'), + struct: term('An OCaml record type with named fields.', 'OCaml type and exception definitions', 'https://ocaml.org/manual/5.5/typedecl.html#s:tydef'), + constant: term('A named OCaml value or variant constructor. The signature does not promise a compile-time constant.', 'OCaml module types', 'https://ocaml.org/manual/5.5/modtypes.html#s:modtypes'), + function: term('An OCaml value with a function type. Arguments are curried and can carry labels or be optional.', 'OCaml expressions', 'https://ocaml.org/manual/5.5/expr.html#s:value-expr'), + attribute: term('A field of an OCaml record. Its module supplies the qualified name; the reference groups it under its declaring type.', 'OCaml type and exception definitions', 'https://ocaml.org/manual/5.5/typedecl.html#s:tydef'), + exception: term('An OCaml exception constructor.', 'OCaml type and exception definitions', 'https://ocaml.org/manual/5.5/typedecl.html#s:tydef'), + }, scala: { module: term('A singleton object that groups Scala declarations.', 'Scala singleton objects', scalaTour('singleton-objects'), 'The module badge represents object declarations here. Its members belong to that object; the label does not identify a separately installed artifact.'), class: term('A Scala class that defines instances, constructors and members.', 'Scala classes', scalaTour('classes'), 'Traits and case classes have their own declaration syntax; read the displayed signature for those distinctions.'), diff --git a/site/src/lib/api-models.ts b/site/src/lib/api-models.ts index 5bf18a561..8c08ce06e 100644 --- a/site/src/lib/api-models.ts +++ b/site/src/lib/api-models.ts @@ -37,6 +37,8 @@ import swiftModel from '../data/api/swift.json' import tsModel from '../data/api/ts.json' import kotlinModel from '../data/api/kotlin.json' import scalaModel from '../data/api/scala.json' +import ocamlModel from '../data/api/ocaml.json' +import ocamlNav from '../data/api/ocaml.nav.json' import fsharpModel from '../data/api/fsharp.json' import kotlinNav from '../data/api/kotlin.nav.json' import scalaNav from '../data/api/scala.nav.json' @@ -67,6 +69,7 @@ export const API_MODELS: Record = { swift: swiftModel as unknown as ApiModel, kotlin: kotlinModel as unknown as ApiModel, scala: scalaModel as unknown as ApiModel, + ocaml: ocamlModel as unknown as ApiModel, fsharp: fsharpModel as unknown as ApiModel, } @@ -130,6 +133,7 @@ export const API_NAV: Record = { swift: swiftNav as unknown as PortNavData, kotlin: kotlinNav as unknown as PortNavData, scala: scalaNav as unknown as PortNavData, + ocaml: ocamlNav as unknown as PortNavData, fsharp: fsharpNav as unknown as PortNavData, } @@ -152,6 +156,7 @@ export const PORT_NAME: Record = { kotlin: 'Kotlin', scala: 'Scala', fsharp: 'F#', + ocaml: 'OCaml', } /** diff --git a/site/src/lib/api-sections.ts b/site/src/lib/api-sections.ts index 982fd64ee..c8b79d93a 100644 --- a/site/src/lib/api-sections.ts +++ b/site/src/lib/api-sections.ts @@ -228,7 +228,7 @@ export function aliasDeclaration(symbol: ApiSymbol, language?: string): { name: /** Keep native declaration syntax consistent in HTML and copied Markdown. */ export function usesNativeSignatures(symbol: ApiSymbol, port?: string): boolean { - return (port === 'rs' && Boolean(symbol.variant)) || supportsRustSignatures(symbol, port) || supportsTypeScriptSignatures(symbol, port) || supportsGoSignatures(symbol, port) || supportsJavaSignatures(symbol, port) || supportsCSharpSignatures(symbol, port) || supportsRubySignatures(symbol, port) || supportsLuaSignatures(symbol, port) || supportsElixirSignatures(symbol, port) || ['kotlin', 'scala', 'fsharp', 'c', 'powershell', 'julia'].includes(port ?? '') || + return (port === 'rs' && Boolean(symbol.variant)) || supportsRustSignatures(symbol, port) || supportsTypeScriptSignatures(symbol, port) || supportsGoSignatures(symbol, port) || supportsJavaSignatures(symbol, port) || supportsCSharpSignatures(symbol, port) || supportsRubySignatures(symbol, port) || supportsLuaSignatures(symbol, port) || supportsElixirSignatures(symbol, port) || ['kotlin', 'scala', 'fsharp', 'ocaml', 'c', 'powershell', 'julia'].includes(port ?? '') || (port === 'cxx' && symbol.signatures.length > 0 && symbol.signatures.every((signature) => Boolean(signature.raw))) } diff --git a/site/src/lib/api-sidebar.ts b/site/src/lib/api-sidebar.ts index 802677c80..a6da78954 100644 --- a/site/src/lib/api-sidebar.ts +++ b/site/src/lib/api-sidebar.ts @@ -154,8 +154,6 @@ export function sidebarNodes(source: ApiTreeJson, base: string, mode: SidebarPre branch?: { lazy: string; level: number }): SidebarNode[] { const json = sidebarInventory(source) const catalog = sidebarCatalog(json) - const ancestry = new Set() - for (let id: string | undefined = selected; id && !ancestry.has(id); id = catalog.parent.get(id)) ancestry.add(id) const buckets = new Map() const placements = new Map() const index = (list: ApiTreeBucket[], path: string[] = []) => { @@ -167,6 +165,12 @@ export function sidebarNodes(source: ApiTreeJson, base: string, mode: SidebarPre } } index(json.buckets) + const ancestry = new Set() + for (let id: string | undefined = selected; id && !ancestry.has(id); id = catalog.parent.get(id)) { + ancestry.add(id) + // A curated root owns its branch even when its language module is also listed. + if (placements.has(id)) break + } const currentBuckets = new Set([...ancestry].map((id) => placements.get(id)).find(Boolean) ?? []) let seq = 0 const nextId = () => `api-presentation-${++seq}` diff --git a/site/src/lib/brand-palettes.json b/site/src/lib/brand-palettes.json index 786aa18b1..9faf73be3 100644 --- a/site/src/lib/brand-palettes.json +++ b/site/src/lib/brand-palettes.json @@ -414,5 +414,31 @@ "solid": "#54167b", "onSolid": "#ffffff" } + }, + "ocaml": { + "name": "OCaml", + "color": "#EF7A08", + "light": { + "background": "#fafbfc", + "surface": "#f3f5f7", + "hover": "#e9edf1", + "border": "#d6dce3", + "text": "#202830", + "muted": "#53606d", + "link": "#6c3704", + "solid": "#6c3704", + "onSolid": "#ffffff" + }, + "dark": { + "background": "#15191d", + "surface": "#1c2229", + "hover": "#29323d", + "border": "#3e4a57", + "text": "#e7edf3", + "muted": "#b7c1cd", + "link": "#fad7b5", + "solid": "#6c3704", + "onSolid": "#ffffff" + } } } diff --git a/site/src/lib/core-apis.ts b/site/src/lib/core-apis.ts index 945b67580..f776b9812 100644 --- a/site/src/lib/core-apis.ts +++ b/site/src/lib/core-apis.ts @@ -14,7 +14,7 @@ import { API_MODELS, referenceHref } from './api-models.ts' import { PORT_BY_SLUG, referenceUrl } from './ports.ts' /** The language each port's examples are written in. */ -const LANG: Record = { rs: 'rust', go: 'go', ruby: 'ruby' } +const LANG: Record = { rs: 'rust', go: 'go', ruby: 'ruby', ocaml: 'ocaml' } /** Entries shown before "+N more". */ export const MAX_APIS = 10 @@ -38,7 +38,8 @@ export interface ApisUsed { const escape = (text: string) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') /** Languages the examples are written in, and what starts a comment or a string in each. */ -const SYNTAX: Record = { +const SYNTAX: Record = { + ocaml: { block: ['(*', '*)'], quotes: ['"'] }, rust: { line: '//', block: ['/*', '*/'], quotes: ['"'] }, go: { line: '//', block: ['/*', '*/'], quotes: ['"', '`', "'"] }, ruby: { line: '#', quotes: ['"', "'"] }, @@ -52,11 +53,21 @@ export function withoutLiterals(code: string, lang: string): string { for (let i = 0; i < code.length;) { const rest = code.slice(i) const blank = (length: number) => { out += code.slice(i, i + length).replace(/[^\n]/g, ' '); i += length } - if (rest.startsWith(syntax.line)) { + if (syntax.line && rest.startsWith(syntax.line)) { const end = rest.indexOf('\n') blank(end < 0 ? rest.length : end) } else if (syntax.block && rest.startsWith(syntax.block[0])) { - const end = rest.indexOf(syntax.block[1], syntax.block[0].length) + let end = rest.indexOf(syntax.block[1], syntax.block[0].length) + if (lang === 'ocaml') { + let depth = 1 + let at = syntax.block[0].length + while (at < rest.length && depth > 0) { + if (rest.startsWith(syntax.block[0], at)) { depth++; at += syntax.block[0].length } + else if (rest.startsWith(syntax.block[1], at)) { depth--; at += syntax.block[1].length } + else at++ + } + end = depth ? -1 : at - syntax.block[1].length + } blank(end < 0 ? rest.length : end + syntax.block[1].length) } else if (syntax.quotes.includes(rest[0]!)) { const quote = rest[0]! diff --git a/site/src/lib/core-capabilities.ts b/site/src/lib/core-capabilities.ts index d6225b8a2..de941507c 100644 --- a/site/src/lib/core-capabilities.ts +++ b/site/src/lib/core-capabilities.ts @@ -96,6 +96,7 @@ export const MAX_PROGRAM_LINES = 150 */ export function programProblems(lang: string, content: string): string[] { const rules: Record = { + ocaml: { imports: /^open Libtmux$/m, entry: /^let \(\) =/m, local: /open Example|#use/ }, rust: { imports: /^use /m, entry: /^(?:async )?fn main\(|^(?:#\[[^\]]+\]\s*)+(?:async )?fn main\(/m }, go: { imports: /^import[ (]/m, entry: /^func main\(\)/m }, // A port may indent its require inside the begin block so excerpts of that block carry it. diff --git a/site/src/lib/core-home.ts b/site/src/lib/core-home.ts index 7afb58085..6f183f75b 100644 --- a/site/src/lib/core-home.ts +++ b/site/src/lib/core-home.ts @@ -70,11 +70,14 @@ const CAPABILITY_EVIDENCE: Record /capture|content|text|screen|scrollback/i.test(symbol.name) }, 'current-pane': { needs: 'an environment constructor', test: (symbol) => /env/i.test(symbol.name) }, 'test-fixtures': { needs: 'a test or fixture symbol', test: (symbol) => /test|fixture|junit|pytest/i.test(`${qualifiedNameOf(symbol)} ${symbol.source?.file ?? ''}`) }, - async: { needs: 'an async, suspend, Promise or Task signature', test: (symbol) => /async|suspend|promise|\btask\b/i.test([symbol.name, ...symbol.signatures.map((signature) => `${signature.raw ?? ''} ${signature.returns ?? ''}`)].join(' ')) }, + async: { needs: 'an async, suspend, Promise or Task signature, or a documented Eio capture operation', test: (symbol) => + (symbol.package === 'libtmux-eio' && symbol.id === 'Libtmux_eio.Client.capture') || /async|suspend|promise|\btask\b/i.test([symbol.name, ...symbol.signatures.map((signature) => `${signature.raw ?? ''} ${signature.returns ?? ''}`)].join(' ')) }, } export interface CoreHomeEntry { objects: Record + /** A native model may distinguish a connection or global window from contextual handles. */ + wraps?: Partial> capabilities: Partial> } @@ -114,7 +117,7 @@ export function resolveCoreHome(port: string, version: string, entry: CoreHomeEn if (!entry) throw new Error(`core-home: ${port} has no entry`) const objects = CORE_ROLES.map((role) => { if (!entry.objects[role]) throw new Error(`core-home: ${port} names no ${role} type`) - return { role, ...link(port, entry.objects[role], version, role), wraps: TMUX_OBJECTS[role].wraps, tmuxId: TMUX_OBJECTS[role].id } + return { role, ...link(port, entry.objects[role], version, role), wraps: entry.wraps?.[role] ?? TMUX_OBJECTS[role].wraps, tmuxId: TMUX_OBJECTS[role].id } }) const capabilities: CoreHome['capabilities'] = { typed: [], cli: [] } for (const [key, id] of Object.entries(entry.capabilities)) { diff --git a/site/src/lib/highlight.ts b/site/src/lib/highlight.ts index 790f56782..3ee6c2d0a 100644 --- a/site/src/lib/highlight.ts +++ b/site/src/lib/highlight.ts @@ -121,7 +121,7 @@ const EC_LANGS = new Set([ 'python', 'ruby', 'lua', 'rust', 'ts', 'tsx', 'js', 'jsx', 'java', 'kotlin', 'scala', 'fsharp', 'swift', 'csharp', 'cpp', 'c', 'go', 'bash', 'shell', 'console', 'json', 'yaml', 'toml', 'xml', 'diff', 'text', 'tmux-usage', 'tmux-shell', 'tmux-config', 'powershell', 'julia', 'elixir', 'properties', 'ini', - 'cmake', + 'cmake', 'ocaml', 'lisp', ]) const EC_ALIASES: Record = { @@ -133,6 +133,8 @@ const EC_ALIASES: Record = { rs: 'rust', 'c#': 'csharp', cs: 'csharp', + dune: 'lisp', + ml: 'ocaml', ex: 'elixir', exs: 'elixir', sh: 'bash', diff --git a/site/src/lib/native-name.ts b/site/src/lib/native-name.ts index 0550d62be..513a5e1ce 100644 --- a/site/src/lib/native-name.ts +++ b/site/src/lib/native-name.ts @@ -7,7 +7,7 @@ import { qualifiedNameOf, type ApiSymbol } from '@libtmux/api-model' * write that path as it is (Python `libtmux.Server.new_session`, Go `tmux.Client.Session`), and two already keep * their own separators in the id (C++ `libtmux::Server`, Ruby `LibTmux::Server#list_sessions`, Lua * `libtmux.Buffer:reference`, Elixir `LibTmux.Capture.fetch/2`, PowerShell `LibTmux\Connect-TmuxServer`). Rust and - * TypeScript are the two that need a spelling of their own: + * TypeScript need a spelling of their own: * * - Rust names a path with `::` from the crate: `libtmux::control::ControlSender::unmute_pane`. The id begins at the * module, so the crate comes from the file the symbol is written in, and the markers the extractor adds for the @@ -19,6 +19,7 @@ import { qualifiedNameOf, type ApiSymbol } from '@libtmux/api-model' * separator (`ControlSender::unmute_pane`, `Server#new_session`, `Buffer:reference`, `Capture.fetch/2`), and the bare name * for a declaration with no owner. The full name is the page's Qualified name row. The page heading still joins the owner * and the member with a dot in every port, so for Rust, C++, Ruby, Lua and PowerShell it differs from the card's header. + * OCaml constructors and record fields use their module's namespace, while their stable ids retain the owning type. * * This is for display. The public id, the anchors and the URLs stay as the model has them. */ @@ -94,6 +95,8 @@ export function nativeShortName(model: { port?: string; symbols: readonly ApiSym if (!owner) return symbol.name if (model?.port === 'rs') return `${owner.name}${tupleField(symbol.name) ? '.' : '::'}${symbol.name}` const id = qualifiedNameOf(symbol), ownerId = qualifiedNameOf(owner) + // OCaml constructors and record fields live in their module's namespace, not their type's. + if (model?.port === 'ocaml') return id.split('.').slice(-2).join('.') // Swift writes a member's labels in its name and fewer of them in its id, so the id is not always the owner and the name. const fits = id.startsWith(ownerId) && id.endsWith(symbol.name) && id.length > ownerId.length + symbol.name.length return `${owner.name}${(fits && id.slice(ownerId.length, id.length - symbol.name.length)) || '.'}${symbol.name}` diff --git a/site/src/lib/port-documentation.ts b/site/src/lib/port-documentation.ts index f290e8adc..69a1dc919 100644 --- a/site/src/lib/port-documentation.ts +++ b/site/src/lib/port-documentation.ts @@ -44,6 +44,7 @@ export interface PortSourceGuide { interface PortDocumentation { domains: readonly DocumentationDomain[] sourceGuides: readonly PortSourceGuide[] + stagedSections?: readonly string[] redirects?: readonly { sourcePath: string; path: string; target: string }[] } @@ -65,6 +66,20 @@ const libraryDomain = (description: string): DocumentationDomain => ({ }) const PORT_DOCUMENTATION: Readonly> = { + ocaml: { + stagedSections: ['guides'], + domains: [ + libraryDomain('Immutable OCaml observations, typed queries and explicit native transports.'), + { id: 'workspace', label: 'Workspace Manager', kind: 'product', navGroup: 'Apps', route: 'workspace', package: 'workspace', product: 'workspace', + description: 'Validate, preview and apply JSON workspaces with retained execution receipts.' }, + ], + sourceGuides: [ + ...['getting-started', 'bootstrap', 'graph', 'queries', 'query-interchange', 'control', 'recovery', 'streaming', 'showcases', 'packages', 'compatibility', 'testing', 'benchmarking', 'status'].map((name, index) => + guide(`docs/${name}.md`, `guides/${name}`, 'core', { aliases: [], sidebar: { group: 'Guides', order: index + 1 } })), + guide('docs/workspaces.md', 'workspace/source-guide', 'workspace', { title: 'Workspace guide', product: 'workspace', package: 'workspace', aliases: [] }), + ], + redirects: [{ sourcePath: 'docs/api.md', path: 'guides/api', target: 'reference' }], + }, powershell: { domains: [ libraryDomain('Install LibTmux and use cmdlets to read and control tmux.'), @@ -380,12 +395,15 @@ export function sourceGuidesFor(portSlug: string): readonly PortSourceGuide[] { /** * The section overviews staging writes for a port's source guides, unless the * port authors one itself: guides for every staged port, and examples, topics - * and concepts too unless the port wraps another library's source. + * and concepts too unless the catalog selects its populated sections or the + * port wraps another library's source. * `scripts/stage-port-docs.mjs` writes them; the Core page cards are tested * against this list. */ export function stagedSectionsFor(portSlug: string): readonly string[] { - if (!documentationFor(portSlug)) return [] + const documentation = documentationFor(portSlug) + if (!documentation) return [] + if (documentation.stagedSections) return documentation.stagedSections return PORT_BY_SLUG[portSlug]!.parentLibrary ? ['guides'] : ['guides', 'examples', 'topics', 'concepts'] } diff --git a/site/src/lib/port-families.ts b/site/src/lib/port-families.ts index 7ebee4884..efbd42a77 100644 --- a/site/src/lib/port-families.ts +++ b/site/src/lib/port-families.ts @@ -11,7 +11,7 @@ export interface PortFamily { */ export const PORT_FAMILIES: readonly PortFamily[] = [ { label: 'Scripting & web', ports: ['py', 'ruby', 'lua', 'julia', 'ts'] }, - { label: 'Compiled & native', ports: ['rs', 'go', 'cxx', 'swift'] }, + { label: 'Compiled & native', ports: ['rs', 'go', 'cxx', 'swift', 'ocaml'] }, { label: 'JVM', ports: ['java', 'kotlin', 'scala'] }, { label: '.NET', ports: ['csharp', 'fsharp', 'powershell'] }, { label: 'BEAM', ports: ['elixir'] }, diff --git a/site/src/lib/port-inventory.ts b/site/src/lib/port-inventory.ts index 261c0664b..de4deb79e 100644 --- a/site/src/lib/port-inventory.ts +++ b/site/src/lib/port-inventory.ts @@ -285,6 +285,20 @@ const GO = 'github.com/libtmux/libtmux-go' * testing products in the order a reader reaches for them. */ export const INVENTORY: Readonly> = { + ocaml: [ + { id: 'libtmux', kind: 'library', product: 'core', unit: 'opam package', label: 'libtmux', coordinate: 'libtmux', + aliases: ['Libtmux'], repo: 'libtmux/libtmux-ocaml', ref: 'master', path: 'lib', status: 'published' }, + { id: 'libtmux-unix', kind: 'companion', product: 'core', unit: 'opam package', label: 'libtmux-unix', coordinate: 'libtmux-unix', + aliases: ['Libtmux_unix'], repo: 'libtmux/libtmux-ocaml', ref: 'master', path: 'unix', status: 'published' }, + { id: 'libtmux-eio', kind: 'companion', product: 'core', unit: 'opam package', label: 'libtmux-eio', coordinate: 'libtmux-eio', + aliases: ['Libtmux_eio'], repo: 'libtmux/libtmux-ocaml', ref: 'master', path: 'eio', status: 'published' }, + { id: 'libtmux-json', kind: 'companion', product: 'core', unit: 'opam package', label: 'libtmux-json', coordinate: 'libtmux-json', + aliases: ['Libtmux_json'], repo: 'libtmux/libtmux-ocaml', ref: 'master', path: 'json', status: 'published' }, + { id: 'libtmux-workspace', kind: 'companion', product: 'workspace', unit: 'opam package', label: 'libtmux-workspace', coordinate: 'libtmux-workspace', + aliases: ['Libtmux_workspace'], repo: 'libtmux/libtmux-ocaml', ref: 'master', path: 'workspace', status: 'published' }, + { id: 'libtmux-workspace-cli', kind: 'cli', product: 'workspace', unit: 'opam package', label: 'libtmux-workspace-cli', coordinate: 'libtmux-workspace-cli', + aliases: ['tmux-workspace'], repo: 'libtmux/libtmux-ocaml', ref: 'master', path: 'cli', status: 'published' }, + ], py: [ py({ id: 'libtmux', kind: 'library', product: 'core', label: 'libtmux', ...pypi('libtmux'), aliases: ['libtmux'] }), // The pytest plugin is an entry point of the libtmux distribution, not a package of its own. diff --git a/site/src/lib/ports.ts b/site/src/lib/ports.ts index 2bdc4156d..d1d90f461 100644 --- a/site/src/lib/ports.ts +++ b/site/src/lib/ports.ts @@ -1256,6 +1256,31 @@ target_link_libraries(your_target PRIVATE libtmux::libtmux)`, installNote: 'A target depends on the product, not the package: write .product(name: "LibTmux", package: "libtmux-swift"). The library is `LibTmux` while the package identity SwiftPM derives from the URL is `libtmux-swift`, which is neither the product name nor the `name:` in the package manifest.', }, + { + slug: 'ocaml', projectName: 'libtmux-ocaml', logoLanguage: 'ocaml', shortName: 'ML', + name: 'OCaml', language: 'OCaml', packageName: 'libtmux', + repo: 'libtmux/libtmux-ocaml', checkout: '~/work/libtmux/libtmux-ocaml', + worktree: '~/work/libtmux/libtmux-ocaml-docs-site', + source: { path: 'lib', ref: 'master' }, versionedDocs: true, tagGrammar: 'semver', + publishesOwnTree: true, + docsDispatch: { workflow: 'docs.yml' }, + renderer: 'astro', generator: 'OCaml typed interfaces and odoc comments', referenceKind: 'model', + workspaceCli: 'tmux-workspace apply', workspaceCliAvailability: 'local', + productAvailability: { workspace: 'available', mcp: 'excluded' }, + packages: [{ id: 'workspace', name: 'libtmux-workspace-cli', executable: 'tmux-workspace', + source: { path: 'cli', ref: 'master' }, + installs: [{ label: 'opam (source)', lang: 'console', code: 'git clone https://github.com/libtmux/libtmux-ocaml.git && \\\n cd libtmux-ocaml && \\\n opam install .', + note: 'Build the CLI from source, then use tmux-workspace apply with a validated JSON workspace.' }] }], + installs: [{ label: 'opam (source)', lang: 'console', + code: 'git clone https://github.com/libtmux/libtmux-ocaml.git && \\\n cd libtmux-ocaml && \\\n opam install .', + note: 'Source installation; no registry release. Requires OCaml 5.5.2, Linux and tmux 3.3a through 3.8.' }], + initProject: { lang: 'console', code: 'dune init project my_tmux_app' }, + installForms: { + release: { lang: 'console', code: 'opam install .' }, + prerelease: { lang: 'console', code: 'opam install .' }, + git: { lang: 'console', code: 'git clone https://github.com/libtmux/libtmux-ocaml.git && \\\n cd libtmux-ocaml && \\\n opam install .' }, + }, + }, ] as const type WrapperLibrary = Omit & { diff --git a/site/src/lib/prose-resolver.ts b/site/src/lib/prose-resolver.ts index cdaa33e19..d42c2396e 100644 --- a/site/src/lib/prose-resolver.ts +++ b/site/src/lib/prose-resolver.ts @@ -26,6 +26,7 @@ import fsharpPaths from '../data/api/fsharp.paths.json' import powershellPaths from '../data/api/powershell.paths.json' import juliaPaths from '../data/api/julia.paths.json' import elixirPaths from '../data/api/elixir.paths.json' +import ocamlPaths from '../data/api/ocaml.paths.json' /** Language labels used by shared prose headings and comparison rows. */ export const PORT_BY_LABEL: Record = Object.fromEntries( @@ -38,10 +39,10 @@ const PATHS: Record py: pyPaths, ruby: rubyPaths, lua: luaPaths, ts: tsPaths, rs: rsPaths, go: goPaths, java: javaPaths, csharp: csharpPaths, cxx: cxxPaths, swift: swiftPaths, kotlin: kotlinPaths, scala: scalaPaths, fsharp: fsharpPaths, - powershell: powershellPaths, julia: juliaPaths, elixir: elixirPaths, + powershell: powershellPaths, julia: juliaPaths, elixir: elixirPaths, ocaml: ocamlPaths, } const TREES = Object.fromEntries(Object.entries(PATHS).map(([port, data]) => [port, new Set(data.paths)])) -const FILE_RE = /^[\w./@-]+\.(py|ts|tsx|js|rs|go|java|cs|cpp|hpp|h|swift|jl|ex|exs|ps1|psm1|psd1|md|toml|json|ya?ml|sh)$/ +const FILE_RE = /^[\w./@-]+\.(py|ts|tsx|js|rs|go|java|cs|cpp|hpp|h|swift|jl|ex|exs|ps1|psm1|psd1|ml|mli|opam|md|toml|json|ya?ml|sh)$/ type ProseDecision = MentionDecision & { file?: boolean } diff --git a/site/src/lib/symbol-form.ts b/site/src/lib/symbol-form.ts index b8264415a..4942acb37 100644 --- a/site/src/lib/symbol-form.ts +++ b/site/src/lib/symbol-form.ts @@ -49,6 +49,7 @@ export const FORMS: Record = { kotlin: { qualifier: '.', call: false }, scala: { qualifier: '.', call: false }, fsharp: { qualifier: '.', call: false }, + ocaml: { qualifier: '.', call: false }, julia: { qualifier: '.', call: false }, ruby: { qualifier: '::', call: false }, lua: { qualifier: '.', call: true }, @@ -158,6 +159,7 @@ interface EnumContext extends Pick part.link)) return undefined let plain = '' let linked = '' @@ -122,8 +123,8 @@ function proseMarkdown(markdown: string, index: SymbolIndex, symbol: ApiSymbol, } else if (markdown.slice(start, end) === node.value) { const spans = index.docSpans(node.value, symbol) const linked = spans.map((span) => (span.kind === 'ref' ? referenceMarkdown(span) : undefined)) - if (linked.some(Boolean)) edits.push({ start, end, - text: spans.map((span, i) => linked[i] ?? ('text' in span ? span.text : span.label)).join('') }) + if (linked.some(Boolean) || (index.language === 'ocaml' && spans.some((span) => span.kind === 'ref'))) edits.push({ start, end, + text: spans.map((span, i) => linked[i] ?? ('text' in span ? span.text : span.kind === 'citation' || span.code === false ? span.label : inlineCode(span.label))).join('') }) } } else if ('children' in node) for (const child of node.children) visit(child as Parameters[0]) } @@ -199,7 +200,7 @@ export function symbolMarkdown(ctx: MarkdownContext): string { const port = 'port' in model ? model.port : undefined const language = 'language' in model ? model.language : port const index = ctx.index ?? (port && 'port' in model ? productApiIndex(model, ctx.version ?? defaultVersionFor(port)) : undefined) - const prose = (text: string) => index ? proseMarkdown(text, index, symbol, ['powershell', 'scala', 'ts'].includes(language ?? '')) : text + const prose = (text: string) => index ? proseMarkdown(text, index, symbol, ['powershell', 'scala', 'ts', 'ocaml'].includes(language ?? '')) : text const id = qualifiedNameOf(symbol) const out: string[] = [`# ${id}`, ''] const info = port ? PORT_BY_SLUG[port] : undefined @@ -261,6 +262,7 @@ export function symbolMarkdown(ctx: MarkdownContext): string { else if (parent?.variant && symbol.type) out.push(fencedCode(`${symbol.name}: ${symbol.type}`, language), '') else if (symbol.value !== undefined) out.push(fencedCode(`${qualifiedNameOf(symbol)}${symbol.type ? `: ${symbol.type}` : ''} = ${symbol.value}`, language ?? ''), '') else if (language === 'c') out.push(`${anonymousDeclarationLabel(symbol)}.`, '') + else if (language === 'ocaml' && ['module', 'interface'].includes(symbol.kind)) out.push(fencedCode(`${symbol.kind === 'interface' ? 'module type' : 'module'} ${symbol.name}`, 'ocaml'), '') if (symbol.doc?.summary) out.push(prose(symbol.doc.summary), '') if (symbol.doc?.body) out.push(prose(symbol.doc.body), '') diff --git a/site/src/lib/tmux-library-usage.ts b/site/src/lib/tmux-library-usage.ts index 66402f8be..9baa0c624 100644 --- a/site/src/lib/tmux-library-usage.ts +++ b/site/src/lib/tmux-library-usage.ts @@ -19,6 +19,7 @@ import java from '../data/tmux-usage/java.json' import julia from '../data/tmux-usage/julia.json' import kotlin from '../data/tmux-usage/kotlin.json' import lua from '../data/tmux-usage/lua.json' +import ocaml from '../data/tmux-usage/ocaml.json' import powershell from '../data/tmux-usage/powershell.json' import py from '../data/tmux-usage/py.json' import rs from '../data/tmux-usage/rs.json' @@ -67,7 +68,7 @@ export interface TmuxScope { } export const TMUX_USAGE: Record = { - csharp, cxx, elixir, fsharp, go, java, julia, kotlin, lua, powershell, py, rs, ruby, scala, swift, ts, + csharp, cxx, elixir, fsharp, go, java, julia, kotlin, lua, ocaml, powershell, py, rs, ruby, scala, swift, ts, } as unknown as Record const SCOPES = scopeTable.commands as Record diff --git a/site/src/plugins/remark-port-code.mjs b/site/src/plugins/remark-port-code.mjs index 6c2925dae..8cd0e49cd 100644 --- a/site/src/plugins/remark-port-code.mjs +++ b/site/src/plugins/remark-port-code.mjs @@ -21,6 +21,7 @@ import { visit } from 'unist-util-visit' */ /** @type {Record} */ export const LANG_TO_PORT = { + ocaml: 'ocaml', python: 'py', py: 'py', ruby: 'ruby', @@ -51,6 +52,7 @@ export const LANG_TO_PORT = { /** Checkout locations used to refresh the revision-bound cache. */ export const CHECKOUTS = { + ocaml: '~/work/libtmux/libtmux-ocaml-docs-site', py: '~/work/python/libtmux', ruby: '~/work/libtmux/libtmux-ruby-docs', lua: '~/work/libtmux/libtmux-lua-docs', diff --git a/site/src/styles/brand.css b/site/src/styles/brand.css index cfdcb30bd..b1b171126 100644 --- a/site/src/styles/brand.css +++ b/site/src/styles/brand.css @@ -1999,3 +1999,128 @@ html[data-brand="elixir"][data-theme-mode="dark"], html[data-brand="elixir"][dat --lt-color-code-bg: #1c2229; } } +html[data-brand="ocaml"] { + color-scheme: light; + --brand-color: #EF7A08; + --brand-solid: #6c3704; + --brand-on-solid: #ffffff; + --button-bg-primary: #6c3704; + --button-text-primary: #ffffff; + --theme-primary: #6c3704; + --theme-secondary: #53606d; + --theme-accent: #6c3704; + --theme-background: #fafbfc; + --theme-text: #202830; + --background-color: #fafbfc; + --text-color: #202830; + --topnav-background: #fafbfc; + --topnav-text-color: #202830; + --topnav-link-color: #53606d; + --topnav-link-hover-color: #202830; + --color-background-primary: #fafbfc; + --color-background-secondary: #f3f5f7; + --color-background-border: #d6dce3; + --color-api-background-hover: #e9edf1; + --color-foreground-primary: #202830; + --color-foreground-secondary: #53606d; + --color-foreground-muted: #53606d; + --color-link: #6c3704; + --color-brand-primary: #6c3704; + --color-brand-content: #6c3704; + --color-inline-code-background: #f3f5f7; + --lt-color-bg: #fafbfc; + --lt-color-bg-secondary: #f3f5f7; + --lt-color-bg-hover: #e9edf1; + --lt-color-fg: #202830; + --lt-color-fg-secondary: #53606d; + --lt-color-fg-muted: #53606d; + --lt-color-border: #d6dce3; + --lt-color-accent: #6c3704; + --lt-color-link: #6c3704; + --lt-color-link-visited: #6c3704; + --lt-color-code-bg: #f3f5f7; +} +html[data-brand="ocaml"][data-theme-mode="dark"], html[data-brand="ocaml"][data-theme="dark"] { + color-scheme: dark; + --brand-color: #EF7A08; + --brand-solid: #6c3704; + --brand-on-solid: #ffffff; + --button-bg-primary: #6c3704; + --button-text-primary: #ffffff; + --theme-primary: #fad7b5; + --theme-secondary: #b7c1cd; + --theme-accent: #fad7b5; + --theme-background: #15191d; + --theme-text: #e7edf3; + --background-color: #15191d; + --text-color: #e7edf3; + --topnav-background: #15191d; + --topnav-text-color: #e7edf3; + --topnav-link-color: #b7c1cd; + --topnav-link-hover-color: #e7edf3; + --color-background-primary: #15191d; + --color-background-secondary: #1c2229; + --color-background-border: #3e4a57; + --color-api-background-hover: #29323d; + --color-foreground-primary: #e7edf3; + --color-foreground-secondary: #b7c1cd; + --color-foreground-muted: #b7c1cd; + --color-link: #fad7b5; + --color-brand-primary: #fad7b5; + --color-brand-content: #fad7b5; + --color-inline-code-background: #1c2229; + --lt-color-bg: #15191d; + --lt-color-bg-secondary: #1c2229; + --lt-color-bg-hover: #29323d; + --lt-color-fg: #e7edf3; + --lt-color-fg-secondary: #b7c1cd; + --lt-color-fg-muted: #b7c1cd; + --lt-color-border: #3e4a57; + --lt-color-accent: #fad7b5; + --lt-color-link: #fad7b5; + --lt-color-link-visited: #fad7b5; + --lt-color-code-bg: #1c2229; +} +@media (prefers-color-scheme: dark) { + html[data-brand="ocaml"]:not([data-theme-mode]):not([data-theme="light"]) { + color-scheme: dark; + --brand-color: #EF7A08; + --brand-solid: #6c3704; + --brand-on-solid: #ffffff; + --button-bg-primary: #6c3704; + --button-text-primary: #ffffff; + --theme-primary: #fad7b5; + --theme-secondary: #b7c1cd; + --theme-accent: #fad7b5; + --theme-background: #15191d; + --theme-text: #e7edf3; + --background-color: #15191d; + --text-color: #e7edf3; + --topnav-background: #15191d; + --topnav-text-color: #e7edf3; + --topnav-link-color: #b7c1cd; + --topnav-link-hover-color: #e7edf3; + --color-background-primary: #15191d; + --color-background-secondary: #1c2229; + --color-background-border: #3e4a57; + --color-api-background-hover: #29323d; + --color-foreground-primary: #e7edf3; + --color-foreground-secondary: #b7c1cd; + --color-foreground-muted: #b7c1cd; + --color-link: #fad7b5; + --color-brand-primary: #fad7b5; + --color-brand-content: #fad7b5; + --color-inline-code-background: #1c2229; + --lt-color-bg: #15191d; + --lt-color-bg-secondary: #1c2229; + --lt-color-bg-hover: #29323d; + --lt-color-fg: #e7edf3; + --lt-color-fg-secondary: #b7c1cd; + --lt-color-fg-muted: #b7c1cd; + --lt-color-border: #3e4a57; + --lt-color-accent: #fad7b5; + --lt-color-link: #fad7b5; + --lt-color-link-visited: #fad7b5; + --lt-color-code-bg: #1c2229; + } +} diff --git a/site/src/styles/global.css b/site/src/styles/global.css index f65de687d..e22a5dccf 100644 --- a/site/src/styles/global.css +++ b/site/src/styles/global.css @@ -4,7 +4,8 @@ Navigation is motionless. Homepage hover previews have a brief fade, disabled when the reader prefers reduced motion. */ -@import "tailwindcss"; +/* Isolated previews link dependencies beside src; scan the rendering sources. */ +@import "tailwindcss" source("../"); @import "./gp-sphinx-tokens.css"; @import "./brand.css"; @import "./api-kinds.css"; diff --git a/site/test/api-destination-evidence.test.ts b/site/test/api-destination-evidence.test.ts index 134a960df..179871721 100644 --- a/site/test/api-destination-evidence.test.ts +++ b/site/test/api-destination-evidence.test.ts @@ -1,5 +1,5 @@ import { readFileSync } from 'node:fs' -import { describe, expect, it } from 'vitest' +import { beforeAll, describe, expect, it } from 'vitest' import { API_HOSTS, EXTERNAL_INVENTORIES, PAGE_EXCEPTIONS, addressSegments, apiHostOf, arityOf, collectApiDestinations, linksIn, qualified, terminalSymbol, urlsIn } from '../../scripts/lib/api-destinations.mjs' import { addressOf, mismatch } from '../../scripts/lib/api-addresses.mjs' import { judge, judgeLabel, pageIdentity, sourceIdentity } from '../../scripts/lib/api-identities.mjs' @@ -13,10 +13,12 @@ import { import evidence from '../src/data/api-destination-evidence.json' const root = new URL('../../', import.meta.url).pathname -const destinations = collectApiDestinations({ root }) +let collectedDestinations: ReturnType | undefined +const destinations = () => collectedDestinations ??= collectApiDestinations({ root }) const today = new Date(`${evidence.checkedAt}T12:00:00Z`) describe('API destination evidence', () => { + beforeAll(() => { destinations() }) it('records the heading a link was read at, never the name of the book or site the page belongs to', () => { // "Associated items - The Rust Reference" is headed "Associated items": a record that kept "The Rust Reference" could not see a page move. // A name that ends the titles of three pages of one host is the host's book, not any page's. @@ -33,7 +35,7 @@ describe('API destination evidence', () => { }) it('holds a passing record for every destination the site generates, and none for a link nothing makes', () => { - const { problems } = checkApiEvidence(destinations, evidence, { today, root }) + const { problems } = checkApiEvidence(destinations(), evidence, { today, root }) expect(problems).toEqual([]) }) @@ -56,7 +58,7 @@ describe('API destination evidence', () => { if (!record.ok) continue expect(record.status, record.url).toBe(200) expect(record.finalUrl, `${record.url} is a redirect`).toBeUndefined() - const destination = destinations.get(record.url) + const destination = destinations().get(record.url) if (!destination) continue expect(needsCheck(destination, record), record.url).toBe(false) } @@ -274,11 +276,76 @@ describe('what the verifier reads from a page', () => { }) it('knows which hosts document a language or an SDK', () => { + expect(apiHostOf('https://ocaml.org/manual/5.5/api/Iarray.html#TYPEt')).toBe('ocaml.org') + expect(languageOfUrl('https://ocaml.org/manual/5.5/api/Iarray.html#TYPEt')).toBe('ocaml') + expect(languageProblem('ocaml', 'https://ocaml.org/manual/5.5/api/Iarray.html#TYPEt')).toBeUndefined() + const url = 'https://ocaml.org/manual/5.5/api/Iarray.html#TYPEt' + const html = 'OCaml library : Iarray

Module Iarray

type \'a t = \'a iarray
' + const identity = pageIdentity(url, readPage(html)) + expect(identity).toMatchObject({ kind: 'type', path: ['Iarray', 't'] }) + expect(judge(sourceIdentity({ port: 'ocaml', name: 'Iarray.t', source: 'type' }), identity)).toBeUndefined() + expect(judge(sourceIdentity({ port: 'ocaml', name: 'Seq.t', source: 'type' }), identity)).toMatchObject({ failure: 'owner' }) + expect(pageIdentity(url, readPage(html.replace('type', 'val')))).toMatchObject({ kind: 'other' }) expect(apiHostOf('https://pkg.go.dev/time#Duration')).toBe('pkg.go.dev') expect(apiHostOf('https://elixir.hexdocs.pm/Enum.html')).toBe('elixir.hexdocs.pm') expect(apiHostOf('https://github.com/libtmux/libtmux')).toBeUndefined() expect(API_HOSTS.has('docs.oracle.com')).toBe(true) }) + + it('checks OCaml value anchors against their declaration and owning module', () => { + const url = 'https://ocaml.org/manual/5.5/api/Seq.html#VALfilter' + const html = 'OCaml library : Seq

Module Seq

val filter : (\'a -> bool) -> \'a t -> \'a t
' + expect(addressOf(url)).toMatchObject({ path: ['Seq', 'filter'], exact: true, fragment: 'member' }) + const identity = pageIdentity(url, readPage(html)) + expect(identity).toMatchObject({ kind: 'member', path: ['Seq', 'filter'] }) + expect(judge(sourceIdentity({ port: 'ocaml', name: 'Seq.filter', source: 'builtin' }), identity)).toBeUndefined() + expect(judge(sourceIdentity({ port: 'ocaml', name: 'List.filter', source: 'builtin' }), identity)).toMatchObject({ failure: 'owner' }) + for (const forged of [html.replace('val', 'type'), html.replace('> filter', '> invented')]) { + expect(pageIdentity(url, readPage(forged))).toMatchObject({ kind: 'other' }) + } + for (const name of ['List', 'Unix']) { + const module = pageIdentity(`https://ocaml.org/manual/5.5/api/${name}.html`, readPage(`OCaml library : ${name}

Module ${name}

`)) + expect(judge(sourceIdentity({ port: 'ocaml', name, source: 'builtin' }), module), name).toBeUndefined() + } + }) + + it('checks OCaml variant constructors against their type and declared name', () => { + const html = 'OCaml library : Option

Module Option

' + + '
type \'a t = \'a option = 
' + + '' + + '
None
Some of \'a
' + for (const name of ['None', 'Some']) { + const url = `https://ocaml.org/manual/5.5/api/Option.html#TYPEELTt.${name}` + expect(addressOf(url)).toMatchObject({ path: ['Option', name], exact: true, fragment: 'member' }) + const identity = pageIdentity(url, readPage(html)) + expect(identity).toMatchObject({ via: 'ocamldoc', declared: 'constructor', kind: 'member', path: ['Option', name] }) + expect(judge(sourceIdentity({ port: 'ocaml', name: `Option.${name}`, source: 'builtin' }), identity)).toBeUndefined() + expect(judge(sourceIdentity({ port: 'ocaml', name: `Other.${name}`, source: 'builtin' }), identity)).toMatchObject({ failure: 'owner' }) + for (const forged of [html.replace('type \'a t', 'type \'a other'), + html.replace(`class="constructor">${name}`, 'class="constructor">Invented'), + html.replace(`class="constructor">${name}`, `class="type">${name}`)]) { + expect(pageIdentity(url, readPage(forged))).toMatchObject({ kind: 'other' }) + } + } + }) + + it('matches complete OCaml identifiers including apostrophes in value and type declarations', () => { + const actual = [] + const expected = [] + for (const [prefix, keyword, base, kind] of [['VAL', 'val', 'filter', 'member'], ['TYPE', 'type', 't', 'type']]) { + for (const name of [base, `${base}'`, `${base}''`, `${base}'item`]) { + for (const declared of [name, `${name}'`, `${name}''`, `${name}_other`, `${name}2`]) { + const url = `https://ocaml.org/manual/5.5/api/Seq.html#${prefix}${name}` + const html = `OCaml library : Seq

Module Seq

${keyword} ${keyword === 'type' ? "'a " : ''}${declared}${keyword === 'type' ? ' = unit' : ' : unit'}
` + const identity = pageIdentity(url, readPage(html)) + if (!identity) throw new Error(`Missing OCaml page identity for ${prefix}${name}`) + actual.push([prefix, name, declared, identity.kind, identity.kind === 'other' ? [] : identity.path]) + expected.push([prefix, name, declared, name === declared ? kind : 'other', name === declared ? ['Seq', name] : []]) + } + } + } + expect(actual).toEqual(expected) + }) }) describe('what a name says it is', () => { @@ -504,6 +571,7 @@ describe('what a link\'s words say', () => { }) describe('the reviewed link table', () => { + beforeAll(() => { destinations() }) const { rows, byPair } = loadReviewedLinks(root) it('has one row for each text and address, each with a heading, sorted so a review reads as the rows that changed', () => { @@ -604,7 +672,7 @@ describe('the reviewed link table', () => { const use = { port: '', name: 'a.md', source: 'authored', label: 'crate API', from: 'go', package: { identity: 'tmux-mcp', ports: ['rs'] } } const [expectation] = expectationsOf({ url: 'https://docs.rs/tmux-mcp', uses: [use] }) expect(expectation).toMatchObject({ label: 'crate API', ports: ['go'], package: { identity: 'tmux-mcp', ports: ['rs'] } }) - expect(Object.keys(destinations.get('https://docs.rs/tmux-mcp')?.uses.values().next().value.package ?? {})).toEqual(['identity', 'ports']) + expect(Object.keys(destinations().get('https://docs.rs/tmux-mcp')?.uses.values().next().value.package ?? {})).toEqual(['identity', 'ports']) }) it('keeps every port that wrote the same words at the same address, so the last one cannot hide the others', () => { diff --git a/site/test/api-glossary.test.ts b/site/test/api-glossary.test.ts index 24d06ec41..b2296d1f0 100644 --- a/site/test/api-glossary.test.ts +++ b/site/test/api-glossary.test.ts @@ -19,6 +19,7 @@ const astroRequire = createRequire(realpathSync(new URL('../node_modules/astro/p const windows: Window[] = [] const nativeAuthorities: Record = { scala: /^https:\/\/docs\.scala-lang\.org\//, java: /^https:\/\/docs\.oracle\.com\//, + ocaml: /^https:\/\/ocaml\.org\//, kotlin: /^https:\/\/kotlinlang\.org\//, julia: /^https:\/\/docs\.julialang\.org\//, py: /^https:\/\/(?:docs\.python\.org|peps\.python\.org|packaging\.python\.org)\//, ts: /^https:\/\/www\.typescriptlang\.org\//, diff --git a/site/test/api-links-rendered.test.ts b/site/test/api-links-rendered.test.ts index d65533eb1..77159b197 100644 --- a/site/test/api-links-rendered.test.ts +++ b/site/test/api-links-rendered.test.ts @@ -34,14 +34,14 @@ const collected = (href: string) => destinations.has(normalizeAddress(href)) const PORTS = Object.keys(API_MODELS) /** Every address on an API host that a tree of Markdown links, and where. */ -function markdownAddresses(markdown: string): string[] { +function markdownAddresses(markdown: string, tree = fromMarkdown(markdown)): string[] { const found: string[] = [] const walk = (node: any) => { if ((node.type === 'link' || node.type === 'definition') && apiHostOf(node.url)) found.push(node.url) if (node.type === 'html') for (const match of node.value.matchAll(/href\s*=\s*["']([^"']+)["']/gi)) if (apiHostOf(match[1])) found.push(match[1]) for (const child of node.children ?? []) walk(child) } - walk(fromMarkdown(markdown)) + walk(tree) return found } @@ -240,7 +240,8 @@ describe('the pages, rendered for each port', () => { const pagePort = (page.data.port as string | undefined) || undefined for (const build of builds(page)) { const markdown = twin(page, build) - for (const href of markdownAddresses(markdown)) { + const tree = fromMarkdown(markdown) + for (const href of markdownAddresses(markdown, tree)) { linked += 1 if (!collected(href) && !missing.has(href)) missing.set(href, where(page, build)) } @@ -253,7 +254,7 @@ describe('the pages, rendered for each port', () => { } for (const child of node.children ?? []) walk(child) } - walk(fromMarkdown(markdown)) + walk(tree) } } expect([...missing].map(([href, place]) => `${href} (${place})`)).toEqual([]) @@ -302,16 +303,18 @@ describe('the symbol pages, drawn by the components', () => { it('draw the types of every symbol with the addresses the index gives them, each one a destination the collector reads', async () => { components ??= await apiComponents() - const container = await experimental_AstroContainer.create() const stray = new Map() let drawn = 0 let linked = 0 for (const [port, model] of Object.entries(API_MODELS)) { const index = productApiIndex(model, defaultVersionFor(port)) for (const symbol of model.symbols) { + // Containers retain rendered routes; keep that history within one symbol. + let container: experimental_AstroContainer | undefined for (const { signature, text } of typeInputs(symbol)) { const expected = given(index.linkType(text, symbol, signature)) if (!expected.size) continue + container ??= await experimental_AstroContainer.create() const html = await container.renderToString(components.type, { props: { type: text, index, context: symbol, signature } }) drawn += 1 for (const href of hostAddresses(html)) { diff --git a/site/test/api-search.test.ts b/site/test/api-search.test.ts index 84e1ce522..acb96b79b 100644 --- a/site/test/api-search.test.ts +++ b/site/test/api-search.test.ts @@ -64,8 +64,9 @@ describe('reference symbol search', () => { } expect(searchApi(inventory, '', 'types').every((entry) => entry.category === 'types')).toBe(true) expect(searchApi(inventory, '', 'members').every((entry) => entry.category === 'members')).toBe(true) - const server = searchApi(inventory, 'Server')[0] - expect(server.category, `${port}: Server type precedes properties with the same name`).toBe('types') - expect(symbols.get(server.id)?.name).toBe('Server') + const server = searchApi(inventory, port === 'ocaml' ? 'Libtmux_unix.Client' : 'Server')[0] + expect(server.category, `${port}: primary server declaration category`).toBe('types') + expect(symbols.get(server.id)?.name).toBe(port === 'ocaml' ? 'Client' : 'Server') + if (port === 'ocaml') expect(server).toMatchObject({ id: 'Libtmux_unix.Client', kind: 'module' }) }) }) diff --git a/site/test/api-sidebar.test.ts b/site/test/api-sidebar.test.ts index ff5568196..79fb6e433 100644 --- a/site/test/api-sidebar.test.ts +++ b/site/test/api-sidebar.test.ts @@ -51,6 +51,16 @@ describe('API sidebar presentations', () => { expect(nodes[0]?.kind).toBeUndefined() }) + it('opens a curated root once when its module also lists it as a member', () => { + const inventory = structuredClone(json) + inventory.buckets[0]!.types.push({ id: 'nested', name: 'Companion', slug: 'companion', m: 1, kind: 'module', category: 'types' }) + for (const selected of ['nested', 'create']) { + const rows = rowsOf(sidebarNodes(inventory, '/reference/', 'outline', selected)) + expect(rows.filter((row) => row.current)).toHaveLength(1) + expect(rows.find((row) => row.label === 'Session')?.expanded).toBe(false) + } + }) + it('focuses the selected owner and represents empty owners without invented members', () => { const nodes = sidebarNodes(json, '/reference/', 'focus', 'create') expect(nodes.map((node) => node.label)).toEqual(['Companion', 'create']) diff --git a/site/test/api-tree.test.ts b/site/test/api-tree.test.ts index b3c5b79df..7ddf6ce95 100644 --- a/site/test/api-tree.test.ts +++ b/site/test/api-tree.test.ts @@ -89,7 +89,12 @@ describe('shared reference index sections', () => { expect(sections[0].id).toBe('server') if (port === 'powershell') expect(sections[0].free.map((symbol) => symbol.name)) .toEqual(expect.arrayContaining(['Connect-TmuxServer', 'Get-TmuxServer', 'New-TmuxServer'])) - else expect(sections[0].types[0].name).toBe('Server') + else if (port === 'ocaml') { + expect(sections[0].types).toEqual([]) + expect(sections[0].free.slice(0, 2).map((symbol) => [symbol.id, symbol.kind])) + .toEqual([['Libtmux_unix.Client', 'module'], ['Libtmux_eio.Client', 'module']]) + expect(firstEntry(navTree(port)[0]!)?.id).toBe('Libtmux_unix.Client') + } else expect(sections[0].types[0].name).toBe('Server') const ids = sections.flatMap((section) => [...section.types, ...section.free]).map((symbol) => symbol.id) expect(new Set(ids).size).toBe(ids.length) const available = new Set(sections.map((section) => section.id)) @@ -241,14 +246,24 @@ describe('major tmux object domains', () => { expect(Object.keys(API_MODELS).sort()).toEqual([...PORTS].sort()) expect(Object.keys(API_NAV).sort()).toEqual([...PORTS].sort()) }) + it('separates OCaml live server connections from captured client observations', () => { + const buckets = navTree('ocaml') + expect(buckets.find((bucket) => bucket.id === 'server')!.entries.slice(0, 2).map((entry) => entry.id)) + .toEqual(['Libtmux_unix.Client', 'Libtmux_eio.Client']) + expect(buckets.find((bucket) => bucket.id === 'client')!.entries.map((entry) => entry.id)) + .toContain('Libtmux.Client_observation') + expect(API_MODELS.ocaml.symbols.some((symbol) => symbol.kind === 'class' && symbol.name === 'Server')).toBe(false) + }) it.each(PORTS)('uses the same useful member order for %s pages and lazy branches', (port) => { const model = API_MODELS[port]! const branches = membersByType(port) const compare = compareMembers(memberSignals(port, mentions.mentions)) const owners = model.symbols.filter((symbol) => port === 'powershell' ? symbol.kind === 'module' - : OWNER_KINDS.has(symbol.kind) && ['Server', 'Session', 'Window', 'Pane', 'Client', 'Snapshot'].includes(symbol.name)) + : OWNER_KINDS.has(symbol.kind) && ['Server', 'Session', 'Window', 'Pane', 'Client', 'Snapshot', ...(port === 'ocaml' ? ['Client_observation', 'Window_link'] : [])].includes(symbol.name)) if (port === 'powershell') expect(owners.map((owner) => owner.name).sort()).toEqual(['LibTmux', 'LibTmux.Workspace']) + else if (port === 'ocaml') expect(owners.filter((owner) => owner.name === 'Client').map((owner) => owner.id)) + .toEqual(['Libtmux_eio.Client', 'Libtmux_unix.Client']) else expect(owners.some((owner) => owner.name === 'Server'), port).toBe(true) for (const owner of owners) { const displayed = membersOf(model, owner, memberSignals(port, mentions.mentions)).sort(compare) diff --git a/site/test/branding.test.ts b/site/test/branding.test.ts index 483dec058..b714f63cb 100644 --- a/site/test/branding.test.ts +++ b/site/test/branding.test.ts @@ -28,6 +28,7 @@ describe('route branding', () => { kotlin: 'libtmux-kotlin: Kotlin-based tmux client', scala: 'libtmux-scala: Scala-based tmux client', csharp: 'libtmux-dotnet: C#-based tmux client', fsharp: 'libtmux-fsharp: F#-based tmux client', cxx: 'libtmux-cxx: C++-based tmux client', swift: 'libtmux-swift: Swift-based tmux client', + ocaml: 'libtmux-ocaml: OCaml-based tmux client', }) expect(portTagline(PORTS.find((port) => port.slug === 'rs')!)).toBe('Rust-based tmux client') // The home title carries no ` | project` suffix, for Julia's differing project name too. @@ -46,6 +47,7 @@ describe('route branding', () => { rs: 'libtmux-rs', go: 'libtmux-go', java: 'libtmux-java', kotlin: 'libtmux-kotlin', scala: 'libtmux-scala', csharp: 'libtmux-dotnet', fsharp: 'libtmux-fsharp', cxx: 'libtmux-cxx', swift: 'libtmux-swift', + ocaml: 'libtmux-ocaml', } expect(Object.fromEntries(PORTS.map((port) => [port.slug, branding(port.slug).projectName]))).toEqual(names) expect(branding('java', 'reference/libtmux-scala-cats').projectName).toBe('libtmux-scala') @@ -96,6 +98,8 @@ describe('route branding', () => { }) it('ships raster and vector fallbacks for every palette and product', () => { for (const language of Object.keys(palettes)) for (const product of ['library', 'mcp', 'workspace']) { + const owners = PORTS.filter((port) => port.logoLanguage === language) + if (product !== 'library' && owners.length && owners.every((port) => port.productAvailability?.[product as 'mcp' | 'workspace'] === 'excluded')) continue const brand = { asset: (file: string) => `/brand/${language}/${product}/${file}` } for (const file of ['logo.svg', 'favicon.ico', 'logo-32.png', 'logo-512.png', 'apple-touch-icon-light.png', 'opengraph-light.png', 'twitter-light.png', 'site.webmanifest']) { expect(existsSync(publicFile(brand.asset(file))), brand.asset(file)).toBe(true) diff --git a/site/test/concept-coverage.test.ts b/site/test/concept-coverage.test.ts index 892b04011..00c62f912 100644 --- a/site/test/concept-coverage.test.ts +++ b/site/test/concept-coverage.test.ts @@ -27,7 +27,7 @@ function coverage(concept: string) { describe('the ports that have a page for an operation', () => { it('lists every port for a server snapshot except those with no whole-server snapshot', () => { const { pages, reasons } = coverage('snapshot') - expect(pages.toSorted()).toEqual(['csharp', 'elixir', 'fsharp', 'go', 'java', 'julia', 'kotlin', 'lua', 'powershell', 'rs', 'ruby', 'scala', 'swift', 'ts']) + expect(pages.toSorted()).toEqual(['csharp', 'elixir', 'fsharp', 'go', 'java', 'julia', 'kotlin', 'lua', 'ocaml', 'powershell', 'rs', 'ruby', 'scala', 'swift', 'ts']) // Python's core and C++ have no snapshot of a whole server, and each says so. expect(reasons.toSorted()).toEqual(['cxx', 'py']) for (const port of ['py', 'cxx']) expect(CONCEPTS.snapshot!.absent![port], port).toMatch(/^no equivalent on `Server`/) diff --git a/site/test/deploy-workflow.test.ts b/site/test/deploy-workflow.test.ts index d4190ac78..ab044dc92 100644 --- a/site/test/deploy-workflow.test.ts +++ b/site/test/deploy-workflow.test.ts @@ -12,16 +12,37 @@ const shell = readFileSync(new URL('../../.github/workflows/deploy-shell.yml', i const testWorkflow = readFileSync(new URL('../../.github/workflows/test.yml', import.meta.url), 'utf8') const publicationAudit = readFileSync(new URL('../../scripts/test-all.sh', import.meta.url), 'utf8') const publishRoot = readFileSync(new URL('../../scripts/publish-root.sh', import.meta.url), 'utf8') -const sourceGuidePorts = ['ruby', 'lua', 'powershell', 'julia', 'elixir'] +const sourceGuidePorts = ['ruby', 'lua', 'powershell', 'julia', 'elixir', 'ocaml'] function sourceCheckoutContract(workflow: string): void { for (const port of sourceGuidePorts) { - expect(workflow).toContain(`echo "${port}=$(jq -r .revision site/src/data/api/${port}.json)" >> "$GITHUB_OUTPUT"`) expect(workflow).toContain(`repository: libtmux/libtmux-${port}`) expect(workflow).toContain('ref: ${{ steps.integrated-sources.outputs.' + port + ' }}') expect(workflow).toContain(`path: .port-sources/${port}`) } expect(workflow).toContain('persist-credentials: false') + + const body = /^ {8}id: integrated-sources\n {8}run: \|\n((?: {10}[^\n]*\n|\n)*)/m.exec(workflow)?.[1] + expect(body, 'the integrated-sources step has an executable run block').toBeDefined() + const directory = mkdtempSync(join(tmpdir(), 'libtmux-source-outputs-')) + try { + const models = join(directory, 'site/src/data/api') + mkdirSync(models, { recursive: true }) + const revisions = Object.fromEntries(sourceGuidePorts.map((port, index) => [port, String(index + 1).repeat(40)])) + for (const [port, revision] of Object.entries(revisions)) writeFileSync(join(models, `${port}.json`), JSON.stringify({ revision })) + const output = join(directory, 'github-output') + writeFileSync(output, '') + const result = spawnSync('bash', ['-e', '-c', body!.replace(/^ {10}/gm, '')], { + cwd: directory, encoding: 'utf8', timeout: 1000, env: { PATH: process.env.PATH, GITHUB_OUTPUT: output }, + }) + expect(result.error, result.stderr).toBeUndefined() + expect(result.status, result.stderr).toBe(0) + const emitted = Object.fromEntries(readFileSync(output, 'utf8').split('\n').filter(Boolean).map((line) => { + const separator = line.indexOf('=') + return [line.slice(0, separator), line.slice(separator + 1)] + })) + expect(emitted, 'source revisions emitted to GITHUB_OUTPUT').toEqual(revisions) + } finally { rmSync(directory, { recursive: true, force: true }) } } interface ManifestResponse { @@ -397,6 +418,15 @@ describe('port publisher contract', () => { expect(merge).not.toMatch(/\|\| true|2>\/dev\/null/) }) + it.each([ + ['missing output', testWorkflow.replace('} >> "$GITHUB_OUTPUT"', '}')], + ['the wrong revision field', testWorkflow.replace('jq -r .revision', 'jq -r .missing')], + ['an extra equals sign in the revision', testWorkflow.replace('ruby.json)"', 'ruby.json)=unexpected"')], + ['trailing whitespace in the revision', testWorkflow.replace('ocaml.json)"', 'ocaml.json) "')], + ])('rejects source revisions with %s', (_name, workflow) => { + expect(() => sourceCheckoutContract(workflow)).toThrow(/source revisions emitted to GITHUB_OUTPUT/) + }) + it('stages every source-bound native guide before the publication audit checks backlinks', () => { sourceCheckoutContract(testWorkflow) expect(testWorkflow).toContain('node scripts/stage-port-docs.mjs --from-source') @@ -407,7 +437,7 @@ describe('port publisher contract', () => { } expect(stage).toContain('node scripts/stage-port-docs.mjs --cached --check') expect(stage.indexOf('--cached --check')).toBeGreaterThan(stage.indexOf('--from-source')) - for (const port of ['ruby', 'lua']) { + for (const port of ['ruby', 'lua', 'ocaml']) { expect(audit).toContain(`LIBTMUX_DOCS_CHECKOUT_${port.toUpperCase()}: ` + '${{ github.workspace }}/.port-sources/' + port) } expect(audit).not.toMatch(/LIBTMUX_DOCS_CHECKOUT_(POWERSHELL|JULIA|ELIXIR):/) diff --git a/site/test/destination-evidence.test.ts b/site/test/destination-evidence.test.ts index de64e2eef..5f67633e0 100644 --- a/site/test/destination-evidence.test.ts +++ b/site/test/destination-evidence.test.ts @@ -183,6 +183,7 @@ describe('destination evidence', () => { describe('age', () => { const checked = new Date(`${evidence.checkedAt}T12:00:00Z`) const later = (days: number) => new Date(checked.getTime() + days * DAY) + const sameDate = withEvidence(evidence.destinations.map((record) => ({ ...record, checkedAt: evidence.checkedAt }))) it('is measured, never judged, by the agreement check, so a change that touches none of this cannot fail for the passage of time', () => { const ancient = withEvidence(evidence.destinations.map((record) => ({ ...record, checkedAt: '2001-01-01' }))) @@ -192,8 +193,8 @@ describe('destination evidence', () => { }) it('reports a record as stale only after the bound, oldest first, with its date', () => { - expect(staleRecords(evidence, { today: later(EVIDENCE_MAX_AGE_DAYS) })).toEqual([]) - const stale = staleRecords(evidence, { today: later(EVIDENCE_MAX_AGE_DAYS + 2) }) + expect(staleRecords(sameDate, { today: later(EVIDENCE_MAX_AGE_DAYS) })).toEqual([]) + const stale = staleRecords(sameDate, { today: later(EVIDENCE_MAX_AGE_DAYS + 2) }) expect(stale).toHaveLength(evidence.destinations.length) expect(stale[0]).toMatchObject({ checkedAt: evidence.checkedAt, days: EVIDENCE_MAX_AGE_DAYS + 2 }) const old = new Date(checked.getTime() - (EVIDENCE_MAX_AGE_DAYS + 5) * DAY).toISOString().slice(0, 10) @@ -203,7 +204,7 @@ describe('destination evidence', () => { }) it('words a warning with the date and the command that clears it', () => { - const stale = staleRecords(evidence, { today: later(EVIDENCE_MAX_AGE_DAYS + 2) }) + const stale = staleRecords(sameDate, { today: later(EVIDENCE_MAX_AGE_DAYS + 2) }) expect(staleWarnings(stale)).toEqual([`${evidence.destinations.length} destination records were last checked ${evidence.checkedAt}, more than ${EVIDENCE_MAX_AGE_DAYS} days ago: run node scripts/verify-destinations.mjs`]) expect(staleWarnings(stale.slice(0, 1))[0]).toMatch(/^1 destination record was last checked/) }) @@ -244,12 +245,12 @@ describe('destination evidence', () => { }) it('names every record dated beyond a day ahead of today, and fails the agreement check on it', () => { - expect(futureRecords(evidence, { today: new Date(checked.getTime() - DAY) })).toEqual([]) - const early = futureRecords(evidence, { today: new Date(checked.getTime() - 3 * DAY) }) + expect(futureRecords(sameDate, { today: new Date(checked.getTime() - DAY) })).toEqual([]) + const early = futureRecords(sameDate, { today: new Date(checked.getTime() - 3 * DAY) }) expect(early).toHaveLength(evidence.destinations.length) expect(early[0]).toMatchObject({ checkedAt: evidence.checkedAt }) - expect(checkEvidence(INVENTORY, evidence, { manifests, today: checked })).toEqual([]) - expect(checkEvidence(INVENTORY, evidence, { manifests, today: new Date(checked.getTime() - 3 * DAY) })) + expect(checkEvidence(INVENTORY, sameDate, { manifests, today: checked })).toEqual([]) + expect(checkEvidence(INVENTORY, sameDate, { manifests, today: new Date(checked.getTime() - 3 * DAY) })) .toContain(`${evidence.destinations[0]!.url} was checked ${evidence.checkedAt}, which is in the future`) }) diff --git a/site/test/docs-paths.test.ts b/site/test/docs-paths.test.ts index 34bbd0b04..8a40bc3dd 100644 --- a/site/test/docs-paths.test.ts +++ b/site/test/docs-paths.test.ts @@ -75,8 +75,9 @@ describe('product document URLs', () => { expect(docsRoutePath({ id: 'meta/third-party-notices', data: {} })).toBe('meta/third-party-notices') }) - it('retires duplicate Julia and F# API overviews in root and selected-version builds', () => { + it('retires source API overviews in root and selected-version builds', () => { expect(sourceGuideRedirects(undefined, { fsharp: 'v0.46.2' })).toEqual([ + { path: 'ocaml/latest/guides/api', target: 'ocaml/latest/reference' }, { path: 'julia/latest/guides/api-overview', target: 'julia/latest/reference' }, { path: 'fsharp/v0.46.2/guides/api-overview', target: 'fsharp/v0.46.2/reference' }, ]) @@ -86,6 +87,9 @@ describe('product document URLs', () => { expect(sourceGuideRedirects('fsharp')).toEqual([ { path: 'guides/api-overview', target: 'reference' }, ]) + expect(sourceGuideRedirects('ocaml')).toEqual([ + { path: 'guides/api', target: 'reference' }, + ]) expect(sourceGuideRedirects('py')).toEqual([]) }) it('uses the same path in root and per-port builds', () => { diff --git a/site/test/exports.test.ts b/site/test/exports.test.ts index c568ae533..9ad6e93ae 100644 --- a/site/test/exports.test.ts +++ b/site/test/exports.test.ts @@ -3,6 +3,7 @@ import { join } from 'node:path' import { describe, expect, it } from 'vitest' import { Window } from 'happy-dom' import { API_MODEL_PORTS, PORTS } from '../src/lib/ports' +import { referenceIndexSections } from '../src/lib/api-tree' import { SITE_BUILT, SITE_PREFIX, PREVIEW_PREFIX, productionPath, publishedHas, publishedPath, sitePath } from './site-root' /** @@ -134,10 +135,12 @@ describeIfAssembled('published exports', () => { template.innerHTML = readPublished(join(root, 'index.html')) const actual = [...template.content.querySelectorAll('.api-index-summary[id]')].map((node) => node.id) expect(reference.headings.map((heading: { id: string }) => heading.id)).toEqual(actual) - expect(actual[0]).toBe('section-server') - if (port.slug === 'powershell') expect(reference.symbols.slice(0, 3).map((symbol: { name: string }) => symbol.name)) - .toEqual(['New-TmuxServer', 'Get-TmuxServer', 'Connect-TmuxServer']) - else expect(reference.symbols[0].name).toBe('Server') + const sections = referenceIndexSections(port.slug) + expect(sections.length, `${port.slug} model reference sections`).toBeGreaterThan(0) + expect(actual).toEqual(sections.map((section) => `section-${section.id}`)) + expect(reference.symbols.map((symbol: { id: string }) => symbol.id)).toEqual( + sections.flatMap((section) => [...section.types, ...section.free]).map((symbol) => symbol.publicId ?? symbol.id), + ) for (const symbol of reference.symbols) { const target = new URL(symbol.url).pathname.replace(/^\//, '') expect(has(join(target, 'index.html')), symbol.url).toBe(true) diff --git a/site/test/fixtures/header-links.ts b/site/test/fixtures/header-links.ts index fbc6d6c9f..7e0b8cddf 100644 --- a/site/test/fixtures/header-links.ts +++ b/site/test/fixtures/header-links.ts @@ -25,6 +25,18 @@ export interface ExpectedLinks { } export const LINKS: Record = { + ocaml: { + actions: [['source', 'GitHub', 'GitHub: libtmux/libtmux-ocaml/lib', 'https://github.com/libtmux/libtmux-ocaml/tree/master/lib']], + indexed: true, + rows: [ + ['source', 'libtmux', 'opam package · lib', 'https://github.com/libtmux/libtmux-ocaml/tree/master/lib', ['libtmux']], + ['source', 'libtmux-unix', 'opam package · unix', 'https://github.com/libtmux/libtmux-ocaml/tree/master/unix', ['libtmux-unix']], + ['source', 'libtmux-eio', 'opam package · eio', 'https://github.com/libtmux/libtmux-ocaml/tree/master/eio', ['libtmux-eio']], + ['source', 'libtmux-json', 'opam package · json', 'https://github.com/libtmux/libtmux-ocaml/tree/master/json', ['libtmux-json']], + ['source', 'libtmux-workspace', 'opam package · workspace', 'https://github.com/libtmux/libtmux-ocaml/tree/master/workspace', ['libtmux-workspace']], + ['source', 'libtmux-workspace-cli', 'opam package · cli', 'https://github.com/libtmux/libtmux-ocaml/tree/master/cli', ['libtmux-workspace-cli']], + ], + }, py: { actions: [['source', 'GitHub', 'GitHub: tmux-python/libtmux', 'https://github.com/tmux-python/libtmux'], ['package', 'PyPI', 'PyPI: libtmux package', 'https://pypi.org/project/libtmux/']], diff --git a/site/test/fixtures/home-examples.json b/site/test/fixtures/home-examples.json index e431ba348..4da8d5091 100644 --- a/site/test/fixtures/home-examples.json +++ b/site/test/fixtures/home-examples.json @@ -1465,6 +1465,107 @@ "excerptSha256": "315b120fc40982d69ab2945b84a0b2c6df5faf8d63d75bf940739cd6e23b68af" } } + }, + { + "port": "ocaml", + "page": "home", + "sourceRepository": "libtmux/libtmux-ocaml", + "sourceRevision": "6ef4ac3c255ce503270edba7640c5bd65cdc43a1", + "sourceTree": "2d3cfff8570f97d0498db2a3dbeb26124b1eeeba", + "files": [ + { + "name": "examples/showcase_graph.ml", + "sha256": "daa3c08e96c7aa366f6ac798b41a09e2f967c2fcf6c343df194c4e7fc4627a26", + "clipboardSha256": "3417aac5cfb59506b776d82344e4a4a2bd5749eecc684f33b255148c9d540bed" + }, + { + "name": "dune-project", + "sha256": "daaacf75db08cde5fbf1b18daa332e83a3b64949f61b5ab9e83194a35f4628d4", + "clipboardSha256": "9872d829a36399cf09b1a1e486428dc80151c7fb8635c6d0bd124ec213b5d847" + }, + { + "name": "examples/dune", + "sha256": "d8b6dc92ae4d7b32866d3ff4e9fb175d05abfb1518e11af582260e64c46c5022", + "clipboardSha256": "10e66c40d8a664c75c9f7a8a236bcaee8e90de47f742b4bdebf956a072a49590" + } + ], + "excerptSha256": "3417aac5cfb59506b776d82344e4a4a2bd5749eecc684f33b255148c9d540bed", + "shellRecipe": [ + "opam exec -- dune exec examples/showcase_graph.exe" + ], + "expectedOutputs": [ + [ + "graph: 2 sessions, 2 windows, 3 links, 2 panes" + ] + ], + "tmuxVersions": [ + "3.3", + "3.3a", + "3.4", + "3.8" + ], + "variants": { + "concise": { + "files": [ + { + "name": "examples/showcase_graph.ml", + "sha256": "05b3cc89ebfd071169c0b7723154eeb02071079528c7cd50dd44f4da8f0383e6", + "clipboardSha256": "175a3e563c3fcb69add9bf8ab74d721b07ab2530ad4cb60a63244f84453db11b" + }, + { + "name": "dune-project", + "sha256": "daaacf75db08cde5fbf1b18daa332e83a3b64949f61b5ab9e83194a35f4628d4", + "clipboardSha256": "9872d829a36399cf09b1a1e486428dc80151c7fb8635c6d0bd124ec213b5d847" + }, + { + "name": "examples/dune", + "sha256": "d8b6dc92ae4d7b32866d3ff4e9fb175d05abfb1518e11af582260e64c46c5022", + "clipboardSha256": "10e66c40d8a664c75c9f7a8a236bcaee8e90de47f742b4bdebf956a072a49590" + } + ], + "excerptSha256": "175a3e563c3fcb69add9bf8ab74d721b07ab2530ad4cb60a63244f84453db11b" + }, + "errors": { + "files": [ + { + "name": "examples/showcase_graph.ml", + "sha256": "05b3cc89ebfd071169c0b7723154eeb02071079528c7cd50dd44f4da8f0383e6", + "clipboardSha256": "175a3e563c3fcb69add9bf8ab74d721b07ab2530ad4cb60a63244f84453db11b" + }, + { + "name": "dune-project", + "sha256": "daaacf75db08cde5fbf1b18daa332e83a3b64949f61b5ab9e83194a35f4628d4", + "clipboardSha256": "9872d829a36399cf09b1a1e486428dc80151c7fb8635c6d0bd124ec213b5d847" + }, + { + "name": "examples/dune", + "sha256": "d8b6dc92ae4d7b32866d3ff4e9fb175d05abfb1518e11af582260e64c46c5022", + "clipboardSha256": "10e66c40d8a664c75c9f7a8a236bcaee8e90de47f742b4bdebf956a072a49590" + } + ], + "excerptSha256": "175a3e563c3fcb69add9bf8ab74d721b07ab2530ad4cb60a63244f84453db11b" + }, + "cleanup": { + "files": [ + { + "name": "examples/showcase_graph.ml", + "sha256": "daa3c08e96c7aa366f6ac798b41a09e2f967c2fcf6c343df194c4e7fc4627a26", + "clipboardSha256": "3417aac5cfb59506b776d82344e4a4a2bd5749eecc684f33b255148c9d540bed" + }, + { + "name": "dune-project", + "sha256": "daaacf75db08cde5fbf1b18daa332e83a3b64949f61b5ab9e83194a35f4628d4", + "clipboardSha256": "9872d829a36399cf09b1a1e486428dc80151c7fb8635c6d0bd124ec213b5d847" + }, + { + "name": "examples/dune", + "sha256": "d8b6dc92ae4d7b32866d3ff4e9fb175d05abfb1518e11af582260e64c46c5022", + "clipboardSha256": "10e66c40d8a664c75c9f7a8a236bcaee8e90de47f742b4bdebf956a072a49590" + } + ], + "excerptSha256": "3417aac5cfb59506b776d82344e4a4a2bd5749eecc684f33b255148c9d540bed" + } + } } ] } diff --git a/site/test/fixtures/port-destinations.ts b/site/test/fixtures/port-destinations.ts index e420562eb..ee0ff54c8 100644 --- a/site/test/fixtures/port-destinations.ts +++ b/site/test/fixtures/port-destinations.ts @@ -20,6 +20,9 @@ export interface ExpectedDestinations { const github = (url: string, name: string): ExpectedLink => ({ url, label: `${name} on GitHub` }) export const DESTINATIONS: Record = { + ocaml: { + source: github('https://github.com/libtmux/libtmux-ocaml/tree/master/lib', 'libtmux-ocaml/lib'), + }, py: { source: github('https://github.com/tmux-python/libtmux', 'libtmux'), registry: { name: 'PyPI', url: 'https://pypi.org/project/libtmux/', icon: 'pypi', label: 'libtmux on PyPI' }, diff --git a/site/test/fixtures/port-links.json b/site/test/fixtures/port-links.json index 96e38b455..d4b8ff9eb 100644 --- a/site/test/fixtures/port-links.json +++ b/site/test/fixtures/port-links.json @@ -31,6 +31,8 @@ "cxx v1.2.3 @revision": "", "swift": "", "swift v1.2.3 @revision": "", + "ocaml": "", + "ocaml v1.2.3 @revision": "", "powershell v1.2.3": "", "powershell next": "", "powershell latest @revision": "", @@ -93,6 +95,8 @@ "swift mcp v1.2.3 @revision": "", "swift workspace": "", "swift workspace v1.2.3 @revision": "", + "ocaml workspace": "", + "ocaml workspace v1.2.3 @revision": "", "ts mcp v1.2.3": "", "py workspace v1.2.3": "", "lua mcp (no package)": "", diff --git a/site/test/markdown-conditions.mjs b/site/test/markdown-conditions.mjs new file mode 100644 index 000000000..357998365 --- /dev/null +++ b/site/test/markdown-conditions.mjs @@ -0,0 +1,14 @@ +import { registerHooks } from 'node:module' + +const parser = /^(?:mdast-util-from-markdown|micromark(?:-[^/]+)?)(?:\/.*)?$/ + +// Production parser entries omit per-token development assertions. +registerHooks({ + resolve(specifier, context, nextResolve) { + if (!parser.test(specifier) || !context.conditions.includes('development')) return nextResolve(specifier, context) + return nextResolve(specifier, { + ...context, + conditions: context.conditions.filter((condition) => condition !== 'development'), + }) + }, +}) diff --git a/site/test/native-name.test.ts b/site/test/native-name.test.ts index de5e9b2cd..5ceffa4f5 100644 --- a/site/test/native-name.test.ts +++ b/site/test/native-name.test.ts @@ -196,7 +196,7 @@ describe('short names', () => { expect(nativeShortName(API_MODELS.swift, symbol)).toBe(`Server.${symbol.name}`) }) - it('are the owner, a separator that the language writes, and the member, for every symbol of every port', { timeout: 30_000 }, () => { + it('use the native owner namespace and member separator across ports', { timeout: 30_000 }, () => { const separators: Record = { rs: ['::'], cxx: ['::'], ruby: ['::', '.', '#'], lua: ['.', ':'], powershell: ['\\'] } for (const [port, model] of Object.entries(API_MODELS)) { const owners = new Map(model.symbols.map((symbol) => [symbol.id, symbol])) @@ -204,6 +204,8 @@ describe('short names', () => { const shown = nativeShortName(model, symbol) const owner = symbol.parent ? owners.get(symbol.parent) : undefined if (!owner) { expect(shown, `${port} ${symbol.id}`).toBe(symbol.name); continue } + // OCaml types group constructors and fields without qualifying their names. + if (port === 'ocaml' && owner.kind !== 'module') continue expect(shown.startsWith(owner.name) && shown.endsWith(symbol.name), `${port} ${symbol.id}`).toBe(true) const separator = shown.slice(owner.name.length, shown.length - symbol.name.length) // A Rust tuple field follows its owner with a dot, as rustdoc writes it; every other Rust member with `::`. @@ -213,6 +215,16 @@ describe('short names', () => { } }) + it.each([ + ['Libtmux.Cardinality.error.Multiple_matches', 'Cardinality.Multiple_matches'], + ['Libtmux.Cardinality.error.Multiple_matches.at_least', 'Cardinality.at_least'], + ['Libtmux.Command.view:type.Rename_session', 'Command.Rename_session'], + ['Libtmux.Snapshot.t', 'Snapshot.t'], + ['Libtmux_unix.Client.capture', 'Client.capture'], + ])('writes the native OCaml namespace of %s as %s', (id, expected) => { + expect(nativeShortName(API_MODELS.ocaml, symbolNamed('ocaml', id))).toBe(expected) + }) + it('are the end of the full name wherever the id ends with the name, so the card is the page\'s name without its path', { timeout: 30_000 }, () => { for (const [port, model] of Object.entries(API_MODELS)) { for (const symbol of model.symbols) { diff --git a/site/test/native-signature.test.ts b/site/test/native-signature.test.ts index cc6cdc15a..4629af7c5 100644 --- a/site/test/native-signature.test.ts +++ b/site/test/native-signature.test.ts @@ -70,6 +70,10 @@ const cases = [ ['scala', 'io.github.libtmux.scaladsl.Server.sessions'], ['kotlin', 'io.github.libtmux.kotlin.Server.sessions'], ['fsharp', 'LibTmux.FSharp.Server.newSession'], + ['ocaml', 'Libtmux_unix.Client.capture'], + ['ocaml', 'Libtmux_unix.Client.t'], + ['ocaml', 'Libtmux.Snapshot.panes'], + ['ocaml', 'Libtmux.Command.view:type'], ['julia', 'LibTmux.Server'], ['powershell', 'LibTmux\\Connect-TmuxControl'], ] as const @@ -625,7 +629,7 @@ describe('native signature emission', () => { const before = JSON.stringify(models.julia) const { entries } = await signatureProbe(models) expect([...new Set(entries.map(({ port }) => port))]).toEqual(API_MODEL_PORTS.map(({ slug }) => slug)) - expect(new Set(entries.map(({ port }) => port)).size).toBe(16) + expect(new Set(entries.map(({ port }) => port)).size).toBe(API_MODEL_PORTS.length) for (const [port, model] of Object.entries(models)) { const callables = model.symbols.filter((symbol) => symbol.signatures.some((signature) => signature.params.length > 0 && signature.returns)) const selected = callables.find((symbol) => /capture/i.test(symbol.name)) ?? callables[0] diff --git a/site/test/ocaml.test.ts b/site/test/ocaml.test.ts new file mode 100644 index 000000000..b923b912e --- /dev/null +++ b/site/test/ocaml.test.ts @@ -0,0 +1,61 @@ +import { expect, it } from 'vitest' +import { readFileSync } from 'node:fs' +import { parseFrontmatter } from '@astrojs/markdown-remark' +import { PORT_BY_SLUG, productAvailable } from '../src/lib/ports' +import { usesNativeSignatures, nativeSignatureText } from '../src/lib/api-sections' +import { API_MODELS } from '../src/lib/api-models' +import { navSidecar } from '../../packages/api-model/src/nav-sidecar' +import { SymbolIndex } from '@libtmux/api-model' +import { docsPath } from '../src/lib/docs-paths' + +it('publishes authored overviews at their advertised section routes', () => { + for (const [file, route] of [ + ['concepts/index.md', 'concepts'], ['examples/index.md', 'examples'], + ['topics/index.md', 'topics'], ['workspace/reference.md', 'workspace/reference'], + ]) { + const source = readFileSync(new URL(`../src/content/docs/ports/ocaml/${file}`, import.meta.url), 'utf8') + const { frontmatter } = parseFrontmatter(source, { frontmatter: 'remove' }) + const id = `ports/ocaml/${file}`.replace(/\.md$/, '').replace(/\/index$/, '') + expect(docsPath({ id, data: frontmatter }), file).toBe(route) + } +}) + +it('resolves authored odoc references from every exported public declaration', () => { + const model = API_MODELS.ocaml! + const index = new SymbolIndex(model.symbols, (symbol) => `/reference/${symbol.id}`, 'ocaml') + const missing = model.symbols.flatMap((symbol) => [symbol.doc?.summary, symbol.doc?.body].filter(Boolean) + .flatMap((text) => index.docSpans(text!, symbol).filter((span) => span.kind === 'ref' && !span.link) + .map((span) => `${symbol.id}: ${span.kind === 'ref' ? span.target : ''}`))) + expect(missing).toEqual([]) +}) + +it('keeps OCaml native type syntax and excludes MCP while exposing workspaces', () => { + const port = PORT_BY_SLUG.ocaml! + expect(port.productAvailability?.mcp).toBe('excluded') + expect(productAvailable(port, 'mcp')).toBe(false) + expect(productAvailable(port, 'workspace')).toBe(true) + const opaque = API_MODELS.ocaml!.symbols.find((symbol) => symbol.id === 'Libtmux.Pane.t')! + expect(opaque.modifiers).toContain('opaque') + expect(usesNativeSignatures(opaque, 'ocaml')).toBe(true) + expect(nativeSignatureText(opaque, opaque.signatures[0]!, 'ocaml')).toBe('type t') + expect(API_MODELS.ocaml!.symbols.some((symbol) => symbol.product === 'mcp')).toBe(false) +}) + +it('places live server connections under Server and captured tmux clients under Client', () => { + const nav = navSidecar('ocaml', API_MODELS.ocaml!)! + expect(nav.placement['Libtmux_unix.Client']).toBe('server') + expect(nav.placement['Libtmux_eio.Client']).toBe('server') + expect(nav.placement['Libtmux.Client_observation']).toBe('client') +}) + +it('attaches the tested bootstrap program to its workspace operations', () => { + const model = API_MODELS.ocaml! + const sourceUrl = `https://github.com/libtmux/libtmux-ocaml/blob/${model.revision}/examples/showcase_bootstrap.ml` + const targets = ['Libtmux_unix.Workspace.submit_bootstrap', + 'Libtmux_unix.Workspace.await', 'Libtmux_unix.Workspace.client'] + for (const id of targets) { + const symbol = model.symbols.find((entry) => entry.id === id)! + const example = symbol.doc?.examples?.find((entry) => entry.lang === 'ocaml' && entry.sourceUrl === sourceUrl) + expect(example, id).toBeDefined() + } +}) diff --git a/site/test/page-port-links.test.ts b/site/test/page-port-links.test.ts index ec3d9f131..d17b92674 100644 --- a/site/test/page-port-links.test.ts +++ b/site/test/page-port-links.test.ts @@ -46,6 +46,18 @@ describe('prose route ownership', () => { }) describe('reference picker exits', () => { + it('keeps an excluded MCP product out of shared-page language links', () => { + for (const pagePath of ['mcp', 'mcp/tools']) { + const entries = pagePortLinks({ ...options, pagePath, portSlug: 'ts' }) + expect(entries.find((entry) => entry.port === 'ocaml')).toMatchObject({ + links: [], home: { href: '/pr-42/en/ocaml/latest/', label: 'Go to OCaml home' }, + }) + expect(entries.find((entry) => entry.port === 'ts')?.links).toEqual([ + { href: `/pr-42/en/ts/v1.2.3/${pagePath}/` }, + ]) + } + }) + it('keeps missing equivalents distinct from product and language home shortcuts', () => { const entries = pagePortLinks({ ...options, pagePath: 'mcp/reference/libtmux-mcp-arguments', portSlug: 'cxx' }) expect(entries.find((entry) => entry.port === 'rs')).toMatchObject({ diff --git a/site/test/port-docs-runtime.test.ts b/site/test/port-docs-runtime.test.ts index 9dcee55c7..635bf3cb1 100644 --- a/site/test/port-docs-runtime.test.ts +++ b/site/test/port-docs-runtime.test.ts @@ -327,6 +327,56 @@ if (process.argv[2] === process.env.FAILING_TASK) process.exit(23) }) }) +describe('OCaml documentation producer', () => { + it.each(['', 'install', 'build', 'tools/export_api.py'])('exports installed interfaces and stops on task %j failure', (failure) => { + const directory = mkdtempSync(join(tmpdir(), 'libtmux-ocaml-export-')) + try { + const source = join(directory, 'selected source') + const calls = join(directory, 'calls') + mkdirSync(source) + writeFileSync(join(directory, 'opam'), `#!${process.execPath} +const fs = require('node:fs') +const argv = process.argv.slice(2) +fs.appendFileSync(process.env.EXPORT_CALLS, JSON.stringify({ argv, cwd: process.cwd(), export: process.env.LIBTMUX_API_EXPORT }) + '\\n') +if (argv.includes(process.env.FAILING_TASK)) process.exit(23) +`, { mode: 0o700 }) + const result = spawnSync('bash', ['-e', '-c', script('Export OCaml API from the selected source')], { + cwd: source, encoding: 'utf8', timeout: 1000, + env: { ...process.env, PATH: `${directory}:${process.env.PATH}`, LIBTMUX_API_EXPORT: '1', + EXPORT_CALLS: calls, FAILING_TASK: failure }, + }) + const commands = readFileSync(calls, 'utf8').trim().split('\n').map((line) => JSON.parse(line)) + const expected = [ + ['install', '.', '--deps-only', '--with-doc', '--yes'], + ['exec', '--', 'dune', 'build', '@install', 'tools/api_export.exe'], + ['exec', '--', 'python3', 'tools/export_api.py', '--output', '_build/docs/ocaml.json'], + ] + expect(result.status, result.stderr).toBe(failure ? 23 : 0) + expect(commands).toEqual(expected.slice(0, failure === 'install' ? 1 : failure === 'build' ? 2 : 3) + .map((argv) => ({ argv, cwd: realpathSync(source), export: '1' }))) + } finally { rmSync(directory, { recursive: true, force: true }) } + }) + + it('prepares the pinned compiler and public exporter before building the port tree', () => { + const setup = workflow.indexOf('uses: ocaml/setup-ocaml@') + const exporter = workflow.indexOf('name: Export OCaml API from the selected source') + const build = workflow.indexOf("name: Build this port's tree") + expect(setup).toBeGreaterThan(workflow.indexOf('name: Snapshot source inputs before native generation')) + expect(exporter).toBeGreaterThan(setup) + expect(exporter).toBeLessThan(build) + const steps = workflow.slice(workflow.lastIndexOf('\n - ', setup), exporter) + expect(steps).toContain("if: matrix.port == 'ocaml'") + expect(steps).toContain('ocaml-compiler: ocaml-base-compiler.5.5.2') + expect(steps).toContain('opam-local-packages: port/*.opam') + expect(steps).toMatch(/uses: ocaml\/setup-ocaml@[0-9a-f]{40} # v\d+\.\d+\.\d+/) + expect(workflow.slice(exporter, build)).toContain("LIBTMUX_API_EXPORT: '1'") + const model = readFileSync(join(root, 'scripts/gen-api-model.mjs'), 'utf8') + const artifact = /\bocaml: \{[^}]*nativeArtifact: '([^']+)'/.exec(model)?.[1] + expect(artifact).toBe('_build/docs/ocaml.json') + expect(script('Export OCaml API from the selected source')).toContain(` ${artifact}\n`) + }) +}) + describe('source-bound guide staging', () => { const build = readFileSync(join(root, 'scripts/build-site.sh'), 'utf8') // Ruby and Lua carry their guides in the exporter artifact, wrappers stage diff --git a/site/test/port-inventory.test.ts b/site/test/port-inventory.test.ts index 0e204c4e2..613ec1829 100644 --- a/site/test/port-inventory.test.ts +++ b/site/test/port-inventory.test.ts @@ -18,7 +18,7 @@ const coordinates = (slug: string, kinds?: InventoryEntry['kind'][]) => */ const manifests = manifestPackages.ports as Record const distributions = (slug: string) => published(slug).filter((entry) => !entry.within && entry.kind !== 'source') diff --git a/site/test/port-landing.test.ts b/site/test/port-landing.test.ts index b30d233db..d9e144330 100644 --- a/site/test/port-landing.test.ts +++ b/site/test/port-landing.test.ts @@ -20,6 +20,7 @@ const read = (path: string) => JSON.parse(readFileSync(new URL(path, import.meta /** Every product a port ships, as the selector offers it. PowerShell serves MCP with the .NET tool. */ const PRODUCTS: Record = { + ocaml: ['core', 'workspace'], py: ['core', 'mcp', 'workspace'], ruby: ['core', 'mcp', 'workspace'], lua: ['core'], @@ -50,6 +51,7 @@ const GAPS: readonly string[] = ['julia/mcp'] * is a reviewed change to this list, with the CI evidence that goes with it. */ const EXCERPT_FILES: Record = { + 'ocaml/workspace': 'examples/showcase_graph.ml', 'py/mcp': 'tests/test_window_tools.py', 'py/workspace': 'src/tmuxp/workspace/builder/classic.py', 'ruby/mcp': 'examples/mcp_protocol.rb', diff --git a/site/test/port-links.test.ts b/site/test/port-links.test.ts index 76db174a1..13ccc37d2 100644 --- a/site/test/port-links.test.ts +++ b/site/test/port-links.test.ts @@ -33,6 +33,7 @@ function cases(): Case[] { } for (const port of PORTS.filter((entry) => entry.packages?.some(({ id }) => id === 'mcp' || id === 'workspace'))) { for (const product of ['mcp', 'workspace']) { + if (port.productAvailability?.[product as 'mcp' | 'workspace'] === 'excluded') continue add(`${port.slug} ${product}`, { port, product, version: 'latest' }) add(`${port.slug} ${product} v1.2.3 @revision`, { port, product, version: 'v1.2.3', revision: REVISION }) } diff --git a/site/test/product-docs.test.ts b/site/test/product-docs.test.ts index 357d233d7..932bb4f58 100644 --- a/site/test/product-docs.test.ts +++ b/site/test/product-docs.test.ts @@ -1,6 +1,7 @@ -import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs' +import { existsSync, globSync, readdirSync, readFileSync, statSync } from 'node:fs' import { join } from 'node:path' import { createHash } from 'node:crypto' +import { parseFrontmatter } from '@astrojs/markdown-remark' import { Window, type Element as DomElement } from 'happy-dom' import { describe, expect, it } from 'vitest' import { CONCEPT_DESCRIPTION, PORTS, productAvailable, productDescription, productIsConcept, productInDevelopment, productStatus, workspaceOverviewNotice, type Port } from '../src/lib/ports' @@ -10,7 +11,12 @@ import { SITE_BUILT, SITE_PREFIX, PREVIEW_PREFIX, productionPath, publishedPath, import { MCP_REFERENCE, MCP_SECTIONS, mcpObjects } from '../src/lib/mcp-catalog' import { mcpObjectGroup } from '../src/lib/mcp-reference' import { mentionBadge, mentionBadgeHtml } from '../src/lib/mention-badge' -import { mcpTitle, workspaceSubtitle, workspaceTitle } from '../src/lib/product-copy' +import { headingTitle } from '../src/lib/branding' +import { docsPath, type DocsPage } from '../src/lib/docs-paths' +import { docsEntriesAvailable } from '../src/lib/page-port-links' +import { documentationAreas, SOURCE_GUIDE_PORTS, sourceGuidesFor } from '../src/lib/port-documentation' +import { KNOWN_PORTS, resolvePortData } from '../src/lib/workspace-shared-slots' +import { DEFAULT_LOCALE, isLocale } from '../src/i18n/locales' import type { ApiTreeJson } from '../src/lib/api-search' import { PRODUCT_SECTIONS } from '../src/lib/product-api-sections' import { loadAstroTemplate, renderAstroTemplate } from './astro-templates' @@ -73,35 +79,88 @@ const pagesBeyondOverview = (pages: { url: string }[], overview: string) => page .filter((path) => path.startsWith(overview) && path !== overview) const urlFor = (path: string) => new URL(`/${SITE_PREFIX}${path}`, 'https://libtmux.org') const productUrl = new RegExp(`/(?:${portSlugs(primaryPorts)})/[^/]+/(?:mcp|workspace)(?:/|$)`) -// Python, Ruby, PowerShell and Julia keep real workspace Topics or native replacements; no other port does. -const legacyWorkspaceTopics = new RegExp(`/(?:${portSlugs(PORTS.filter((port) => !['py', 'ruby', 'powershell', 'julia'].includes(port.slug)))})/[^/]+/workspace/topics/?$`) +// Only a documented Internals section without a public Topics page needs this redirect. +function legacyWorkspaceTopics(url: string) { + const match = /\/([^/]+)\/[^/]+\/workspace\/topics\/?$/.exec(url) + if (!match || !PORTS.some((port) => port.slug === match[1])) return false + const sections = sectionsFor(match[1], 'workspace') + return sections.includes('internals/topics') && !sections.includes('topics') +} // A page's storage identity under `ports/` must not reach a public link. const storageIdentity = new RegExp(`/ports/(?:${portSlugs()})/`) // Port documentation is not translated, so no port tree exists under a translated locale. const localizedPortTree = new RegExp(`^/ja/(?:${portSlugs()})/`) -const nativeProductDocs = (port: string) => ['powershell', 'julia'].includes(port) -const mcpClientSetupRoutes: Record = { - py: ['mcp/guides'], ruby: ['mcp/guides/connect-client', 'mcp/source-guide'], - julia: ['mcp/source-guide'], ts: ['mcp/guides'], rs: ['mcp/guides/connect-client'], - go: ['mcp/guides/connect-client'], java: ['mcp/guides'], csharp: ['mcp/guides/connect-client'], - cxx: ['mcp/guides'], swift: ['mcp/guides'], + +type SourcePage = DocsPage & { data: DocsPage['data'] & { title: string } } +const sourceByPort = new Map>() +let sourceEntries: SourcePage[] | undefined + +/** Expected routes come from source, so a missing rendered page cannot remove its own test. */ +function documentsFor(port: string): Map { + const cached = sourceByPort.get(port) + if (cached) return cached + if (!sourceEntries) { + const base = new URL('../src/content/docs/', import.meta.url) + const idFor = (file: string) => file.replace(/\.mdx?$/, '').replace(/\/index$/, '') + const entries = globSync(['**/*.md', '**/*.mdx'], { cwd: base }).filter((file) => { + const locale = file.split('/')[0] + return !isLocale(locale) || locale === DEFAULT_LOCALE + }).map((file) => ({ + id: idFor(file), data: parseFrontmatter(readFileSync(new URL(file, base), 'utf8')).frontmatter, + })) as SourcePage[] + const owned = new Set(entries.map((entry) => entry.id)) + const shared = new URL('../src/content/_workspace-shared/', import.meta.url) + for (const file of globSync(['**/*.md', '**/*.mdx'], { cwd: shared })) { + const { frontmatter } = parseFrontmatter(readFileSync(new URL(file, shared), 'utf8')) + for (const slug of KNOWN_PORTS) { + const id = `ports/${slug}/${idFor(file)}` + if (!owned.has(id)) entries.push({ id, data: resolvePortData(frontmatter, slug, 'workspace') } as SourcePage) + } + } + sourceEntries = entries + } + const documents = new Map(docsEntriesAvailable(sourceEntries, port).map((entry) => [docsPath(entry), entry])) + // A staging omission is a failure, not permission to skip that port's native guides. + for (const guide of SOURCE_GUIDE_PORTS.includes(port) ? sourceGuidesFor(port) : []) { + expect(documents.has(guide.route), `${port}: stage native guide ${guide.sourcePath}`).toBe(true) + } + sourceByPort.set(port, documents) + return documents +} + +function sourceGuide(port: string, product: ProductPage['product']) { + return SOURCE_GUIDE_PORTS.includes(port) + ? sourceGuidesFor(port).find((guide) => guide.product === product && guide.route === `${product}/source-guide`) : undefined +} + +function counterpartRoutes(port: string, path: string): Map { + const own = documentsFor(port).get(path) + const paths = [path, ...(own?.data.aliases ?? [])] + const product = path.split('/')[0] as ProductPage['product'] + return new Map(PORTS.filter((candidate) => !candidate.parentLibrary && candidate.productAvailability?.[product] !== 'excluded') + .map((candidate) => { + if (own?.data.equivalence && candidate.slug === port) return [port, [path]] as const + const documents = [...documentsFor(candidate.slug).values()] + const matches = own?.data.equivalence + ? documents.filter((entry) => entry.data.equivalence === own.data.equivalence && entry.data.product === own.data.product) + : paths.flatMap((route) => documents.filter((entry) => docsPath(entry) === route || entry.data.aliases?.includes(route))).slice(0, 1) + // A product overview may be an alias of a core integration guide. + return [candidate.slug, [...new Set(matches.map((entry) => path === product && entry.data.aliases?.includes(path) ? path : docsPath(entry)))]] as const + }).filter(([, routes]) => routes.length)) } -it('advertises local native loaders while retaining their development status', () => { - // Ruby ships its own released `libtmux-workspace load` and published MCP - // gem, and Lua has neither product at all: both fall outside the - // py-vs-generic-local-CLI dichotomy this test covers. - const native = (p: Port) => p.workspaceCliAvailability === 'local' || p.workspaceCliAvailability === 'published' - for (const port of PORTS.filter((p) => p.slug === 'py' || native(p))) { - expect(port.workspaceCli).toBe(port.slug === 'julia' ? 'libtmux-workspace load' : native(port) ? 'tmux-workspace load' : 'tmuxp load') - if (!native(port)) expect(port.workspaceCliAvailability).toBe('released') - expect(productInDevelopment(port, 'workspace')).toBe(native(port)) - expect(productInDevelopment(port, 'mcp')).toBe(true) +it('advertises workspace loaders with their declared command and development status', () => { + for (const port of PORTS.filter((entry) => entry.workspaceCli)) { + expect(port.workspaceCli).toMatch(/^\S+\s+\S+/) + const executable = port.packages?.find((entry) => entry.id === 'workspace')?.executable + if (executable) expect(port.workspaceCli!.split(/\s+/)[0]).toBe(executable) + expect(productInDevelopment(port, 'workspace')).toBe(productAvailable(port, 'workspace') && port.workspaceCliAvailability !== 'released') + expect(productInDevelopment(port, 'mcp')).toBe(productAvailable(port, 'mcp')) expect(productDescription(port, 'workspace')).not.toMatch(/worktree|checkpoint/) if (port.workspaceCliAvailability === 'local') { - expect(productDescription(port, 'workspace')).toContain(port.slug === 'julia' ? 'LibTmuxWorkspace' : 'Build the CLI from source') + expect(productDescription(port, 'workspace')).toContain(port.productDescriptions?.workspace ?? 'Build the CLI from source') } - if (native(port)) expect(workspaceOverviewNotice(port)?.body).toContain(`\`${port.workspaceCli!.split(/\s+/)[0]}\``) + if (['local', 'published'].includes(port.workspaceCliAvailability!)) expect(workspaceOverviewNotice(port)?.body).toContain(`\`${port.workspaceCli!.split(/\s+/)[0]}\``) if (port.workspaceCliAvailability === 'published') { expect(productDescription(port, 'workspace')).toContain('published') expect(workspaceOverviewNotice(port)?.body).not.toMatch(/unreleased|local/) @@ -109,21 +168,40 @@ it('advertises local native loaders while retaining their development status', ( } }) -function sectionsFor(port: string, product: ProductPage['product']): string[] { - if (port === 'powershell' && product === 'mcp') return [] - if (nativeProductDocs(port)) return ['', 'source-guide', 'reference'] - // A product with no published implementation has only the overview that says so. - if (!productAvailable(PORTS.find((entry) => entry.slug === port)!, product)) return [''] - if (port === 'ruby') return ['', 'topics', 'guides', 'examples', 'reference'] - // `reference` is a section of the product now, not a page inside Internals: - // the Workspace Manager and the MCP server are packages with APIs of their - // own, and Internals keeps the notes about building one. - if (product === 'mcp') return ['', 'topics', 'guides', 'examples', 'reference'] - return port === 'py' - ? ['', 'topics', 'guides', 'examples', 'reference', 'internals', 'internals/topics', 'internals/examples'] - : ['', 'guides', 'examples', 'reference', 'internals', 'internals/topics', 'internals/guides', 'internals/examples'] +function sectionsFor(port: string, product: ProductPage['product'], documents = documentsFor(port)): string[] { + const owner = PORTS.find((entry) => entry.slug === port)! + if (owner.parentLibrary || owner.productAvailability?.[product] === 'excluded') return [] + for (const area of documentationAreas(port).filter((area) => area.product === product)) { + const overview = documents.get(area.route) + expect(overview, `${port}: required ${product} overview`).toBeDefined() + expect(overview!.data, `${port}: ${product} overview ownership`).toMatchObject({ port, product }) + } + return ['', 'topics', 'guides', 'examples', 'reference', 'internals', 'internals/topics', 'internals/guides', 'internals/examples', 'source-guide'] + .filter((section) => { + const path = `${product}${section ? `/${section}` : ''}` + const entry = documents.get(path) + if (!entry) return false + expect(entry.data, `${port}: ${path} ownership`).toMatchObject({ port, product }) + return true + }) } +it('keeps declared product overviews and their ownership required', () => { + for (const port of primaryPorts) { + for (const product of products) sectionsFor(port.slug, product) + for (const area of documentationAreas(port.slug).filter((area) => area.product)) { + const documents = documentsFor(port.slug) + const missing = new Map(documents) + missing.delete(area.route) + expect(() => sectionsFor(port.slug, area.product!, missing)).toThrow(`${port.slug}: required ${area.product} overview`) + const mislabelled = new Map(documents) + const overview = documents.get(area.route)! + mislabelled.set(area.route, { ...overview, data: { ...overview.data, product: undefined } }) + expect(() => sectionsFor(port.slug, area.product!, mislabelled)).toThrow(`${port.slug}: ${area.product} overview ownership`) + } + } +}) + function pages(): ProductPage[] { const versions = manifest() return primaryPorts.flatMap((port) => { @@ -379,7 +457,8 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { }) it.each(PORTS.filter((port) => !port.parentLibrary).map((port) => port.slug))('%s exposes supported products from latest homes and core navigation', async (port) => { - for (const section of ['', 'guides/', 'topics/']) { + const sections = ['guides', 'topics'].filter((section) => documentsFor(port).has(section)) + for (const section of ['', ...sections.map((section) => `${section}/`)]) { const path = `${port}/latest/${section}` await inspect(path, (document) => { const navigation = document.querySelectorAll(section ? '[data-surface-picker]' : 'main') @@ -449,25 +528,15 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { }) }) - it('serves both products and every section with the chosen port content', () => { + it('serves each documented product and section with the chosen port content', () => { for (const page of pages()) { const html = pageHtml(page.path) const article = html.match(/]*>([\s\S]*?)<\/article>/i)?.[1] expect(article, page.path).toBeDefined() const headings1 = [...article!.matchAll(/]*>([\s\S]*?)<\/h1>/gi)].map((match) => match[1]!) expect(headings1, page.path).toHaveLength(1) - const sharedBrowse = page.product === 'workspace' && !['py', 'ruby'].includes(page.port) - && ['guides', 'examples'].includes(page.section) - if (nativeProductDocs(page.port)) { - const nativeTitles = page.product === 'workspace' - ? { '': `${workspaceTitle(page.port)} ${workspaceSubtitle(page.port)}`, 'source-guide': 'Workspace guide', reference: `${page.port === 'julia' ? 'LibTmuxWorkspace' : 'LibTmux.Workspace'} API reference` } - : { '': mcpTitle(page.port), 'source-guide': 'MCP server guide', reference: 'LibTmuxMCP API reference' } - expect(text(headings1[0]!), page.path).toBe(nativeTitles[page.section as keyof typeof nativeTitles]) - } else if (sharedBrowse) { - expect(text(headings1[0]!), page.path).toBe(page.section === 'guides' ? 'Guides' : 'Examples') - } else { - expect(text(headings1[0]!), page.path).toContain(page.name) - } + const source = documentsFor(page.port).get(`${page.product}${page.section ? `/${page.section}` : ''}`)! + expect(text(headings1[0]!), page.path).toBe(headingTitle(source.data)) const context = html.match(/]*class="surface-picker-footer"[^>]*>([\s\S]*?)<\/div>/i)?.[1] expect(context, `${page.path} language and version context`).toBeDefined() expect(text(context!), page.path).toBe(`${page.name} · ${page.version} · en`) @@ -518,11 +587,11 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { } }) - it.each(PORTS.filter((port) => !port.parentLibrary && products.some((product) => !productAvailable(port, product)))) + it.each(PORTS.filter((port) => !port.parentLibrary && products.some((product) => port.productAvailability?.[product] === 'unpublished'))) ('$name builds, lists and links only the overview of a product it has not published', (port) => { const version = manifest().defaultVersion[port.slug]! const docs = JSON.parse(read(`${port.slug}/${version}/docs.json`)) as DocsManifest - for (const product of products.filter((entry) => !productAvailable(port, entry))) { + for (const product of products.filter((entry) => port.productAvailability?.[entry] === 'unpublished')) { // Whatever the product's other pages would be called, none is built or listed. const directory = sitePath(`${port.slug}/${version}/${product}`) const built = existsSync(directory) ? readdirSync(directory, { recursive: true }).map(String) : [] @@ -540,8 +609,8 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { expect(storageIdentity.test(`/en/ports/${port.slug}/guides/`), `${port.slug} storage identity`).toBe(true) expect(localizedPortTree.test(`/ja/${port.slug}/latest/`), `${port.slug} localized tree`).toBe(true) if (!port.parentLibrary) expect(productUrl.test(`/en/${port.slug}/latest/mcp/`), `${port.slug} product URL`).toBe(true) - const redirected = !['py', 'ruby', 'powershell', 'julia'].includes(port.slug) - expect(legacyWorkspaceTopics.test(`/en/${port.slug}/latest/workspace/topics/`), `${port.slug} legacy Topics`).toBe(redirected) + const redirected = documentsFor(port.slug).has('workspace/internals/topics') && !documentsFor(port.slug).has('workspace/topics') + expect(legacyWorkspaceTopics(`/en/${port.slug}/latest/workspace/topics/`), `${port.slug} legacy Topics`).toBe(redirected) } expect(productUrl.test('/en/elixir/latest/mcp/guides/')).toBe(true) expect(productUrl.test('/en/elixir/latest/guides/overview/')).toBe(false) @@ -600,6 +669,12 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { return } const surface = page.product === 'mcp' ? 'MCP' : 'Workspace Manager' + if (sourceGuide(page.port, 'workspace') && page.product === 'workspace' && page.section === '') { + expect(document.querySelector('[data-workspace-coming]'), `${page.path} native examples already documented`).toBeNull() + const guide = urlFor(`${page.port}/${page.version}/workspace/source-guide/`).pathname + expect([...document.querySelectorAll('article a[href]')].some((link) => + new URL(link.getAttribute('href')!, urlFor(page.path)).pathname === guide), `${page.path} native example guide`).toBe(true) + } const section = page.section === 'source-guide' ? 'guides' : page.section.split('/')[0] || 'home' const sectionLabel = section === 'reference' ? 'API Reference' : section[0].toUpperCase() + section.slice(1) expect(picker?.querySelector('.surface-current .surface-label')?.textContent, `${page.path} current app`).toBe(surface) @@ -609,7 +684,8 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { expect(picker?.querySelector('.surface-current small')?.textContent, `${page.path} current section`).toBe(sectionLabel) const current = picker?.querySelectorAll('[aria-current="location"]') expect(current, `${page.path} one current section`).toHaveLength(1) - const sectionPath = `${page.port}/${page.version}/${page.product}/${page.section === 'source-guide' ? 'source-guide/' : section === 'home' ? '' : `${section}/`}` + const sourceIsOverview = page.section === 'source-guide' && !documentsFor(page.port).has(`${page.product}/guides`) + const sectionPath = `${page.port}/${page.version}/${page.product}/${sourceIsOverview ? 'source-guide/' : section === 'home' ? '' : `${section}/`}` expect(current![0].getAttribute('href'), `${page.path} current destination`).toBe(urlFor(sectionPath).pathname) expect(resolves(current![0].getAttribute('href')!), `${page.path} current destination exists`).toBe(true) // The API reference is the reference sidebar, one navigation for every viewport; the other sections share the section sidebar. @@ -620,7 +696,7 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { expect(nav.getAttribute('aria-label'), page.path).toBe(`${surface}: ${sectionLabel}`) const links = [...nav.querySelectorAll('a[href]')] expect(links.length, `${page.path} current section pages`).toBeGreaterThan(0) - const sourceGuidePath = port.slug === 'ruby' && section === 'guides' + const sourceGuidePath = sourceGuide(page.port, page.product) && section === 'guides' ? urlFor(`${page.port}/${page.version}/${page.product}/source-guide/`).pathname : undefined if (sourceGuidePath) { const guides = links.filter((link) => new URL(link.getAttribute('href')!, urlFor(page.path)).pathname === sourceGuidePath) @@ -656,7 +732,7 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { } } } - if (page.product === 'workspace' && page.port !== 'ruby' && !nativeProductDocs(page.port) && productAvailable(port, 'workspace')) { + if (page.product === 'workspace' && sectionsFor(page.port, 'workspace').includes('internals') && productAvailable(port, 'workspace')) { expect([...picker!.querySelectorAll('a[href]')].some((link) => link.getAttribute('href') === urlFor(`${page.port}/${page.version}/workspace/internals/`).pathname), `${page.path} Internals remains reachable in the picker`).toBe(true) } @@ -670,7 +746,7 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { expect(article, `${page.path} native CLI`).toContain(port.workspaceCli.split(/\s+/)[0]) expect(article.match(/concept example/gi), `${page.path} states scope once`).toHaveLength(1) const links = [...document.querySelectorAll('article a[href]')] - const installation = nativeProductDocs(page.port) ? 'source-guide' : 'guides/installation' + const installation = documentsFor(page.port).has('workspace/guides/installation') ? 'guides/installation' : 'source-guide' expect(links.some((link) => new URL(link.getAttribute('href')!, urlFor(page.path)).pathname === urlFor(`${page.port}/${page.version}/workspace/${installation}/`).pathname), `${page.path} native installation`).toBe(true) expect(links.some((link) => link.getAttribute('href') === 'https://tmuxp.git-pull.com/'), `${page.path} foreign installation`).toBe(false) } @@ -787,19 +863,9 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { const links = [...document.querySelectorAll('[data-page-port-switcher] a[data-port][href]')] const tmux = document.querySelector('[data-page-port-switcher] .tmux-area a[href]') expect(tmux?.getAttribute('href'), `${page.path} tmux destination`).toBe(urlFor('tmux/').pathname) - const clientSetup = page.product === 'mcp' && page.section === 'guides' - && ['py', 'ts', 'java', 'cxx', 'swift'].includes(page.port) - const counterparts = clientSetup ? new Map(Object.entries(mcpClientSetupRoutes).map(([port, routes]) => [port, + const counterparts = new Map([...counterpartRoutes(page.port, `${page.product}${page.section ? `/${page.section}` : ''}`)].map(([port, routes]) => [port, routes.map((route) => urlFor(`${port}/${port === page.port ? page.version : defaults[port]}/${route}/`).pathname), - ])) : new Map(PORTS.flatMap((port) => { - const section = page.section - if (port.slug === 'powershell' && page.product === 'mcp' && !section) { - return [[port.slug, [urlFor(`${port.slug}/${defaults[port.slug]}/mcp/`).pathname]]] - } - if (port.parentLibrary || !sectionsFor(port.slug, page.product).includes(section)) return [] - const version = port.slug === page.port ? page.version : defaults[port.slug] - return [[port.slug, [urlFor(`${port.slug}/${version}/${page.product}/${section ? `${section}/` : ''}`).pathname]]] - })) + ])) expect(links.length, `${page.path} port counterparts`).toBe([...counterparts.values()].flat().length) for (const port of PORTS) { const expected = counterparts.get(port.slug) @@ -835,18 +901,15 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { }) }) - it.each([ - ['powershell', 'workspace'], ['julia', 'workspace'], ['julia', 'mcp'], - ])('switches from the native %s %s source guide to verified task counterparts', async (port, product) => { + it.each(primaryPorts.flatMap((port) => products.filter((product) => sourceGuide(port.slug, product)) + .map((product) => [port.slug, product] as const)))('switches from the native %s %s source guide to verified task counterparts', async (port, product) => { const defaults = manifest().defaultVersion - const routes: Record = product === 'workspace' ? { - ruby: ['workspace/source-guide'], powershell: ['workspace/source-guide'], julia: ['workspace/source-guide'], - } : mcpClientSetupRoutes + const routes = counterpartRoutes(port, `${product}/source-guide`) const path = `${port}/${defaults[port]}/${product}/source-guide/` await inspect(path, (document) => { const links = [...document.querySelectorAll('[data-page-port-switcher] a[data-port][href]')] expect(links.map((link) => new URL(link.getAttribute('href')!, urlFor(path)).pathname).sort()).toEqual( - Object.entries(routes).flatMap(([slug, paths]) => paths.map((route) => urlFor(`${slug}/${defaults[slug]}/${route}/`).pathname)).sort(), + [...routes].flatMap(([slug, paths]) => paths.map((route) => urlFor(`${slug}/${defaults[slug]}/${route}/`).pathname)).sort(), ) for (const link of links) expect(resolves(link.getAttribute('href')!, urlFor(path).href)).toBe(true) }) @@ -867,7 +930,7 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { }) it.each(PORTS.filter((port) => !port.parentLibrary && productAvailable(port, 'workspace') - && !['py', 'ruby', 'powershell', 'julia'].includes(port.slug))) + && KNOWN_PORTS.has(port.slug) && port.workspaceCliAvailability === 'local')) ('$name publishes workspace Guides and Examples browse pages', async (port) => { for (const page of pages().filter((entry) => entry.product === 'workspace' && entry.port === port.slug && ['guides', 'examples'].includes(entry.section))) await inspect(page.path, (document) => { @@ -990,7 +1053,7 @@ describe.skipIf(!SITE_BUILT)('assembled MCP and Workspace Manager docs', () => { expect(resolves(entry.url), entry.url).toBe(true) expect(resolves(entry.markdownUrl), entry.markdownUrl).toBe(true) expect(entry.url, `${root} canonical workspace API exports`).not.toMatch(/\/workspace\/api(?:\/|$)/) - expect(entry.url, `${root} legacy workspace Topics redirect excluded`).not.toMatch(legacyWorkspaceTopics) + expect(legacyWorkspaceTopics(entry.url), `${root} legacy workspace Topics redirect excluded`).toBe(false) if (root) expect(new URL(entry.url).pathname).toContain(`/${SITE_PREFIX}${root}`) } } diff --git a/site/test/prose-markdown.test.ts b/site/test/prose-markdown.test.ts index 8b7a92b53..e1a302a8e 100644 --- a/site/test/prose-markdown.test.ts +++ b/site/test/prose-markdown.test.ts @@ -34,6 +34,19 @@ function exampleBytes(markdown: string): string[] { } describe('prose Markdown links', () => { + it('keeps OCaml local filenames and output labels plain while linking source and Stdlib references', async () => { + const source = 'Save the example as `main.ml`. Save the interface as `main.mli`. Save the package as `example.opam`. Output: `editor:2`, `logs:1`. Read `json/libtmux_json.mli`, `List`, `Unix` and `Seq.filter`.' + const processor = await createMarkdownProcessor({ rehypePlugins: [rehypeApiLinks], syntaxHighlight: false }) + const html = (await processor.render(source, { frontmatter: { port: 'ocaml' } })).code + const markdown = linkProseMarkdown(source, 'ocaml') + const sourcePath = JSON.parse(readFileSync(new URL('../src/data/api/ocaml.paths.json', import.meta.url), 'utf8')) + const expected = [`https://github.com/${sourcePath.repo}/blob/${sourcePath.revision}/json/libtmux_json.mli`, + 'https://ocaml.org/manual/5.5/api/List.html', 'https://ocaml.org/manual/5.5/api/Unix.html', 'https://ocaml.org/manual/5.5/api/Seq.html#VALfilter'] + expect(urls(markdown)).toEqual(expected) + for (const href of expected) expect(html).toContain(`href="${href}"`) + for (const literal of ['main.ml', 'main.mli', 'example.opam', 'editor:2', 'logs:1']) expect(html).toContain(`${literal}`) + }) + it('links native commands through prose HTML and Markdown without claiming prose aliases', async () => { const source = 'Call tmux resize-pane. Use `$ tmux -L local run -b true` and `display-message`. Keep tmux has many panes.\n\n[Keep `run-shell`](https://example.com/authored).\n\nrun-shell\n\n`tmux run-shell true && tmux display-message hello`\n\n```sh\ntmux run-shell true\n```' const processor = await createMarkdownProcessor({ rehypePlugins: [rehypeApiLinks], syntaxHighlight: false }) @@ -362,8 +375,8 @@ describe('prose Markdown links', () => { it.each(Object.keys(PORT_BY_SLUG))('links a real %s declaration in its selected version', (port) => { const model = API_MODELS[port] - const name = port === 'powershell' ? 'New-TmuxServer' : 'Server' - const symbol = model.symbols.find((entry) => entry.name === name && (port === 'powershell' ? entry.command : !entry.parent))! + const name = port === 'powershell' ? 'New-TmuxServer' : port === 'ocaml' ? 'Libtmux_unix.Client' : 'Server' + const symbol = model.symbols.find((entry) => port === 'ocaml' ? entry.id === name : entry.name === name && (port === 'powershell' ? entry.command : !entry.parent))! expect(symbol, `${port} ${name} declaration`).toBeDefined() vi.stubEnv('LIBTMUX_DOCS_PORT', port) vi.stubEnv('LIBTMUX_DOCS_VERSION', 'next') diff --git a/site/test/stage-port-docs.outer.test.ts b/site/test/stage-port-docs.outer.test.ts index 7c7ab8f4f..fdfa3d0de 100644 --- a/site/test/stage-port-docs.outer.test.ts +++ b/site/test/stage-port-docs.outer.test.ts @@ -5,15 +5,16 @@ import { dirname, join } from 'node:path' import { expect, it } from 'vitest' import { stagedRoutesFor } from '../../scripts/stage-port-docs.mjs' import { PORTS } from '../src/lib/ports.ts' +import { SOURCE_GUIDE_PORTS } from '../src/lib/port-documentation.ts' const root = new URL('../../', import.meta.url).pathname const cachedRevision = 'a'.repeat(40) const files = ['scripts/stage-port-docs.mjs', 'site/src/lib/ports.ts', 'site/src/lib/site-root.ts', 'site/src/lib/cooldown.ts', 'site/src/lib/port-documentation.ts', 'site/src/lib/versions.ts'] -const stagedPorts = ['ruby', 'lua', 'powershell', 'julia', 'elixir', 'kotlin', 'scala', 'fsharp'] +const stagedPorts = SOURCE_GUIDE_PORTS -function fixture(slug: 'ruby' | 'lua' | 'kotlin', run: (fixture: { +function fixture(slug: 'ruby' | 'lua' | 'kotlin' | 'ocaml', run: (fixture: { directory: string; checkout: string; revision: string; write: (path: string, value: string) => void; artifact: (port: string, revision: string, label: string) => string; @@ -42,8 +43,8 @@ function fixture(slug: 'ruby' | 'lua' | 'kotlin', run: (fixture: { })) } let revision = 'b'.repeat(40) - if (slug === 'kotlin') { - for (const path of Object.keys(stagedRoutesFor(slug))) write(join(checkout, path), '# Guide\n\nfresh-kotlin\n') + if (['kotlin', 'ocaml'].includes(slug)) { + for (const path of Object.keys(stagedRoutesFor(slug))) write(join(checkout, path), `# Guide\n\nfresh-${slug}\n`) const git = (...args: string[]) => execFileSync('git', ['-C', checkout, ...args], { encoding: 'utf8', stdio: 'pipe' }).trim() git('init', '-q') git('add', '.') @@ -85,7 +86,7 @@ it('leaves the preview mount to Markdown while selecting the parent API version' }) }) -it.each(['ruby', 'lua', 'kotlin'] as const)('stages other caches before accepting only the selected %s source', (slug) => { +it.each(['ruby', 'lua', 'kotlin', 'ocaml'] as const)('stages other caches before accepting only the selected %s source', (slug) => { fixture(slug, ({ directory, checkout, revision, write, artifact, invoke }) => { const staged = join(directory, 'site/src/content/docs/_staged') const cache = join(directory, `site/src/data/port-guides/${slug}.json`) @@ -106,11 +107,13 @@ it.each(['ruby', 'lua', 'kotlin'] as const)('stages other caches before acceptin expect(explicit.stderr).toContain(`--cached cannot stage selected publication port ${slug}`) expect(readFileSync(cache, 'utf8')).toBe(cachedBytes) - if (slug !== 'kotlin') { + const fromSource = ['kotlin', 'ocaml'].includes(slug) + if (slug === 'ocaml') write(join(directory, `site/src/data/api/${slug}.json`), JSON.stringify({ revision })) + if (!fromSource) { write(join(directory, `site/src/data/api/${slug}.json`), JSON.stringify({ revision })) write(join(checkout, 'docs/_build/api.json'), artifact(slug, revision, 'fresh')) } - const fresh = invoke('--port', slug, ...(slug === 'kotlin' ? ['--from-source'] : [])) + const fresh = invoke('--port', slug, ...(fromSource ? ['--from-source'] : [])) expect(fresh.status, fresh.stderr).toBe(0) const route = Object.values(stagedRoutesFor(slug))[0].route const rendered = join(staged, slug, route, 'index.md') @@ -127,14 +130,17 @@ it.each(['ruby', 'lua', 'kotlin'] as const)('stages other caches before acceptin } const wrong = 'c'.repeat(40) - if (slug === 'kotlin') { + if (fromSource) { execFileSync('git', ['-C', checkout, '-c', 'user.name=Fixture', '-c', 'user.email=fixture@example.invalid', 'commit', '--allow-empty', '-qm', 'Different source'], { stdio: 'pipe' }) + if (slug === 'ocaml') write(join(directory, `site/src/data/api/${slug}.json`), JSON.stringify({ + revision: execFileSync('git', ['-C', checkout, 'rev-parse', 'HEAD'], { encoding: 'utf8' }).trim(), + })) } else { write(join(directory, `site/src/data/api/${slug}.json`), JSON.stringify({ revision: wrong })) write(join(checkout, 'docs/_build/api.json'), artifact(slug, wrong, 'wrong')) } - const rejected = invoke('--port', slug, ...(slug === 'kotlin' ? ['--from-source'] : [])) + const rejected = invoke('--port', slug, ...(fromSource ? ['--from-source'] : [])) expect(rejected.status).not.toBe(0) expect(rejected.stderr).toContain(`${slug}: expected source ${revision}, artifact records`) expect(readFileSync(rendered, 'utf8')).toBe(renderedBytes) diff --git a/site/test/stage-port-docs.test.ts b/site/test/stage-port-docs.test.ts index 6cab3c66d..7dcf531d3 100644 --- a/site/test/stage-port-docs.test.ts +++ b/site/test/stage-port-docs.test.ts @@ -127,8 +127,10 @@ describe('staged port guide links', () => { expect(index).toContain('title: "Guides"') expect(index).toContain('"label":"Overview","order":1') const cards = JSON.parse(/^cards: (.+)$/m.exec(index)![1]) - expect(cards[0].label).toBe('Getting started') - expect(cards[1].label).toBe('Attaching to tmux') + expect(cards[0].href).toMatch(/^\.\.\/guides\/(?:getting-started|overview)\/$/) + const setup = files.get(`${port}/${cards[0].href.slice(3)}index.md`)! + expect(cards[0].label).toBe(JSON.parse(/^title: (.+)$/m.exec(setup)![1])) + if (port !== 'ocaml') expect(cards[1].label).toBe('Attaching to tmux') for (const section of ['examples', 'topics']) { const page = files.get(`${port}/${section}/index.md`) if (!page) continue @@ -136,6 +138,13 @@ describe('staged port guide links', () => { expect(JSON.parse(/^cards: (.+)$/m.exec(page)![1]).length).toBeGreaterThan(0) } }) + it('keeps the OCaml setup title and source examples', () => { + const artifact = JSON.parse(readFileSync(new URL('../src/data/port-guides/ocaml.json', import.meta.url), 'utf8')) + const setup = artifact.guides.find((guide: { path: string }) => guide.path === 'docs/getting-started.md') + const page = stagedPortGuides('ocaml', artifact).get('ocaml/guides/getting-started/index.md')! + expect(page).toContain('title: "Install and run your first capture"') + for (const [example] of setup.content.matchAll(/^```[^\n]*\n[\s\S]*?^```/gm)) expect(page).toContain(example) + }) const routes = { 'docs/runtime.md': ['guides/source/runtime'], 'docs/query.md': ['guides/source/query'], diff --git a/site/test/symbol-form.test.ts b/site/test/symbol-form.test.ts index 4fbd3b1e9..86dde8ba9 100644 --- a/site/test/symbol-form.test.ts +++ b/site/test/symbol-form.test.ts @@ -18,6 +18,7 @@ interface Row { } const ROWS: Record = { + ocaml: { type: ['Libtmux::Snapshot.t', 'Libtmux.Snapshot.t'], method: ['Client.capture', 'Client.capture', 'Libtmux_unix.Client.capture'], function: ['Query.matching', 'Query.matching', 'Libtmux.Query.matching'], property: ['Generation.value', 'Generation.value', 'Libtmux.Generation.t.value'], member: ['error', 'No_match', 'Libtmux.Cardinality.error.No_match', 'No_match', 'No_match'] }, py: { type: ['libtmux::Server', 'libtmux.Server'], method: ['Server.list_sessions', 'Server.list_sessions()', 'libtmux.Server.list_sessions'], function: ['get_version', 'get_version()', 'libtmux.get_version'], property: ['Server.socket_name', 'Server.socket_name', 'libtmux.Server.socket_name'], member: ['Direction', 'UP', 'libtmux.Direction.UP', 'Direction.UP', 'Direction.UP'] }, ts: { type: ['server.Server', 'server.Server'], method: ['Server.listSessions', 'Server.listSessions()', 'server.Server.listSessions'], function: ['parseWorkspace', 'parseWorkspace()', 'config.parseWorkspace'], property: ['Pane.id', 'Pane.id', 'pane.Pane.id'], member: ['Direction', 'Up', 'constants.Direction.Up', 'Direction.Up', 'Direction.Up'] }, rs: { type: ['crate.Server', 'crate::Server'], method: ['Server.list_sessions', 'Server::list_sessions()', 'server.Server.list_sessions'], function: ['retry_until', 'retry_until()', 'test.retry_until'], property: ['Pane::id', 'Pane::id', 'pane.Pane.id'], member: ['Direction', 'Up', 'pane.Direction.Up', 'Direction::Up', 'Direction::Up'] }, diff --git a/site/test/tmux-library-usage.test.ts b/site/test/tmux-library-usage.test.ts index c86ad7022..cba46eeee 100644 --- a/site/test/tmux-library-usage.test.ts +++ b/site/test/tmux-library-usage.test.ts @@ -31,6 +31,26 @@ const usage = tmuxUsage('list-panes')! const cell = (scope: string, port: string) => usage.groups.find((group) => group.scope?.id === scope)!.ports.find((entry) => entry.port === port)?.links.map((link) => link.label) describe('the recorded usage', () => { + it('records OCaml execution methods from its public interfaces and keeps pure builders off the table', () => { + for (const backend of ['unix', 'eio']) { + const client = `Libtmux_${backend}.Client` + expect(TMUX_USAGE.ocaml.symbols[`${client}.capture`].map((use) => [use.command, use.scope])).toEqual([ + ['list-clients', null], ['list-panes', 'server'], ['list-sessions', null], ['list-windows', 'server'], + ]) + expect(TMUX_USAGE.ocaml.symbols[`${client}.rename_window`]).toEqual([expect.objectContaining({ command: 'rename-window', reviewed: true })]) + expect(TMUX_USAGE.ocaml.symbols[`${client}.capture_text`].find((use) => use.command === 'capture-pane')).toBeDefined() + expect(TMUX_USAGE.ocaml.symbols[`${client}.cycle_layout`].map((use) => [use.command, use.when])).toEqual([ + ['next-layout', 'direction is `Next'], ['previous-layout', 'direction is `Previous'], + ]) + } + const byId = new Map(API_MODELS.ocaml.symbols.map((symbol) => [symbol.publicId ?? symbol.id, symbol])) + for (const id of Object.keys(TMUX_USAGE.ocaml.symbols)) { + expect(byId.get(id)).toMatchObject({ kind: 'function', apiScope: 'exported' }) + expect(byId.get(id)?.source?.file).toMatch(/\.mli$/) + expect(id).not.toMatch(/^Libtmux\.(?:Operations|Snapshot|Session|Window)\./) + } + }) + /** Every command either pinned manual documents. */ const manualCommands = [...new Set(Object.values(TMUX_MANUALS).flatMap((manual) => manual.commands.map((command) => command.name)))].sort() diff --git a/site/test/tmux-usage-derive.test.ts b/site/test/tmux-usage-derive.test.ts index 70e3cdb6c..9cd8610ee 100644 --- a/site/test/tmux-usage-derive.test.ts +++ b/site/test/tmux-usage-derive.test.ts @@ -8,6 +8,7 @@ import { forwardUsage } from '../../scripts/lib/tmux-usage-forward.mjs' import { carriesCommand, memberWords, selects, settleCandidates, sweepCandidates } from '../../scripts/lib/tmux-usage-sweep.mjs' import { scanElixir, scanFSharp, scanJulia, tokenizeElixir } from '../../scripts/lib/tmux-usage-lexical.mjs' import { guardFlag, libraryScopes, scopeProblems } from '../../scripts/lib/tmux-usage-scopes.mjs' +import { bindOcamlDefinitions } from '../../scripts/lib/tmux-usage-ocaml.mjs' type Forwarded = { symbol: string; command: string; scope: string | null; evidence: string[]; hops: number; via: { port: string; symbol: string; evidence: string[]; reviewed?: boolean } } type Scanned = { name: string; owner?: string; start: number; end: number; sites: { command: string; line: number; flags: string }[]; calls: Map; receivers: Map> } @@ -18,6 +19,66 @@ const scopes = readFileSync(new URL('../src/data/tmux-usage/scopes.json', import const spec = { scopes: libraryScopes(JSON.parse(scopes).commands['list-panes']) } describe('scanning a send site', () => { + it('reads OCaml curried dispatch calls without crediting comments, labels or local bindings', async () => { + const { functions } = await scanSource({ + grammar: 'ocaml', known, commands: new Set(['list-panes']), dispatch: new Set(['metadata']), + text: [ + 'module Client = struct', + ' (* metadata client "list-panes" [ "-s" ] *)', + ' let capture client =', + ' let rows = metadata client "list-panes" [ "-a" ] in', + ' rows', + ' let label client = Error ("list-panes")', + 'end', + ].join('\n'), + }) + expect(functions.map((fn) => fn.name)).toEqual(['capture', 'label']) + expect(functions[0]).toMatchObject({ name: 'capture', owner: 'Client' }) + expect(functions[0].sites).toEqual([{ command: 'list-panes', line: 4, flags: 'a', depth: 0, dispatch: { line: 4, name: 'metadata' } }]) + expect(functions[1].sites).toEqual([]) + expect(functions[0].calls.get('metadata')).toBe(4) + }) + + it('resolves OCaml public interfaces through aliases and functor includes without matching another module', async () => { + const sources = new Map([ + ['lib/libtmux.ml', 'module Operations = Commands.Operations'], + ['lib/commands.ml', 'module Operations = struct let rename_window target = Command.Rename_window target end'], + ['unix/libtmux_unix.ml', 'module Client = struct\nlet capture c = Acquisition.snapshot c\ninclude Generated_operations.Make (struct let run x = x end)\nend'], + ['unix/acquisition.ml', 'open Connection\nlet snapshot c = metadata c "list-panes" [ "-a" ]'], + ['unix/connection.ml', 'let metadata c command flags = transport c command flags'], + ['unix/generated_operations.ml', 'module Make (Client : sig val run : unit -> unit end) = struct\nlet rename_window target = Client.run target\nend'], + ['eio/generated_operations.ml', 'module Make = struct let rename_window target = target end'], + ['unix/private.ml', 'let snapshot c = metadata c "list-panes" [ "-s" ]'], + ]) + const functions: (Awaited>['functions'][number] & { file: string })[] = [] + const modules: { file: string; path: string; target?: string; include?: boolean; open?: boolean }[] = [] + for (const [file, text] of sources) { + const scanned = await scanSource({ grammar: 'ocaml', text, commands: new Set(['list-panes']), known, dispatch: new Set(['metadata']) }) + functions.push(...scanned.functions.map((fn) => ({ ...fn, file }))) + modules.push(...(scanned.modules ?? []).map((module) => ({ ...module, file }))) + } + const symbols = [ + { id: 'Libtmux.Operations.rename_window', name: 'rename_window', file: 'lib/libtmux.mli', line: 100 }, + { id: 'Libtmux_unix.Client.capture', name: 'capture', file: 'unix/libtmux_unix.mli', line: 100 }, + { id: 'Libtmux_unix.Client.rename_window', name: 'rename_window', file: 'unix/libtmux_unix.mli', line: 200 }, + ] + bindOcamlDefinitions({ symbols, functions, modules, sources }) + const definitions = definitionsOf(functions, symbols) + expect([...definitions].map(([fn, own]) => [fn.file, fn.name, own[0].id])).toEqual([ + ['lib/commands.ml', 'rename_window', 'Libtmux.Operations.rename_window'], + ['unix/libtmux_unix.ml', 'capture', 'Libtmux_unix.Client.capture'], + ['unix/generated_operations.ml', 'rename_window', 'Libtmux_unix.Client.rename_window'], + ]) + const entries = deriveUsage({ command: 'list-panes', spec, functions, symbols }).entries + expect(entries.map((entry) => [entry.symbol, entry.scope])).toEqual([['Libtmux_unix.Client.capture', 'server']]) + expect(entries[0].evidence).toEqual(['unix/acquisition.ml:2', 'unix/libtmux_unix.ml:2']) + expect(deriveUsage({ command: 'list-panes', spec, functions, symbols: [] }).entries).toEqual([]) + }) + + it('refuses OCaml syntax errors instead of deriving an empty result', async () => { + await expect(scan('ocaml', 'module Client = struct let capture =')).rejects.toThrow(/could not parse/) + }) + it('reads the flags written beside the command and ignores a docstring and a default value', async () => { const { functions } = await scan('python', [ 'class Session:', diff --git a/site/test/workspace-picker.outer.test.ts b/site/test/workspace-picker.outer.test.ts index c21130095..cce6b8240 100644 --- a/site/test/workspace-picker.outer.test.ts +++ b/site/test/workspace-picker.outer.test.ts @@ -4,7 +4,7 @@ import type { AddressInfo } from 'node:net' import { createComponent, renderTemplate } from 'astro/runtime/server/index.js' import { chromium, type Browser, type BrowserContext, type Page } from 'playwright' import ts from 'typescript' -import { afterAll, beforeAll, describe, expect, it } from 'vitest' +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest' import { presetOptions, workspaceShowcase } from '../src/lib/workspace-showcase' import { loadAstroTemplate, renderAstroTemplate } from './astro-templates' @@ -86,11 +86,16 @@ const ADDRESS = 'http://workspace.test/en/rs/latest/workspace/' let browser: Browser let page: string +// Each case owns a browser context; keep at most two cases active. +vi.setConfig({ maxConcurrency: 2 }) + beforeAll(async () => { browser = await chromium.launch({ headless: true }) page = await html() }, 60_000) -afterAll(async () => { await browser?.close() }) +afterAll(async () => { + try { await browser?.close() } finally { vi.resetConfig() } +}) async function open(context: BrowserContext, path = '', body = page): Promise { await context.route('http://workspace.test/**', (route) => route.fulfill({ contentType: 'text/html', body })) @@ -197,7 +202,7 @@ const strip = (tab: Page, preset: string) => tab.evaluate((id) => { }, preset) describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { - it('has presets of different heights to reserve for', async () => { + it.concurrent('has presets of different heights to reserve for', async () => { const context = await browser.newContext() const tab = await open(context) const natural = await tab.evaluate(() => [...document.querySelectorAll('.ws-picker__panel')].map((panel) => panel.querySelector('pre')!.scrollHeight)) @@ -207,7 +212,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) for (const width of WIDTHS) { - it(`reserves the tallest preset's height at ${width} px, so no choice, window, search or roll shifts anything`, async () => { + it.concurrent(`reserves the tallest preset's height at ${width} px, so no choice, window, search or roll shifts anything`, async () => { const context = await browser.newContext({ viewport: { width, height: 900 } }) await context.addInitScript(layoutShift) const tab = await open(context) @@ -278,12 +283,12 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { return total } - it('shifts nothing, because the picker shows once every preset is parsed', async () => { + it.concurrent('shifts nothing, because the picker shows once every preset is parsed', async () => { expect(page).toContain('ws-picker__end') expect(await loaded(page)).toBe(0) }) - it('does shift when the picker shows as it is parsed, so the check can fail', async () => { + it.concurrent('does shift when the picker shows as it is parsed, so the check can fail', async () => { const shown = page.replace(/\.ws-picker:not\(:has\(\.ws-picker__end\)\)/g, '.ws-never') expect(shown).not.toBe(page) expect(await loaded(shown)).toBeGreaterThan(0) @@ -291,7 +296,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) for (const width of [1440, 1024, 768]) { - it(`puts the configuration and the drawing side by side at equal height at ${width} px`, async () => { + it.concurrent(`puts the configuration and the drawing side by side at equal height at ${width} px`, async () => { const context = await browser.newContext({ viewport: { width, height: 900 } }) const tab = await open(context) for (const preset of IDS) { @@ -309,7 +314,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) } - it('stacks the configuration over the drawing on a phone', async () => { + it.concurrent('stacks the configuration over the drawing on a phone', async () => { const context = await browser.newContext({ viewport: { width: 390, height: 900 } }) const tab = await open(context) const { config, layout, stage } = await measure(tab) @@ -319,7 +324,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { await context.close() }) - it('keeps a long file inside its panel, where it scrolls', async () => { + it.concurrent('keeps a long file inside its panel, where it scrolls', async () => { const context = await browser.newContext({ viewport: { width: 1440, height: 900 } }) const tab = await open(context) await choose(tab, 'start-directory') @@ -333,7 +338,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) for (const width of [320, 390, 480, 768, 1024, 1440]) { - it(`never scrolls the page sideways at ${width} px, whichever preset shows, with the menu shut or open`, async () => { + it.concurrent(`never scrolls the page sideways at ${width} px, whichever preset shows, with the menu shut or open`, async () => { const context = await browser.newContext({ viewport: { width, height: 800 } }) const tab = await open(context) for (const preset of IDS) { @@ -352,7 +357,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { } for (const width of [320, 390, 480, 768, 1440]) { - it(`paints nothing of a preset that is not shown, and takes no pointer or focus from it, at ${width} px`, async () => { + it.concurrent(`paints nothing of a preset that is not shown, and takes no pointer or focus from it, at ${width} px`, async () => { const context = await browser.newContext({ viewport: { width, height: 800 } }) const tab = await open(context) for (const preset of IDS) { @@ -374,7 +379,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) } - it('catches a shown window that paints through a hidden preset, as the first stylesheet let it', async () => { + it.concurrent('catches a shown window that paints through a hidden preset, as the first stylesheet let it', async () => { const bad = STYLES.replace(/html\[data-js\] \.ws-layout__stack > \.ws-win:not\(\[data-active\]\) \{\s*visibility: hidden;\s*\}/, 'html[data-js] .ws-layout__stack > .ws-win { visibility: hidden; }\nhtml[data-js] .ws-layout__stack > .ws-win[data-active] { visibility: visible; }') expect(bad).not.toBe(STYLES) const context = await browser.newContext({ viewport: { width: 480, height: 800 } }) @@ -386,7 +391,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) for (const width of [320, 390, 480, 768, 1024, 1440]) { - it(`draws the window tabs above the drawing, never over it, with one caption, at ${width} px`, async () => { + it.concurrent(`draws the window tabs above the drawing, never over it, with one caption, at ${width} px`, async () => { const context = await browser.newContext({ viewport: { width, height: 800 } }) const tab = await open(context) for (const preset of IDS) { @@ -429,7 +434,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) } - it('scrolls the window tabs of a preset with many inside their strip on a phone, and brings the one chosen into view', async () => { + it.concurrent('scrolls the window tabs of a preset with many inside their strip on a phone, and brings the one chosen into view', async () => { const context = await browser.newContext({ viewport: { width: 390, height: 900 } }) const tab = await open(context, '?preset=start-directory') const strip = await tab.evaluate(() => { @@ -451,7 +456,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) for (const width of [320, 390, 480, 768, 1024, 1440]) { - it(`shows the scroll buttons and the slider only on a strip that overflows, with the right ones at each end, at ${width} px`, async () => { + it.concurrent(`shows the scroll buttons and the slider only on a strip that overflows, with the right ones at each end, at ${width} px`, async () => { const context = await browser.newContext({ viewport: { width, height: 800 }, reducedMotion: 'reduce' }) const tab = await open(context) let overflowed = 0 @@ -490,7 +495,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) } - it('shows no controls on a strip whose tabs fit', async () => { + it.concurrent('shows no controls on a strip whose tabs fit', async () => { const context = await browser.newContext({ viewport: { width: 1440, height: 800 } }) const tab = await open(context, '?preset=window-index') const now = await strip(tab, 'window-index') @@ -501,7 +506,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) for (const width of [390, 768, 1440]) { - it(`scrolls about one tab with a click and keeps the slider in step, at ${width} px`, async () => { + it.concurrent(`scrolls about one tab with a click and keeps the slider in step, at ${width} px`, async () => { const context = await browser.newContext({ viewport: { width, height: 900 }, reducedMotion: 'reduce' }) await context.addInitScript(layoutShift) const tab = await open(context, '?preset=start-directory') @@ -550,7 +555,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) } - it('drags the thumb to scroll the strip, and pages when the track beside it is pressed', async () => { + it.concurrent('drags the thumb to scroll the strip, and pages when the track beside it is pressed', async () => { const context = await browser.newContext({ viewport: { width: 390, height: 900 }, reducedMotion: 'reduce' }) const tab = await open(context, '?preset=start-directory') await tab.locator('.ws-picker__panel[data-preset="start-directory"] .ws-layout').scrollIntoViewIfNeeded() @@ -579,7 +584,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) for (const width of [320, 390, 480, 768, 1440]) { - it(`keeps the selected window's tab in view, clear of the buttons, as the arrow keys move along the tabs, at ${width} px`, async () => { + it.concurrent(`keeps the selected window's tab in view, clear of the buttons, as the arrow keys move along the tabs, at ${width} px`, async () => { const context = await browser.newContext({ viewport: { width, height: 900 }, reducedMotion: 'reduce' }) const tab = await open(context, '?preset=start-directory') await tab.focus('.ws-picker__panel[data-preset="start-directory"] [role="tab"][aria-selected="true"]') @@ -617,7 +622,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { }) } - it('keeps the buttons focusable and labelled, and hands focus to the tab when the one that has it goes', async () => { + it.concurrent('keeps the buttons focusable and labelled, and hands focus to the tab when the one that has it goes', async () => { const context = await browser.newContext({ viewport: { width: 390, height: 900 }, reducedMotion: 'reduce' }) const tab = await open(context, '?preset=start-directory') const end = '.ws-picker__panel[data-preset="start-directory"] .ws-layout__scroll--end' @@ -636,7 +641,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { await context.close() }) - it('fades the strip with the colour of the card in both colour schemes', async () => { + it.concurrent('fades the strip with the colour of the card in both colour schemes', async () => { const context = await browser.newContext({ viewport: { width: 390, height: 900 } }) const tab = await open(context, '?preset=start-directory') const surface = (scheme: 'light' | 'dark') => tab.evaluate((mode) => { @@ -656,7 +661,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { await context.close() }) - it('shows the current preset on the menu, with the roll button beside it, as the front page does', async () => { + it.concurrent('shows the current preset on the menu, with the roll button beside it, as the front page does', async () => { for (const width of [1440, 390]) { const context = await browser.newContext({ viewport: { width, height: 900 } }) const tab = await open(context) @@ -671,7 +676,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { } }) - it('opens a searchable menu of every preset, each row a tile, a name and one line', async () => { + it.concurrent('opens a searchable menu of every preset, each row a tile, a name and one line', async () => { const context = await browser.newContext({ viewport: { width: 1440, height: 900 } }) const tab = await open(context) await tab.click('.ws-picker__menu > summary') @@ -694,7 +699,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { await context.close() }) - it('filters the menu by name, summary and key, says when nothing matches, and closes with Escape', async () => { + it.concurrent('filters the menu by name, summary and key, says when nothing matches, and closes with Escape', async () => { const context = await browser.newContext({ viewport: { width: 1440, height: 900 } }) const tab = await open(context) const shownRows = () => tab.evaluate(() => [...document.querySelectorAll('[data-preset-option]')].filter((row) => !row.hidden).map((row) => row.dataset.presetOption)) @@ -717,7 +722,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { await context.close() }) - it('chooses from the menu by keyboard: search, arrow down, enter', async () => { + it.concurrent('chooses from the menu by keyboard: search, arrow down, enter', async () => { const context = await browser.newContext() const tab = await open(context) await tab.focus('.ws-picker__menu > summary') @@ -742,7 +747,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { await context.close() }) - it('rolls to a different preset every time, with the front page\'s own button', async () => { + it.concurrent('rolls to a different preset every time, with the front page\'s own button', async () => { const context = await browser.newContext() const tab = await open(context) expect(await tab.locator('[data-action="roll"]').evaluate((button) => button.classList.contains('lm-reroll') && button.textContent!.includes('🎲'))).toBe(true) @@ -761,7 +766,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { await context.close() }) - it('remembers the choice per port, writes it to the address and opens on it again', async () => { + it.concurrent('remembers the choice per port, writes it to the address and opens on it again', async () => { const context = await browser.newContext() const tab = await open(context) await choose(tab, 'environment') @@ -775,7 +780,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { await context.close() }) - it('shows the remembered or named preset before the picker\'s own script runs, so nothing flashes', async () => { + it.concurrent('shows the remembered or named preset before the picker\'s own script runs, so nothing flashes', async () => { const context = await browser.newContext() const tab = await open(context) await choose(tab, 'environment') @@ -799,7 +804,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { await context.close() }) - it('opens on the preset the address names in both colour schemes, with all of its windows', async () => { + it.concurrent('opens on the preset the address names in both colour schemes, with all of its windows', async () => { const context = await browser.newContext() const tab = await open(context) await choose(tab, 'environment') @@ -816,7 +821,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { await context.close() }) - it('shows the first preset when storage is unavailable, and still swaps', async () => { + it.concurrent('shows the first preset when storage is unavailable, and still swaps', async () => { const context = await browser.newContext() await context.addInitScript(() => { Object.defineProperty(window, 'localStorage', { get() { throw new DOMException('denied', 'SecurityError') } }) @@ -834,7 +839,7 @@ describe('the workspace picker in Chromium', { timeout: 60_000 }, () => { await context.close() }) - it('without script shows the first preset alone and every example in full below it', async () => { + it.concurrent('without script shows the first preset alone and every example in full below it', async () => { const context = await browser.newContext({ javaScriptEnabled: false }) const tab = await open(context) const panels = tab.locator('.ws-picker__panel') @@ -897,7 +902,7 @@ describe('the workspace picker as a landing page tab in Chromium', { timeout: 60 beforeAll(async () => { page = await landing() }) for (const width of [1440, 768, 390]) { - it(`ends every preset's evidence where the stage ends, and moves nothing below, at ${width} px`, async () => { + it.concurrent(`ends every preset's evidence where the stage ends, and moves nothing below, at ${width} px`, async () => { const context = await browser.newContext({ viewport: { width, height: 900 } }) await context.addInitScript(layoutShift) const tab = await open(context, '', page) @@ -920,7 +925,7 @@ describe('the workspace picker as a landing page tab in Chromium', { timeout: 60 }) } - it('shows the opening preset, with its command and evidence, to a reader without script', async () => { + it.concurrent('shows the opening preset, with its command and evidence, to a reader without script', async () => { const context = await browser.newContext({ viewport: { width: 1280, height: 900 }, javaScriptEnabled: false }) const tab = await open(context, '', page) const panels = tab.locator('.ws-picker__panel') @@ -937,7 +942,7 @@ describe('the workspace picker as a landing page tab in Chromium', { timeout: 60 await context.close() }) - it('leaves the evidence off the foot of the stage when the panel is not a column, so the check can fail', async () => { + it.concurrent('leaves the evidence off the foot of the stage when the panel is not a column, so the check can fail', async () => { const bad = STYLES.replace(/html\[data-js\] \.ws-picker--landing \.ws-picker__panel \{[^}]*\}/, '') expect(bad).not.toBe(STYLES) const context = await browser.newContext({ viewport: { width: 1280, height: 900 } }) diff --git a/site/test/workspace-showcase.test.ts b/site/test/workspace-showcase.test.ts index 7d2ea3c92..8320a1f8c 100644 --- a/site/test/workspace-showcase.test.ts +++ b/site/test/workspace-showcase.test.ts @@ -424,9 +424,9 @@ describe('the overview page', () => { describe('a workspace overview with no tested files', () => { const page = readFileSync(new URL('../src/components/docs/DocPage.astro', import.meta.url), 'utf8') - it('keeps the old overview and says tested example files are coming', () => { - expect(page).toMatch(/isWorkspaceOverview && !workspaceExamples && \(\s*]*data-workspace-coming>Tested example workspace files for this port are coming\.<\/p>/) - // The note is for the ports whose own tests hold no quotable file, and for no other. + it('keeps the overview and shows the placeholder only without examples or a native guide', () => { + expect(page).toMatch(/isWorkspaceOverview && !workspaceExamples && !hasWorkspaceGuide && \(\s*]*data-workspace-coming>Tested example workspace files for this port are coming\.<\/p>/) + // Missing showcase files do not imply that a port lacks a native guide. const empty = Object.entries(data.ports).filter(([, block]) => block.examples.length === 0).map(([port]) => port) expect(empty.length).toBeGreaterThan(0) for (const port of empty) expect(workspaceShowcase(port), port).toBeUndefined() diff --git a/site/vitest.config.ts b/site/vitest.config.ts index b88f11555..215c4bd4b 100644 --- a/site/vitest.config.ts +++ b/site/vitest.config.ts @@ -7,6 +7,7 @@ export default defineConfig({ // Astro supplies this virtual module inside a build; tests that read the project root use a stand-in. resolve: { alias: { 'astro:config/server': fileURLToPath(new URL('./test/astro-config-server.ts', import.meta.url)) } }, test: { + execArgv: ['--import', new URL('./test/markdown-conditions.mjs', import.meta.url).href], // Reuse transforms of the generated API and protocol catalogs across workers. fsModuleCache: true, // Report skipped assembly suites beside the summary, outside worker output.