{
  "$schema": "https://pi-tui.ratstack.sh/schema/pattern.schema.json",
  "aka": [
    "Temporary input listener"
  ],
  "animated": false,
  "apis": [
    {
      "name": "ctx.ui.onTerminalInput",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#interact-with-the-user"
    },
    {
      "name": "ctx.ui.setWidget",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#interact-with-the-user"
    },
    {
      "name": "ExtensionContext.mode",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#account-for-each-mode"
    },
    {
      "name": "onTerminalInput",
      "url": null
    },
    {
      "name": "setWidget",
      "url": null
    },
    {
      "name": "matchesKey",
      "url": null
    }
  ],
  "applicability": [
    "Use this when foreground progress or a visible widget needs stop or detach controls."
  ],
  "category": "keys",
  "categoryLabel": "Keys and focus",
  "consequences": [
    "Temporary stop or detach controls can coexist with the normal editor.",
    "Raw input interception needs TUI guards and bounded subscription lifetime."
  ],
  "family": "lifecycle",
  "familyLabel": "Lifecycle",
  "id": "input-lease",
  "implementation": [
    "Subscribe only in TUI mode.",
    "Always unsubscribe on completion or cancellation."
  ],
  "intent": "Intercept raw terminal controls only while their owning operation is active.",
  "jsonUrl": "https://pi-tui.ratstack.sh/patterns/input-lease.json",
  "kind": "screen",
  "knownUses": [
    {
      "example": "terminal-progress-interception",
      "moreRefs": 0,
      "refs": [
        {
          "file": "extensions/handover/index.ts",
          "lines": "700-747",
          "sha": "17cce138",
          "url": "https://github.com/nicobailon/dot314/blob/17cce138f3f687211d0485d204408a9650953c61/extensions/handover/index.ts#L700-L747"
        }
      ],
      "repo": "dot314",
      "repoUrl": "https://github.com/nicobailon/dot314",
      "title": "Bound input interception to foreground progress"
    },
    {
      "example": "terminal-progress-interception",
      "moreRefs": 0,
      "refs": [
        {
          "file": "subagent-step.ts",
          "lines": "443-462",
          "sha": "6da20591",
          "url": "https://github.com/nicobailon/pi-prompt-template-model/blob/6da205917e549cbe8e855c1d241c616ae1fb1627/subagent-step.ts#L443-L462"
        },
        {
          "file": "subagent-step.ts",
          "lines": "533-558",
          "sha": "6da20591",
          "url": "https://github.com/nicobailon/pi-prompt-template-model/blob/6da205917e549cbe8e855c1d241c616ae1fb1627/subagent-step.ts#L533-L558"
        },
        {
          "file": "subagent-step.ts",
          "lines": "748-762",
          "sha": "6da20591",
          "url": "https://github.com/nicobailon/pi-prompt-template-model/blob/6da205917e549cbe8e855c1d241c616ae1fb1627/subagent-step.ts#L748-L762"
        }
      ],
      "repo": "pi-prompt-template-model",
      "repoUrl": "https://github.com/nicobailon/pi-prompt-template-model",
      "title": "Bound input interception to foreground progress"
    },
    {
      "example": "terminal-progress-interception",
      "moreRefs": 0,
      "refs": [
        {
          "file": "index.ts",
          "lines": "63-75",
          "sha": "0194b7a3",
          "url": "https://github.com/nicobailon/pi-prune/blob/0194b7a3eb87db71648fef672effbfb65411a82a/index.ts#L63-L75"
        },
        {
          "file": "index.ts",
          "lines": "131-132",
          "sha": "0194b7a3",
          "url": "https://github.com/nicobailon/pi-prune/blob/0194b7a3eb87db71648fef672effbfb65411a82a/index.ts#L131-L132"
        }
      ],
      "repo": "pi-prune",
      "repoUrl": "https://github.com/nicobailon/pi-prune",
      "title": "Bound input interception to foreground progress"
    },
    {
      "example": "terminal-progress-interception",
      "moreRefs": 0,
      "refs": [
        {
          "file": "src/slash/slash-commands.ts",
          "lines": "350-440",
          "sha": "6826b054",
          "url": "https://github.com/nicobailon/pi-subagents/blob/6826b0545216077195ae8ffe468a6434715814b7/src/slash/slash-commands.ts#L350-L440"
        },
        {
          "file": "src/slash/slash-commands.ts",
          "lines": "770-835",
          "sha": "6826b054",
          "url": "https://github.com/nicobailon/pi-subagents/blob/6826b0545216077195ae8ffe468a6434715814b7/src/slash/slash-commands.ts#L770-L835"
        }
      ],
      "repo": "pi-subagents",
      "repoUrl": "https://github.com/nicobailon/pi-subagents",
      "title": "Bound input interception to foreground progress"
    },
    {
      "example": "fleet-status-terminal-input",
      "moreRefs": 0,
      "refs": [
        {
          "file": "src/tui/fleet-status.ts",
          "lines": "575-600",
          "sha": "6826b054",
          "url": "https://github.com/nicobailon/pi-subagents/blob/6826b0545216077195ae8ffe468a6434715814b7/src/tui/fleet-status.ts#L575-L600"
        },
        {
          "file": "src/tui/fleet-status.ts",
          "lines": "1080-1130",
          "sha": "6826b054",
          "url": "https://github.com/nicobailon/pi-subagents/blob/6826b0545216077195ae8ffe468a6434715814b7/src/tui/fleet-status.ts#L1080-L1130"
        }
      ],
      "repo": "pi-subagents",
      "repoUrl": "https://github.com/nicobailon/pi-subagents",
      "title": "Install terminal input listeners with explicit teardown"
    }
  ],
  "linkedFrom": [
    {
      "how": "intercepts raw input instead",
      "id": "action-compass",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/action-compass.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/action-compass.md",
      "name": "Action Compass",
      "url": "https://pi-tui.ratstack.sh/patterns/action-compass/"
    }
  ],
  "links": {
    "agentGuide": "https://pi-tui.ratstack.sh/llms.txt",
    "index": "https://pi-tui.ratstack.sh/patterns.md",
    "skill": "https://pi-tui.ratstack.sh/skills/build-pi-tui-component.md"
  },
  "mdUrl": "https://pi-tui.ratstack.sh/patterns/input-lease.md",
  "motivation": "Foreground progress controls and fleet widgets must remove terminal listeners after their operation ends.",
  "name": "Input Lease",
  "participants": [
    {
      "name": "ctx.ui.onTerminalInput",
      "role": "Installs a raw-input handler and returns its unsubscriber.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#interact-with-the-user"
    },
    {
      "name": "ctx.ui.setWidget",
      "role": "Mounts, replaces or clears one near-editor widget.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#interact-with-the-user"
    },
    {
      "name": "ExtensionContext.mode",
      "role": "Separates TUI from RPC, JSON and print modes.",
      "url": "https://github.com/earendil-works/pi/blob/v1.0.3/packages/coding-agent/docs/extensions.md#account-for-each-mode"
    },
    {
      "name": "Unsubscriber",
      "role": "Releases temporary interception when its owner ends.",
      "url": null
    }
  ],
  "pi": "1.0.3",
  "related": [
    {
      "how": "resolves configurable component actions",
      "id": "action-compass",
      "jsonUrl": "https://pi-tui.ratstack.sh/patterns/action-compass.json",
      "mdUrl": "https://pi-tui.ratstack.sh/patterns/action-compass.md",
      "name": "Action Compass",
      "url": "https://pi-tui.ratstack.sh/patterns/action-compass/"
    }
  ],
  "sampleCode": {
    "code": "// Input Lease: release raw terminal interception when its operation ends.\nimport { matchesKey, Key } from \"@earendil-works/pi-tui\";\nimport type { PatternStory } from \"../../../src/pattern.ts\";\n\nexport const story: PatternStory = {\n  id: \"input-lease\", title: \"Input Lease\", kind: \"screen\",\n  apis: [\"onTerminalInput\", \"setWidget\", \"matchesKey\"],\n  states: [\n    { id: \"active\", label: \"Temporary controls\" },\n    { id: \"consumed\", label: \"Control handled\", steps: [\n      { type: \"keys\", data: \"\\x04\" }, { type: \"action\", name: \"assert-consumed\" },\n    ] },\n    { id: \"finished\", label: \"Listener removed\", steps: [\n      { type: \"action\", name: \"finish\" }, { type: \"text\", text: \"Review detached output\" },\n      { type: \"action\", name: \"assert-released\" },\n    ] },\n  ],\n  setup({ ui, mode, theme, action }) {\n    ui.setEditorText(\"Draft: \");\n    ui.setWidget(\"task\", [theme.fg(\"accent\", \"Parser checks · running\"),\n      theme.fg(\"muted\", \"Ctrl+D detaches · editor stays usable\")]);\n    // Lifecycle: active -> detached -> finished; cleanup is idempotent.\n    let unsubscribe: (() => void) | undefined;\n    let interceptedInputs = 0, inputsAtRelease = 0;\n    if (mode === \"tui\") unsubscribe = ui.onTerminalInput(data => {\n      interceptedInputs++;\n      if (!matchesKey(data, Key.ctrl(\"d\"))) return;\n      ui.setWidget(\"task\", [theme.fg(\"success\", \"Detached · checks run in background\"),\n        theme.fg(\"muted\", \"Ctrl+D consumed; draft unchanged\")]);\n      return { consume: true };\n    });\n    action(\"assert-consumed\", () => {\n      if (interceptedInputs !== 1 || ui.getEditorText() !== \"Draft: \") throw new Error(\"Control was not consumed\");\n    });\n    const release = () => { unsubscribe?.(); unsubscribe = undefined; };\n    action(\"finish\", () => {\n      release();\n      inputsAtRelease = interceptedInputs;\n      ui.setWidget(\"task\", [theme.fg(\"success\", \"Checks done · input lease released\")]);\n    });\n    action(\"assert-released\", () => {\n      if (interceptedInputs !== inputsAtRelease) throw new Error(\"Input listener survived cleanup\");\n      if (ui.getEditorText() !== \"Draft: Review detached output\") throw new Error(\"Editor did not reclaim input\");\n    });\n    return release;\n  },\n};\n",
    "lang": "ts",
    "path": "stories/patterns/lifecycle/input-lease.ts"
  },
  "states": [
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Input Lease, Temporary controls state, 40 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/active-40-dark.1cd6d63e2ea4.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Input Lease, Temporary controls state, 40 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/active-40-light.591e78008ad2.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Input Lease, Temporary controls state, 60 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/active-60-dark.ef9455932073.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Input Lease, Temporary controls state, 60 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/active-60-light.c68e689e47cd.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Input Lease, Temporary controls state, 80 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/active-80-dark.a01417819628.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Input Lease, Temporary controls state, 80 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/active-80-light.85f7d666f1db.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Input Lease, Temporary controls state, 120 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/active-120-dark.a62bb5839eac.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Input Lease, Temporary controls state, 120 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/active-120-light.4e8391165d8c.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Show a synthetic running task and its cancel or detach hint.",
      "id": "active",
      "label": "Temporary controls",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Input Lease, Control handled state, 40 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/consumed-40-dark.7dd7c923b876.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Input Lease, Control handled state, 40 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/consumed-40-light.5bcc7ace2754.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Input Lease, Control handled state, 60 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/consumed-60-dark.7773abc282b4.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Input Lease, Control handled state, 60 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/consumed-60-light.624f42bc250e.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Input Lease, Control handled state, 80 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/consumed-80-dark.3bf789ad37b5.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Input Lease, Control handled state, 80 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/consumed-80-light.05fd6086421a.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Input Lease, Control handled state, 120 columns, dark theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/consumed-120-dark.dc7ef5633057.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Input Lease, Control handled state, 120 columns, light theme, 11 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 484,
          "rows": 11,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/consumed-120-light.354ea620c326.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Consume a task-specific control and update its visible state.",
      "id": "consumed",
      "label": "Control handled",
      "problems": []
    },
    {
      "dont": false,
      "expectFail": [],
      "frames": [
        {
          "alt": "Input Lease, Listener removed state, 40 columns, dark theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/finished-40-dark.e32715385f61.webp",
          "theme": "dark",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Input Lease, Listener removed state, 40 columns, light theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/finished-40-light.5b11c87f32b2.webp",
          "theme": "light",
          "w": 800,
          "width": 40
        },
        {
          "alt": "Input Lease, Listener removed state, 60 columns, dark theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/finished-60-dark.3f257d2b8e8d.webp",
          "theme": "dark",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Input Lease, Listener removed state, 60 columns, light theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/finished-60-light.eceac85f38d0.webp",
          "theme": "light",
          "w": 1200,
          "width": 60
        },
        {
          "alt": "Input Lease, Listener removed state, 80 columns, dark theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/finished-80-dark.9626439684f8.webp",
          "theme": "dark",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Input Lease, Listener removed state, 80 columns, light theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/finished-80-light.58cf1eb8fa54.webp",
          "theme": "light",
          "w": 1600,
          "width": 80
        },
        {
          "alt": "Input Lease, Listener removed state, 120 columns, dark theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/finished-120-dark.faff04f5dfd2.webp",
          "theme": "dark",
          "w": 2400,
          "width": 120
        },
        {
          "alt": "Input Lease, Listener removed state, 120 columns, light theme, 10 rows",
          "animated": false,
          "animation": null,
          "checks": [
            {
              "evidence": [],
              "name": "width",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "style-leak",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "hard-coded-colour",
              "status": "pass",
              "verdict": "pass"
            },
            {
              "evidence": [],
              "name": "height",
              "status": "pass",
              "verdict": "pass"
            }
          ],
          "h": 440,
          "rows": 10,
          "still": "https://pi-tui.ratstack.sh/frames/input-lease/finished-120-light.0984d37531eb.webp",
          "theme": "light",
          "w": 2400,
          "width": 120
        }
      ],
      "how": "Return input to the normal editor after cleanup.",
      "id": "finished",
      "label": "Listener removed",
      "problems": []
    }
  ],
  "structure": "active -> subscribe input\ncontrol -> consume / transform\nend -> unsubscribe",
  "thumbnails": {
    "dark": {
      "animation": null,
      "src": "https://pi-tui.ratstack.sh/thumbs/input-lease/dark.9117518cef13.webp"
    },
    "light": {
      "animation": null,
      "src": "https://pi-tui.ratstack.sh/thumbs/input-lease/light.e46326c5ce6a.webp"
    }
  },
  "url": "https://pi-tui.ratstack.sh/patterns/input-lease/",
  "widths": [
    40,
    60,
    80,
    120
  ]
}
